✨ feat(vscode): 只有从「未提交的更改」点开的预览才对比上一次提交
This commit is contained in:
1 parent
4ec2b9d5d6
commit
3c7513b7cd
18 files changed
+366
-143
No files matched your search
@@ -1,3 +1,4 @@
|
||||
import type { DiffBase, OpenedFrom } from '../diff/diffBase'
|
||||
import type { RewriteRequest } from '../qa/codeQa'
|
||||
import type { ExtensionToWebview, WebviewToExtension } from './messages'
|
||||
import { describe, expect, it, vi } from 'vitest'
|
||||
@@ -10,6 +11,7 @@ vi.mock('vscode', () => ({
|
||||
workspace: {
|
||||
onDidChangeTextDocument: () => ({ dispose: () => {} }),
|
||||
onDidChangeConfiguration: () => ({ dispose: () => {} }),
|
||||
getConfiguration: () => ({ get: (_key: string, fallback: unknown) => fallback }),
|
||||
openTextDocument: vi.fn(),
|
||||
applyEdit: vi.fn(async () => true),
|
||||
},
|
||||
@@ -28,6 +30,15 @@ vi.mock('../../webview/html', () => ({ webviewHtml: () => '', webviewUiRoot: ()
|
||||
vi.mock('../folderStore', () => ({ locate: () => ({ folder: { uri: { fsPath: '/workspace' } }, key: 'web/a.ts' }) }))
|
||||
vi.mock('./pathPreview', () => ({ PATH_PREVIEW_SCHEME: 'code-reader-path', topSubjectOf: (uri: unknown) => ({ uri, kind: 'file' }) }))
|
||||
vi.mock('./occurrences', () => ({ occurrencesOf: vi.fn() }))
|
||||
/** 排视图数据不真的解析:一份没有块的文档 */
|
||||
vi.mock('./documentMessage', () => ({
|
||||
documentMessage: vi.fn(async (input: { languageId: string, version: number }) => ({
|
||||
message: { type: 'document', version: input.version, languageId: input.languageId, blocks: [], attributes: [], translators: [], translatorId: '', names: [] },
|
||||
displayNames: [],
|
||||
symbols: [],
|
||||
imports: [],
|
||||
})),
|
||||
}))
|
||||
|
||||
const SOURCE = ['// 旧说明', 'export function load() {}']
|
||||
|
||||
@@ -125,3 +136,136 @@ describe('预览里重写注释', () => {
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
const HEAD_BASE: DiffBase = { label: '上一次提交', key: 'head:web/a.ts', read: async () => '// 改之前', missing: '' }
|
||||
|
||||
/** 对比基准只认从「未提交的更改」点开的:从那儿点开的对比上一次提交,别处打开的不比 */
|
||||
function opening() {
|
||||
const subscribe = () => ({ dispose: () => {} })
|
||||
const diffBase = vi.fn((_uri: unknown, from: OpenedFrom): DiffBase | undefined => from === 'uncommitted' ? HEAD_BASE : undefined)
|
||||
const qa = {
|
||||
imageRoot: () => undefined,
|
||||
onDidChange: subscribe,
|
||||
onDidAnswer: subscribe,
|
||||
onDidRewrite: subscribe,
|
||||
profiles: { subscribe, choice: async () => ({ profiles: [], selected: '' }) },
|
||||
view: () => ({ type: 'qa' }),
|
||||
}
|
||||
const provider = new PreviewEditorProvider(...[
|
||||
{},
|
||||
{},
|
||||
{},
|
||||
{ subscribe, current: { excluded: {}, onlyChanges: false } },
|
||||
async () => [],
|
||||
qa,
|
||||
async () => [],
|
||||
async () => [],
|
||||
{ diffBase, onDidChange: subscribe },
|
||||
{ namesOf: () => [], onDidChange: subscribe },
|
||||
async () => false,
|
||||
] as unknown as ConstructorParameters<typeof PreviewEditorProvider>)
|
||||
const uri = { fsPath: '/workspace/web/a.ts', scheme: 'file', toString: () => 'file:///workspace/web/a.ts' }
|
||||
const document = { uri, version: 1, languageId: 'typescript', fileName: '/workspace/web/a.ts', getText: () => SOURCE.join('\n') }
|
||||
return { provider, document, diffBase }
|
||||
}
|
||||
|
||||
/** 一个标签页:收发消息、切走(页面被销毁,切回来重新加载、再发 ready) */
|
||||
function tab() {
|
||||
let receive: ((message: WebviewToExtension) => Promise<void>) | undefined
|
||||
let viewStateChanged: (() => void) | undefined
|
||||
const post = vi.fn<(message: ExtensionToWebview) => void>()
|
||||
const panel = {
|
||||
active: true,
|
||||
visible: true,
|
||||
webview: {
|
||||
options: {},
|
||||
postMessage: post,
|
||||
asWebviewUri: (file: unknown) => file,
|
||||
onDidReceiveMessage: (listener: typeof receive) => {
|
||||
receive = listener
|
||||
return { dispose: () => {} }
|
||||
},
|
||||
},
|
||||
onDidChangeViewState: (listener: typeof viewStateChanged) => {
|
||||
viewStateChanged = listener
|
||||
return { dispose: () => {} }
|
||||
},
|
||||
onDidDispose: () => ({ dispose: () => {} }),
|
||||
}
|
||||
return {
|
||||
panel: panel as unknown as Parameters<PreviewEditorProvider['resolveCustomTextEditor']>[1],
|
||||
send: (message: WebviewToExtension) => receive!(message),
|
||||
hide: () => {
|
||||
panel.visible = false
|
||||
viewStateChanged!()
|
||||
panel.visible = true
|
||||
},
|
||||
posted: () => post.mock.calls.map(([message]) => message),
|
||||
clear: () => post.mockClear(),
|
||||
}
|
||||
}
|
||||
|
||||
const comparedWithHead = expect.objectContaining({ type: 'diff', diff: expect.objectContaining({ base: '上一次提交' }) })
|
||||
|
||||
describe('预览对比什么看这个标签页是从哪儿打开的', () => {
|
||||
it('从「未提交的更改」点开的新预览对比上一次提交,页面记下是从哪儿打开的', async () => {
|
||||
const { provider, document } = opening()
|
||||
const page = tab()
|
||||
await provider.open(document.uri as never, { from: 'uncommitted' }, async () => provider.resolveCustomTextEditor(document as never, page.panel))
|
||||
await page.send({ type: 'ready' })
|
||||
|
||||
expect(page.posted()).toContainEqual({ type: 'openedFrom', from: 'uncommitted' })
|
||||
await vi.waitFor(() => expect(page.posted()).toContainEqual(comparedWithHead))
|
||||
})
|
||||
|
||||
it('开着的预览再从别处点开就不比,再从「未提交的更改」点开又比;只切标签页不变', async () => {
|
||||
const { provider, document } = opening()
|
||||
const page = tab()
|
||||
await provider.open(document.uri as never, { from: 'uncommitted' }, async () => provider.resolveCustomTextEditor(document as never, page.panel))
|
||||
await page.send({ type: 'ready' })
|
||||
await vi.waitFor(() => expect(page.posted()).toContainEqual(comparedWithHead))
|
||||
|
||||
page.clear()
|
||||
await provider.open(document.uri as never, { from: 'other' }, async () => {})
|
||||
expect(page.posted()).toContainEqual({ type: 'openedFrom', from: 'other' })
|
||||
await vi.waitFor(() => expect(page.posted()).toContainEqual({ type: 'diff', diff: null }))
|
||||
|
||||
page.clear()
|
||||
await provider.open(document.uri as never, { from: 'uncommitted' }, async () => {})
|
||||
expect(page.posted()).toContainEqual({ type: 'openedFrom', from: 'uncommitted' })
|
||||
await vi.waitFor(() => expect(page.posted()).toContainEqual(comparedWithHead))
|
||||
|
||||
page.hide()
|
||||
page.clear()
|
||||
await page.send({ type: 'ready', openedFrom: 'uncommitted' })
|
||||
expect(page.posted()).toContainEqual({ type: 'openedFrom', from: 'uncommitted' })
|
||||
await vi.waitFor(() => expect(page.posted()).toContainEqual(comparedWithHead))
|
||||
})
|
||||
|
||||
it('没带打开请求的(VS Code 重启后恢复的)按页面记着的来,页面没记过的不比', async () => {
|
||||
const { provider, document, diffBase } = opening()
|
||||
const restored = tab()
|
||||
provider.resolveCustomTextEditor(document as never, restored.panel)
|
||||
await restored.send({ type: 'ready', openedFrom: 'uncommitted' })
|
||||
await vi.waitFor(() => expect(restored.posted()).toContainEqual(comparedWithHead))
|
||||
|
||||
diffBase.mockClear()
|
||||
const fresh = tab()
|
||||
provider.resolveCustomTextEditor(document as never, fresh.panel)
|
||||
await fresh.send({ type: 'ready' })
|
||||
expect(fresh.posted()).toContainEqual({ type: 'openedFrom', from: 'other' })
|
||||
expect(diffBase).toHaveBeenCalledWith(document.uri, 'other')
|
||||
expect(diffBase).not.toHaveBeenCalledWith(document.uri, 'uncommitted')
|
||||
})
|
||||
|
||||
it('打开请求说的从哪儿打开比页面记着的优先', async () => {
|
||||
const { provider, document, diffBase } = opening()
|
||||
const page = tab()
|
||||
await provider.open(document.uri as never, { from: 'other' }, async () => provider.resolveCustomTextEditor(document as never, page.panel))
|
||||
await page.send({ type: 'ready', openedFrom: 'uncommitted' })
|
||||
|
||||
expect(page.posted()).toContainEqual({ type: 'openedFrom', from: 'other' })
|
||||
expect(diffBase).toHaveBeenCalledWith(document.uri, 'other')
|
||||
expect(diffBase).not.toHaveBeenCalledWith(document.uri, 'uncommitted')
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user