Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| """ | |
| COMPREHENSIVE TEST SUITE for Production-Grade NLP Engine | |
| Tests all query types and filter combinations | |
| Run: python test_production_engine.py | |
| """ | |
| import sys | |
| from database import FilterExtractor, ask_llm | |
| def test_basic_filters(): | |
| """Test basic single-filter extraction""" | |
| print("\n" + "="*70) | |
| print("TEST 1: BASIC FILTERS") | |
| print("="*70) | |
| extractor = FilterExtractor() | |
| test_cases = [ | |
| ("show TN vehicles", {"state": "TN"}), | |
| ("show buses", {"vehicle_type": "bus"}), | |
| ("show vehicles in adyar", {"location": "adyar"}), | |
| ("track TN63MB3157", {"plate": "TN63MB3157"}), | |
| ] | |
| for query, expected_filters in test_cases: | |
| filters = extractor.extract_filters(query) | |
| status = "β " if all( | |
| filters.get(k) == v for k, v in expected_filters.items() | |
| ) else "β" | |
| print(f"{status} {query}") | |
| print(f" Extracted: {expected_filters}") | |
| def test_multi_filters(): | |
| """Test multi-filter extraction""" | |
| print("\n" + "="*70) | |
| print("TEST 2: MULTI-FILTER COMBINATIONS") | |
| print("="*70) | |
| extractor = FilterExtractor() | |
| test_cases = [ | |
| ("show TN buses in adyar", | |
| {"state": "TN", "vehicle_type": "bus", "location": "adyar"}), | |
| ("show Karnataka cars in velachery", | |
| {"state": "KA", "vehicle_type": "car", "location": "velachery"}), | |
| ("show TN buses in besant nagar on monday", | |
| {"state": "TN", "vehicle_type": "bus", "location": "besant nagar", "day": "Monday"}), | |
| ] | |
| for query, expected_filters in test_cases: | |
| filters = extractor.extract_filters(query) | |
| status = "β " if all( | |
| filters.get(k) == v for k, v in expected_filters.items() | |
| ) else "β" | |
| print(f"{status} {query}") | |
| def test_date_range(): | |
| """Test date range extraction""" | |
| print("\n" + "="*70) | |
| print("TEST 3: DATE RANGE EXTRACTION") | |
| print("="*70) | |
| extractor = FilterExtractor() | |
| test_cases = [ | |
| "show vehicles from 01-05-2026 to 10-05-2026", | |
| "show buses between 2026-05-01 and 2026-05-10", | |
| "show vehicles from 01/05/2026 to 10/05/2026", | |
| ] | |
| for query in test_cases: | |
| filters = extractor.extract_filters(query) | |
| date_range = filters.get("date_range") | |
| if date_range: | |
| print(f"β {query}") | |
| print(f" Start: {date_range['start']}, End: {date_range['end']}") | |
| else: | |
| print(f"β {query}") | |
| def test_time_range(): | |
| """Test time range extraction""" | |
| print("\n" + "="*70) | |
| print("TEST 4: TIME RANGE EXTRACTION") | |
| print("="*70) | |
| extractor = FilterExtractor() | |
| test_cases = [ | |
| ("show vehicles after 8 PM", {"start": 20, "end": 23}), | |
| ("show vehicles before 6 AM", {"start": 0, "end": 6}), | |
| ("show vehicles between 6 PM and 9 PM", {"start": 18, "end": 21}), | |
| ("show vehicles in the morning", {"start": 5, "end": 12}), | |
| ("show vehicles in the evening", {"start": 17, "end": 21}), | |
| ] | |
| for query, expected_range in test_cases: | |
| filters = extractor.extract_filters(query) | |
| time_range = filters.get("time_range") | |
| if time_range: | |
| if (time_range.get("start") == expected_range["start"] and | |
| time_range.get("end") == expected_range["end"]): | |
| print(f"β {query}") | |
| else: | |
| print(f"β οΈ {query}") | |
| print(f" Expected: {expected_range}, Got: {time_range}") | |
| else: | |
| print(f"β {query}") | |
| def test_intent_detection(): | |
| """Test intent detection""" | |
| print("\n" + "="*70) | |
| print("TEST 5: INTENT DETECTION") | |
| print("="*70) | |
| extractor = FilterExtractor() | |
| test_cases = [ | |
| ("track TN63MB3157", ["tracking"]), | |
| ("count buses", ["count"]), | |
| ("show top vehicles", ["top", "analytics"]), | |
| ("show hourly traffic", ["hourly", "analytics"]), | |
| ("show suspicious vehicles", ["suspicious", "analytics"]), | |
| ("show vehicles in multiple locations", ["location_based"]), | |
| ] | |
| for query, expected_intents in test_cases: | |
| intents = extractor.detect_intents(query) | |
| detected = [k for k, v in intents.items() if v] | |
| match = all(intent in detected for intent in expected_intents) | |
| status = "β " if match else "β οΈ" | |
| print(f"{status} {query}") | |
| print(f" Intents: {', '.join(detected) if detected else 'general'}") | |
| def test_sql_generation(): | |
| """Test SQL generation for various queries""" | |
| print("\n" + "="*70) | |
| print("TEST 6: SQL GENERATION") | |
| print("="*70) | |
| test_cases = [ | |
| "show TN buses", | |
| "show buses in adyar", | |
| "show TN buses in adyar from 01-05-2026 to 10-05-2026", | |
| "show vehicles after 8 PM", | |
| "show buses between 6 PM and 9 PM", | |
| "count TN vehicles", | |
| "track TN63MB3157", | |
| "show top vehicles", | |
| "show hourly traffic", | |
| "show suspicious vehicles", | |
| ] | |
| for query in test_cases: | |
| sql = ask_llm(query) | |
| # Validate SQL | |
| if sql.strip().startswith("SELECT"): | |
| print(f"β {query}") | |
| # Show first line of SQL | |
| first_line = sql.split("\n")[0] | |
| print(f" {first_line}...") | |
| else: | |
| print(f"β {query}") | |
| print(f" Invalid SQL: {sql[:50]}...") | |
| def test_complex_queries(): | |
| """Test complex multi-dimension queries""" | |
| print("\n" + "="*70) | |
| print("TEST 7: COMPLEX MULTI-DIMENSION QUERIES") | |
| print("="*70) | |
| complex_queries = [ | |
| "show TN buses in adyar from 01-05-2026 to 10-05-2026 after 8 PM", | |
| "show TN high-confidence buses detected in multiple locations", | |
| "show Kerala cars in velachery on weekend between 6 PM and 9 PM", | |
| "count vehicles in adyar from 01-05-2026 to 10-05-2026", | |
| "track TN63MB3157 in adyar on monday", | |
| ] | |
| for query in complex_queries: | |
| sql = ask_llm(query) | |
| if "SELECT" in sql and "FROM vehicle_logs" in sql: | |
| print(f"β {query}") | |
| else: | |
| print(f"β {query}") | |
| def test_location_variants(): | |
| """Test location variant matching""" | |
| print("\n" + "="*70) | |
| print("TEST 8: LOCATION VARIANT MATCHING") | |
| print("="*70) | |
| extractor = FilterExtractor() | |
| test_cases = [ | |
| ("adyar", "adyar"), | |
| ("besant nagar", "besant nagar"), | |
| ("besant", "besant nagar"), | |
| ("t nagar", "t nagar"), | |
| ("tnagar", "t nagar"), | |
| ("anna nagar", "anna nagar"), | |
| ("anna", "anna nagar"), | |
| ("velachery", "velachery"), | |
| ] | |
| for query_location, expected in test_cases: | |
| filters = extractor.extract_filters(f"show vehicles in {query_location}") | |
| location = filters.get("location") | |
| status = "β " if location == expected else "β" | |
| print(f"{status} '{query_location}' β '{location}'") | |
| def test_vehicle_synonyms(): | |
| """Test vehicle type synonym matching""" | |
| print("\n" + "="*70) | |
| print("TEST 9: VEHICLE TYPE SYNONYMS") | |
| print("="*70) | |
| extractor = FilterExtractor() | |
| test_cases = [ | |
| ("buses", "bus"), | |
| ("truck", "truck"), | |
| ("lorry", "truck"), | |
| ("motorcycle", "bike"), | |
| ("motorbike", "bike"), | |
| ("autorickshaw", "auto"), | |
| ("auto-rickshaw", "auto"), | |
| ("compact", "car"), | |
| ("sedan", "car"), | |
| ("cabs", "taxi"), | |
| ] | |
| for query_type, expected in test_cases: | |
| filters = extractor.extract_filters(f"show {query_type}") | |
| vehicle_type = filters.get("vehicle_type") | |
| status = "β " if vehicle_type == expected else "β" | |
| print(f"{status} '{query_type}' β '{vehicle_type}'") | |
| def test_confidence_threshold(): | |
| """Test confidence threshold extraction""" | |
| print("\n" + "="*70) | |
| print("TEST 10: CONFIDENCE THRESHOLD") | |
| print("="*70) | |
| extractor = FilterExtractor() | |
| test_cases = [ | |
| ("show vehicles with 0.9 confidence", 0.9), | |
| ("show high confidence detections above 0.95", 0.95), | |
| ("vehicles with 0.85 confidence", 0.85), | |
| ] | |
| for query, expected_conf in test_cases: | |
| filters = extractor.extract_filters(query) | |
| confidence = filters.get("confidence") | |
| if confidence: | |
| status = "β " if abs(confidence - expected_conf) < 0.01 else "β οΈ" | |
| print(f"{status} {query}") | |
| print(f" Confidence: {confidence}") | |
| else: | |
| print(f"β οΈ {query}") | |
| print(f" Confidence not extracted") | |
| def run_all_tests(): | |
| """Run all test suites""" | |
| print("\n\n") | |
| print("β" + "β"*68 + "β") | |
| print("β" + " "*68 + "β") | |
| print("β" + " PRODUCTION-GRADE NLP ENGINE TEST SUITE ".center(68) + "β") | |
| print("β" + " "*68 + "β") | |
| print("β" + "β"*68 + "β") | |
| try: | |
| test_basic_filters() | |
| test_multi_filters() | |
| test_date_range() | |
| test_time_range() | |
| test_intent_detection() | |
| test_sql_generation() | |
| test_complex_queries() | |
| test_location_variants() | |
| test_vehicle_synonyms() | |
| test_confidence_threshold() | |
| print("\n" + "="*70) | |
| print("β ALL TESTS COMPLETED") | |
| print("="*70 + "\n") | |
| except Exception as e: | |
| print(f"\nβ Test failed with error: {e}") | |
| import traceback | |
| traceback.print_exc() | |
| if __name__ == "__main__": | |
| run_all_tests() | |