After a long weekend in the garden...
module Com_ravnaandtines
module Zlib
class Adler32
# largest prime smaller than 65536
@@ADLER_BASE = 65521
def initialize
@value = 1
end
def update(buffer)
if not buffer
return @value
end
## build up the checksum
low = @value & 0xffff
high = (@value >> 16) & 0xffff
buffer.each do |x|
low += (x.to_i & 0xff)
high += low
end
## collapse into modular parts
low %= @@ADLER_BASE
high %= @@ADLER_BASE
@value = (high << 16) | low
end
def reset
@value = 1
end
end
end
end
and tweak the tests thus:
def basic_test_engine(seq, expected)
## string to array
## otherwise expect an each method to yield integers
if seq.respond_to? :unpack
seq = seq.unpack("C*")
end
adler = Com_ravnaandtines::Zlib::Adler32.new()
a = adler.update(seq)
assert_equal(expected, a)
end
def test_boundary
basic_test_engine(nil, 1)
end
That feels better. No special cases, no leakage of state. Looking at JZlib, most of the work will be in doing the encapsulation properly.
Next up, though, when time and energy combine, more on the IronPython FTP client.


No comments:
Post a Comment