Unit Testing(Chapter 13 of Programming Ruby)
Roman
1 class Roman
2 MAX_ROMAN = 4999
3 def initialize(value)
4 if value <= 0 || value > MAX_ROMAN
5 fail "Roman values must be > 0 and <= #{MAX_ROMAN}"
6 end
7 @value = value
8 end
9
10 FACTORS = [["m", 1000], ["cm", 900], ["d", 500], ["cd", 400],
11 ["c", 100], ["xc", 90], ["l", 50], ["xl", 40],
12 ["x", 10], ["ix", 9], ["v", 5], ["iv", 4],
13 ["i", 1]]
14
15 def to_s
16 value = @value
17 roman = ""
18 for code, factor in FACTORS
19 count, value = value.divmod(factor)
20 roman << (code * count)
21 end
22 roman
23 end
24 end
2 MAX_ROMAN = 4999
3 def initialize(value)
4 if value <= 0 || value > MAX_ROMAN
5 fail "Roman values must be > 0 and <= #{MAX_ROMAN}"
6 end
7 @value = value
8 end
9
10 FACTORS = [["m", 1000], ["cm", 900], ["d", 500], ["cd", 400],
11 ["c", 100], ["xc", 90], ["l", 50], ["xl", 40],
12 ["x", 10], ["ix", 9], ["v", 5], ["iv", 4],
13 ["i", 1]]
14
15 def to_s
16 value = @value
17 roman = ""
18 for code, factor in FACTORS
19 count, value = value.divmod(factor)
20 roman << (code * count)
21 end
22 roman
23 end
24 end
Test
1 require 'roman'
2 require 'test/unit'
3
4 class RomanTest < MiniTest::Unit::TestCase
5 def test_simple
6 assert_equal("i", Roman.new(1).to_s)
7 assert_equal("ii", Roman.new(2).to_s)
8 assert_equal("iii", Roman.new(3).to_s)
9 assert_equal("iv", Roman.new(4).to_s)
10 assert_equal("ix", Roman.new(9).to_s)
11 end
12 end
2 require 'test/unit'
3
4 class RomanTest < MiniTest::Unit::TestCase
5 def test_simple
6 assert_equal("i", Roman.new(1).to_s)
7 assert_equal("ii", Roman.new(2).to_s)
8 assert_equal("iii", Roman.new(3).to_s)
9 assert_equal("iv", Roman.new(4).to_s)
10 assert_equal("ix", Roman.new(9).to_s)
11 end
12 end