queencheck 0.1.2 → 1.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.
@@ -0,0 +1,107 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'colorize'
3
+
4
+ module QueenCheck
5
+ class Result
6
+ def initialize(properties, is_success, exception = nil)
7
+ @properties = properties
8
+ @is_success = is_success == true
9
+ unless exception.nil?
10
+ @exception = exception
11
+ @is_success = false
12
+ end
13
+ end
14
+ attr_reader :properties
15
+
16
+ def is_success?; @is_success; end
17
+ def is_failure?; !@is_success; end
18
+ def is_exception?; !@exception.nil?; end
19
+ end
20
+
21
+ class ResultReport < Array
22
+ alias :tests :length
23
+
24
+ def initialize(*args)
25
+ super(*args)
26
+ @labels = {}
27
+ end
28
+
29
+ def pretty_report
30
+ justify = count(:all).to_s.size
31
+ label_justify = @labels.keys.map{|label| label.size}.max
32
+ [
33
+ "Tests: ".green + count(:all).to_s.colorize(count(:all) == count(:success) ? :green : :red),
34
+ " ✓ Successes : #{count(:success).to_s.rjust(justify)}#{
35
+ (@labels.empty? ? '' : "\n") + @labels.keys.map { |label|
36
+ " #{label.ljust(label_justify)} : #{count(label, successes).to_s.rjust(justify)}"
37
+ }.join("\n")
38
+ }".green,
39
+ " ✗ Failures : #{count(:failures).to_s.rjust(justify)}#{
40
+ (@labels.empty? ? '' : "\n") + @labels.keys.map { |label|
41
+ " #{label.ljust(label_justify)} : #{count(label, failures).to_s.rjust(justify)}"
42
+ }.join("\n")
43
+ }".yellow,
44
+ " ✷ Exceptions : #{count(:exception).to_s.rjust(justify)}#{
45
+ (@labels.empty? ? '' : "\n") + @labels.keys.map { |label|
46
+ " #{label.ljust(label_justify)} : #{count(label, exceptions).to_s.rjust(justify)}"
47
+ }.join("\n")
48
+ }".red
49
+ ].join("\n")
50
+ end
51
+
52
+ def report(with_label = true)
53
+ [
54
+ ["tests", count(:all)],
55
+ ["success", count(:success)],
56
+ ["failure", count(:failure)],
57
+ ["exception", count(:exception)]
58
+ ] + (
59
+ if with_label
60
+ report_label
61
+ else
62
+ []
63
+ end
64
+ )
65
+ end
66
+
67
+ def report_label
68
+ @labels.keys.map { | label |
69
+ [label, count(label)]
70
+ }
71
+ end
72
+
73
+ def count(label = :all, list = self)
74
+ case label
75
+ when :all, :tests
76
+ self.size
77
+ when :success, :successes
78
+ self.successes.size
79
+ when :failure, :failures
80
+ self.failures.size
81
+ when :exception, :exceptions
82
+ self.exceptions.size
83
+ else
84
+ raise ArgumentError, "`#{label}` is not valid label" if !@labels.has_key?(label)
85
+ list.reject {|result|
86
+ !@labels[label].call(*result.properties)
87
+ }.size
88
+ end
89
+ end
90
+
91
+ def labeling(label, &block)
92
+ @labels[label] = block
93
+ end
94
+
95
+ def successes
96
+ self.reject{|result| result.is_failure? }
97
+ end
98
+
99
+ def failures
100
+ self.reject{|result| result.is_success? }
101
+ end
102
+
103
+ def exceptions
104
+ self.reject{|result| !result.is_exception? }
105
+ end
106
+ end
107
+ end
@@ -1,11 +1,52 @@
1
+ require 'queencheck'
2
+ require 'rspec'
1
3
 
