spicycode-micronaut 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/LICENSE +20 -0
  2. data/README +17 -0
  3. data/Rakefile +55 -0
  4. data/examples/example_helper.rb +19 -0
  5. data/examples/lib/micronaut/example_group_example.rb +116 -0
  6. data/examples/lib/micronaut/example_runner_example.rb +5 -0
  7. data/examples/lib/micronaut/expectations/differs/default_example.rb +126 -0
  8. data/examples/lib/micronaut/expectations/extensions/object_example.rb +78 -0
  9. data/examples/lib/micronaut/expectations/fail_with_example.rb +71 -0
  10. data/examples/lib/micronaut/expectations/wrap_expectation_example.rb +30 -0
  11. data/examples/lib/micronaut_example.rb +8 -0
  12. data/lib/autotest/discover.rb +3 -0
  13. data/lib/autotest/micronaut.rb +43 -0
  14. data/lib/micronaut/example_group.rb +100 -0
  15. data/lib/micronaut/example_runner.rb +108 -0
  16. data/lib/micronaut/example_world.rb +13 -0
  17. data/lib/micronaut/exceptions.rb +7 -0
  18. data/lib/micronaut/expectations/differs/default.rb +67 -0
  19. data/lib/micronaut/expectations/handler.rb +52 -0
  20. data/lib/micronaut/expectations/object_extensions.rb +62 -0
  21. data/lib/micronaut/expectations/string_and_symbol_extensions.rb +17 -0
  22. data/lib/micronaut/expectations/wrap_expectation.rb +51 -0
  23. data/lib/micronaut/expectations.rb +57 -0
  24. data/lib/micronaut/extensions/kernel.rb +15 -0
  25. data/lib/micronaut/matchers/be.rb +203 -0
  26. data/lib/micronaut/matchers/be_close.rb +37 -0
  27. data/lib/micronaut/matchers/change.rb +148 -0
  28. data/lib/micronaut/matchers/eql.rb +43 -0
  29. data/lib/micronaut/matchers/equal.rb +43 -0
  30. data/lib/micronaut/matchers/errors.rb +5 -0
  31. data/lib/micronaut/matchers/exist.rb +22 -0
  32. data/lib/micronaut/matchers/generated_descriptions.rb +36 -0
  33. data/lib/micronaut/matchers/has.rb +34 -0
  34. data/lib/micronaut/matchers/have.rb +150 -0
  35. data/lib/micronaut/matchers/include.rb +77 -0
  36. data/lib/micronaut/matchers/match.rb +41 -0
  37. data/lib/micronaut/matchers/method_missing.rb +9 -0
  38. data/lib/micronaut/matchers/operator_matcher.rb +72 -0
  39. data/lib/micronaut/matchers/raise_error.rb +132 -0
  40. data/lib/micronaut/matchers/respond_to.rb +46 -0
  41. data/lib/micronaut/matchers/satisfy.rb +47 -0
  42. data/lib/micronaut/matchers/simple_matcher.rb +132 -0
  43. data/lib/micronaut/matchers/throw_symbol.rb +100 -0
  44. data/lib/micronaut/matchers.rb +141 -0
  45. data/lib/micronaut/mocking/with_mocha.rb +23 -0
  46. data/lib/micronaut.rb +42 -0
  47. metadata +120 -0
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Chad Humphries
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,17 @@
1
+ = Micronaut
2
+
3
+ * http://github.com/spicycode/micronaut
4
+
5
+ == DESCRIPTION:
6
+
7
+ Micronaut is an ultra light-weight BDD test framework. For the moment think of it is a prototype of
8
+ RSpec lite. Definitely pre alpha at the moment.
9
+
10
+ == REQUIREMENTS:
11
+
12
+ + Ruby 1.8
13
+
14
+ == CREDITS:
15
+
16
+ * Mini/Unit for the great ideas and runner
17
+ * RSpec for the great ideas and matchers
data/Rakefile ADDED
@@ -0,0 +1,55 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require 'rubygems/specification'
4
+ require 'date'
5
+
6
+ GEM = "micronaut"
7
+ GEM_VERSION = "0.0.2"
8
+ AUTHOR = "Chad Humphries"
9
+ EMAIL = "chad@spicycode.com"
10
+ HOMEPAGE = "http://spicycode.com"
11
+ SUMMARY = "An excellent replacement for the wheel..."
12
+
13
+ spec = Gem::Specification.new do |s|
14
+ s.name = GEM
15
+ s.version = GEM_VERSION
16
+ s.platform = Gem::Platform::RUBY
17
+ s.has_rdoc = true
18
+ s.extra_rdoc_files = ["README", "LICENSE"]
19
+ s.summary = SUMMARY
20
+ s.description = s.summary
21
+ s.author = AUTHOR
22
+ s.email = EMAIL
23
+ s.homepage = HOMEPAGE
24
+
25
+ # Uncomment this to add a dependency
26
+ s.add_dependency "mocha"
27
+
28
+ s.require_path = 'lib'
29
+ s.autorequire = GEM
30
+ s.files = %w(LICENSE README Rakefile) + Dir.glob("{lib,examples}/**/*")
31
+ end
32
+
33
+ desc "Run all examples"
34
+ task :default do
35
+ examples = Dir["examples/**/*_example.rb"].map { |g| Dir.glob(g) }.flatten
36
+ examples.map! {|f| %Q(require "#{f}")}
37
+ command = "-e '#{examples.join("; ")}'"
38
+ ruby command
39
+ end
40
+
41
+ Rake::GemPackageTask.new(spec) do |pkg|
42
+ pkg.gem_spec = spec
43
+ end
44
+
45
+ desc "install the gem locally"
46
+ task :install => [:package] do
47
+ sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}}
48
+ end
49
+
50
+ desc "create a gemspec file"
51
+ task :make_spec do
52
+ File.open("#{GEM}.gemspec", "w") do |file|
53
+ file.puts spec.to_ruby
54
+ end
55
+ end
@@ -0,0 +1,19 @@
1
+ lib_path = File.expand_path(File.dirname(__FILE__) + "/../lib")
2
+ $LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
3
+
4
+ require 'micronaut'
5
+
6
+
7
+ module Micronaut
8
+ module Matchers
9
+ def fail
10
+ raise_error(::Micronaut::Exceptions::ExpectationNotMetError)
11
+ end
12
+
13
+ def fail_with(message)
14
+ raise_error(::Micronaut::Exceptions::ExpectationNotMetError, message)
15
+ end
16
+ end
17
+ end
18
+
19
+ Micronaut::ExampleRunner.autorun
@@ -0,0 +1,116 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../example_helper")
2
+
3
+ describe Micronaut::ExampleGroup do
4
+ class Foo; end
5
+
6
+ def scenario_1
7
+ example_group = Micronaut::ExampleGroup.new(Foo, "Scenario 1")
8
+ example_group.it("should do 1 thing") { 1 }
9
+ example_group.it("should do 2 thing") { 2 }
10
+ example_group.it("should do 3 thing") { 3 }
11
+ example_group
12
+ end
13
+
14
+ def scenario_2
15
+ example_group = Micronaut::ExampleGroup.new(Foo, "Scenario 2")
16
+ example_group.before { 'beforeeach1' }
17
+ example_group.before { 'beforeeach2' }
18
+ example_group.before(:all) { 'beforeall1' }
19
+ example_group.before(:all) { 'beforeall2' }
20
+ example_group
21
+ end
22
+
23
+ def scenario_3
24
+ example_group = Micronaut::ExampleGroup.new(Foo, "Scenario 3")
25
+ example_group.after { 'aftereach1' }
26
+ example_group.after { 'aftereach2' }
27
+ example_group.after(:all) { 'afterall1' }
28
+ example_group.after(:all) { 'afterall2' }
29
+ example_group
30
+ end
31
+
32
+ it "should make the first parameter the name by calling to_s on it" do
33
+ scenario_1.name.should == 'Foo'
34
+ end
35
+
36
+ it "should make the second parameter the description" do
37
+ scenario_1.description.should == 'Scenario 1'
38
+ end
39
+
40
+ it "scenario 1 should have 3 examples" do
41
+ scenario_1.should have(3).examples
42
+ end
43
+
44
+ it "scenario 1 should maintain the example order" do
45
+ example_group = scenario_1
46
+ example_group.examples[0].first.should == 'should do 1 thing'
47
+ example_group.examples[1].first.should == 'should do 2 thing'
48
+ example_group.examples[2].first.should == 'should do 3 thing'
49
+ end
50
+
51
+ it "scenario 1 should allow you to call it's examples" do
52
+ example_group = scenario_1
53
+ example_group.examples[0].last.call.should == 1
54
+ example_group.examples[1].last.call.should == 2
55
+ example_group.examples[2].last.call.should == 3
56
+ end
57
+
58
+ it "scenario 2 should have 2 before each parts" do
59
+ scenario_2.should have(2).before_each_parts
60
+ end
61
+
62
+ it "scenario 2 should have 2 before all parts" do
63
+ scenario_2.should have(2).before_all_parts
64
+ end
65
+
66
+ it "scenario 2 should maintain the before parts order" do
67
+ example_group = scenario_2
68
+ example_group.before_all_parts[0].call.should == 'beforeall1'
69
+ example_group.before_all_parts[1].call.should == 'beforeall2'
70
+ example_group.before_each_parts[0].call.should == 'beforeeach1'
71
+ example_group.before_each_parts[1].call.should == 'beforeeach2'
72
+ end
73
+
74
+ it "scenario 3 should have 2 after each parts" do
75
+ scenario_3.should have(2).after_each_parts
76
+ end
77
+
78
+ it "scenario 3 should have 2 after all parts" do
79
+ scenario_3.should have(2).after_all_parts
80
+ end
81
+
82
+ it "scenario 3 should maintain the after parts order" do
83
+ example_group = scenario_3
84
+ example_group.after_all_parts[0].call.should == 'afterall1'
85
+ example_group.after_all_parts[1].call.should == 'afterall2'
86
+ example_group.after_each_parts[0].call.should == 'aftereach1'
87
+ example_group.after_each_parts[1].call.should == 'aftereach2'
88
+ end
89
+
90
+ def scenario_4
91
+ example_group = Micronaut::ExampleGroup.new(Foo, "Scenario 4")
92
+ example_group
93
+ end
94
+
95
+ it "scenario 4 should run the before all blocks, before each blocks, the example, the after each blocks, and finally the after all blocks" do
96
+ example_group = scenario_4
97
+ example_group.before(:all) { 'before_all_1' }
98
+ example_group.before(:all) { 'before_all_2' }
99
+ example_group.before { "before_each_1"; @foo = 2 }
100
+ example_group.before { "before_each_2"; @foo += 1 }
101
+ example_group.before { "before_each_3"; @foo += 2 }
102
+ example_group.after { "after_each_1"; @foo = 3 }
103
+ example_group.after { "after_each_2"; 'final after each' }
104
+ example_group.after(:all) { 'after_all_1' }
105
+ example_group.after(:all) { 'after_all_2' }
106
+
107
+ example_group.it("prints out the value of the @foo variable") do
108
+ @foo.should == 5
109
+ end
110
+ example_group.it("other example") do
111
+
112
+ end
113
+ example_group.run
114
+ end
115
+
116
+ end
@@ -0,0 +1,5 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../example_helper")
2
+
3
+ describe Micronaut::ExampleRunner do
4
+
5
+ end
@@ -0,0 +1,126 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../../../example_helper")
2
+ require 'micronaut/expectations/differs/default'
3
+
4
+ module Micronaut
5
+ module Fixtures
6
+ class Animal
7
+ def initialize(name,species)
8
+ @name,@species = name,species
9
+ end
10
+
11
+ def inspect
12
+ <<-EOA
13
+ <Animal
14
+ name=#{@name},
15
+ species=#{@species}
16
+ >
17
+ EOA
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "Diff" do
24
+
25
+ before do
26
+ @differ = Micronaut::Expectations::Differs::Default.new(:unified)
27
+ end
28
+
29
+ it "should output unified diff of two strings" do
30
+ expected="foo\nbar\nzap\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nline\n"
31
+ actual="foo\nzap\nbar\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nanother\nline\n"
32
+ expected_diff= <<'EOD'
33
+
34
+
35
+ @@ -1,6 +1,6 @@
36
+ foo
37
+ -zap
38
+ bar
39
+ +zap
40
+ this
41
+ is
42
+ soo
43
+ @@ -9,6 +9,5 @@
44
+ equal
45
+ insert
46
+ a
47
+ -another
48
+ line
49
+ EOD
50
+
51
+ diff = @differ.diff_as_string(expected, actual)
52
+ diff.should eql(expected_diff)
53
+ end
54
+
55
+ it "should output unified diff message of two arrays" do
56
+ expected = [ :foo, 'bar', :baz, 'quux', :metasyntactic, 'variable', :delta, 'charlie', :width, 'quite wide' ]
57
+ actual = [ :foo, 'bar', :baz, 'quux', :metasyntactic, 'variable', :delta, 'tango' , :width, 'very wide' ]
58
+
59
+ expected_diff = <<'EOD'
60
+
61
+
62
+ @@ -5,7 +5,7 @@
63
+ :metasyntactic,
64
+ "variable",
65
+ :delta,
66
+ - "tango",
67
+ + "charlie",
68
+ :width,
69
+ - "very wide"]
70
+ + "quite wide"]
71
+ EOD
72
+
73
+
74
+ diff = @differ.diff_as_object(expected,actual)
75
+ diff.should == expected_diff
76
+ end
77
+
78
+ it "should output unified diff message of two objects" do
79
+ expected = Micronaut::Fixtures::Animal.new "bob", "giraffe"
80
+ actual = Micronaut::Fixtures::Animal.new "bob", "tortoise"
81
+
82
+ expected_diff = <<'EOD'
83
+
84
+ @@ -1,5 +1,5 @@
85
+ <Animal
86
+ name=bob,
87
+ - species=tortoise
88
+ + species=giraffe
89
+ >
90
+ EOD
91
+
92
+ diff = @differ.diff_as_object(expected,actual)
93
+ diff.should == expected_diff
94
+ end
95
+
96
+ end
97
+
98
+
99
+ describe "Diff in context format" do
100
+ before(:each) do
101
+ @differ = Micronaut::Expectations::Differs::Default.new(:context)
102
+ end
103
+
104
+ it "should output unified diff message of two objects" do
105
+ expected = Micronaut::Fixtures::Animal.new "bob", "giraffe"
106
+ actual = Micronaut::Fixtures::Animal.new "bob", "tortoise"
107
+
108
+ expected_diff = <<'EOD'
109
+
110
+ ***************
111
+ *** 1,5 ****
112
+ <Animal
113
+ name=bob,
114
+ ! species=tortoise
115
+ >
116
+ --- 1,5 ----
117
+ <Animal
118
+ name=bob,
119
+ ! species=giraffe
120
+ >
121
+ EOD
122
+
123
+ diff = @differ.diff_as_object(expected,actual)
124
+ diff.should == expected_diff
125
+ end
126
+ end
@@ -0,0 +1,78 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../../../example_helper")
2
+
3
+ describe Object, "#should" do
4
+
5
+ before(:each) do
6
+ @target = "target"
7
+ @matcher = mock("matcher")
8
+ @matcher.stubs(:matches?).returns(true)
9
+ @matcher.stubs(:failure_message)
10
+ end
11
+
12
+ it "should accept and interact with a matcher" do
13
+ @matcher.expects(:matches?).with(@target).returns(true)
14
+ @target.should @matcher
15
+ end
16
+
17
+ it "should ask for a failure_message when matches? returns false" do
18
+ @matcher.expects(:matches?).with(@target).returns(false)
19
+ @matcher.expects(:failure_message).returns("the failure message")
20
+
21
+ lambda { @target.should @matcher }.should fail_with("the failure message")
22
+ end
23
+
24
+ it "should raise error if it receives false directly" do
25
+ lambda { @target.should false }.should raise_error(Micronaut::Expectations::InvalidMatcherError)
26
+ end
27
+
28
+ it "should raise error if it receives false (evaluated)" do
29
+ lambda { @target.should eql?("foo") }.should raise_error(Micronaut::Expectations::InvalidMatcherError)
30
+ end
31
+
32
+ it "should raise error if it receives true" do
33
+ lambda { @target.should true }.should raise_error(Micronaut::Expectations::InvalidMatcherError)
34
+ end
35
+
36
+ end
37
+
38
+ describe Object, "#should_not" do
39
+
40
+ before(:each) do
41
+ @target = "target"
42
+ @matcher = mock("matcher")
43
+ end
44
+
45
+ it "should accept and interact with a matcher" do
46
+ @matcher.expects(:matches?).with(@target).returns(false)
47
+ @matcher.stubs(:negative_failure_message)
48
+
49
+ @target.should_not @matcher
50
+ end
51
+
52
+ it "should ask for a negative_failure_message when matches? returns true" do
53
+ @matcher.expects(:matches?).with(@target).returns(true)
54
+ @matcher.expects(:negative_failure_message).returns("the negative failure message")
55
+ lambda {
56
+ @target.should_not @matcher
57
+ }.should fail_with("the negative failure message")
58
+ end
59
+
60
+ it "should raise error if it receives false directly" do
61
+ lambda {
62
+ @target.should_not false
63
+ }.should raise_error(Micronaut::Expectations::InvalidMatcherError)
64
+ end
65
+
66
+ it "should raise error if it receives false (evaluated)" do
67
+ lambda {
68
+ @target.should_not eql?("foo")
69
+ }.should raise_error(Micronaut::Expectations::InvalidMatcherError)
70
+ end
71
+
72
+ it "should raise error if it receives true" do
73
+ lambda {
74
+ @target.should_not true
75
+ }.should raise_error(Micronaut::Expectations::InvalidMatcherError)
76
+ end
77
+
78
+ end
@@ -0,0 +1,71 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../../example_helper")
2
+
3
+ describe Micronaut::Expectations, "#fail_with with no diff" do
4
+ before(:each) do
5
+ @old_differ = Micronaut::Expectations.differ
6
+ Micronaut::Expectations.differ = nil
7
+ end
8
+
9
+ it "should handle just a message" do
10
+ lambda {
11
+ Micronaut::Expectations.fail_with "the message"
12
+ }.should fail_with("the message")
13
+ end
14
+
15
+ it "should handle an Array" do
16
+ lambda {
17
+ Micronaut::Expectations.fail_with ["the message","expected","actual"]
18
+ }.should fail_with("the message")
19
+ end
20
+
21
+ after(:each) do
22
+ Micronaut::Expectations.differ = @old_differ
23
+ end
24
+ end
25
+
26
+ describe Micronaut::Expectations, "#fail_with with diff" do
27
+ before(:each) do
28
+ @old_differ = Micronaut::Expectations.differ
29
+ @differ = mock("differ")
30
+ Micronaut::Expectations.differ = @differ
31
+ end
32
+
33
+ it "should not call differ if no expected/actual" do
34
+ lambda {
35
+ Micronaut::Expectations.fail_with "the message"
36
+ }.should fail_with("the message")
37
+ end
38
+
39
+ it "should call differ if expected/actual are presented separately" do
40
+ @differ.expects(:diff_as_string).returns("diff")
41
+ lambda {
42
+ Micronaut::Expectations.fail_with "the message", "expected", "actual"
43
+ }.should fail_with("the message\nDiff:diff")
44
+ end
45
+
46
+ it "should call differ if expected/actual are not strings" do
47
+ @differ.expects(:diff_as_object).returns("diff")
48
+ lambda {
49
+ Micronaut::Expectations.fail_with "the message", :expected, :actual
50
+ }.should fail_with("the message\nDiff:diff")
51
+ end
52
+
53
+ it "should not call differ if expected or actual are procs" do
54
+ @differ.expects(:diff_as_string).never
55
+ @differ.expects(:diff_as_object).never
56
+ lambda {
57
+ Micronaut::Expectations.fail_with "the message", lambda {}, lambda {}
58
+ }.should fail_with("the message")
59
+ end
60
+
61
+ it "should call differ if expected/actual are presented in an Array with message" do
62
+ @differ.expects(:diff_as_string).with("actual","expected").returns("diff")
63
+ lambda {
64
+ Micronaut::Expectations.fail_with(["the message", "expected", "actual"])
65
+ }.should fail_with(/the message\nDiff:diff/)
66
+ end
67
+
68
+ after(:each) do
69
+ Micronaut::Expectations.differ = @old_differ
70
+ end
71
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../../example_helper")
2
+
3
+ module Micronaut
4
+ module Matchers
5
+ describe "wrap_expectation" do
6
+
7
+ def stub_matcher
8
+ @_stub_matcher ||= simple_matcher do
9
+ end
10
+ end
11
+
12
+ def failing_matcher
13
+ @_failing_matcher ||= simple_matcher do
14
+ 1.should == 2
15
+ end
16
+ end
17
+
18
+ it "should return true if there is no error" do
19
+ wrap_expectation stub_matcher do
20
+ end.should be_true
21
+ end
22
+
23
+ it "should return false if there is an error" do
24
+ wrap_expectation failing_matcher do
25
+ raise "error"
26
+ end.should be_false
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,8 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../example_helper")
2
+
3
+ describe Micronaut do
4
+
5
+ it "should allow pending examples by not supplying a block"
6
+
7
+
8
+ end
@@ -0,0 +1,3 @@
1
+ Autotest.add_discovery do
2
+ "micronaut" if File.directory?('examples')
3
+ end
@@ -0,0 +1,43 @@
1
+ require 'autotest'
2
+
3
+ Autotest.add_hook :initialize do |at|
4
+ at.clear_mappings
5
+ # watch out: Ruby bug (1.8.6):
6
+ # %r(/) != /\//
7
+ at.add_mapping(%r%^examples/.*_example.rb$%) { |filename, _|
8
+ filename
9
+ }
10
+ at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m|
11
+ ["examples/#{m[1]}_example.rb"]
12
+ }
13
+ at.add_mapping(%r%^examples/(examples_helper|shared/.*)\.rb$%) {
14
+ at.files_matching %r%^examples/.*_example\.rb$%
15
+ }
16
+ end
17
+
18
+ class MicronautCommandError < StandardError; end
19
+
20
+ class Autotest::Micronaut < Autotest
21
+
22
+ def initialize
23
+ super
24
+ self.failed_results_re = /^\d+\)\n(?:\e\[\d*m)?(?:.*?Error in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m
25
+ self.completed_re = /\n(?:\e\[\d*m)?\d* examples?/m
26
+ end
27
+
28
+ def consolidate_failures(failed)
29
+ filters = new_hash_of_arrays
30
+ failed.each do |spec, trace|
31
+ if trace =~ /\n(\.\/)?(.*example\.rb):[\d]+:\Z?/
32
+ filters[$2] << spec
33
+ end
34
+ end
35
+ return filters
36
+ end
37
+
38
+ def make_test_cmd(files_to_test)
39
+ return '' if files_to_test.empty?
40
+ return "#{ruby} -S #{files_to_test.keys.flatten.join(' ')}"
41
+ end
42
+
43
+ end