@@ -12,9 +12,24 @@ const Module = require('module');
1212type VSCode = typeof vscode ;
1313
1414const mockedVSCode : Partial < VSCode > = { } ;
15-
15+ const mockedVSCodeNamespaces : { [ P in keyof VSCode ] ?: TypeMoq . IMock < VSCode [ P ] > } = { } ;
1616const originalLoad = Module . _load ;
1717
18+ generateMock ( 'workspace' ) ;
19+ generateMock ( 'window' ) ;
20+ generateMock ( 'commands' ) ;
21+ generateMock ( 'languages' ) ;
22+ generateMock ( 'env' ) ;
23+ generateMock ( 'debug' ) ;
24+ generateMock ( 'extensions' ) ;
25+ generateMock ( 'scm' ) ;
26+
27+ function generateMock < K extends keyof VSCode > ( name : K ) : void {
28+ const mockedObj = TypeMoq . Mock . ofType < VSCode [ K ] > ( ) ;
29+ mockedVSCode [ name ] = mockedObj . object ;
30+ mockedVSCodeNamespaces [ name ] = mockedObj as any ;
31+ }
32+
1833export function initialize ( ) {
1934 Module . _load = function ( request , parent ) {
2035 if ( request === 'vscode' ) {
@@ -24,10 +39,22 @@ export function initialize() {
2439 } ;
2540}
2641
42+ /**
43+ * Gets the mocked VS Code namespaces/classes.
44+ * For VS Code namespaces, always return pre-mocked objects, else create a new mock object.
45+ * @export
46+ * @template K
47+ * @param {K } name
48+ * @returns {TypeMoq.IMock<VSCode[K]> }
49+ */
2750export function mock < K extends keyof VSCode > ( name : K ) : TypeMoq . IMock < VSCode [ K ] > {
28- const mockedObj = TypeMoq . Mock . ofType < VSCode [ K ] > ( ) ;
29- mockedVSCode [ name ] = mockedObj . object ;
30- return mockedObj ;
51+ if ( mockedVSCodeNamespaces [ name ] === undefined ) {
52+ return TypeMoq . Mock . ofType < VSCode [ K ] > ( ) ;
53+ }
54+ // When re-using, always reset (other tests could have used this same instance).
55+ const mockObj = mockedVSCodeNamespaces [ name ] ! ;
56+ mockObj . reset ( ) ;
57+ return mockObj as any as TypeMoq . IMock < VSCode [ K ] > ;
3158}
3259
3360// This is one of the very few classes that we need in our unit tests.
0 commit comments