2
- begin
3
- require 'queencheck'
4
- rescue LoadError
5
- require "pathname"
6
- $:.unshift Pathname.new(File.expand_path('../../', __FILE__))
7
- require 'queencheck'
8
- end
4
+ module RSpec
5
+ module Core
6
+ class ExampleGroup
7
+ def self.QueenCheck(name, *args, &block)
8
+ describe(*[name]) {
9
+ report = nil
9
10
 
10
- require 'rspec'
11
- require 'queencheck/rspec/dsl'
11
+ it "running tests" do
12
+ report = ::QueenCheck::Testable.new(*args, &block).check
13
+ end
14
+
15
+ it "all tests passes" do
16
+ report.count(:all).should == report.count(:success)
17
+ end
18
+ }
19
+ end
20
+
21
+ def self.verboseQueenCheck(name, *args, &block)
22
+ describe(*[name]) {
23
+ assert = proc { | *props |
24
+ proc{ block.call(*props) }
25
+ }
26
+ its = proc { | *props |
27
+ it("Gen: #{props.map{|i| i.inspect}.join(', ')}", &assert.call(*props))
28
+ }
29
+ ::QueenCheck::Testable.new(*args, &its).check
30
+ }
31
+ end
32
+
33
+ def self.labelingQueenCheck(name, labels, *args, &block)
34
+ checker = ::QueenCheck::Testable.new(*args, &block)
35
+ report = checker.check_with_label(labels)
36
+ describe(*[name]) {
37
+ it "all tests passes" do
38
+ report.count(:all).should == report.count(:success)
39
+ end
40
+
41
+ describe "labels" do
42
+ labels.each_pair do | label, p |
43
+ it label do
44
+ report.count(label).should == report.count(label, report.successes)
45
+ end
46
+ end
47
+ end
48
+ }
49
+ end
50
+ end
51
+ end
52
+ end
@@ -5,15 +5,15 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "queencheck"
8
- s.version = "0.0.2"
8
+ s.version = "1.0.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Sho Kusano"]
12
- s.date = "2012-02-02"
12
+ s.date = "2012-02-17"
13
13
  s.description = "QueenCheck is random test library. Inspired by QuickCheck library in Haskell."
14
14
  s.email = "rosylilly@aduca.org"
15
15
  s.extra_rdoc_files = [
16
- "README.markdown"
16
+ "README.md"
17
17
  ]
18
18
  s.files = [
19
19
  ".rspec",
@@ -21,40 +21,40 @@ Gem::Specification.new do |s|
21
21
  ".travis.yml",
22
22
  "Gemfile",
23
23
  "Guardfile",
24
- "README.markdown",
24
+ "README.md",
25
25
  "Rakefile",
26
26
  "VERSION",
27
27
  "lib/queencheck.rb",
28
+ "lib/queencheck/arbitraries/all.rb",
29
+ "lib/queencheck/arbitraries/boolean.rb",
30
+ "lib/queencheck/arbitraries/integer.rb",
31
+ "lib/queencheck/arbitraries/string.rb",
28
32
  "lib/queencheck/arbitrary.rb",
29
- "lib/queencheck/array.rb",
30
- "lib/queencheck/boolean.rb",
31
- "lib/queencheck/config.rb",
33
+ "lib/queencheck/condition.rb",
32
34
  "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",
35
+ "lib/queencheck/exception.rb",
36
+ "lib/queencheck/gen.rb",
37
+ "lib/queencheck/result.rb",
37
38
  "queencheck.gemspec",
38
39
  "spec/queencheck/arbitrary_spec.rb",
39
40
  "spec/queencheck/core_spec.rb",
40
- "spec/queencheck/elements_of_spec.rb",
41
- "spec/queencheck/integer_spec.rb",
42
- "spec/queencheck/string_spec.rb",
41
+ "spec/queencheck/gen_spec.rb",
43
42
  "spec/spec_helper.rb"
44
43
  ]
45
44
  s.homepage = "https://github.com/rosylilly/QueenCheck"
46
45
  s.require_paths = ["lib"]
47
- s.rubygems_version = "1.8.10"
46
+ s.rubygems_version = "1.8.11"
48
47
  s.summary = "like haskell's QuickCheck"
49
48
 
