$5 + 10 CHF = $10 if rate is 2:1
$5 * 2 - $10
Make "amount" private
Dollar side effects?
Money rounding?
equals()
hashCode()
Equal null
Equal object
5 CHF * 2 - 10 CHF
Dollar/Franc duplication
Common equals
Common times
public void testMultiplication {
Dollar five = new Dollar(5);
assertEquals(new Dollar(10), five.times(2));
assertEquals(new Dollar(15), five.times(3));
}
require 'test/unit'
require 'dollar.rb'
require 'franc.rb'
class TestDollar < Test::Unit::TestCase
def test_multiplication
five = Dollar.new(5)
assert_equal(five.times(2), Dollar.new(10))
assert_equal(five.times(3), Dollar.new(15))
end
def test_franc_multiplication
five = Franc.new(5)
assert_equal(five.times(2), Franc.new(10))
assert_equal(five.times(3), Franc.new(15))
end
def test_equality
assert_equal(Dollar.new(5), Dollar.new(5))
assert_not_equal(Dollar.new(5), Dollar.new(6))
end
def test_franc_equality
assert_equal(Franc.new(5), Franc.new(5))
assert_not_equal(Franc.new(5), Franc.new(6))
end
end
require 'spec'
require 'dollar.rb'
require 'franc.rb'
class DollarSpecification < Spec::Context
def dollar_multiplication
five = Dollar.new(5)
five.times(2).should.equal Dollar.new(10)
five.times(3).should.equal Dollar.new(15)
end
def franc_multiplication
five = Franc.new(5)
five.times(2).should.equal Franc.new(10)
five.times(3).should.equal Franc.new(15)
end
def dollar_equality
Dollar.new(5).should.equal Dollar.new(5)
Dollar.new(5).should.not.equal Dollar.new(6)
end
def franc_equality
Franc.new(5).should.equal Franc.new(5)
Franc.new(5).should.not.equal Franc.new(6)
end
end
class Dollar
attr_reader :amount
def initialize(amount)
@amount = amount
end
def times(multiplier)
Dollar.new(@amount * multiplier)
end
def eql?(object)
self == (object)
end
def ==(object)
object.equal?(self) ||
(object.instance_of?(self.class) && object.amount == @amount)
end
end
class Franc
attr_reader :amount
def initialize(amount)
@amount = amount
end
def times(multiplier)
Franc.new(@amount * multiplier)
end
def eql?(object)
self == (object)
end
def ==(object)
object.equal?(self) ||
(object.instance_of?(self.class) && object.amount == @amount)
end
end