Created
June 8, 2011 14:46
-
-
Save bensie/1014564 to your computer and use it in GitHub Desktop.
Week 3 Exercise - Solution
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
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