Hi,
I''m running Ruby 1.8.2 over WinXP-Pro/SP2.
I''ve written a variant of Dave Thomas'' Decimal-to-Roman
program from
PickAxe 2. I get a couple of minor differences in execution..
One difference is that my assert statements that test values need a
"to_s" to avoid failure. His do not, e.g.
assert_equal(''i'', Roman.new(1).to_s)
assert_equal(''ii'', Roman.new(2).to_s)
assert_equal(''iv'', Roman.new(4).to_s)
My statement
assert_raise(RuntimeError, Roman.new(0))
shows up in the "errors" count and a traceback is produced.
Dave''s
example shows no errors nor a traceback.
I test under SciTE and in a Command Window; they yield identical
results.
Dave''s book says he''s covering the same Ruby version
I''m using. Could
it be he''s developing on Uni* while I''m on Windows? The
code''s below
if your interested.
Thanks in Advance,
Richard
TestC.rb
=====equire ''roman3'' # No debugging code ... just one puts
statement
require ''test/unit''
class TestRoman < Test::Unit::TestCase
def test_simple
assert_equal(''i'', Roman.new(1).to_s)
assert_equal(''ii'', Roman.new(2).to_s)
assert_equal(''iv'', Roman.new(4).to_s)
assert_equal(''v'', Roman.new(5).to_s)
assert_equal(''vi'', Roman.new(6).to_s)
assert_equal(''ixx'', Roman.new(19).to_s)
assert_equal(''ic'', Roman.new(99).to_s)
assert_equal(''ci'', Roman.new(101).to_s)
assert_equal(''vmmmmm'', Roman.new(4995).to_s)
assert_equal(''immmmm'', Roman.new(4999).to_s)
assert_raise(RuntimeError, Roman.new(0))
end
end
Results
====Loaded suite TestC
Started
1=>i
2=>ii
4=>iv
5=>v
6=>vi
19=>ixx
99=>ic
101=>ci
4995=>vmmmmm
4999=>immmmm
E
Finished in 0.0 seconds.
1) Error:
test_simple(TestRoman):
RuntimeError: Roman numerals must be between 1 & 4999
./roman3.rb:9:in `initialize''
TestC.rb:15:in `new''
TestC.rb:15:in `test_simple''
1 tests, 10 assertions, 0 failures, 1 errors
Roman3.rb
=======class Roman
MAXROMAN = 4999
Symbols= [ ["m", 1000], ["d", 500], ["c", 100],
["l", 50],
["x", 10], ["v", 5], ["i", 1]
]
def initialize(value)
if value <= 0 || value > MAXROMAN
fail "Roman numerals must be between 1 & #{MAXROMAN}"
end
@value = value
end
def to_s
value = @value
roman = ""
# Check for exact match
for code, dec_equiv in Symbols
if dec_equiv == value then roman << code; value = 0; break; end
end
for code, dec_equiv in Symbols
break unless value > 0
orig_val =value
count, value = value.divmod(dec_equiv)
if (count < 0 || count * dec_equiv == orig_val)
else
for new_code, new_dec_equiv in Symbols
next unless new_dec_equiv < dec_equiv
if orig_val + new_dec_equiv == dec_equiv * (count+1)
roman << new_code
count += 1
value = orig_val + new_dec_equiv - (count * dec_equiv)
break
end
end
end
roman << (code * count)
break if value == 0
end
puts @value.to_s + ''=>'' + roman
roman
end
end
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Rimantas Liubertas
2006-Nov-20 11:27 UTC
Re: Minor discrepancies running Thomas'' "Roman" program: why?
<...>> My statement > assert_raise(RuntimeError, Roman.new(0)) > shows up in the "errors" count and a traceback is produced. Dave''s > example shows no errors nor a traceback.<...>> Dave''s book says he''s covering the same Ruby version I''m using. Could > it be he''s developing on Uni* while I''m on Windows?<...> It has nothing to do with Uni* or Windows. Your code: assert_raise(RuntimeError, Roman.new(0)) Dave''s code: assert_raise(RuntimeError) { Roman.new(0) } From the documentation of assert_raise: assert_raise(*args) {|| ...} Passes if the block raises one of the given exceptions. Your code has no block... -- Regards, Rimantas -- http://rimantas.com/ --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---