Spaces:
Running
Running
File size: 7,118 Bytes
9a6a4dc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
"""
Test Calculator Prompt Enhancer - TDD Implementation
Tests the prompt enhancement functionality for exponentiation operations.
"""
import pytest
import sys
import os
import logging
# Add the deployment-ready directory to the path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from utils.calculator_prompt_enhancer import CalculatorPromptEnhancer
logger = logging.getLogger(__name__)
class TestCalculatorPromptEnhancer:
"""Test suite for calculator prompt enhancer."""
@pytest.fixture(autouse=True)
def setup_method(self):
"""Set up test fixtures."""
self.enhancer = CalculatorPromptEnhancer()
def test_detect_exponentiation_patterns(self):
"""Test detection of various exponentiation patterns."""
test_cases = [
# Should detect exponentiation
("Calculate 2^8", True),
("What is 2**8?", True),
("2 to the power of 8", True),
("Compute 3 to the power of 4", True),
("What is 2 raised to 8?", True),
("Calculate power(2, 8)", True),
("Use pow(3, 4)", True),
("What is 5 squared?", True),
("Calculate 2 cubed", True),
# Should NOT detect exponentiation
("Calculate 25 * 17", False),
("What is 144 divided by 12?", False),
("Add 100 and 50", False),
("Subtract 75 from 200", False),
("What is the square root of 16?", False),
]
for question, expected in test_cases:
result = self.enhancer.detect_exponentiation(question)
assert result == expected, f"Failed for '{question}': expected {expected}, got {result}"
logger.info(f"β
Detection test passed: '{question}' β {result}")
def test_extract_exponentiation_components(self):
"""Test extraction of base and exponent from questions."""
test_cases = [
("Calculate 2^8", {'base': 2, 'exponent': 8, 'expected_result': 256}),
("What is 3**4?", {'base': 3, 'exponent': 4, 'expected_result': 81}),
("2 to the power of 8", {'base': 2, 'exponent': 8, 'expected_result': 256}),
("5 raised to 3", {'base': 5, 'exponent': 3, 'expected_result': 125}),
]
for question, expected in test_cases:
result = self.enhancer.extract_exponentiation_components(question)
assert result is not None, f"Failed to extract components from '{question}'"
assert result['base'] == expected['base'], f"Base mismatch for '{question}'"
assert result['exponent'] == expected['exponent'], f"Exponent mismatch for '{question}'"
assert result['expected_result'] == expected['expected_result'], f"Expected result mismatch for '{question}'"
logger.info(f"β
Extraction test passed: '{question}' β {result['base']}^{result['exponent']} = {result['expected_result']}")
def test_enhance_prompt_for_exponentiation(self):
"""Test prompt enhancement for exponentiation questions."""
test_cases = [
"Calculate 2^8",
"What is 3 to the power of 4?",
"Compute 5**2",
]
for question in test_cases:
enhanced = self.enhancer.enhance_prompt_for_exponentiation(question)
# Check that enhancement occurred
assert len(enhanced) > len(question), f"Prompt not enhanced for '{question}'"
assert "Python" in enhanced, f"Enhanced prompt should mention Python for '{question}'"
assert "**" in enhanced, f"Enhanced prompt should mention ** operator for '{question}'"
assert question in enhanced, f"Original question should be preserved in '{question}'"
logger.info(f"β
Enhancement test passed: '{question}'")
logger.info(f" Enhanced length: {len(enhanced)} vs original: {len(question)}")
def test_non_exponentiation_questions_unchanged(self):
"""Test that non-exponentiation questions are not enhanced."""
test_cases = [
"Calculate 25 * 17",
"What is 144 divided by 12?",
"Add 100 and 50",
]
for question in test_cases:
enhanced = self.enhancer.enhance_prompt_for_exponentiation(question)
assert enhanced == question, f"Non-exponentiation question should not be enhanced: '{question}'"
logger.info(f"β
Non-enhancement test passed: '{question}'")
def test_validate_exponentiation_result(self):
"""Test validation of exponentiation results."""
test_cases = [
# Correct results
("Calculate 2^8", "256", True),
("What is 3**4?", "The answer is 81", True),
("2 to the power of 8", "Result: 256", True),
# Incorrect results
("Calculate 2^8", "16", False), # This is 2*8, not 2^8
("What is 3**4?", "12", False), # This is 3*4, not 3^4
("2 to the power of 8", "128", False), # Wrong result
]
for question, result, expected_valid in test_cases:
validation = self.enhancer.validate_exponentiation_result(question, result)
assert 'valid' in validation, f"Validation should include 'valid' key for '{question}'"
assert validation['valid'] == expected_valid, f"Validation failed for '{question}' with result '{result}'"
if expected_valid:
logger.info(f"β
Validation test passed (correct): '{question}' β '{result}'")
else:
logger.info(f"β
Validation test passed (incorrect detected): '{question}' β '{result}'")
assert 'expected' in validation, f"Should include expected result for incorrect answer"
assert 'actual' in validation, f"Should include actual result for incorrect answer"
def test_create_python_calculation_prompt(self):
"""Test creation of Python calculation prompts."""
test_cases = [
(2, 8, 256),
(3, 4, 81),
(5, 3, 125),
]
for base, exponent, expected_result in test_cases:
prompt = self.enhancer.create_python_calculation_prompt(base, exponent)
# Check that prompt contains necessary elements
assert str(base) in prompt, f"Prompt should contain base {base}"
assert str(exponent) in prompt, f"Prompt should contain exponent {exponent}"
assert str(expected_result) in prompt, f"Prompt should contain expected result {expected_result}"
assert "**" in prompt, f"Prompt should contain ** operator"
assert "Python" in prompt, f"Prompt should mention Python"
logger.info(f"β
Python prompt test passed: {base}^{exponent} = {expected_result}")
if __name__ == "__main__":
# Run the prompt enhancer tests
pytest.main([__file__, "-v", "-s"]) |