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