@@ -23,51 +23,37 @@ async function resolveItemChildren(item: vscode.TestItem) {
2323 ) ;
2424 if ( response ) {
2525 response ?. data ?. result ?. content ?. forEach ( async element => {
26- const fullClassName = element . Name ;
27-
28- const response = await makeRESTRequest (
29- "POST" ,
30- spec ,
31- { apiVersion : 1 , namespace, path : "/action/query" } ,
32- { query : `SELECT Name FROM %Dictionary.MethodDefinition WHERE parent='${ fullClassName } ' AND Name %STARTSWITH 'Test'` } ,
33- ) ;
34- if ( response ?. data ?. result ?. content ?. length > 0 ) {
26+ const fullClassName : string = element . Name ;
27+
3528 const tiClass = loadedTestController . createTestItem (
3629 `${ item . id } :${ fullClassName } ` ,
37- fullClassName
30+ fullClassName ,
31+ vscode . Uri . from ( {
32+ scheme : "isfs-readonly" ,
33+ authority : item . id . toLowerCase ( ) ,
34+ path : "/" + fullClassName . replace ( / \. / , "/" ) + ".cls"
35+ } )
3836 ) ;
39- //tiClass.description = `Class ${fullClassName}`;
40- response ?. data ?. result ?. content ?. forEach ( element => {
41- const testMethodSuffix = element . Name . slice ( 4 ) ;
42- const tiMethod = loadedTestController . createTestItem (
43- `${ item . id } :${ element . Name } ` ,
44- testMethodSuffix
45- ) ;
46- tiClass . children . add ( tiMethod ) ;
47- } ) ;
48- item . children . add ( tiClass ) ;
49- }
50- } ) ;
51- }
52- }
53- else if ( parts . length === 3 ) {
54- // Find all Test* methods in a class
55- const fullClassName = parts [ 2 ] ;
56- const response = await makeRESTRequest (
57- "POST" ,
58- spec ,
59- { apiVersion : 1 , namespace, path : "/action/query" } ,
60- { query : `SELECT Name FROM %Dictionary.MethodDefinition WHERE parent='${ fullClassName } ' AND Name %STARTSWITH 'Test'` } ,
61- ) ;
62- if ( response ) {
63- response ?. data ?. result ?. content ?. forEach ( element => {
64- const testMethodSuffix = element . Name . slice ( 4 ) ;
65- const child = loadedTestController . createTestItem (
66- `${ item . id } :${ element . Name } ` ,
67- testMethodSuffix
68- ) ;
69- child . canResolveChildren = false ;
70- item . children . add ( child ) ;
37+ const symbols = await vscode . commands . executeCommand < vscode . ProviderResult < vscode . SymbolInformation [ ] | vscode . DocumentSymbol [ ] > > ( 'vscode.executeDocumentSymbolProvider' , tiClass . uri ) ;
38+ if ( symbols ?. length === 1 && symbols [ 0 ] . kind === vscode . SymbolKind . Class ) {
39+ const symbol = symbols [ 0 ] ;
40+ tiClass . range = ( symbol as vscode . DocumentSymbol ) . range || ( symbol as vscode . SymbolInformation ) . location . range ;
41+ ( symbol as vscode . DocumentSymbol ) . children . forEach ( childSymbol => {
42+ if ( childSymbol . kind === vscode . SymbolKind . Method && childSymbol . name . startsWith ( "Test" ) ) {
43+ const testMethodName = childSymbol . name ;
44+ const tiMethod = loadedTestController . createTestItem (
45+ `${ item . id } :${ testMethodName } ` ,
46+ testMethodName . slice ( 4 ) ,
47+ tiClass . uri
48+ ) ;
49+ tiMethod . range = childSymbol . range ;
50+ tiClass . children . add ( tiMethod ) ;
51+ }
52+ } ) ;
53+ }
54+ if ( tiClass . children . size > 0 ) {
55+ item . children . add ( tiClass ) ;
56+ }
7157 } ) ;
7258 }
7359 }
@@ -77,16 +63,18 @@ async function resolveItemChildren(item: vscode.TestItem) {
7763 else {
7864 // Root items
7965 replaceRootItems ( loadedTestController ) ;
80- }
66+
67+ if ( loadedTestController . items . size > 0 ) {
68+ loadedTestController . createRunProfile ( 'Run Server Tests' , vscode . TestRunProfileKind . Run , runTestsHandler , true ) ;
69+ loadedTestController . createRunProfile ( 'Debug Server Tests' , vscode . TestRunProfileKind . Debug , runTestsHandler ) ;
70+ //loadedTestController.createRunProfile('Test Coverage', vscode.TestRunProfileKind.Coverage, runTestsHandler);
71+ }
72+ }
8173}
8274
8375export async function setupServerTestsController ( ) {
8476 logger . info ( 'setupServerTestsController invoked' ) ;
8577
86- loadedTestController . createRunProfile ( 'Run Tests' , vscode . TestRunProfileKind . Run , runTestsHandler , true ) ;
87- loadedTestController . createRunProfile ( 'Debug Tests' , vscode . TestRunProfileKind . Debug , runTestsHandler ) ;
88- //testController.createRunProfile('Test Coverage', vscode.TestRunProfileKind.Coverage, runTestsHandler);
89-
9078 loadedTestController . resolveHandler = resolveItemChildren ;
9179 loadedTestController . items . replace ( [ loadedTestController . createTestItem ( '-' , 'loading...' ) ] ) ;
9280}
@@ -127,7 +115,10 @@ export async function runTestsHandler(request: vscode.TestRunRequest, cancellati
127115
128116 // Return result for leaf items
129117 if ( test . children . size === 0 ) {
130- const suffix = test . id . split ( '.' ) . pop ( )
118+ let suffix = test . id . split ( '.' ) . pop ( ) ;
119+ if ( ! suffix ?. match ( / ^ \d + $ / ) ) {
120+ suffix = ( Math . random ( ) * 5 + 1 ) . toPrecision ( 1 ) ;
121+ }
131122 switch ( suffix ) {
132123 case '1' :
133124 run . skipped ( test ) ;
0 commit comments