queencheck 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|