1require 'test/unit'
2require 'digest'
3require_relative '../with_different_ofs.rb'
4
5class TestDigestExtend < Test::Unit::TestCase
6  extend DifferentOFS
7
8  class MyDigest < Digest::Class
9    def initialize(*arg)
10      super
11      @buf = []
12    end
13
14    def initialize_copy(org)
15      @buf = org.buf.dup
16    end
17
18    def update(arg)
19      @buf << arg
20      self
21    end
22
23    alias << update
24
25    def finish
26      (@buf.join('').length % 256).chr
27    end
28
29    def reset
30      @buf.clear
31      self
32    end
33
34  protected
35
36    def buf
37      @buf
38    end
39  end
40
41  def setup
42    @MyDigest = Class.new(MyDigest)
43  end
44
45  def test_digest_s_hexencode
46    assert_equal('', Digest.hexencode(''))
47    assert_equal('0102', Digest.hexencode("\1\2"))
48    assert_equal(
49      (0..0xff).to_a.map { |c| sprintf("%02x", c ) }.join(''),
50      Digest.hexencode((0..0xff).to_a.map { |c| c.chr }.join(''))
51    )
52    assert_equal(Encoding::US_ASCII, Digest.hexencode("\1\2").encoding)
53  end
54
55  def test_class_reset
56    a = Digest::SHA1.new
57    base = a.to_s
58    assert_equal(base, a.reset.to_s)
59    b = a.new
60    assert_equal(base, b.to_s)
61    b.update('1')
62    assert_not_equal(base, b.to_s)
63    assert_equal(base, b.reset.to_s)
64  end
65
66  def test_digest
67    assert_equal("\3", MyDigest.digest("foo"))
68  end
69
70  def test_hexdigest
71    assert_equal("03", @MyDigest.hexdigest("foo"))
72  end
73
74  def test_context
75    digester = @MyDigest.new
76    digester.update("foo")
77    assert_equal("\3", digester.digest)
78    digester.update("foobar")
79    assert_equal("\t", digester.digest)
80    digester.update("foo")
81    assert_equal("\f", digester.digest)
82  end
83
84  def test_new
85    a = Digest::SHA1.new
86    b = a.new
87    obj = a.to_s
88    assert_equal(obj, a.to_s)
89    assert_equal(obj, b.to_s)
90    a.update('1')
91    assert_not_equal(obj, a.to_s)
92    assert_equal(obj, b.to_s)
93  end
94
95  def test_digest_hexdigest
96    [:digest, :hexdigest].each do |m|
97      exp_1st = "\3"; exp_1st = Digest.hexencode(exp_1st) if m == :hexdigest
98      exp_2nd = "\6"; exp_2nd = Digest.hexencode(exp_2nd) if m == :hexdigest
99      digester = @MyDigest.new
100      digester.update("foo")
101      obj = digester.send(m)
102      # digest w/o param does not reset the org digester.
103      assert_equal(exp_1st, obj)
104      digester.update("bar")
105      obj = digester.send(m)
106      assert_equal(exp_2nd, obj)
107      obj = digester.send(m, "baz")
108      # digest with param resets the org digester.
109      assert_equal(exp_1st, obj)
110    end
111  end
112
113  def test_digest_hexdigest_bang
114    [:digest!, :hexdigest!].each do |m|
115      exp_1st = "\3"; exp_1st = Digest.hexencode(exp_1st) if m == :hexdigest!
116      digester = @MyDigest.new
117      digester.update("foo")
118      obj = digester.send(m) # digest! always resets the org digester.
119      assert_equal(exp_1st, obj)
120      digester.update("bar")
121      obj = digester.send(m)
122      assert_equal(exp_1st, obj)
123    end
124  end
125
126  def test_to_s
127    digester = @MyDigest.new
128    digester.update("foo")
129    assert_equal("03", digester.to_s)
130  end
131
132  def test_length
133    @MyDigest.class_eval do
134      def digest_length
135        2
136      end
137    end
138    digester = @MyDigest.new
139    assert_equal(2, digester.length)
140    assert_equal(2, digester.size)
141  end
142
143  def test_digest_length # breaks @MyDigest#digest_length
144    assert_equal(1, @MyDigest.new.digest_length)
145    @MyDigest.class_eval do
146      def digest_length
147        2
148      end
149    end
150    assert_equal(2, @MyDigest.new.digest_length)
151  end
152
153  def test_block_length
154    assert_raises(RuntimeError) do
155      @MyDigest.new.block_length
156    end
157  end
158end
159