Class: TestBench::Output::Digest

Inherits:
Object
  • Object
show all
Defined in:
lib/test_bench/output/digest.rb

Defined Under Namespace

Modules: Defaults Classes: Null

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#bufferObject



9
10
11
# File 'lib/test_bench/output/digest.rb', line 9

def buffer
  @buffer ||= String.new(encoding: 'BINARY', capacity: Defaults.size_bytes * 2)
end

#last_digestObject



4
5
6
# File 'lib/test_bench/output/digest.rb', line 4

def last_digest
  @last_digest ||= 0
end

Class Method Details

.configure(receiver, inert: nil, attr_name: nil) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/test_bench/output/digest.rb', line 20

def self.configure(receiver, inert: nil, attr_name: nil)
  attr_name ||= :digest
  inert = true if inert.nil?

  if inert
    instance = Null.new
  else
    instance = self.new
  end

  receiver.public_send(:"#{attr_name}=", instance)
end

.digest(data) ⇒ Object



14
15
16
17
18
# File 'lib/test_bench/output/digest.rb', line 14

def self.digest(data)
  instance = new
  instance.update(data)
  instance.digest
end

.format(digest) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/test_bench/output/digest.rb', line 82

def self.format(digest)
  if digest < 0
    # 0x8000...
    sign_mask = 0x1 << (8 * Defaults.size_bytes - 1)
    # 0x7FFF...
    mask = (256 ** Defaults.size_bytes - 1) ^ sign_mask

    digest_uint64 = ~digest & mask | sign_mask
  else
    digest_uint64 = digest
  end

  "0x%016X" % digest_uint64
end

Instance Method Details

#cloneObject



33
34
35
36
37
38
# File 'lib/test_bench/output/digest.rb', line 33

def clone
  cloned_digest = Digest.new
  cloned_digest.last_digest = last_digest
  cloned_digest.buffer << buffer
  cloned_digest
end

#digestObject Also known as: value, to_i



59
60
61
62
63
64
65
66
67
# File 'lib/test_bench/output/digest.rb', line 59

def digest
  buffer_bytes = buffer.unpack('C*')[0...8]

  buffer_int64 = buffer_bytes.reduce(0) do |int64, byte|
    (int64 << 8) | byte
  end

  (last_digest + buffer_int64) % (256 ** Defaults.size_bytes - 1)
end

#digest?(data) ⇒ Boolean

Returns:

  • (Boolean)


71
72
73
74
75
# File 'lib/test_bench/output/digest.rb', line 71

def digest?(data)
  other_digest = self.class.digest(data)

  digest == other_digest
end

#formatObject



77
78
79
# File 'lib/test_bench/output/digest.rb', line 77

def format
  self.class.format(value)
end

#to_sObject



80
81
82
# File 'lib/test_bench/output/digest.rb', line 80

def format
  self.class.format(value)
end

#update(data) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/test_bench/output/digest.rb', line 40

def update(data)
  digest_size_bytes = Defaults.size_bytes

  (0..data.bytesize).step(digest_size_bytes).each do |position|
    next_bytes = data.byteslice(position, digest_size_bytes)
    next_bytes.force_encoding('BINARY')

    buffer << next_bytes

    if buffer.length >= digest_size_bytes
      self.last_digest = digest

      buffer.slice!(0, 8)
    end
  end

  digest
end