88import { expect , use } from 'chai' ;
99import * as TypeMoq from 'typemoq' ;
1010import { CancellationToken , CancellationTokenSource , CompletionItemKind , DocumentSymbolProvider , SymbolKind , TextDocument , Uri } from 'vscode' ;
11+ import { IFileSystem } from '../../client/common/platform/types' ;
12+ import { IServiceContainer } from '../../client/ioc/types' ;
1113import { JediFactory } from '../../client/languageServices/jediProxyFactory' ;
1214import { IDefinition , ISymbolResult , JediProxyHandler } from '../../client/providers/jediProxy' ;
1315import { PythonSymbolProvider } from '../../client/providers/symbolProvider' ;
16+
1417const assertArrays = require ( 'chai-arrays' ) ;
1518use ( assertArrays ) ;
1619
1720suite ( 'Symbol Provider' , ( ) => {
18- let symbolProvider : DocumentSymbolProvider ;
21+ let serviceContainer : TypeMoq . IMock < IServiceContainer > ;
1922 let jediHandler : TypeMoq . IMock < JediProxyHandler < ISymbolResult > > ;
2023 let jediFactory : TypeMoq . IMock < JediFactory > ;
24+ let fileSystem : TypeMoq . IMock < IFileSystem > ;
25+ let provider : DocumentSymbolProvider ;
26+ let uri : Uri ;
27+ let doc : TypeMoq . IMock < TextDocument > ;
2128 setup ( ( ) => {
29+ serviceContainer = TypeMoq . Mock . ofType < IServiceContainer > ( ) ;
2230 jediFactory = TypeMoq . Mock . ofType ( JediFactory ) ;
2331 jediHandler = TypeMoq . Mock . ofType < JediProxyHandler < ISymbolResult > > ( ) ;
2432
33+ fileSystem = TypeMoq . Mock . ofType < IFileSystem > ( ) ;
34+ doc = TypeMoq . Mock . ofType < TextDocument > ( ) ;
2535 jediFactory . setup ( j => j . getJediProxyHandler ( TypeMoq . It . isAny ( ) ) )
2636 . returns ( ( ) => jediHandler . object ) ;
37+
38+ serviceContainer . setup ( c => c . get ( IFileSystem ) ) . returns ( ( ) => fileSystem . object ) ;
2739 } ) ;
2840
2941 async function testDocumentation ( requestId : number , fileName : string , expectedSize : number , token ?: CancellationToken , isUntitled = false ) {
30- const doc = TypeMoq . Mock . ofType < TextDocument > ( ) ;
42+ fileSystem . setup ( fs => fs . arePathsSame ( TypeMoq . It . isAny ( ) , TypeMoq . It . isAny ( ) ) )
43+ . returns ( ( ) => true ) ;
3144 token = token ? token : new CancellationTokenSource ( ) . token ;
3245 const symbolResult = TypeMoq . Mock . ofType < ISymbolResult > ( ) ;
3346
@@ -39,91 +52,130 @@ suite('Symbol Provider', () => {
3952 }
4053 ] ;
4154
55+ uri = Uri . file ( fileName ) ;
56+ doc . setup ( d => d . uri ) . returns ( ( ) => uri ) ;
4257 doc . setup ( d => d . fileName ) . returns ( ( ) => fileName ) ;
4358 doc . setup ( d => d . isUntitled ) . returns ( ( ) => isUntitled ) ;
44- doc . setup ( d => d . uri ) . returns ( ( ) => Uri . file ( fileName ) ) ;
4559 doc . setup ( d => d . getText ( TypeMoq . It . isAny ( ) ) ) . returns ( ( ) => '' ) ;
4660 symbolResult . setup ( c => c . requestId ) . returns ( ( ) => requestId ) ;
4761 symbolResult . setup ( c => c . definitions ) . returns ( ( ) => definitions ) ;
4862 symbolResult . setup ( ( c : any ) => c . then ) . returns ( ( ) => undefined ) ;
4963 jediHandler . setup ( j => j . sendCommand ( TypeMoq . It . isAny ( ) , TypeMoq . It . isAny ( ) ) )
5064 . returns ( ( ) => Promise . resolve ( symbolResult . object ) ) ;
5165
52- const items = await symbolProvider . provideDocumentSymbols ( doc . object , token ) ;
66+ const items = await provider . provideDocumentSymbols ( doc . object , token ) ;
5367 expect ( items ) . to . be . array ( ) ;
5468 expect ( items ) . to . be . ofSize ( expectedSize ) ;
5569 }
5670
5771 test ( 'Ensure symbols are returned' , async ( ) => {
58- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 0 ) ;
72+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 0 ) ;
5973 await testDocumentation ( 1 , __filename , 1 ) ;
6074 } ) ;
6175 test ( 'Ensure symbols are returned (for untitled documents)' , async ( ) => {
62- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 0 ) ;
76+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 0 ) ;
6377 await testDocumentation ( 1 , __filename , 1 , undefined , true ) ;
6478 } ) ;
6579 test ( 'Ensure symbols are returned with a debounce of 100ms' , async ( ) => {
66- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 0 ) ;
80+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 0 ) ;
6781 await testDocumentation ( 1 , __filename , 1 ) ;
6882 } ) ;
6983 test ( 'Ensure symbols are returned with a debounce of 100ms (for untitled documents)' , async ( ) => {
70- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 0 ) ;
84+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 0 ) ;
7185 await testDocumentation ( 1 , __filename , 1 , undefined , true ) ;
7286 } ) ;
7387 test ( 'Ensure symbols are not returned when cancelled' , async ( ) => {
74- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 0 ) ;
88+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 0 ) ;
7589 const tokenSource = new CancellationTokenSource ( ) ;
7690 tokenSource . cancel ( ) ;
7791 await testDocumentation ( 1 , __filename , 0 , tokenSource . token ) ;
7892 } ) ;
7993 test ( 'Ensure symbols are not returned when cancelled (for untitled documents)' , async ( ) => {
80- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 0 ) ;
94+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 0 ) ;
8195 const tokenSource = new CancellationTokenSource ( ) ;
8296 tokenSource . cancel ( ) ;
8397 await testDocumentation ( 1 , __filename , 0 , tokenSource . token , true ) ;
8498 } ) ;
8599 test ( 'Ensure symbols are returned only for the last request' , async ( ) => {
86- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 100 ) ;
100+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 100 ) ;
87101 await Promise . all ( [
88102 testDocumentation ( 1 , __filename , 0 ) ,
89103 testDocumentation ( 2 , __filename , 0 ) ,
90104 testDocumentation ( 3 , __filename , 1 )
91105 ] ) ;
92106 } ) ;
93107 test ( 'Ensure symbols are returned for all the requests when the doc is untitled' , async ( ) => {
94- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 100 ) ;
108+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 100 ) ;
95109 await Promise . all ( [
96110 testDocumentation ( 1 , __filename , 1 , undefined , true ) ,
97111 testDocumentation ( 2 , __filename , 1 , undefined , true ) ,
98112 testDocumentation ( 3 , __filename , 1 , undefined , true )
99113 ] ) ;
100114 } ) ;
101115 test ( 'Ensure symbols are returned for multiple documents' , async ( ) => {
102- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 0 ) ;
116+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 0 ) ;
103117 await Promise . all ( [
104118 testDocumentation ( 1 , 'file1' , 1 ) ,
105119 testDocumentation ( 2 , 'file2' , 1 )
106120 ] ) ;
107121 } ) ;
108122 test ( 'Ensure symbols are returned for multiple untitled documents ' , async ( ) => {
109- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 0 ) ;
123+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 0 ) ;
110124 await Promise . all ( [
111125 testDocumentation ( 1 , 'file1' , 1 , undefined , true ) ,
112126 testDocumentation ( 2 , 'file2' , 1 , undefined , true )
113127 ] ) ;
114128 } ) ;
115129 test ( 'Ensure symbols are returned for multiple documents with a debounce of 100ms' , async ( ) => {
116- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 100 ) ;
130+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 100 ) ;
117131 await Promise . all ( [
118132 testDocumentation ( 1 , 'file1' , 1 ) ,
119133 testDocumentation ( 2 , 'file2' , 1 )
120134 ] ) ;
121135 } ) ;
122136 test ( 'Ensure symbols are returned for multiple untitled documents with a debounce of 100ms' , async ( ) => {
123- symbolProvider = new PythonSymbolProvider ( jediFactory . object , 100 ) ;
137+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 100 ) ;
124138 await Promise . all ( [
125139 testDocumentation ( 1 , 'file1' , 1 , undefined , true ) ,
126140 testDocumentation ( 2 , 'file2' , 1 , undefined , true )
127141 ] ) ;
128142 } ) ;
143+ test ( 'Ensure IFileSystem.arePathsSame is used' , async ( ) => {
144+ doc . setup ( d => d . getText ( ) )
145+ . returns ( ( ) => '' )
146+ . verifiable ( TypeMoq . Times . once ( ) ) ;
147+ doc . setup ( d => d . isDirty )
148+ . returns ( ( ) => true )
149+ . verifiable ( TypeMoq . Times . once ( ) ) ;
150+ doc . setup ( d => d . fileName )
151+ . returns ( ( ) => __filename ) ;
152+
153+ const symbols = TypeMoq . Mock . ofType < ISymbolResult > ( ) ;
154+ symbols . setup ( ( s : any ) => s . then ) . returns ( ( ) => undefined ) ;
155+ const definitions : IDefinition [ ] = [ ] ;
156+ for ( let counter = 0 ; counter < 3 ; counter += 1 ) {
157+ const def = TypeMoq . Mock . ofType < IDefinition > ( ) ;
158+ def . setup ( d => d . fileName ) . returns ( ( ) => counter . toString ( ) ) ;
159+ definitions . push ( def . object ) ;
160+
161+ fileSystem . setup ( fs => fs . arePathsSame ( TypeMoq . It . isValue ( counter . toString ( ) ) , TypeMoq . It . isValue ( __filename ) ) )
162+ . returns ( ( ) => false )
163+ . verifiable ( TypeMoq . Times . exactly ( 1 ) ) ;
164+ }
165+ symbols . setup ( s => s . definitions )
166+ . returns ( ( ) => definitions )
167+ . verifiable ( TypeMoq . Times . atLeastOnce ( ) ) ;
168+
169+ jediHandler . setup ( j => j . sendCommand ( TypeMoq . It . isAny ( ) , TypeMoq . It . isAny ( ) ) )
170+ . returns ( ( ) => Promise . resolve ( symbols . object ) )
171+ . verifiable ( TypeMoq . Times . once ( ) ) ;
172+
173+ provider = new PythonSymbolProvider ( serviceContainer . object , jediFactory . object , 0 ) ;
174+ await provider . provideDocumentSymbols ( doc . object , new CancellationTokenSource ( ) . token ) ;
175+
176+ doc . verifyAll ( ) ;
177+ symbols . verifyAll ( ) ;
178+ fileSystem . verifyAll ( ) ;
179+ jediHandler . verifyAll ( ) ;
180+ } ) ;
129181} ) ;
0 commit comments