11using Microsoft . Extensions . DependencyInjection ;
22using Microsoft . Extensions . Logging ;
3+ using Microsoft . Extensions . Options ;
34using NLWebNet . Models ;
45using NLWebNet . Services ;
56using NLWebNet . Tests . TestData ;
@@ -21,7 +22,11 @@ public void Initialize()
2122 var services = new ServiceCollection ( ) ;
2223 services . AddLogging ( builder => builder . AddConsole ( ) ) ;
2324
24- // Add tool selector with default configuration
25+ // Configure NLWebOptions with tool selection enabled
26+ var options = new NLWebOptions { ToolSelectionEnabled = true } ;
27+ services . AddSingleton ( Options . Create ( options ) ) ;
28+
29+ // Add tool selector with proper configuration
2530 services . AddSingleton < IToolSelector , ToolSelector > ( ) ;
2631
2732 _serviceProvider = services . BuildServiceProvider ( ) ;
@@ -54,9 +59,14 @@ public async Task ToolSelection_CompareQueries_SelectCompareToolCorrectly()
5459
5560 if ( scenario . ExpectedTools . Contains ( "Compare" ) )
5661 {
57- // Tool selection should either return a specific tool or null (meaning default processing)
58- // The important thing is that it doesn't crash
59- Console . WriteLine ( $ "Tool selection completed for compare query: { scenario . Query } ") ;
62+ // For compare scenarios, the tool selector should select the "compare" tool
63+ Assert . AreEqual ( "compare" , selectedTool ,
64+ $ "Expected 'compare' tool to be selected for compare query: '{ scenario . Query } '") ;
65+ Console . WriteLine ( $ "✓ Compare tool correctly selected for: { scenario . Query } ") ;
66+ }
67+ else
68+ {
69+ Console . WriteLine ( $ "Tool selection completed for query: { scenario . Query } ") ;
6070 }
6171
6272 Console . WriteLine ( $ "✓ Compare tool selection validated for '{ scenario . Name } '") ;
@@ -83,7 +93,28 @@ public async Task ToolSelection_DetailQueries_SelectDetailsToolCorrectly()
8393
8494 if ( scenario . ExpectedTools . Contains ( "Details" ) )
8595 {
86- Console . WriteLine ( $ "Tool selection completed for detail query: { scenario . Query } ") ;
96+ // Check if the query actually contains details keywords that the tool selector recognizes
97+ var queryLower = scenario . Query . ToLowerInvariant ( ) ;
98+ var detailsKeywords = new [ ] { "details" , "information about" , "tell me about" , "describe" } ;
99+ var shouldSelectDetails = detailsKeywords . Any ( keyword => queryLower . Contains ( keyword ) ) ;
100+
101+ if ( shouldSelectDetails )
102+ {
103+ Assert . AreEqual ( "details" , selectedTool ,
104+ $ "Expected 'details' tool to be selected for details query: '{ scenario . Query } '") ;
105+ Console . WriteLine ( $ "✓ Details tool correctly selected for: { scenario . Query } ") ;
106+ }
107+ else
108+ {
109+ // Query doesn't contain details keywords, so it defaults to search
110+ Assert . AreEqual ( "search" , selectedTool ,
111+ $ "Expected 'search' tool (default) for query without details keywords: '{ scenario . Query } '") ;
112+ Console . WriteLine ( $ "✓ Search tool (default) correctly selected for: { scenario . Query } ") ;
113+ }
114+ }
115+ else
116+ {
117+ Console . WriteLine ( $ "Tool selection completed for query: { scenario . Query } ") ;
87118 }
88119
89120 Console . WriteLine ( $ "✓ Details tool selection validated for '{ scenario . Name } '") ;
@@ -111,7 +142,28 @@ public async Task ToolSelection_EnsembleQueries_SelectToolsCorrectly()
111142 // Ensemble queries should be handled appropriately
112143 if ( scenario . ExpectedTools . Contains ( "Ensemble" ) )
113144 {
114- Console . WriteLine ( $ "Tool selection evaluated for ensemble query") ;
145+ // Check if the query actually contains ensemble keywords that the tool selector recognizes
146+ var queryLower = scenario . Query . ToLowerInvariant ( ) ;
147+ var ensembleKeywords = new [ ] { "recommend" , "suggest" , "what should" , "ensemble" , "set of" } ;
148+ var shouldSelectEnsemble = ensembleKeywords . Any ( keyword => queryLower . Contains ( keyword ) ) ;
149+
150+ if ( shouldSelectEnsemble )
151+ {
152+ Assert . AreEqual ( "ensemble" , selectedTool ,
153+ $ "Expected 'ensemble' tool to be selected for ensemble query: '{ scenario . Query } '") ;
154+ Console . WriteLine ( $ "✓ Ensemble tool correctly selected for: { scenario . Query } ") ;
155+ }
156+ else
157+ {
158+ // Query doesn't contain ensemble keywords, so it defaults to search
159+ Assert . AreEqual ( "search" , selectedTool ,
160+ $ "Expected 'search' tool (default) for query without ensemble keywords: '{ scenario . Query } '") ;
161+ Console . WriteLine ( $ "✓ Search tool (default) correctly selected for: { scenario . Query } ") ;
162+ }
163+ }
164+ else
165+ {
166+ Console . WriteLine ( $ "Tool selection evaluated for query: { scenario . Query } ") ;
115167 }
116168
117169 Console . WriteLine ( $ "✓ Ensemble tool selection validated for '{ scenario . Name } '") ;
@@ -138,7 +190,18 @@ public async Task ToolSelection_BasicSearchQueries_HandleAppropriately()
138190
139191 // Basic search may or may not require specific tool selection
140192 // The important thing is that the selector doesn't crash and returns a valid response
141- Console . WriteLine ( $ "✓ Basic search tool selection validated for '{ scenario . Name } '") ;
193+ if ( scenario . ExpectedTools . Contains ( "Search" ) )
194+ {
195+ // For basic search scenarios, the tool selector should select the "search" tool or null
196+ Assert . IsTrue ( selectedTool == "search" || selectedTool == null ,
197+ $ "Expected 'search' tool or null to be selected for basic search query: '{ scenario . Query } ', but got: { selectedTool } ") ;
198+ Console . WriteLine ( $ "✓ Basic search tool selection validated: { selectedTool ?? "null" } for '{ scenario . Query } '") ;
199+ }
200+ else
201+ {
202+ // For scenarios not expecting search tool, any valid result is acceptable
203+ Console . WriteLine ( $ "✓ Tool selection completed for query: '{ scenario . Query } ' -> { selectedTool ?? "null" } ") ;
204+ }
142205 }
143206 }
144207
@@ -287,10 +350,10 @@ public void ToolSelection_ShouldSelectTool_IdentifiesCorrectly()
287350 {
288351 var testScenarios = new [ ]
289352 {
290- new { Query = "" , ShouldSelect = false } ,
291- new { Query = "simple query" , ShouldSelect = true } ,
292- new { Query = "compare A vs B" , ShouldSelect = true } ,
293- new { Query = "detailed analysis" , ShouldSelect = true }
353+ new { Query = "" , ShouldSelect = true , Description = "Empty query (still triggers tool selection)" } ,
354+ new { Query = "simple query" , ShouldSelect = true , Description = "Simple query should trigger tool selection" } ,
355+ new { Query = "compare A vs B" , ShouldSelect = true , Description = "Compare query should trigger tool selection" } ,
356+ new { Query = "detailed analysis" , ShouldSelect = true , Description = "Details query should trigger tool selection" }
294357 } ;
295358
296359 foreach ( var scenario in testScenarios )
@@ -304,10 +367,31 @@ public void ToolSelection_ShouldSelectTool_IdentifiesCorrectly()
304367
305368 var shouldSelect = _toolSelector . ShouldSelectTool ( request ) ;
306369
307- Console . WriteLine ( $ "Query: '{ scenario . Query } ' -> Should select: { shouldSelect } ") ;
370+ Console . WriteLine ( $ "Query: '{ scenario . Query } ' -> Should select: { shouldSelect } (Expected: { scenario . ShouldSelect } )") ;
371+
372+ // Assert that the result matches expected behavior
373+ Assert . AreEqual ( scenario . ShouldSelect , shouldSelect ,
374+ $ "ShouldSelectTool should return { scenario . ShouldSelect } for: { scenario . Description } ") ;
375+
376+ Console . WriteLine ( $ "✓ ShouldSelectTool correctly evaluated for query: '{ scenario . Query } '") ;
377+ }
378+
379+ // Test scenarios that should return false
380+ var falseScenariosToTest = new [ ]
381+ {
382+ new { Request = new NLWebRequest { Query = "test" , Mode = QueryMode . Generate } , Description = "Generate mode should not trigger tool selection" } ,
383+ new { Request = new NLWebRequest { Query = "test" , Mode = QueryMode . List , DecontextualizedQuery = "already processed" } , Description = "Request with decontextualized query should not trigger tool selection" }
384+ } ;
385+
386+ foreach ( var scenario in falseScenariosToTest )
387+ {
388+ var shouldSelect = _toolSelector . ShouldSelectTool ( scenario . Request ) ;
389+
390+ Console . WriteLine ( $ "Scenario: '{ scenario . Description } ' -> Should select: { shouldSelect } (Expected: False)") ;
391+
392+ Assert . IsFalse ( shouldSelect , $ "ShouldSelectTool should return false for: { scenario . Description } ") ;
308393
309- // The implementation determines the logic, we just verify it doesn't crash
310- Console . WriteLine ( $ "✓ ShouldSelectTool evaluated for query: '{ scenario . Query } '") ;
394+ Console . WriteLine ( $ "✓ ShouldSelectTool correctly returned false for: { scenario . Description } ") ;
311395 }
312396 }
313397}
0 commit comments