Skip to content

Instantly share code, notes, and snippets.

@JoshCheek
Created June 24, 2014 16:25
Show Gist options
  • Save JoshCheek/fedfbf8150df30f0488e to your computer and use it in GitHub Desktop.
Save JoshCheek/fedfbf8150df30f0488e to your computer and use it in GitHub Desktop.
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