50
49
  if s.respond_to? :specification_version then
51
50
  s.specification_version = 3
52
51
 
53
52
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
54
- s.add_development_dependency(%q<jeweler>, [">= 1.8.3"])
53
+ s.add_runtime_dependency(%q<colorize>, [">= 0.5.8"])
55
54
  s.add_development_dependency(%q<rake>, [">= 0.9.2.2"])
56
55
  s.add_development_dependency(%q<rspec>, [">= 2.8.0"])
57
56
  s.add_development_dependency(%q<fuubar>, [">= 0.0.6"])
57
+ s.add_development_dependency(%q<jeweler>, [">= 1.8.3"])
58
58
  s.add_development_dependency(%q<growl>, [">= 1.0.3"])
59
59
  s.add_development_dependency(%q<spork>, [">= 0.9.0.rc9"])
60
60
  s.add_development_dependency(%q<rb-fsevent>, [">= 0.9.0"])
@@ -64,11 +64,14 @@ Gem::Specification.new do |s|
64
64
  s.add_development_dependency(%q<guard-yard>, [">= 1.0.2"])
65
65
  s.add_development_dependency(%q<yard>, [">= 0.7.4"])
66
66
  s.add_development_dependency(%q<yard-tomdoc>, [">= 0.3.0"])
67
+ s.add_development_dependency(%q<redcarpet>, [">= 0"])
68
+ s.add_development_dependency(%q<pry>, [">= 0"])
67
69
  else
68
- s.add_dependency(%q<jeweler>, [">= 1.8.3"])
70
+ s.add_dependency(%q<colorize>, [">= 0.5.8"])
69
71
  s.add_dependency(%q<rake>, [">= 0.9.2.2"])
70
72
  s.add_dependency(%q<rspec>, [">= 2.8.0"])
71
73
  s.add_dependency(%q<fuubar>, [">= 0.0.6"])
74
+ s.add_dependency(%q<jeweler>, [">= 1.8.3"])
72
75
  s.add_dependency(%q<growl>, [">= 1.0.3"])
73
76
  s.add_dependency(%q<spork>, [">= 0.9.0.rc9"])
74
77
  s.add_dependency(%q<rb-fsevent>, [">= 0.9.0"])
@@ -78,12 +81,15 @@ Gem::Specification.new do |s|
78
81
  s.add_dependency(%q<guard-yard>, [">= 1.0.2"])
79
82
  s.add_dependency(%q<yard>, [">= 0.7.4"])
80
83
  s.add_dependency(%q<yard-tomdoc>, [">= 0.3.0"])
84
+ s.add_dependency(%q<redcarpet>, [">= 0"])
85
+ s.add_dependency(%q<pry>, [">= 0"])
81
86
  end
82
87
  else
83
- s.add_dependency(%q<jeweler>, [">= 1.8.3"])
88
+ s.add_dependency(%q<colorize>, [">= 0.5.8"])
84
89
  s.add_dependency(%q<rake>, [">= 0.9.2.2"])
85
90
  s.add_dependency(%q<rspec>, [">= 2.8.0"])
86
91
  s.add_dependency(%q<fuubar>, [">= 0.0.6"])
92
+ s.add_dependency(%q<jeweler>, [">= 1.8.3"])
87
93
  s.add_dependency(%q<growl>, [">= 1.0.3"])
88
94
  s.add_dependency(%q<spork>, [">= 0.9.0.rc9"])
89
95
  s.add_dependency(%q<rb-fsevent>, [">= 0.9.0"])
@@ -93,6 +99,8 @@ Gem::Specification.new do |s|
93
99
  s.add_dependency(%q<guard-yard>, [">= 1.0.2"])
94
100
  s.add_dependency(%q<yard>, [">= 0.7.4"])
95
101
  s.add_dependency(%q<yard-tomdoc>, [">= 0.3.0"])
102
+ s.add_dependency(%q<redcarpet>, [">= 0"])
103
+ s.add_dependency(%q<pry>, [">= 0"])
96
104
  end
97
105
  end
98
106
 
@@ -1,42 +1,16 @@
1
1
  require 'queencheck/arbitrary'
2
2
 
3
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)
4
+ it "define" do
5
+ class Klass
6
+ arbitrary do | progress, rnd |
7
+ rnd
15
8
  end
16
9
  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
10
 
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) { (1..10).to_a[rand(10)] }
36
-
37
- QueenCheck::Arbitrary(:sample).should eq(arb)
38
- QueenCheck(Kernel, :p, :sample).should_not be_nil
39
- end
11
+ Klass.arbitrary.should be_instance_of(QueenCheck::Arbitrary)
12
+ Klass.arbitrary?.should == true
13
+ Class.arbitrary.should be_nil
14
+ Class.arbitrary?.should == false
40
15
  end
41
16
  end
42
-
@@ -1,42 +1,14 @@
1
1
  require 'queencheck'
2
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.passes.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.passes.should eq(100)
31
- end
32
-
33
- describe 'Task' do
34
- it 'verbose' do
35
- task = QueenCheck::Core::Task.new(1, :+, [1])
36
-
37
- task.run! do | result, arguments, error |
38
- result != arguments[0]
39
- end
40
- end
41
- end
42
- end
3
+ prop_int = QueenCheck::Testable.new(
4
+ QueenCheck::Gen.choose(0, 100),
5
+ QueenCheck::Gen.choose(0, 100)
6
+ ) { | x, y |
7
+ x + y == y + x
8
+ }
9
+
10
+ puts prop_int.check_with_label(
11
+ "x > y" => proc {|x, y| x > y },
12
+ "x < y" => proc {|x, y| x < y },
13
+ "x == y" => proc {|x, y| x == y }
14
+ ).pretty_report
@@ -0,0 +1,68 @@
1
+ require 'queencheck/gen'
2
+
3
+ describe QueenCheck::Gen do
4
+ it "initialize" do
5
+ QueenCheck::Gen.new { | progress, rnd |
6
+ [progress, rnd]
7
+ }.should be_instance_of(QueenCheck::Gen)
8
+ end
9
+
10
+ it "#choose" do
11
+ choose = QueenCheck::Gen.choose(0, 100)
12
+ choose.should be_instance_of(QueenCheck::Gen)
13
+ 10000.times do | n |
14
+ v = choose.value(n)[0]
15
+ v.should >= 0
16
+ v.should <= 100
17
+ end
18
+ end
19
+
20
+ it "#one_of" do
21
+ one_of = QueenCheck::Gen.one_of([
22
+ QueenCheck::Gen.elements_of([1, 2, 3]),
23
+ QueenCheck::Gen.choose(5, 10)
24
+ ])
25
+
26
+ 10000.times do | n |
27
+ v = one_of.value(n)[0]
28
+ v.should >= 1
29
+ v.should <= 10
30
+ v.should_not == 4
31
+ end
32
+ end
33
+
34
+ it "#where" do
35
+ gen = QueenCheck::Gen.choose(0, 10)
36
+
37
+ include_gen = gen.where(
38
+ :include => [0,2,3]
39
+ ).where(
40
+ :not_equal => 0
41
+ )
42
+ 10000.times do | n |
43
+ v = include_gen.value(n)
44
+ [2, 3].include?(v[0]).should == v[1]
45
+ end
46
+ end
47
+
48
+ it "#frequency" do
49
+ gen = QueenCheck::Gen.frequency([
50
+ [1, QueenCheck::Gen.elements_of([0])],
51
+ [3, QueenCheck::Gen.elements_of([1])]
52
+ ])
53
+
54
+ stat = {
55
+ :a => 0,
56
+ :b => 0
57
+ }
58
+ 10000.times do | n |
59
+ v = gen.value(n)
60
+ if v[0] == 0
61
+ stat[:a] += 1
62
+ else
63
+ stat[:b] += 1
64
+ end
65
+ end
66
+ stat[:a].should <= stat[:b]
67
+ end
68
+ end