Skip to content

Instantly share code, notes, and snippets.

@bensie
Created June 8, 2011 14:46
Show Gist options
  • Save bensie/1014564 to your computer and use it in GitHub Desktop.
Save bensie/1014564 to your computer and use it in GitHub Desktop.
Week 3 Exercise - Solution
class Person
attr_accessor :name, :title
def first_name
name.split[0]
end
def last_name
name.split[1]
end
end
class Company
attr_accessor :name
end
module Formatter
def formatted_address
"#{number} #{street}\n#{city}, #{state} #{zip}"
end
def formatted_phone_number
area_code = number.to_s[0..2]
local_prefix = number.to_s[3..5]
local_suffix = number.to_s[6..9]
"(#{area_code}) #{local_prefix}-#{local_suffix}"
end
def formatted_email_address
address.downcase
end
end
class Address
include Formatter
attr_reader :number, :street, :city, :state, :zip
def initialize(options)
@number = options[:number]
@street = options[:street]
@city = options[:city]
@state = options[:state]
@zip = options[:zip]
end
end
class PhoneNumber
include Formatter
attr_reader :number
def initialize(number)
# Accept a hash with the :number parameter as well as a string
if number.is_a?(Hash)
number = number[:number]
end
@number = number
end
end
class Email
include Formatter
class InvalidAddress < StandardError; end
def self.valid_address?(address)
address =~ /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
end
attr_reader :address
def initialize(address)
# Accept a hash with the :address parameter as well as a string
if address.is_a?(Hash)
address = address[:address]
end
if Email.valid_address?(address)
@address = address
else
raise InvalidAddress, "Email address is invalid"
end
end
end
require 'test/unit'
class PersonTest < Test::Unit::TestCase
def setup
@james = Person.new
@james.name = "James Miller"
@prince = Person.new
@prince.name = "Prince"
end
def test_person_has_a_full_name
assert_equal "James Miller", @james.name
assert_equal "Prince", @prince.name
end
def test_james_has_a_first_name
assert_equal "James", @james.first_name
end
def test_prince_has_a_first_name
assert_equal "Prince", @prince.first_name
end
def test_james_has_a_last_name
assert_equal "Miller", @james.last_name
end
def test_prince_does_not_have_a_last_name
assert_nil @prince.last_name
end
def test_person_can_have_a_title
@james.title = "President"
assert_equal "President", @james.title
end
end
class CompanyTest < Test::Unit::TestCase
def setup
@company = Company.new
@company.name = "SDRuby"
end
def test_company_has_a_name
assert_equal "SDRuby", @company.name
end
end
class AddressTest < Test::Unit::TestCase
def setup
@address = Address.new(
number: 9500,
street: "Gilman Drive",
city: "La Jolla",
state: "CA",
zip: "92093"
)
end
def test_address_parts
assert_equal 9500, @address.number
assert_equal "Gilman Drive", @address.street
assert_equal "La Jolla", @address.city
assert_equal "CA", @address.state
assert_equal "92093", @address.zip
end
def test_formatted_address
formatted = "9500 Gilman Drive\nLa Jolla, CA 92093"
assert_equal formatted, @address.formatted_address
end
end
class EmailTest < Test::Unit::TestCase
def test_valid_email_returns_an_email_address
email = Email.new("bensie@gmail.com")
assert_equal "bensie@gmail.com", email.address
end
def test_invalid_email_raises_an_exception
assert_raises Email::InvalidAddress do
Email.new("bensie@gmail")
end
end
def test_valid_hash_email_returns_an_email_address
email = Email.new(address: "bensie@gmail.com")
assert_equal "bensie@gmail.com", email.address
end
def test_valid_email_returns_downcased_address_when_formatted
email = Email.new("BENSIE@GMAIL.COM").formatted_email_address
end
end
class PhoneNumberTest < Test::Unit::TestCase
def setup
@phone_number1 = PhoneNumber.new(8581234567)
@phone_number2 = PhoneNumber.new(:number => 8585551212)
end
def test_phone_number_returns_the_number
assert_equal 8581234567, @phone_number1.number
assert_equal 8585551212, @phone_number2.number
end
def test_phone_number_returns_the_formatted_number
assert_equal "(858) 123-4567", @phone_number1.formatted_phone_number
assert_equal "(858) 555-1212", @phone_number2.formatted_phone_number
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment