queencheck 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rspec +3 -0
- data/.rvmrc +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +13 -0
- data/Guardfile +9 -0
- data/README.markdown +21 -0
- data/Rakefile +20 -0
- data/VERSION +1 -0
- data/lib/queencheck/arbitrary.rb +56 -0
- data/lib/queencheck/array.rb +33 -0
- data/lib/queencheck/boolean.rb +9 -0
- data/lib/queencheck/config.rb +16 -0
- data/lib/queencheck/core.rb +107 -0
- data/lib/queencheck/elements_of.rb +44 -0
- data/lib/queencheck/float.rb +23 -0
- data/lib/queencheck/integer.rb +16 -0
- data/lib/queencheck/string.rb +41 -0
- data/lib/queencheck.rb +10 -0
- data/queencheck.gemspec +85 -0
- data/spec/queencheck/arbitrary_spec.rb +41 -0
- data/spec/queencheck/core_spec.rb +33 -0
- data/spec/queencheck/elements_of_spec.rb +22 -0
- data/spec/queencheck/integer_spec.rb +11 -0
- data/spec/spec_helper.rb +12 -0
- metadata +169 -0
data/.rspec
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use 1.9.3@queencheck --create
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
group :development do
|
4
|
+
gem "jeweler"
|
5
|
+
gem "rake"
|
6
|
+
gem "rspec", "2.8.0"
|
7
|
+
gem "guard-rspec", "0.6.0"
|
8
|
+
gem "growl", "1.0.3"
|
9
|
+
gem "spork", "0.9.0.rc9"
|
10
|
+
gem "guard-spork", "0.5.1"
|
11
|
+
gem "rb-fsevent", "0.4.3.1"
|
12
|
+
gem "fuubar", "~> 0.0.6"
|
13
|
+
end
|
data/Guardfile
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
guard 'spork', :cucumber => false, :bundler => false do
|
2
|
+
end
|
3
|
+
|
4
|
+
guard 'rspec', version: 2, cli: '--drb --color --format Fuubar' do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
end
|
9
|
+
|
data/README.markdown
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# QueenCheck
|
2
|
+
|
3
|
+
QueenCheck is random test library.
|
4
|
+
|
5
|
+
Inspired by QuickCheck library in Haskell.
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
require 'queencheck'
|
11
|
+
|
12
|
+
number = 100
|
13
|
+
|
14
|
+
check = QueenCheck.new(number, :+, Integer)
|
15
|
+
|
16
|
+
res = check.run(verbose: true) do | result, arguments, error |
|
17
|
+
result == number + arguments[0]
|
18
|
+
end
|
19
|
+
|
20
|
+
puts "#{res[:passed]} / #{res[:examples]}"
|
21
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
begin
|
9
|
+
require 'jeweler'
|
10
|
+
Jeweler::Tasks.new do |gemspec|
|
11
|
+
gemspec.name = "queencheck"
|
12
|
+
gemspec.summary = "like haskell's QuickCheck"
|
13
|
+
gemspec.email = "rosylilly@aduca.org"
|
14
|
+
gemspec.homepage = "https://github.com/rosylilly/QueenCheck"
|
15
|
+
gemspec.description = "QueenCheck is random test library. Inspired by QuickCheck library in Haskell."
|
16
|
+
gemspec.authors = ["Sho Kusano"]
|
17
|
+
end
|
18
|
+
rescue LoadError
|
19
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
20
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0
|
@@ -0,0 +1,56 @@
|
|
1
|
+
|
2
|
+
module QueenCheck
|
3
|
+
class << self
|
4
|
+
def Arbitrary(name = nil, &block)
|
5
|
+
if block.nil? && !name.nil?
|
6
|
+
return QueenCheck::Arbitrary::Instance.get_by_id(name)
|
7
|
+
else
|
8
|
+
return QueenCheck::Arbitrary::Instance.new(name, &block)
|
9
|
+
end
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
end
|
13
|
+
module Arbitrary
|
14
|
+
class NotQueenCheckArbitrary < StandardError; end
|
15
|
+
|
16
|
+
def arbitrary?; true; end
|
17
|
+
|
18
|
+
def arbitrary(seed)
|
19
|
+
raise NotImplementedError
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_arbitrary(&block)
|
23
|
+
self.module_eval do
|
24
|
+
sig = class << self; self; end
|
25
|
+
sig.send(:define_method, :arbitrary, &block)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Instance
|
30
|
+
@@collection = {}
|
31
|
+
def self.get_by_id(name); return @@collection[name.to_s.to_sym]; end
|
32
|
+
def self.collection=(c); @@collection = c; end
|
33
|
+
def self.collection; @@collection; end
|
34
|
+
|
35
|
+
def initialize(name = nil, &block)
|
36
|
+
raise ArgumentError, "require block" if block.nil?
|
37
|
+
@arbitrary_proc = block
|
38
|
+
@name = name.to_s.to_sym unless name.nil?
|
39
|
+
unless @name.nil?
|
40
|
+
@@collection[@name] = self
|
41
|
+
end
|
42
|
+
end
|
43
|
+
attr_reader :name
|
44
|
+
|
45
|
+
def arbitrary?; true; end
|
46
|
+
|
47
|
+
def arbitrary(seed)
|
48
|
+
@arbitrary_proc.call(seed)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class BasicObject
|
55
|
+
def arbitrary?; false; end
|
56
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'queencheck/arbitrary'
|
2
|
+
|
3
|
+
class Array
|
4
|
+
extend QueenCheck::Arbitrary
|
5
|
+
|
6
|
+
@@bound = 10
|
7
|
+
|
8
|
+
set_arbitrary do |seed|
|
9
|
+
if seed == 0
|
10
|
+
return []
|
11
|
+
else
|
12
|
+
base = ((@@bound * seed).ceil)
|
13
|
+
|
14
|
+
ary = Array.new(rand(base) + 1)
|
15
|
+
|
16
|
+
if seed > 0.3
|
17
|
+
ary.map!{|ar| Array.new(rand(base) + 1) }
|
18
|
+
end
|
19
|
+
|
20
|
+
if seed > 0.5
|
21
|
+
ary.map!{|ar| ar.map!{|a| Array.new(rand(base) + 1) } }
|
22
|
+
end
|
23
|
+
|
24
|
+
if seed > 0.8
|
25
|
+
ary.map!{|ar| ar.map!{|a| a.map!{|item| Array.new(rand(base) + 1) } } }
|
26
|
+
end
|
27
|
+
|
28
|
+
return ary
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
module QueenCheck
|
3
|
+
class Config
|
4
|
+
attr_reader :count, :log
|
5
|
+
|
6
|
+
def initialize(options = nil)
|
7
|
+
options ||= {}
|
8
|
+
|
9
|
+
@count = options[:count] || 100 # デフォルトの試行回数は 100 回
|
10
|
+
@verbose = options[:verbose] || false
|
11
|
+
@log = options[:log] || STDOUT
|
12
|
+
end
|
13
|
+
|
14
|
+
def verbose?; @verbose; end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'queencheck/config'
|
2
|
+
|
3
|
+
module QueenCheck
|
4
|
+
def self.new(*args)
|
5
|
+
QueenCheck::Core.new(*args)
|
6
|
+
end
|
7
|
+
|
8
|
+
class Core
|
9
|
+
def initialize(instance, method, *types)
|
10
|
+
@instance = instance
|
11
|
+
@method = method.respond_to?(:call) ? method : instance.method(method.to_s.to_sym)
|
12
|
+
@types = types.map do | type |
|
13
|
+
if type.respond_to?(:arbitrary?) && type.arbitrary?
|
14
|
+
next type
|
15
|
+
elsif types.kind_of?(Symbol)
|
16
|
+
type = QueenCheck::Arbitrary::Instance.get_by_id(type)
|
17
|
+
next type if type
|
18
|
+
end
|
19
|
+
raise QueenCheck::Arbitrary::NotQueenCheckArbitrary, "`#{type}` is not implemented arbitrary"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def run(config = QueenCheck::Config.new, &block)
|
24
|
+
config = config.kind_of?(Hash) ? QueenCheck::Config.new(config) : config
|
25
|
+
|
26
|
+
stats = QueenCheck::Core::Result.new(config.count)
|
27
|
+
|
28
|
+
config.count.times do | n |
|
29
|
+
range = n.to_f / config.count
|
30
|
+
arguments = []
|
31
|
+
@types.each do | type |
|
32
|
+
arguments.push(type.arbitrary(range))
|
33
|
+
end
|
34
|
+
|
35
|
+
if config.verbose?
|
36
|
+
arguments.each_with_index do | n, i |
|
37
|
+
puts "#{@types[i]}: #{n}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
result, error = nil, nil
|
42
|
+
begin
|
43
|
+
result = @method.call(*arguments)
|
44
|
+
rescue Exception => e
|
45
|
+
error = e
|
46
|
+
end
|
47
|
+
|
48
|
+
is_exception = false
|
49
|
+
begin
|
50
|
+
test_result = block.call(result, arguments, error)
|
51
|
+
rescue Exception => e
|
52
|
+
error = e
|
53
|
+
is_exception = true
|
54
|
+
end
|
55
|
+
|
56
|
+
if config.verbose?
|
57
|
+
print "#{@instance.kind_of?(Class) ? @instance.name : @instance.class.name} \##{@method.respond_to?(:name) ? @method.name : @method.class} ("
|
58
|
+
print @types.map{|type| "#{type.name}" }.join(', ') + ')'
|
59
|
+
puts " => #{is_exception ? error.class : test_result}"
|
60
|
+
end
|
61
|
+
|
62
|
+
unless is_exception
|
63
|
+
case test_result
|
64
|
+
when true
|
65
|
+
stats.passed += 1
|
66
|
+
when false
|
67
|
+
stats.failures += 1
|
68
|
+
end
|
69
|
+
else
|
70
|
+
stats.add_exception(error)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
return stats
|
75
|
+
end
|
76
|
+
|
77
|
+
class Result
|
78
|
+
def initialize(examples)
|
79
|
+
@examples = examples
|
80
|
+
@passed = 0
|
81
|
+
@failures = 0
|
82
|
+
@exceptions = []
|
83
|
+
end
|
84
|
+
attr_reader :examples, :passed, :failures
|
85
|
+
|
86
|
+
def passed=(n)
|
87
|
+
raise RangeError if n > @examples
|
88
|
+
@passed = n
|
89
|
+
end
|
90
|
+
|
91
|
+
def failures=(n)
|
92
|
+
raise RangeError if n > @examples
|
93
|
+
@failures = n
|
94
|
+
end
|
95
|
+
|
96
|
+
def exceptions; @exceptions.length; end
|
97
|
+
|
98
|
+
def add_exception(e)
|
99
|
+
@exceptions.push(e)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def QueenCheck(*args)
|
106
|
+
QueenCheck.new(*args)
|
107
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
module QueenCheck
|
3
|
+
class << self
|
4
|
+
def ElementsOf(name, elements = nil)
|
5
|
+
if elements.nil? && !name.kind_of?(Array)
|
6
|
+
return QueenCheck::ElementsOf.get_by_id(name)
|
7
|
+
else
|
8
|
+
return QueenCheck::ElementsOf.new(name, elements)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class ElementsOf
|
14
|
+
@@instances = {}
|
15
|
+
|
16
|
+
def self.get_by_id(id)
|
17
|
+
return @@instances[id.to_s.to_sym]
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :elements, :name
|
21
|
+
|
22
|
+
def arbitrary?; true; end
|
23
|
+
|
24
|
+
def arbitrary(seed)
|
25
|
+
@elements[rand(@elements.length)]
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(name, elements = nil)
|
29
|
+
if elements.nil? && name.kind_of?(Array)
|
30
|
+
elements = name
|
31
|
+
name = nil
|
32
|
+
end
|
33
|
+
|
34
|
+
raise ArgumentError, 'elements length require over 1' if !elements.respond_to?(:length) || elements.length < 0
|
35
|
+
@elements = elements
|
36
|
+
|
37
|
+
if name
|
38
|
+
@name = name.to_s.to_sym
|
39
|
+
@@instances[@name] = self
|
40
|
+
QueenCheck::Arbitrary::Instance.collection["elements_of_#{@name}".to_sym] = self
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'queencheck/arbitrary'
|
2
|
+
|
3
|
+
class Float
|
4
|
+
extend QueenCheck::Arbitrary
|
5
|
+
|
6
|
+
@@bound = 25
|
7
|
+
|
8
|
+
set_arbitrary do |seed|
|
9
|
+
if seed == 0
|
10
|
+
0.0
|
11
|
+
else
|
12
|
+
if seed > 0.9 && rand(3) > 0
|
13
|
+
return rand(2).zero? ? 0.0/0.0 : rand(2).zero? ? 1.0/0 : -1.0/0
|
14
|
+
end
|
15
|
+
base = ((@@bound * seed).ceil).to_f
|
16
|
+
max = 10.0 ** base
|
17
|
+
num = rand(max)
|
18
|
+
nod = num.to_s.length
|
19
|
+
num.to_f / (10 ** ((rand(nod / 2) + nod / 2) / 2)) * (rand(2).zero? ? 1.0 : -1.0)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'queencheck/arbitrary'
|
2
|
+
|
3
|
+
class Integer
|
4
|
+
extend QueenCheck::Arbitrary
|
5
|
+
|
6
|
+
@@bound = 25
|
7
|
+
|
8
|
+
set_arbitrary do |seed|
|
9
|
+
if seed == 0
|
10
|
+
0
|
11
|
+
else
|
12
|
+
max = 10 ** ((@@bound * seed).ceil)
|
13
|
+
rand(max) * (rand(2).zero? ? 1 : -1)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'queencheck/arbitrary'
|
2
|
+
|
3
|
+
class String
|
4
|
+
extend QueenCheck::Arbitrary
|
5
|
+
|
6
|
+
@@max_length = 3000
|
7
|
+
|
8
|
+
set_arbitrary do | seed |
|
9
|
+
max = (@@max_length * (seed * seed)).ceil
|
10
|
+
|
11
|
+
charset = []
|
12
|
+
if seed == 0
|
13
|
+
return ''
|
14
|
+
elsif seed < 0.1
|
15
|
+
charset = (0x61 ... 0x7b).to_a + (0x41 ... 0x5b).to_a
|
16
|
+
elsif seed < 0.3 # ASCII
|
17
|
+
charset = (0x32 ... 0x7f).to_a
|
18
|
+
elsif seed < 0.5
|
19
|
+
charset = (0x00 ... 0x80).to_a
|
20
|
+
elsif seed < 0.7
|
21
|
+
charset = (0x00 ... 0x80).to_a
|
22
|
+
charset += (0x80 ... 0x800).to_a
|
23
|
+
elsif seed < 0.9
|
24
|
+
charset = (0x00 ... 0x80).to_a
|
25
|
+
charset += (0x80 ... 0x800).to_a
|
26
|
+
charset += (0x800 ... 0x8000).to_a
|
27
|
+
elsif seed <= 1
|
28
|
+
charset = (0x00 ... 0x80).to_a
|
29
|
+
charset += (0x80 ... 0x800).to_a
|
30
|
+
charset += (0x800 ... 0x8000).to_a
|
31
|
+
charset += (0x1000 ... 0x20000).to_a
|
32
|
+
end
|
33
|
+
|
34
|
+
ret = []
|
35
|
+
(rand(max/2) + (max/2)).times do
|
36
|
+
ret << charset[rand(charset.length)]
|
37
|
+
end
|
38
|
+
|
39
|
+
return ret.pack('U*')
|
40
|
+
end
|
41
|
+
end
|
data/lib/queencheck.rb
ADDED
data/queencheck.gemspec
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "queencheck"
|
8
|
+
s.version = "0.0.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Sho Kusano"]
|
12
|
+
s.date = "2012-01-22"
|
13
|
+
s.description = "QueenCheck is random test library. Inspired by QuickCheck library in Haskell."
|
14
|
+
s.email = "rosylilly@aduca.org"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.markdown"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".rspec",
|
20
|
+
".rvmrc",
|
21
|
+
".travis.yml",
|
22
|
+
"Gemfile",
|
23
|
+
"Guardfile",
|
24
|
+
"README.markdown",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"lib/queencheck.rb",
|
28
|
+
"lib/queencheck/arbitrary.rb",
|
29
|
+
"lib/queencheck/array.rb",
|
30
|
+
"lib/queencheck/boolean.rb",
|
31
|
+
"lib/queencheck/config.rb",
|
32
|
+
"lib/queencheck/core.rb",
|
33
|
+
"lib/queencheck/elements_of.rb",
|
34
|
+
"lib/queencheck/float.rb",
|
35
|
+
"lib/queencheck/integer.rb",
|
36
|
+
"lib/queencheck/string.rb",
|
37
|
+
"queencheck.gemspec",
|
38
|
+
"spec/queencheck/arbitrary_spec.rb",
|
39
|
+
"spec/queencheck/core_spec.rb",
|
40
|
+
"spec/queencheck/elements_of_spec.rb",
|
41
|
+
"spec/queencheck/integer_spec.rb",
|
42
|
+
"spec/spec_helper.rb"
|
43
|
+
]
|
44
|
+
s.homepage = "https://github.com/rosylilly/QueenCheck"
|
45
|
+
s.require_paths = ["lib"]
|
46
|
+
s.rubygems_version = "1.8.10"
|
47
|
+
s.summary = "like haskell's QuickCheck"
|
48
|
+
|
49
|
+
if s.respond_to? :specification_version then
|
50
|
+
s.specification_version = 3
|
51
|
+
|
52
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
53
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
54
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
55
|
+
s.add_development_dependency(%q<rspec>, ["= 2.8.0"])
|
56
|
+
s.add_development_dependency(%q<guard-rspec>, ["= 0.6.0"])
|
57
|
+
s.add_development_dependency(%q<growl>, ["= 1.0.3"])
|
58
|
+
s.add_development_dependency(%q<spork>, ["= 0.9.0.rc9"])
|
59
|
+
s.add_development_dependency(%q<guard-spork>, ["= 0.5.1"])
|
60
|
+
s.add_development_dependency(%q<rb-fsevent>, ["= 0.4.3.1"])
|
61
|
+
s.add_development_dependency(%q<fuubar>, ["~> 0.0.6"])
|
62
|
+
else
|
63
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
64
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
65
|
+
s.add_dependency(%q<rspec>, ["= 2.8.0"])
|
66
|
+
s.add_dependency(%q<guard-rspec>, ["= 0.6.0"])
|
67
|
+
s.add_dependency(%q<growl>, ["= 1.0.3"])
|
68
|
+
s.add_dependency(%q<spork>, ["= 0.9.0.rc9"])
|
69
|
+
s.add_dependency(%q<guard-spork>, ["= 0.5.1"])
|
70
|
+
s.add_dependency(%q<rb-fsevent>, ["= 0.4.3.1"])
|
71
|
+
s.add_dependency(%q<fuubar>, ["~> 0.0.6"])
|
72
|
+
end
|
73
|
+
else
|
74
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
75
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
76
|
+
s.add_dependency(%q<rspec>, ["= 2.8.0"])
|
77
|
+
s.add_dependency(%q<guard-rspec>, ["= 0.6.0"])
|
78
|
+
s.add_dependency(%q<growl>, ["= 1.0.3"])
|
79
|
+
s.add_dependency(%q<spork>, ["= 0.9.0.rc9"])
|
80
|
+
s.add_dependency(%q<guard-spork>, ["= 0.5.1"])
|
81
|
+
s.add_dependency(%q<rb-fsevent>, ["= 0.4.3.1"])
|
82
|
+
s.add_dependency(%q<fuubar>, ["~> 0.0.6"])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'queencheck/arbitrary'
|
2
|
+
|
3
|
+
describe QueenCheck::Arbitrary do
|
4
|
+
class Example
|
5
|
+
extend QueenCheck::Arbitrary
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'arbitrary' do
|
9
|
+
expect {
|
10
|
+
Example.arbitrary(1)
|
11
|
+
}.to raise_error NotImplementedError
|
12
|
+
|
13
|
+
Example.class_eval do
|
14
|
+
def arbitrary(seed)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'Original Arbitrary' do
|
20
|
+
it 'new' do
|
21
|
+
arb = QueenCheck::Arbitrary() do | seed |
|
22
|
+
if seed < 0.5
|
23
|
+
10**20
|
24
|
+
else
|
25
|
+
""
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
arb.arbitrary?.should be_true
|
30
|
+
arb.arbitrary(0).should eq(10**20)
|
31
|
+
arb.arbitrary(1).should eq("")
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'named search' do
|
35
|
+
arb = QueenCheck::Arbitrary(:sample) {}
|
36
|
+
|
37
|
+
QueenCheck::Arbitrary(:sample).should eq(arb)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'queencheck'
|
2
|
+
|
3
|
+
describe QueenCheck do
|
4
|
+
before(:each) do
|
5
|
+
@checker = QueenCheck.new(3, :+, Integer)
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'quick test' do
|
9
|
+
ret = @checker.run do | result, arguments |
|
10
|
+
result.should == 3 + arguments[0]
|
11
|
+
end
|
12
|
+
|
13
|
+
ret.examples.should eq(100)
|
14
|
+
ret.passed.should eq(100)
|
15
|
+
ret.failures.should eq(0)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'exception' do
|
19
|
+
div = QueenCheck(5, :/, Integer)
|
20
|
+
|
21
|
+
ret = div.run do | result, arguments, error |
|
22
|
+
if error
|
23
|
+
error.should be_kind_of(ZeroDivisionError)
|
24
|
+
else
|
25
|
+
result.should eq(5 / arguments[0])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
ret.examples.should eq(100)
|
30
|
+
ret.passed.should eq(100)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'queencheck/elements_of'
|
2
|
+
|
3
|
+
describe QueenCheck::ElementsOf do
|
4
|
+
before(:each) do
|
5
|
+
@samples = ['a', 'b', 'c']
|
6
|
+
@elements_of = QueenCheck::ElementsOf.new(@samples)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'choose one' do
|
10
|
+
100.times do
|
11
|
+
@samples.should be_include(@elements_of.arbitrary(rand(10).to_f / 10))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'named type' do
|
16
|
+
named = QueenCheck::ElementsOf(:names, ['test', 'sample'])
|
17
|
+
|
18
|
+
named.should be_kind_of(QueenCheck::ElementsOf)
|
19
|
+
QueenCheck::ElementsOf(:names).should eq(named)
|
20
|
+
QueenCheck::Arbitrary(:elements_of_names).should eq(named)
|
21
|
+
end
|
22
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: queencheck
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Sho Kusano
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: jeweler
|
16
|
+
requirement: &70273802055380 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70273802055380
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &70273802054200 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70273802054200
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &70273802069140 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - =
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 2.8.0
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70273802069140
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: guard-rspec
|
49
|
+
requirement: &70273802068260 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - =
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.6.0
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70273802068260
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: growl
|
60
|
+
requirement: &70273802067680 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - =
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 1.0.3
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70273802067680
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: spork
|
71
|
+
requirement: &70273802067040 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - =
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.9.0.rc9
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70273802067040
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: guard-spork
|
82
|
+
requirement: &70273802066300 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - =
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 0.5.1
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70273802066300
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: rb-fsevent
|
93
|
+
requirement: &70273802065700 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - =
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 0.4.3.1
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *70273802065700
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: fuubar
|
104
|
+
requirement: &70273802065100 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.0.6
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: *70273802065100
|
113
|
+
description: QueenCheck is random test library. Inspired by QuickCheck library in
|
114
|
+
Haskell.
|
115
|
+
email: rosylilly@aduca.org
|
116
|
+
executables: []
|
117
|
+
extensions: []
|
118
|
+
extra_rdoc_files:
|
119
|
+
- README.markdown
|
120
|
+
files:
|
121
|
+
- .rspec
|
122
|
+
- .rvmrc
|
123
|
+
- .travis.yml
|
124
|
+
- Gemfile
|
125
|
+
- Guardfile
|
126
|
+
- README.markdown
|
127
|
+
- Rakefile
|
128
|
+
- VERSION
|
129
|
+
- lib/queencheck.rb
|
130
|
+
- lib/queencheck/arbitrary.rb
|
131
|
+
- lib/queencheck/array.rb
|
132
|
+
- lib/queencheck/boolean.rb
|
133
|
+
- lib/queencheck/config.rb
|
134
|
+
- lib/queencheck/core.rb
|
135
|
+
- lib/queencheck/elements_of.rb
|
136
|
+
- lib/queencheck/float.rb
|
137
|
+
- lib/queencheck/integer.rb
|
138
|
+
- lib/queencheck/string.rb
|
139
|
+
- queencheck.gemspec
|
140
|
+
- spec/queencheck/arbitrary_spec.rb
|
141
|
+
- spec/queencheck/core_spec.rb
|
142
|
+
- spec/queencheck/elements_of_spec.rb
|
143
|
+
- spec/queencheck/integer_spec.rb
|
144
|
+
- spec/spec_helper.rb
|
145
|
+
homepage: https://github.com/rosylilly/QueenCheck
|
146
|
+
licenses: []
|
147
|
+
post_install_message:
|
148
|
+
rdoc_options: []
|
149
|
+
require_paths:
|
150
|
+
- lib
|
151
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
+
none: false
|
153
|
+
requirements:
|
154
|
+
- - ! '>='
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
157
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
|
+
none: false
|
159
|
+
requirements:
|
160
|
+
- - ! '>='
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: '0'
|
163
|
+
requirements: []
|
164
|
+
rubyforge_project:
|
165
|
+
rubygems_version: 1.8.10
|
166
|
+
signing_key:
|
167
|
+
specification_version: 3
|
168
|
+
summary: like haskell's QuickCheck
|
169
|
+
test_files: []
|