Skip to content

Commit 340866a

Browse files
authored
Merge branch 'master' into python-pycache
2 parents 4e6fc6e + bd9d2c3 commit 340866a

File tree

327 files changed

+14647
-19000
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

327 files changed

+14647
-19000
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Write Unit Tests for Your Python Code With ChatGPT
2+
3+
This folder provides the code examples for the Real Python tutorial [Write Unit Tests for Your Python Code With ChatGPT](https://realpython.com/chatgpt-unit-tests-python/).
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from collections import Counter
2+
3+
4+
def add(x, y):
5+
return x + y
6+
7+
8+
def subtract(x, y):
9+
return x - y
10+
11+
12+
def multiply(x, y):
13+
return x * y
14+
15+
16+
def divide(x, y):
17+
if y == 0:
18+
raise ValueError("Cannot divide by zero.")
19+
return x / y
20+
21+
22+
def mean(data):
23+
return sum(data) / len(data)
24+
25+
26+
def median(data):
27+
n = len(data)
28+
index = n // 2
29+
if n % 2:
30+
return sorted(data)[index]
31+
return sum(sorted(data)[index - 1 : index + 1]) / 2
32+
33+
34+
def mode(data):
35+
c = Counter(data)
36+
return [k for k, v in c.items() if v == c.most_common(1)[0][1]]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
def fizzbuzz(number):
2+
if number % 15 == 0:
3+
return "fizz buzz"
4+
elif number % 3 == 0:
5+
return "fizz"
6+
elif number % 5 == 0:
7+
return "buzz"
8+
else:
9+
return number
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
def fizzbuzz(number):
2+
"""Solves the FizzBuzz problem.
3+
4+
Return "fizz" for numbers divisible by 3,
5+
"buzz" for numbers divisible by 5,
6+
"fizz buzz" for numbers divisible by both,
7+
and the number itself otherwise.
8+
9+
>>> fizzbuzz(3)
10+
'fizz'
11+
>>> fizzbuzz(5)
12+
'buzz'
13+
>>> fizzbuzz(15)
14+
'fizz buzz'
15+
>>> fizzbuzz(4)
16+
4
17+
>>> fizzbuzz(30)
18+
'fizz buzz'
19+
>>> fizzbuzz(9)
20+
'fizz'
21+
>>> fizzbuzz(10)
22+
'buzz'
23+
"""
24+
25+
if number % 15 == 0:
26+
return "fizz buzz"
27+
elif number % 3 == 0:
28+
return "fizz"
29+
elif number % 5 == 0:
30+
return "buzz"
31+
else:
32+
return number
33+
34+
35+
if __name__ == "__main__":
36+
import doctest
37+
38+
doctest.testmod()
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import pytest
2+
3+
4+
def in_interval(number: int, start: int, end: int) -> bool:
5+
return start <= number <= end
6+
7+
8+
@pytest.mark.parametrize(
9+
"number, start, end, expected",
10+
[
11+
(5, 1, 10, True), # Test case inside the interval
12+
(1, 1, 10, True), # Edge case: number equals start
13+
(10, 1, 10, True), # Edge case: number equals end
14+
(0, 1, 10, False), # Number below the interval
15+
(11, 1, 10, False), # Number above the interval
16+
(5, 5, 5, True), # Edge case: start equals end equals number
17+
(-1, -5, 5, True), # Test case with negative numbers
18+
(-6, -5, 5, False), # Number below the interval with negatives
19+
],
20+
)
21+
def test_in_interval(number, start, end, expected):
22+
assert in_interval(number, start, end) == expected

chatgpt-unit-tests-python/prime.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import pytest
2+
3+
4+
def is_prime(number: int) -> bool:
5+
if number <= 1:
6+
return False
7+
for i in range(2, int(number**0.5) + 1):
8+
if number % i == 0:
9+
return False
10+
return True
11+
12+
13+
@pytest.mark.parametrize(
14+
"number, expected",
15+
[
16+
(2, True), # Smallest prime
17+
(3, True), # Prime
18+
(4, False), # Composite (2*2)
19+
(5, True), # Prime
20+
(11, True), # Prime
21+
(12, False), # Composite (2*6)
22+
(13, True), # Prime
23+
(25, False), # Composite (5*5)
24+
(29, True), # Prime
25+
(1, False), # Not prime by definition
26+
(0, False), # Not prime
27+
(-1, False), # Negative number
28+
(-11, False), # Negative number
29+
],
30+
)
31+
def test_is_prime(number, expected):
32+
assert is_prime(number) == expected
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import json
2+
3+
4+
class JSONReader:
5+
def __init__(self, filename):
6+
self.filename = filename
7+
8+
def read(self):
9+
with open(self.filename, encoding="utf-8") as file:
10+
return json.load(file)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import unittest
2+
3+
from calculations import add, divide, mean, median, mode, multiply, subtract
4+
5+
6+
class TestArithmeticOperations(unittest.TestCase):
7+
def test_add(self):
8+
self.assertEqual(add(10, 5), 15)
9+
self.assertEqual(add(-1, 1), 0)
10+
self.assertEqual(add(-1, -1), -2)
11+
12+
def test_subtract(self):
13+
self.assertEqual(subtract(10, 5), 5)
14+
self.assertEqual(subtract(-1, 1), -2)
15+
self.assertEqual(subtract(-1, -1), 0)
16+
17+
def test_multiply(self):
18+
self.assertEqual(multiply(10, 5), 50)
19+
self.assertEqual(multiply(-1, 1), -1)
20+
self.assertEqual(multiply(-1, -1), 1)
21+
22+
def test_divide(self):
23+
self.assertEqual(divide(10, 5), 2)
24+
self.assertEqual(divide(-1, 1), -1)
25+
self.assertEqual(divide(-1, -1), 1)
26+
with self.assertRaises(ValueError):
27+
divide(10, 0)
28+
29+
30+
class TestStatisticalOperations(unittest.TestCase):
31+
def test_mean(self):
32+
self.assertEqual(mean([1, 2, 3, 4, 5]), 3)
33+
self.assertEqual(mean([1, 2, 3, 4, 5, 6]), 3.5)
34+
35+
def test_median_odd(self):
36+
self.assertEqual(median([1, 3, 3, 6, 7, 8, 9]), 6)
37+
38+
def test_median_even(self):
39+
self.assertEqual(median([1, 2, 3, 4, 5, 6, 8, 9]), 4.5)
40+
41+
def test_median_unsorted(self):
42+
self.assertEqual(median([7, 1, 3, 3, 2, 6]), 3)
43+
44+
def test_mode_single(self):
45+
self.assertEqual(mode([1, 2, 2, 3, 4, 4, 4, 5]), [4])
46+
47+
def test_mode_multiple(self):
48+
self.assertEqual(set(mode([1, 1, 2, 3, 4, 4, 5, 5])), {1, 4, 5})
49+
50+
51+
def load_tests(loader, tests, pattern):
52+
suite = unittest.TestSuite()
53+
# suite.addTests(loader.loadTestsFromTestCase(TestArithmeticOperations))
54+
suite.addTests(loader.loadTestsFromTestCase(TestStatisticalOperations))
55+
return suite
56+
57+
58+
if __name__ == "__main__":
59+
unittest.main()
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import pytest
2+
3+
from fizzbuzz import fizzbuzz
4+
5+
# def test_fizzbuzz_with_number_divisible_by_15():
6+
# assert fizzbuzz(30) == "fizz buzz"
7+
8+
9+
# def test_fizzbuzz_with_number_divisible_by_3():
10+
# assert fizzbuzz(9) == "fizz"
11+
12+
13+
# def test_fizzbuzz_with_number_divisible_by_5():
14+
# assert fizzbuzz(10) == "buzz"
15+
16+
17+
# def test_fizzbuzz_with_number_not_divisible_by_3_or_5():
18+
# assert fizzbuzz(4) == 4
19+
20+
21+
# def test_fizzbuzz_with_zero():
22+
# assert fizzbuzz(0) == "fizz buzz"
23+
24+
25+
@pytest.mark.parametrize(
26+
"input,expected",
27+
[
28+
(30, "fizz buzz"), # Divisible by 15
29+
(9, "fizz"), # Divisible by 3
30+
(10, "buzz"), # Divisible by 5
31+
(4, 4), # Not divisible by 3 or 5
32+
(0, "fizz buzz"), # Edge case: 0 (divisible by 15)
33+
(33, "fizz"), # Additional case: Divisible by 3
34+
(55, "buzz"), # Additional case: Divisible by 5
35+
(98, 98), # Additional case: Not divisible by 3 or 5
36+
],
37+
)
38+
def test_fizzbuzz(input, expected):
39+
assert (
40+
fizzbuzz(input) == expected
41+
), f"Expected {expected} for input {input}"
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import unittest
2+
3+
from fizzbuzz import fizzbuzz
4+
5+
6+
class TestFizzBuzz(unittest.TestCase):
7+
def test_fizz(self):
8+
"""Test numbers divisible by 3 but not by 5"""
9+
self.assertEqual(fizzbuzz(3), "fizz")
10+
self.assertEqual(fizzbuzz(6), "fizz")
11+
self.assertNotEqual(fizzbuzz(15), "fizz")
12+
13+
def test_buzz(self):
14+
"""Test numbers divisible by 5 but not by 3"""
15+
self.assertEqual(fizzbuzz(5), "buzz")
16+
self.assertEqual(fizzbuzz(10), "buzz")
17+
self.assertNotEqual(fizzbuzz(15), "buzz")
18+
19+
def test_fizz_buzz(self):
20+
"""Test numbers divisible by both 3 and 5"""
21+
self.assertEqual(fizzbuzz(15), "fizz buzz")
22+
self.assertEqual(fizzbuzz(30), "fizz buzz")
23+
24+
def test_neither(self):
25+
"""Test numbers not divisible by 3 or 5"""
26+
self.assertEqual(fizzbuzz(1), 1)
27+
self.assertEqual(fizzbuzz(2), 2)
28+
self.assertEqual(fizzbuzz(4), 4)
29+
30+
31+
if __name__ == "__main__":
32+
unittest.main()

0 commit comments

Comments
 (0)