Skip to content

Commit 8553651

Browse files
tqa236cmccandless
authored andcommitted
phone-number: add test template (#2137)
* Add test template for phone number * Add additional test data * Generate additional tests
1 parent ad80181 commit 8553651

File tree

4 files changed

+97
-42
lines changed

4 files changed

+97
-42
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"exercise": "phone-number",
3+
"version": "1.7.0",
4+
"cases": [{
5+
"description": "area code",
6+
"property": "area_code",
7+
"input": {
8+
"phrase": "2234567890"
9+
},
10+
"expected": "223"
11+
},
12+
{
13+
"description": "pretty print",
14+
"property": "pretty",
15+
"input": {
16+
"phrase": "2234567890"
17+
},
18+
"expected": "(223) 456-7890"
19+
},
20+
{
21+
"description": "pretty print with full US phone number",
22+
"property": "pretty",
23+
"input": {
24+
"phrase": "12234567890"
25+
},
26+
"expected": "(223) 456-7890"
27+
}
28+
]
29+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{%- import "generator_macros.j2" as macros with context -%}
2+
{% set class = exercise | camel_case -%}
3+
{{ macros.header([class]) }}
4+
5+
class {{ class }}Test(unittest.TestCase):
6+
{% for case in cases[0]["cases"] -%}
7+
def test_{{ case["description"] | to_snake }}(self):
8+
{% if "error" in case["expected"] -%}
9+
with self.assertRaisesWithMessage(ValueError):
10+
{{ class }}("{{ case["input"]["phrase"] }}")
11+
{% else -%}
12+
number = {{ class }}("{{ case["input"]["phrase"] }}").number
13+
self.assertEqual(number, "{{ case["expected"] }}")
14+
{% endif %}
15+
{% endfor %}
16+
17+
# Additional tests for this track
18+
{% for case in additional_cases -%}
19+
def test_{{ case["description"] | to_snake }}(self):
20+
{% set property = case["property"] -%}
21+
{% if property == "area_code" -%}
22+
{% set method = "" -%}
23+
{% else -%}
24+
{% set method = "()" -%}
25+
{% endif -%}
26+
number = {{ class }}("{{ case["input"]["phrase"] }}")
27+
self.assertEqual(number.{{ case["property"] }}{{ method }}, "{{ case["expected"] }}")
28+
{% endfor %}
29+
30+
{{ macros.footer() }}

exercises/phone-number/example.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import re
22

33

4-
class Phone:
4+
class PhoneNumber:
55
def __init__(self, number):
66
self.number = self._clean(number)
77
self.area_code = self.number[:3]
@@ -10,18 +10,14 @@ def __init__(self, number):
1010

1111
def pretty(self):
1212
return "({}) {}-{}".format(
13-
self.area_code,
14-
self.exchange_code,
15-
self.subscriber_number,
13+
self.area_code, self.exchange_code, self.subscriber_number
1614
)
1715

1816
def _clean(self, number):
19-
return self._normalize(
20-
re.sub(r'[^\d]', '', number),
21-
)
17+
return self._normalize(re.sub(r"[^\d]", "", number))
2218

2319
def _normalize(self, number):
24-
if len(number) == 10 or len(number) == 11 and number.startswith('1'):
20+
if len(number) == 10 or len(number) == 11 and number.startswith("1"):
2521
valid = number[-10] in "23456789" and number[-7] in "23456789"
2622
else:
2723
valid = False
Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,100 @@
11
import unittest
22

3-
from phone_number import Phone
4-
3+
from phone_number import PhoneNumber
54

65
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.7.0
76

7+
88
class PhoneNumberTest(unittest.TestCase):
9-
def test_cleans_number(self):
10-
number = Phone("(223) 456-7890").number
9+
def test_cleans_the_number(self):
10+
number = PhoneNumber("(223) 456-7890").number
1111
self.assertEqual(number, "2234567890")
1212

13-
def test_cleans_number_with_dots(self):
14-
number = Phone("223.456.7890").number
13+
def test_cleans_numbers_with_dots(self):
14+
number = PhoneNumber("223.456.7890").number
1515
self.assertEqual(number, "2234567890")
1616

17-
def test_cleans_number_with_multiple_spaces(self):
18-
number = Phone("223 456 7890 ").number
17+
def test_cleans_numbers_with_multiple_spaces(self):
18+
number = PhoneNumber("223 456 7890 ").number
1919
self.assertEqual(number, "2234567890")
2020

2121
def test_invalid_when_9_digits(self):
2222
with self.assertRaisesWithMessage(ValueError):
23-
Phone("123456789")
23+
PhoneNumber("123456789")
2424

25-
def test_invalid_when_11_digits_and_first_not_1(self):
25+
def test_invalid_when_11_digits_does_not_start_with_a_1(self):
2626
with self.assertRaisesWithMessage(ValueError):
27-
Phone("22234567890")
27+
PhoneNumber("22234567890")
2828

29-
def test_valid_when_11_digits_and_first_is_1(self):
30-
number = Phone("12234567890").number
29+
def test_valid_when_11_digits_and_starting_with_1(self):
30+
number = PhoneNumber("12234567890").number
3131
self.assertEqual(number, "2234567890")
3232

33-
def test_valid_when_11_digits_and_first_is_1_with_punctuation(self):
34-
number = Phone("+1 (223) 456-7890").number
33+
def test_valid_when_11_digits_and_starting_with_1_even_with_punctuation(self):
34+
number = PhoneNumber("+1 (223) 456-7890").number
3535
self.assertEqual(number, "2234567890")
3636

3737
def test_invalid_when_more_than_11_digits(self):
3838
with self.assertRaisesWithMessage(ValueError):
39-
Phone("321234567890")
39+
PhoneNumber("321234567890")
4040

4141
def test_invalid_with_letters(self):
4242
with self.assertRaisesWithMessage(ValueError):
43-
Phone("123-abc-7890")
43+
PhoneNumber("123-abc-7890")
4444

45-
def test_invalid_with_punctuation(self):
45+
def test_invalid_with_punctuations(self):
4646
with self.assertRaisesWithMessage(ValueError):
47-
Phone("123-@:!-7890")
47+
PhoneNumber("123-@:!-7890")
4848

4949
def test_invalid_if_area_code_starts_with_0(self):
5050
with self.assertRaisesWithMessage(ValueError):
51-
Phone("(023) 456-7890")
51+
PhoneNumber("(023) 456-7890")
5252

5353
def test_invalid_if_area_code_starts_with_1(self):
5454
with self.assertRaisesWithMessage(ValueError):
55-
Phone("(123) 456-7890")
55+
PhoneNumber("(123) 456-7890")
5656

5757
def test_invalid_if_exchange_code_starts_with_0(self):
5858
with self.assertRaisesWithMessage(ValueError):
59-
Phone("(223) 056-7890")
59+
PhoneNumber("(223) 056-7890")
6060

6161
def test_invalid_if_exchange_code_starts_with_1(self):
6262
with self.assertRaisesWithMessage(ValueError):
63-
Phone("(223) 156-7890")
63+
PhoneNumber("(223) 156-7890")
6464

6565
def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
6666
with self.assertRaisesWithMessage(ValueError):
67-
Phone("1 (023) 456-7890")
67+
PhoneNumber("1 (023) 456-7890")
6868

6969
def test_invalid_if_area_code_starts_with_1_on_valid_11_digit_number(self):
7070
with self.assertRaisesWithMessage(ValueError):
71-
Phone("1 (123) 456-7890")
71+
PhoneNumber("1 (123) 456-7890")
7272

73-
def test_invalid_exchange_code_starts_with_0_valid_11_digit_number(self):
73+
def test_invalid_if_exchange_code_starts_with_0_on_valid_11_digit_number(self):
7474
with self.assertRaisesWithMessage(ValueError):
75-
Phone("1 (223) 056-7890")
75+
PhoneNumber("1 (223) 056-7890")
7676

77-
def test_invalid_exchange_code_starts_with_1_valid_11_digit_number(self):
77+
def test_invalid_if_exchange_code_starts_with_1_on_valid_11_digit_number(self):
7878
with self.assertRaisesWithMessage(ValueError):
79-
Phone("1 (223) 156-7890")
79+
PhoneNumber("1 (223) 156-7890")
8080

81-
# Track specific tests
81+
# Additional tests for this track
8282
def test_area_code(self):
83-
number = Phone("2234567890")
83+
number = PhoneNumber("2234567890")
8484
self.assertEqual(number.area_code, "223")
8585

8686
def test_pretty_print(self):
87-
number = Phone("2234567890")
87+
number = PhoneNumber("2234567890")
8888
self.assertEqual(number.pretty(), "(223) 456-7890")
8989

9090
def test_pretty_print_with_full_us_phone_number(self):
91-
number = Phone("12234567890")
91+
number = PhoneNumber("12234567890")
9292
self.assertEqual(number.pretty(), "(223) 456-7890")
9393

9494
# Utility functions
9595
def assertRaisesWithMessage(self, exception):
9696
return self.assertRaisesRegex(exception, r".+")
9797

9898

99-
if __name__ == '__main__':
99+
if __name__ == "__main__":
100100
unittest.main()

0 commit comments

Comments
 (0)