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