Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.

Commit 6f99817

Browse files
Add Tests for PR#1245
1 parent 0f22cae commit 6f99817

File tree

3 files changed

+488
-1
lines changed

3 files changed

+488
-1
lines changed

api/gen_ai/tests/test_math.py

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
import math
2+
import unittest
3+
from datetime import datetime
4+
5+
import pytest
6+
from api.gen_ai.math import (
7+
Calculator,
8+
DataProcessor,
9+
StringManipulator,
10+
add,
11+
divide,
12+
factorial,
13+
fibonacci,
14+
is_prime,
15+
merge_dicts,
16+
parse_date,
17+
safe_list_access,
18+
subtract,
19+
)
20+
21+
22+
class TestBasicArithmeticFunctions(unittest.TestCase):
23+
def test_add(self):
24+
self.assertEqual(add(2, 3), 5)
25+
self.assertEqual(add(-1, 1), 0)
26+
self.assertEqual(add(0, 0), 0)
27+
self.assertEqual(add(2.5, 3.5), 6.0)
28+
29+
def test_subtract(self):
30+
self.assertEqual(subtract(5, 3), 2)
31+
self.assertEqual(subtract(1, 1), 0)
32+
self.assertEqual(subtract(0, 5), -5)
33+
self.assertEqual(subtract(5.5, 2.5), 3.0)
34+
35+
def test_divide(self):
36+
self.assertEqual(divide(6, 3), 2)
37+
self.assertEqual(divide(5, 2), 2.5)
38+
self.assertEqual(divide(0, 5), 0)
39+
self.assertEqual(divide(-6, 3), -2)
40+
41+
def test_divide_by_zero(self):
42+
with self.assertRaises(ValueError) as context:
43+
divide(5, 0)
44+
self.assertEqual(str(context.exception), "Division by zero is not allowed")
45+
46+
47+
class TestFactorial(unittest.TestCase):
48+
def test_factorial_positive(self):
49+
self.assertEqual(factorial(0), 1)
50+
self.assertEqual(factorial(1), 1)
51+
self.assertEqual(factorial(5), 120)
52+
self.assertEqual(factorial(10), 3628800)
53+
54+
def test_factorial_negative(self):
55+
with self.assertRaises(ValueError) as context:
56+
factorial(-1)
57+
self.assertEqual(str(context.exception), "Negative numbers do not have factorials")
58+
59+
60+
class TestIsPrime(unittest.TestCase):
61+
def test_is_prime(self):
62+
self.assertFalse(is_prime(0))
63+
self.assertFalse(is_prime(1))
64+
self.assertTrue(is_prime(2))
65+
self.assertTrue(is_prime(3))
66+
self.assertFalse(is_prime(4))
67+
self.assertTrue(is_prime(5))
68+
self.assertFalse(is_prime(6))
69+
self.assertTrue(is_prime(7))
70+
self.assertTrue(is_prime(11))
71+
self.assertTrue(is_prime(13))
72+
self.assertTrue(is_prime(17))
73+
self.assertTrue(is_prime(19))
74+
self.assertTrue(is_prime(97))
75+
self.assertFalse(is_prime(100))
76+
77+
78+
class TestFibonacci(unittest.TestCase):
79+
def test_fibonacci(self):
80+
self.assertEqual(fibonacci(0), 0)
81+
self.assertEqual(fibonacci(1), 1)
82+
self.assertEqual(fibonacci(2), 1)
83+
self.assertEqual(fibonacci(3), 2)
84+
self.assertEqual(fibonacci(4), 3)
85+
self.assertEqual(fibonacci(5), 5)
86+
self.assertEqual(fibonacci(6), 8)
87+
self.assertEqual(fibonacci(10), 55)
88+
89+
def test_fibonacci_negative(self):
90+
with self.assertRaises(ValueError) as context:
91+
fibonacci(-1)
92+
self.assertEqual(str(context.exception), "n must be a non-negative integer")
93+
94+
95+
class TestCalculator(unittest.TestCase):
96+
def setUp(self):
97+
self.calc = Calculator()
98+
99+
def test_add(self):
100+
self.assertEqual(self.calc.add(2, 3), 5)
101+
102+
def test_subtract(self):
103+
self.assertEqual(self.calc.subtract(5, 3), 2)
104+
105+
def test_multiply(self):
106+
self.assertEqual(self.calc.multiply(2, 3), 6)
107+
108+
def test_divide(self):
109+
self.assertEqual(self.calc.divide(6, 3), 2)
110+
self.assertEqual(self.calc.divide(5, 2), 2.5)
111+
112+
def test_divide_by_zero(self):
113+
with self.assertRaises(ValueError) as context:
114+
self.calc.divide(5, 0)
115+
self.assertEqual(str(context.exception), "Cannot divide by zero")
116+
117+
def test_memory_operations(self):
118+
self.calc.store(5)
119+
self.assertEqual(self.calc.recall(), 5)
120+
self.calc.store(10)
121+
self.assertEqual(self.calc.recall(), 10)
122+
123+
124+
class TestStringManipulator(unittest.TestCase):
125+
def test_reverse_string(self):
126+
self.assertEqual(StringManipulator.reverse_string("hello"), "olleh")
127+
self.assertEqual(StringManipulator.reverse_string(""), "")
128+
self.assertEqual(StringManipulator.reverse_string("a"), "a")
129+
self.assertEqual(StringManipulator.reverse_string("12345"), "54321")
130+
131+
def test_is_palindrome(self):
132+
self.assertTrue(StringManipulator.is_palindrome("racecar"))
133+
self.assertTrue(StringManipulator.is_palindrome("A man, a plan, a canal: Panama"))
134+
self.assertTrue(StringManipulator.is_palindrome(""))
135+
self.assertTrue(StringManipulator.is_palindrome("a"))
136+
self.assertFalse(StringManipulator.is_palindrome("hello"))
137+
self.assertFalse(StringManipulator.is_palindrome("world"))
138+
139+
140+
class TestDataProcessor(unittest.TestCase):
141+
def test_get_mean(self):
142+
dp = DataProcessor([1, 2, 3, 4, 5])
143+
self.assertEqual(dp.get_mean(), 3.0)
144+
145+
def test_get_variance(self):
146+
dp = DataProcessor([1, 2, 3, 4, 5])
147+
self.assertEqual(dp.get_variance(), 2.5)
148+
149+
def test_normalize(self):
150+
dp = DataProcessor([1, 2, 3, 4, 5])
151+
normalized = dp.normalize()
152+
expected = [
153+
-1.264911064067352,
154+
-0.6324555320336759,
155+
0.0,
156+
0.6324555320336759,
157+
1.264911064067352,
158+
]
159+
for i in range(len(normalized)):
160+
self.assertAlmostEqual(normalized[i], expected[i])
161+
162+
def test_empty_data(self):
163+
with self.assertRaises(ValueError) as context:
164+
dp = DataProcessor([])
165+
self.assertEqual(str(context.exception), "Data list cannot be empty")
166+
167+
def test_variance_single_value(self):
168+
dp = DataProcessor([5])
169+
with self.assertRaises(ValueError) as context:
170+
dp.get_variance()
171+
self.assertEqual(str(context.exception), "At least two data points are required to compute variance")
172+
173+
174+
class TestUtilityFunctions(unittest.TestCase):
175+
def test_parse_date(self):
176+
self.assertEqual(parse_date("2023-01-01"), datetime(2023, 1, 1))
177+
with self.assertRaises(ValueError):
178+
parse_date("01/01/2023")
179+
180+
def test_safe_list_access(self):
181+
test_list = [1, 2, 3]
182+
self.assertEqual(safe_list_access(test_list, 1), 2)
183+
self.assertEqual(safe_list_access(test_list, 5), None)
184+
self.assertEqual(safe_list_access(test_list, 5, "default"), "default")
185+
186+
def test_merge_dicts(self):
187+
dict1 = {"a": 1, "b": {"c": 2, "d": 3}}
188+
dict2 = {"b": {"e": 4}, "f": 5}
189+
result = merge_dicts(dict1, dict2)
190+
expected = {"a": 1, "b": {"c": 2, "d": 3, "e": 4}, "f": 5}
191+
self.assertEqual(result, expected)

0 commit comments

Comments
 (0)