Created
June 24, 2014 16:25
-
-
Save JoshCheek/fedfbf8150df30f0488e to your computer and use it in GitHub Desktop.
Solution to http://tutorials.jumpstartlab.com/projects/eventmanager.html#iteration:-clean-phone-numbers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'minitest/autorun' | |
require 'minitest/pride' | |
class FormatPhoneNumber | |
class BadNumberError < StandardError | |
end | |
def initialize(raw_number) | |
@raw_number = raw_number | |
end | |
def call | |
if digits.size < 10 | |
raise BadNumberError | |
elsif digits.size == 11 && digits[0] == '1' | |
hyphenate digits[1..-1] | |
elsif digits.size >= 11 | |
raise BadNumberError | |
else | |
hyphenate digits | |
end | |
end | |
private | |
def hyphenate(digits) | |
area_code = digits[0..2] | |
exchange = digits[3..5] | |
extension = digits[6..-1] | |
"#{area_code}-#{exchange}-#{extension}" | |
end | |
def digits | |
raw_number.gsub(/\D/, '') | |
end | |
def raw_number | |
@raw_number | |
end | |
end | |
class SomeTest < Minitest::Test | |
BadNumberError = FormatPhoneNumber::BadNumberError | |
def format(number) | |
FormatPhoneNumber.new(number).call | |
end | |
def test_removes_non_digits_and_hyphenates | |
assert_equal "111-222-3333", format(" sjdklfsdj 1 lk1 kj1 ---22.2-/.,,nm33 3k3") | |
end | |
def test_raises_bad_number_error_when_less_than_10_digits | |
assert_raises BadNumberError do | |
format("1" * 9) | |
end | |
format("1" * 10) | |
end | |
def test_ignores_leading_1_on_11_digit_numbers | |
assert_equal "234-567-8901", format("12345678901") | |
end | |
def test_raises_bad_number_error_when_11_digits_and_first_number_isnt_1 | |
assert_raises BadNumberError do | |
format("23456789012") | |
end | |
end | |
def test_raises_bad_number_error_when_greater_than_11_digits | |
assert_raises BadNumberError do | |
format("123456789012") | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment