phone-number: add test template (#2137)

* Add test template for phone number

* Add additional test data

* Generate additional tests
This commit is contained in:
Trinh Quoc Anh
2019-11-20 22:15:13 +01:00
committed by Corey McCandless
parent ad801810c8
commit 8553651944
4 changed files with 97 additions and 42 deletions

View File

@@ -0,0 +1,29 @@
{
"exercise": "phone-number",
"version": "1.7.0",
"cases": [{
"description": "area code",
"property": "area_code",
"input": {
"phrase": "2234567890"
},
"expected": "223"
},
{
"description": "pretty print",
"property": "pretty",
"input": {
"phrase": "2234567890"
},
"expected": "(223) 456-7890"
},
{
"description": "pretty print with full US phone number",
"property": "pretty",
"input": {
"phrase": "12234567890"
},
"expected": "(223) 456-7890"
}
]
}

View File

@@ -0,0 +1,30 @@
{%- import "generator_macros.j2" as macros with context -%}
{% set class = exercise | camel_case -%}
{{ macros.header([class]) }}
class {{ class }}Test(unittest.TestCase):
{% for case in cases[0]["cases"] -%}
def test_{{ case["description"] | to_snake }}(self):
{% if "error" in case["expected"] -%}
with self.assertRaisesWithMessage(ValueError):
{{ class }}("{{ case["input"]["phrase"] }}")
{% else -%}
number = {{ class }}("{{ case["input"]["phrase"] }}").number
self.assertEqual(number, "{{ case["expected"] }}")
{% endif %}
{% endfor %}
# Additional tests for this track
{% for case in additional_cases -%}
def test_{{ case["description"] | to_snake }}(self):
{% set property = case["property"] -%}
{% if property == "area_code" -%}
{% set method = "" -%}
{% else -%}
{% set method = "()" -%}
{% endif -%}
number = {{ class }}("{{ case["input"]["phrase"] }}")
self.assertEqual(number.{{ case["property"] }}{{ method }}, "{{ case["expected"] }}")
{% endfor %}
{{ macros.footer() }}

View File

@@ -1,7 +1,7 @@
import re
class Phone:
class PhoneNumber:
def __init__(self, number):
self.number = self._clean(number)
self.area_code = self.number[:3]
@@ -10,18 +10,14 @@ class Phone:
def pretty(self):
return "({}) {}-{}".format(
self.area_code,
self.exchange_code,
self.subscriber_number,
self.area_code, self.exchange_code, self.subscriber_number
)
def _clean(self, number):
return self._normalize(
re.sub(r'[^\d]', '', number),
)
return self._normalize(re.sub(r"[^\d]", "", number))
def _normalize(self, number):
if len(number) == 10 or len(number) == 11 and number.startswith('1'):
if len(number) == 10 or len(number) == 11 and number.startswith("1"):
valid = number[-10] in "23456789" and number[-7] in "23456789"
else:
valid = False

View File

@@ -1,94 +1,94 @@
import unittest
from phone_number import Phone
from phone_number import PhoneNumber
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.7.0
class PhoneNumberTest(unittest.TestCase):
def test_cleans_number(self):
number = Phone("(223) 456-7890").number
def test_cleans_the_number(self):
number = PhoneNumber("(223) 456-7890").number
self.assertEqual(number, "2234567890")
def test_cleans_number_with_dots(self):
number = Phone("223.456.7890").number
def test_cleans_numbers_with_dots(self):
number = PhoneNumber("223.456.7890").number
self.assertEqual(number, "2234567890")
def test_cleans_number_with_multiple_spaces(self):
number = Phone("223 456 7890 ").number
def test_cleans_numbers_with_multiple_spaces(self):
number = PhoneNumber("223 456 7890 ").number
self.assertEqual(number, "2234567890")
def test_invalid_when_9_digits(self):
with self.assertRaisesWithMessage(ValueError):
Phone("123456789")
PhoneNumber("123456789")
def test_invalid_when_11_digits_and_first_not_1(self):
def test_invalid_when_11_digits_does_not_start_with_a_1(self):
with self.assertRaisesWithMessage(ValueError):
Phone("22234567890")
PhoneNumber("22234567890")
def test_valid_when_11_digits_and_first_is_1(self):
number = Phone("12234567890").number
def test_valid_when_11_digits_and_starting_with_1(self):
number = PhoneNumber("12234567890").number
self.assertEqual(number, "2234567890")
def test_valid_when_11_digits_and_first_is_1_with_punctuation(self):
number = Phone("+1 (223) 456-7890").number
def test_valid_when_11_digits_and_starting_with_1_even_with_punctuation(self):
number = PhoneNumber("+1 (223) 456-7890").number
self.assertEqual(number, "2234567890")
def test_invalid_when_more_than_11_digits(self):
with self.assertRaisesWithMessage(ValueError):
Phone("321234567890")
PhoneNumber("321234567890")
def test_invalid_with_letters(self):
with self.assertRaisesWithMessage(ValueError):
Phone("123-abc-7890")
PhoneNumber("123-abc-7890")
def test_invalid_with_punctuation(self):
def test_invalid_with_punctuations(self):
with self.assertRaisesWithMessage(ValueError):
Phone("123-@:!-7890")
PhoneNumber("123-@:!-7890")
def test_invalid_if_area_code_starts_with_0(self):
with self.assertRaisesWithMessage(ValueError):
Phone("(023) 456-7890")
PhoneNumber("(023) 456-7890")
def test_invalid_if_area_code_starts_with_1(self):
with self.assertRaisesWithMessage(ValueError):
Phone("(123) 456-7890")
PhoneNumber("(123) 456-7890")
def test_invalid_if_exchange_code_starts_with_0(self):
with self.assertRaisesWithMessage(ValueError):
Phone("(223) 056-7890")
PhoneNumber("(223) 056-7890")
def test_invalid_if_exchange_code_starts_with_1(self):
with self.assertRaisesWithMessage(ValueError):
Phone("(223) 156-7890")
PhoneNumber("(223) 156-7890")
def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
with self.assertRaisesWithMessage(ValueError):
Phone("1 (023) 456-7890")
PhoneNumber("1 (023) 456-7890")
def test_invalid_if_area_code_starts_with_1_on_valid_11_digit_number(self):
with self.assertRaisesWithMessage(ValueError):
Phone("1 (123) 456-7890")
PhoneNumber("1 (123) 456-7890")
def test_invalid_exchange_code_starts_with_0_valid_11_digit_number(self):
def test_invalid_if_exchange_code_starts_with_0_on_valid_11_digit_number(self):
with self.assertRaisesWithMessage(ValueError):
Phone("1 (223) 056-7890")
PhoneNumber("1 (223) 056-7890")
def test_invalid_exchange_code_starts_with_1_valid_11_digit_number(self):
def test_invalid_if_exchange_code_starts_with_1_on_valid_11_digit_number(self):
with self.assertRaisesWithMessage(ValueError):
Phone("1 (223) 156-7890")
PhoneNumber("1 (223) 156-7890")
# Track specific tests
# Additional tests for this track
def test_area_code(self):
number = Phone("2234567890")
number = PhoneNumber("2234567890")
self.assertEqual(number.area_code, "223")
def test_pretty_print(self):
number = Phone("2234567890")
number = PhoneNumber("2234567890")
self.assertEqual(number.pretty(), "(223) 456-7890")
def test_pretty_print_with_full_us_phone_number(self):
number = Phone("12234567890")
number = PhoneNumber("12234567890")
self.assertEqual(number.pretty(), "(223) 456-7890")
# Utility functions
@@ -96,5 +96,5 @@ class PhoneNumberTest(unittest.TestCase):
return self.assertRaisesRegex(exception, r".+")
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main()