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