Class: TestBench::Random

Inherits:
Object
  • Object
show all
Defined in:
lib/test_bench/random/random.rb,
lib/test_bench/random/controls/seed.rb

Defined Under Namespace

Modules: Controls, Defaults

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#generatorObject



3
4
5
# File 'lib/test_bench/random/random.rb', line 3

def generator
  @generator ||= self.class.generator(seed, namespace)
end

#namespaceObject



13
14
15
# File 'lib/test_bench/random/random.rb', line 13

def namespace
  @namespace ||= Defaults.namespace
end

#seedObject



8
9
10
# File 'lib/test_bench/random/random.rb', line 8

def seed
  @seed ||= Defaults.seed
end

Class Method Details

.build(seed = nil, namespace: nil) ⇒ Object



18
19
20
21
22
23
# File 'lib/test_bench/random/random.rb', line 18

def self.build(seed=nil, namespace: nil)
  instance = new
  instance.seed = seed
  instance.namespace = namespace
  instance
end

.generator(seed, namespace) ⇒ Object



66
67
68
69
70
71
72
# File 'lib/test_bench/random/random.rb', line 66

def self.generator(seed, namespace)
  namespace_digest = namespace_digest(namespace)

  seed ^= namespace_digest

  ::Random.new(seed)
end

.generator_seed(seed, namespace) ⇒ Object



74
75
76
77
# File 'lib/test_bench/random/random.rb', line 74

def self.generator_seed(seed, namespace)
  generator = generator(seed, namespace)
  generator.seed
end

.namespace_digest(namespace) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/test_bench/random/random.rb', line 79

def self.namespace_digest(namespace)
  byte_width = 8

  sequence = namespace.bytes.each_slice(byte_width).map do |bytes|
    value = 0

    bytes.each_with_index do |byte, index|
      value <<= 8 if not index.zero?

      value += byte
    end

    value
  end

  digest_salt = (0x100 ** byte_width) - 1
  sequence.push(digest_salt)

  sequence.reduce do |checksum, value|
    checksum ^ value
  end
end

Instance Method Details

#booleanObject



45
46
47
48
49
50
51
52
53
# File 'lib/test_bench/random/random.rb', line 45

def boolean
  byte = generator.bytes(1).bytes.first

  if byte % 2 == 1
    true
  else
    false
  end
end

#fractionObject



41
42
43
# File 'lib/test_bench/random/random.rb', line 41

def fraction
  generator.rand
end

#integerObject



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/test_bench/random/random.rb', line 29

def integer
  bytes = generator.bytes(8).bytes

  number = 0

  bytes.each_with_index do |byte, index|
    number += byte ** index
  end

  number
end

#reset(namespace = nil) ⇒ Object



55
56
57
58
59
60
61
62
63
64
# File 'lib/test_bench/random/random.rb', line 55

def reset(namespace=nil)
  namespace ||= self.namespace

  generator = self.class.generator(seed, namespace)

  self.generator = generator
  self.namespace = namespace

  generator.seed
end

#stringObject



25
26
27
# File 'lib/test_bench/random/random.rb', line 25

def string
  integer.to_s(36)
end