Module: RubyCheck

Defined in:
lib/version.rb,
lib/rubycheck.rb

Overview

RubyCheck - a Ruby port of the QuickCheck unit test framework

See www.yellosoft.us/quickcheck for an introduction to QuickCheck property testing.

RubyCheck defines test case generators for several basic Ruby types, and encourages monkeypatching for defining generators for custom types.

Defined Under Namespace

Classes: PropertyFailure

Constant Summary collapse

VERSION =

VERSION is defined once, available to gemspec during packaging, and available programmatically to Ruby code.

'0.0.5'
TRIALS =

Number of test cases to generate per for_all run

10000

Class Method Summary collapse

Class Method Details

.for_all(property, gen_syms) ⇒ Object

Evaluates property, TRIALS times, over random inputs generated by gen_syms.

Returns true, or the first failing test case.

Example:

RubyCheck::for_all( ->(i) { i.even? }, [:gen_int])
=> [9]

RubyCheck::for_all( ->(i) { i.even? || i.odd? }, [:gen_int])
=> true


121
122
123
124
125
126
127
128
129
130
# File 'lib/rubycheck.rb', line 121

def self.for_all(property, gen_syms)
  0.upto(TRIALS - 1).each do |i|
    test_case = gen_syms.map { |gen_sym| send(gen_sym) }
    fail PropertyFailure.new(test_case), 'test case error' unless property.call(*test_case)
  end
rescue PropertyFailure => e
  e.test_case
else
  true
end

.gen_array(gen_sym) ⇒ Object

Generate a random array, populated with values generated with gen_sym.

Example:

RubyCheck::gen_array(:gen_int)
=> [1, 3, 3, 7]


63
64
65
66
67
# File 'lib/rubycheck.rb', line 63

def self.gen_array(gen_sym)
  len = gen_int % 100

  0.upto(len).map { |i| send(gen_sym) }
end

.gen_byteObject

Generate a random byte in [0, 255].

Example:

RubyCheck::gen_byte
=> 96


37
38
39
# File 'lib/rubycheck.rb', line 37

def self.gen_byte
  gen_int % 256
end

.gen_charObject

Generate a random ASCII character.

Example:

RubyCheck::gen_char
=> "Q"


50
51
52
# File 'lib/rubycheck.rb', line 50

def self.gen_char
  (gen_int % 128).chr
end

.gen_intObject

Generate a random integer in [0, 10^10 - 1].

Example:

RubyCheck::gen_int
=> 4


24
25
26
# File 'lib/rubycheck.rb', line 24

def self.gen_int
  Random.rand(10e10).to_i
end

.gen_strObject

Generate a random ASCII string.

Example:

RubyCheck::gen_str
=> "qwerty123!@#"


78
79
80
# File 'lib/rubycheck.rb', line 78

def self.gen_str
  gen_array(:gen_char).join('')
end