spicycode-micronaut 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +23 -10
- data/examples/example_helper.rb +3 -3
- data/examples/lib/micronaut/behaviour_group_example.rb +175 -0
- data/examples/lib/micronaut/expectations/differs/default_example.rb +1 -2
- data/examples/lib/micronaut/expectations/extensions/object_example.rb +15 -8
- data/examples/lib/micronaut/expectations/fail_with_example.rb +2 -2
- data/examples/lib/micronaut/matchers/be_close_example.rb +42 -0
- data/examples/lib/micronaut/matchers/be_example.rb +257 -0
- data/examples/lib/micronaut/matchers/change_example.rb +329 -0
- data/examples/lib/micronaut/matchers/description_generation_example.rb +167 -0
- data/examples/lib/micronaut/matchers/eql_example.rb +29 -0
- data/examples/lib/micronaut/matchers/equal_example.rb +29 -0
- data/examples/lib/micronaut/matchers/exist_example.rb +69 -0
- data/examples/lib/micronaut/matchers/handler_example.rb +146 -0
- data/examples/lib/micronaut/matchers/has_example.rb +63 -0
- data/examples/lib/micronaut/matchers/have_example.rb +575 -0
- data/examples/lib/micronaut/matchers/include_example.rb +88 -0
- data/examples/lib/micronaut/matchers/match_example.rb +41 -0
- data/examples/lib/micronaut/matchers/matcher_methods_example.rb +66 -0
- data/examples/lib/micronaut/matchers/operator_matcher_example.rb +191 -0
- data/examples/lib/micronaut/matchers/raise_error_example.rb +315 -0
- data/examples/lib/micronaut/matchers/respond_to_example.rb +54 -0
- data/examples/lib/micronaut/matchers/satisfy_example.rb +36 -0
- data/examples/lib/micronaut/matchers/simple_matcher_example.rb +93 -0
- data/examples/lib/micronaut/matchers/throw_symbol_example.rb +96 -0
- data/examples/resources/example_classes.rb +67 -0
- data/lib/autotest/micronaut.rb +9 -4
- data/lib/micronaut/behaviour_group.rb +43 -0
- data/lib/micronaut/behaviour_group_class_methods.rb +134 -0
- data/lib/micronaut/example_runner.rb +7 -9
- data/lib/micronaut/example_world.rb +11 -7
- data/lib/micronaut/expectations/differs/default.rb +6 -15
- data/lib/micronaut/expectations/errors.rb +7 -0
- data/lib/micronaut/expectations/{object_extensions.rb → extensions/object.rb} +5 -4
- data/lib/micronaut/expectations/{string_and_symbol_extensions.rb → extensions/string_and_symbol.rb} +0 -0
- data/lib/micronaut/expectations/extensions.rb +2 -0
- data/lib/micronaut/expectations/wrap_expectation.rb +5 -0
- data/lib/micronaut/expectations.rb +5 -5
- data/lib/micronaut/extensions/kernel.rb +2 -4
- data/lib/micronaut/matchers/be_close.rb +6 -22
- data/lib/micronaut/matchers/eql.rb +7 -25
- data/lib/micronaut/matchers/equal.rb +6 -24
- data/lib/micronaut/matchers/exist.rb +8 -14
- data/lib/micronaut/matchers/has.rb +12 -28
- data/lib/micronaut/matchers/include.rb +12 -9
- data/lib/micronaut/matchers/match.rb +8 -27
- data/lib/micronaut/matchers/method_missing.rb +1 -1
- data/lib/micronaut/matchers/operator_matcher.rb +23 -46
- data/lib/micronaut/matchers/raise_error.rb +4 -8
- data/lib/micronaut/matchers/respond_to.rb +2 -1
- data/lib/micronaut/matchers/throw_symbol.rb +9 -3
- data/lib/micronaut/matchers.rb +10 -3
- data/lib/micronaut/mocking/with_mocha.rb +0 -1
- data/lib/micronaut.rb +3 -3
- metadata +31 -7
- data/examples/lib/micronaut/example_group_example.rb +0 -116
- data/lib/micronaut/example_group.rb +0 -100
- data/lib/micronaut/exceptions.rb +0 -7
@@ -0,0 +1,93 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../../example_helper")
|
2
|
+
|
3
|
+
module Micronaut
|
4
|
+
module Matchers
|
5
|
+
describe SimpleMatcher do
|
6
|
+
it "should pass match arg to block" do
|
7
|
+
actual = nil
|
8
|
+
matcher = simple_matcher("message") do |given| actual = given end
|
9
|
+
matcher.matches?("foo")
|
10
|
+
actual.should == "foo"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should provide a stock failure message" do
|
14
|
+
matcher = simple_matcher("thing") do end
|
15
|
+
matcher.matches?("other")
|
16
|
+
matcher.failure_message.should =~ /expected \"thing\" but got \"other\"/
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should provide a stock negative failure message" do
|
20
|
+
matcher = simple_matcher("thing") do end
|
21
|
+
matcher.matches?("other")
|
22
|
+
matcher.negative_failure_message.should =~ /expected not to get \"thing\", but got \"other\"/
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should provide the given description" do
|
26
|
+
matcher = simple_matcher("thing") do end
|
27
|
+
matcher.description.should =="thing"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should fail if a wrapped 'should' fails" do
|
31
|
+
matcher = simple_matcher("should fail") do
|
32
|
+
2.should == 3
|
33
|
+
end
|
34
|
+
lambda do
|
35
|
+
matcher.matches?("anything").should be_true
|
36
|
+
end.should fail_with(/expected: 3/)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "with arity of 2" do
|
41
|
+
it "should provide the matcher so you can access its messages" do
|
42
|
+
provided_matcher = nil
|
43
|
+
matcher = simple_matcher("thing") do |given, matcher|
|
44
|
+
provided_matcher = matcher
|
45
|
+
end
|
46
|
+
matcher.matches?("anything")
|
47
|
+
provided_matcher.should equal(matcher)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should support a custom failure message" do
|
51
|
+
matcher = simple_matcher("thing") do |given, matcher|
|
52
|
+
matcher.failure_message = "custom message"
|
53
|
+
end
|
54
|
+
matcher.matches?("other")
|
55
|
+
matcher.failure_message.should == "custom message"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should complain when asked for a failure message if you don't give it a description or a message" do
|
59
|
+
matcher = simple_matcher do |given, matcher| end
|
60
|
+
matcher.matches?("other")
|
61
|
+
matcher.failure_message.should =~ /No description provided/
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should support a custom negative failure message" do
|
65
|
+
matcher = simple_matcher("thing") do |given, matcher|
|
66
|
+
matcher.negative_failure_message = "custom message"
|
67
|
+
end
|
68
|
+
matcher.matches?("other")
|
69
|
+
matcher.negative_failure_message.should == "custom message"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should complain when asked for a negative failure message if you don't give it a description or a message" do
|
73
|
+
matcher = simple_matcher do |given, matcher| end
|
74
|
+
matcher.matches?("other")
|
75
|
+
matcher.negative_failure_message.should =~ /No description provided/
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should support a custom description" do
|
79
|
+
matcher = simple_matcher("thing") do |given, matcher|
|
80
|
+
matcher.description = "custom message"
|
81
|
+
end
|
82
|
+
matcher.matches?("description")
|
83
|
+
matcher.description.should == "custom message"
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should tell you no description was provided when it doesn't receive one" do
|
87
|
+
matcher = simple_matcher do end
|
88
|
+
matcher.description.should =~ /No description provided/
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../../example_helper")
|
2
|
+
|
3
|
+
module Micronaut
|
4
|
+
module Matchers
|
5
|
+
describe ThrowSymbol do
|
6
|
+
describe "with no args" do
|
7
|
+
before { @matcher = ThrowSymbol.new }
|
8
|
+
|
9
|
+
it "should match if any Symbol is thrown" do
|
10
|
+
@matcher.matches?(lambda{ throw :sym }).should be_true
|
11
|
+
end
|
12
|
+
it "should match if any Symbol is thrown with an arg" do
|
13
|
+
@matcher.matches?(lambda{ throw :sym, "argument" }).should be_true
|
14
|
+
end
|
15
|
+
it "should not match if no Symbol is thrown" do
|
16
|
+
@matcher.matches?(lambda{ }).should be_false
|
17
|
+
end
|
18
|
+
it "should provide a failure message" do
|
19
|
+
@matcher.matches?(lambda{})
|
20
|
+
@matcher.failure_message.should == "expected a Symbol but nothing was thrown"
|
21
|
+
end
|
22
|
+
it "should provide a negative failure message" do
|
23
|
+
@matcher.matches?(lambda{ throw :sym})
|
24
|
+
@matcher.negative_failure_message.should == "expected no Symbol, got :sym"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "with a symbol" do
|
29
|
+
before { @matcher = ThrowSymbol.new(:sym) }
|
30
|
+
|
31
|
+
it "should match if correct Symbol is thrown" do
|
32
|
+
@matcher.matches?(lambda{ throw :sym }).should be_true
|
33
|
+
end
|
34
|
+
it "should match if correct Symbol is thrown with an arg" do
|
35
|
+
@matcher.matches?(lambda{ throw :sym, "argument" }).should be_true
|
36
|
+
end
|
37
|
+
it "should not match if no Symbol is thrown" do
|
38
|
+
@matcher.matches?(lambda{ }).should be_false
|
39
|
+
end
|
40
|
+
it "should not match if correct Symbol is thrown" do
|
41
|
+
@matcher.matches?(lambda{ throw :other_sym }).should be_false
|
42
|
+
end
|
43
|
+
it "should provide a failure message when no Symbol is thrown" do
|
44
|
+
@matcher.matches?(lambda{})
|
45
|
+
@matcher.failure_message.should == "expected :sym but nothing was thrown"
|
46
|
+
end
|
47
|
+
it "should provide a failure message when wrong Symbol is thrown" do
|
48
|
+
@matcher.matches?(lambda{ throw :other_sym })
|
49
|
+
@matcher.failure_message.should == "expected :sym, got :other_sym"
|
50
|
+
end
|
51
|
+
it "should provide a negative failure message" do
|
52
|
+
@matcher.matches?(lambda{ throw :sym })
|
53
|
+
@matcher.negative_failure_message.should == "expected :sym not to be thrown"
|
54
|
+
end
|
55
|
+
it "should only match NameErrors raised by uncaught throws" do
|
56
|
+
@matcher.matches?(lambda{ sym }).should be_false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "with a symbol and an arg" do
|
61
|
+
before { @matcher = ThrowSymbol.new(:sym, "a") }
|
62
|
+
|
63
|
+
it "should match if correct Symbol and args are thrown" do
|
64
|
+
@matcher.matches?(lambda{ throw :sym, "a" }).should be_true
|
65
|
+
end
|
66
|
+
it "should not match if nothing is thrown" do
|
67
|
+
@matcher.matches?(lambda{ }).should be_false
|
68
|
+
end
|
69
|
+
it "should not match if other Symbol is thrown" do
|
70
|
+
@matcher.matches?(lambda{ throw :other_sym, "a" }).should be_false
|
71
|
+
end
|
72
|
+
it "should not match if no arg is thrown" do
|
73
|
+
@matcher.matches?(lambda{ throw :sym }).should be_false
|
74
|
+
end
|
75
|
+
it "should not match if wrong arg is thrown" do
|
76
|
+
@matcher.matches?(lambda{ throw :sym, "b" }).should be_false
|
77
|
+
end
|
78
|
+
it "should provide a failure message when no Symbol is thrown" do
|
79
|
+
@matcher.matches?(lambda{})
|
80
|
+
@matcher.failure_message.should == %q[expected :sym with "a" but nothing was thrown]
|
81
|
+
end
|
82
|
+
it "should provide a failure message when wrong Symbol is thrown" do
|
83
|
+
@matcher.matches?(lambda{ throw :other_sym })
|
84
|
+
@matcher.failure_message.should == %q[expected :sym with "a", got :other_sym]
|
85
|
+
end
|
86
|
+
it "should provide a negative failure message" do
|
87
|
+
@matcher.matches?(lambda{ throw :sym })
|
88
|
+
@matcher.negative_failure_message.should == %q[expected :sym with "a" not to be thrown]
|
89
|
+
end
|
90
|
+
it "should only match NameErrors raised by uncaught throws" do
|
91
|
+
@matcher.matches?(lambda{ sym }).should be_false
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# This file contains various classes used by the specs.
|
2
|
+
module Micronaut
|
3
|
+
module Expectations
|
4
|
+
class Person
|
5
|
+
attr_reader :name
|
6
|
+
def initialize name
|
7
|
+
@name = name
|
8
|
+
end
|
9
|
+
def == other
|
10
|
+
return @name == other.name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class ClassWithMultiWordPredicate
|
15
|
+
def multi_word_predicate?
|
16
|
+
true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module Helper
|
21
|
+
class CollectionWithSizeMethod
|
22
|
+
def initialize; @list = []; end
|
23
|
+
def size; @list.size; end
|
24
|
+
def push(item); @list.push(item); end
|
25
|
+
end
|
26
|
+
|
27
|
+
class CollectionWithLengthMethod
|
28
|
+
def initialize; @list = []; end
|
29
|
+
def length; @list.size; end
|
30
|
+
def push(item); @list.push(item); end
|
31
|
+
end
|
32
|
+
|
33
|
+
class CollectionOwner
|
34
|
+
attr_reader :items_in_collection_with_size_method, :items_in_collection_with_length_method
|
35
|
+
|
36
|
+
def initialize
|
37
|
+
@items_in_collection_with_size_method = CollectionWithSizeMethod.new
|
38
|
+
@items_in_collection_with_length_method = CollectionWithLengthMethod.new
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_to_collection_with_size_method(item)
|
42
|
+
@items_in_collection_with_size_method.push(item)
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_to_collection_with_length_method(item)
|
46
|
+
@items_in_collection_with_length_method.push(item)
|
47
|
+
end
|
48
|
+
|
49
|
+
def items_for(arg)
|
50
|
+
return [1, 2, 3] if arg == 'a'
|
51
|
+
[1]
|
52
|
+
end
|
53
|
+
|
54
|
+
def items
|
55
|
+
@items_in_collection_with_size_method
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class ClassWithUnqueriedPredicate
|
60
|
+
attr_accessor :foo
|
61
|
+
def initialize(foo)
|
62
|
+
@foo = foo
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/autotest/micronaut.rb
CHANGED
@@ -7,10 +7,10 @@ Autotest.add_hook :initialize do |at|
|
|
7
7
|
at.add_mapping(%r%^examples/.*_example.rb$%) { |filename, _|
|
8
8
|
filename
|
9
9
|
}
|
10
|
-
at.add_mapping(%r%^lib/(.*)\.rb$%) { |
|
11
|
-
["examples/#{m[1]}_example.rb"]
|
10
|
+
at.add_mapping(%r%^lib/(.*)\.rb$%) { |filename, m|
|
11
|
+
["examples/lib/#{m[1]}_example.rb"]
|
12
12
|
}
|
13
|
-
at.add_mapping(%r%^examples/(
|
13
|
+
at.add_mapping(%r%^examples/(example_helper|shared/.*)\.rb$%) {
|
14
14
|
at.files_matching %r%^examples/.*_example\.rb$%
|
15
15
|
}
|
16
16
|
end
|
@@ -37,7 +37,12 @@ class Autotest::Micronaut < Autotest
|
|
37
37
|
|
38
38
|
def make_test_cmd(files_to_test)
|
39
39
|
return '' if files_to_test.empty?
|
40
|
-
|
40
|
+
|
41
|
+
examples = files_to_test.keys.flatten
|
42
|
+
|
43
|
+
examples.map! {|f| %Q(require "#{f}")}
|
44
|
+
|
45
|
+
return "#{ruby} -e '#{examples.join("; ")}'"
|
41
46
|
end
|
42
47
|
|
43
48
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Micronaut
|
2
|
+
class BehaviourGroup
|
3
|
+
extend Micronaut::BehaviourGroupClassMethods
|
4
|
+
include Micronaut::Matchers
|
5
|
+
include Micronaut::Mocking::WithMocha
|
6
|
+
|
7
|
+
def execute(runner)
|
8
|
+
result = ''
|
9
|
+
return result if self.class.examples.empty?
|
10
|
+
self.class.all_before_alls.each { |aba| instance_eval(&aba) }
|
11
|
+
|
12
|
+
self.class.examples.each do |desc, opts, block|
|
13
|
+
execution_error = nil
|
14
|
+
|
15
|
+
begin
|
16
|
+
setup_mocks
|
17
|
+
self.class.befores[:each].each { |be| instance_eval(&be) }
|
18
|
+
if block
|
19
|
+
result << '.'
|
20
|
+
instance_eval(&block)
|
21
|
+
else
|
22
|
+
result << 'P'
|
23
|
+
end
|
24
|
+
verify_mocks
|
25
|
+
rescue Exception => e
|
26
|
+
runner.complain(self, e)
|
27
|
+
execution_error ||= e
|
28
|
+
ensure
|
29
|
+
teardown_mocks
|
30
|
+
end
|
31
|
+
|
32
|
+
begin
|
33
|
+
self.class.afters[:each].each { |ae| instance_eval(&ae) }
|
34
|
+
rescue Exception => e
|
35
|
+
runner.complain(self, e)
|
36
|
+
execution_error ||= e
|
37
|
+
end
|
38
|
+
end
|
39
|
+
result
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
module Micronaut
|
2
|
+
module BehaviourGroupClassMethods
|
3
|
+
|
4
|
+
def inherited(klass)
|
5
|
+
super
|
6
|
+
Micronaut::ExampleWorld.example_groups << klass
|
7
|
+
end
|
8
|
+
|
9
|
+
def befores
|
10
|
+
@_befores ||= { :all => [], :each => [] }
|
11
|
+
end
|
12
|
+
|
13
|
+
def before_eachs
|
14
|
+
befores[:each]
|
15
|
+
end
|
16
|
+
|
17
|
+
def before_alls
|
18
|
+
befores[:all]
|
19
|
+
end
|
20
|
+
|
21
|
+
def before(type=:each, &block)
|
22
|
+
befores[type] << block
|
23
|
+
end
|
24
|
+
|
25
|
+
def afters
|
26
|
+
@_afters ||= { :all => [], :each => [] }
|
27
|
+
end
|
28
|
+
|
29
|
+
def after_eachs
|
30
|
+
afters[:each]
|
31
|
+
end
|
32
|
+
|
33
|
+
def after_alls
|
34
|
+
afters[:all]
|
35
|
+
end
|
36
|
+
|
37
|
+
def after(type=:each, &block)
|
38
|
+
afters[type] << block
|
39
|
+
end
|
40
|
+
|
41
|
+
def it(desc=nil, options={}, &block)
|
42
|
+
examples << [desc, options, block]
|
43
|
+
end
|
44
|
+
|
45
|
+
def examples
|
46
|
+
@_examples ||= []
|
47
|
+
end
|
48
|
+
|
49
|
+
def set_it_up(name_or_const, given_description, given_options)
|
50
|
+
@_behaviour_group_name = name_or_const.to_s
|
51
|
+
@_behaviour_described_type = name_or_const.is_a?(String) ? Object : name_or_const
|
52
|
+
@_behaviour_group_description = given_description
|
53
|
+
@_behaviour_group_options = given_options
|
54
|
+
end
|
55
|
+
|
56
|
+
def name
|
57
|
+
@_behaviour_group_name
|
58
|
+
end
|
59
|
+
|
60
|
+
def described_type
|
61
|
+
@_behaviour_described_type
|
62
|
+
end
|
63
|
+
|
64
|
+
def description
|
65
|
+
@_behaviour_group_description
|
66
|
+
end
|
67
|
+
|
68
|
+
def options
|
69
|
+
@_behaviour_group_options
|
70
|
+
end
|
71
|
+
|
72
|
+
def describe(name_or_const, desc=nil, options={}, &block)
|
73
|
+
raise ArgumentError if block.nil? || name_or_const.nil?
|
74
|
+
|
75
|
+
subclass('NestedLevel') do
|
76
|
+
set_it_up(name_or_const, desc, options)
|
77
|
+
|
78
|
+
module_eval(&block)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def create_example_group(name_or_const, desc=nil, options={}, &describe_block)
|
83
|
+
describe(name_or_const, desc, options, &describe_block)
|
84
|
+
end
|
85
|
+
|
86
|
+
def each_ancestor(superclass_last=false)
|
87
|
+
classes = []
|
88
|
+
current_class = self
|
89
|
+
while is_example_group_class?(current_class)
|
90
|
+
superclass_last ? classes << current_class : classes.unshift(current_class)
|
91
|
+
current_class = current_class.superclass
|
92
|
+
end
|
93
|
+
|
94
|
+
classes.each do |example_group|
|
95
|
+
yield example_group
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def is_example_group_class?(klass)
|
100
|
+
klass.kind_of?(Micronaut::BehaviourGroup)
|
101
|
+
end
|
102
|
+
|
103
|
+
def all_before_alls
|
104
|
+
_before_alls = []
|
105
|
+
each_ancestor do |ancestor|
|
106
|
+
_before_alls << ancestor.befores[:all]
|
107
|
+
end
|
108
|
+
_before_alls
|
109
|
+
end
|
110
|
+
|
111
|
+
def run(runner)
|
112
|
+
new.execute(runner)
|
113
|
+
end
|
114
|
+
|
115
|
+
def subclass(base_name, &body)
|
116
|
+
klass = Class.new(self)
|
117
|
+
class_name = "#{base_name}_#{_sub_class_count!}"
|
118
|
+
instance_eval do
|
119
|
+
const_set(class_name, klass)
|
120
|
+
end
|
121
|
+
klass.instance_eval(&body) if block_given?
|
122
|
+
klass
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def _sub_class_count!
|
128
|
+
@_sub_class_count ||= 0
|
129
|
+
@_sub_class_count += 1
|
130
|
+
@_sub_class_count
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
end
|
@@ -26,22 +26,20 @@ module Micronaut
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def location(e)
|
29
|
-
e.backtrace.find { |s|
|
30
|
-
s !~ /in .(assert|refute|flunk|pass|fail|raise)/
|
31
|
-
}.sub(/:in .*$/, '')
|
29
|
+
e.backtrace.find { |s| s !~ /in .(expectations|fail)/ }.sub(/:in .*$/, '')
|
32
30
|
end
|
33
31
|
|
34
|
-
def complain(
|
32
|
+
def complain(group, e)
|
35
33
|
bt = Micronaut::filter_backtrace(e.backtrace).join("\n ")
|
36
34
|
|
37
35
|
e = case e.class.to_s
|
38
|
-
when
|
36
|
+
when /Micronaut::Expectations/, 'Mocha::ExpectationError' then
|
39
37
|
@failures += 1
|
40
|
-
"Failure:\n#{
|
38
|
+
"Failure:\n#{group.class.name}(#{group.class}) [#{location(e)}]:\n#{e.message}\n #{bt}\n"
|
41
39
|
else
|
42
40
|
puts e.to_s
|
43
41
|
@errors += 1
|
44
|
-
"Error:\n#{
|
42
|
+
"Error:\n#{group.class.name}(#{group.class}):\n#{e.class}: #{e.message}\n #{bt}\n"
|
45
43
|
end
|
46
44
|
@report << e
|
47
45
|
e[0, 1]
|
@@ -90,12 +88,12 @@ module Micronaut
|
|
90
88
|
@@out.print "#{example_group.name}: " if @verbose
|
91
89
|
|
92
90
|
t = Time.now if @verbose
|
93
|
-
result = example_group.
|
91
|
+
result = example_group.run(self)
|
94
92
|
|
95
93
|
@example_count += example_group.examples.size
|
96
94
|
|
97
95
|
@@out.print "%.6fs: " % (Time.now - t) if @verbose
|
98
|
-
@@out.print result
|
96
|
+
@@out.print(result) if result
|
99
97
|
@@out.puts if @verbose
|
100
98
|
# end
|
101
99
|
end
|
@@ -1,13 +1,17 @@
|
|
1
|
-
|
1
|
+
module Micronaut
|
2
|
+
|
3
|
+
class ExampleWorld
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
|
5
|
+
def self.reset
|
6
|
+
@@example_groups = []
|
7
|
+
end
|
6
8
|
|
7
|
-
|
9
|
+
reset
|
10
|
+
|
11
|
+
def self.example_groups
|
12
|
+
@@example_groups
|
13
|
+
end
|
8
14
|
|
9
|
-
def self.example_groups
|
10
|
-
@@example_groups
|
11
15
|
end
|
12
16
|
|
13
17
|
end
|
@@ -12,9 +12,8 @@ module Micronaut
|
|
12
12
|
|
13
13
|
# TODO add some rdoc
|
14
14
|
class Default
|
15
|
-
def initialize(
|
16
|
-
@format =
|
17
|
-
@context_lines = context_lines
|
15
|
+
def initialize(format = :unified, context_lines = 3)
|
16
|
+
@format, @context_lines = format, context_lines
|
18
17
|
end
|
19
18
|
|
20
19
|
# This is snagged from diff/lcs/ldiff.rb (which is a commandline tool)
|
@@ -28,17 +27,17 @@ module Micronaut
|
|
28
27
|
file_length_difference = 0
|
29
28
|
diffs.each do |piece|
|
30
29
|
begin
|
31
|
-
hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, context_lines,
|
30
|
+
hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, @context_lines,
|
32
31
|
file_length_difference)
|
33
32
|
file_length_difference = hunk.file_length_difference
|
34
33
|
next unless oldhunk
|
35
34
|
# Hunks may overlap, which is why we need to be careful when our
|
36
35
|
# diff includes lines of context. Otherwise, we might print
|
37
36
|
# redundant lines.
|
38
|
-
if (context_lines > 0) and hunk.overlaps?(oldhunk)
|
37
|
+
if (@context_lines > 0) and hunk.overlaps?(oldhunk)
|
39
38
|
hunk.unshift(oldhunk)
|
40
39
|
else
|
41
|
-
output << oldhunk.diff(format)
|
40
|
+
output << oldhunk.diff(@format)
|
42
41
|
end
|
43
42
|
ensure
|
44
43
|
oldhunk = hunk
|
@@ -46,21 +45,13 @@ module Micronaut
|
|
46
45
|
end
|
47
46
|
end
|
48
47
|
#Handle the last remaining hunk
|
49
|
-
output << oldhunk.diff(format) << "\n"
|
48
|
+
output << oldhunk.diff(@format) << "\n"
|
50
49
|
end
|
51
50
|
|
52
51
|
def diff_as_object(target,expected)
|
53
52
|
diff_as_string(PP.pp(target,""), PP.pp(expected,""))
|
54
53
|
end
|
55
54
|
|
56
|
-
protected
|
57
|
-
def format
|
58
|
-
@format
|
59
|
-
end
|
60
|
-
|
61
|
-
def context_lines
|
62
|
-
@context_lines
|
63
|
-
end
|
64
55
|
end
|
65
56
|
end
|
66
57
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module Micronaut
|
2
2
|
module Expectations
|
3
|
-
#
|
4
|
-
|
3
|
+
# rspec adds #should and #should_not to every Object (and,
|
4
|
+
# implicitly, every Class).
|
5
|
+
module ObjectExpectations
|
5
6
|
# :call-seq:
|
6
7
|
# should(matcher)
|
7
8
|
# should == expected
|
@@ -58,5 +59,5 @@ module Micronaut
|
|
58
59
|
end
|
59
60
|
|
60
61
|
class Object
|
61
|
-
include Micronaut::Expectations::
|
62
|
-
end
|
62
|
+
include Micronaut::Expectations::ObjectExpectations
|
63
|
+
end
|
data/lib/micronaut/expectations/{string_and_symbol_extensions.rb → extensions/string_and_symbol.rb}
RENAMED
File without changes
|
@@ -5,6 +5,11 @@ module Micronaut
|
|
5
5
|
# expectation passes and false if it fails (without bubbling up
|
6
6
|
# the failure).
|
7
7
|
#
|
8
|
+
# This is intended to be used in the context of a simple matcher,
|
9
|
+
# and is especially useful for wrapping multiple expectations or
|
10
|
+
# one or more assertions from test/unit extensions when running
|
11
|
+
# with test/unit.
|
12
|
+
#
|
8
13
|
# == Examples
|
9
14
|
#
|
10
15
|
# def eat_cheese(cheese)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'micronaut/matchers'
|
2
|
-
require 'micronaut/expectations/
|
3
|
-
require 'micronaut/expectations/
|
2
|
+
require 'micronaut/expectations/errors'
|
3
|
+
require 'micronaut/expectations/extensions'
|
4
4
|
require 'micronaut/expectations/handler'
|
5
5
|
require 'micronaut/expectations/wrap_expectation'
|
6
6
|
|
@@ -28,13 +28,13 @@ module Micronaut
|
|
28
28
|
# it returns +false+, the spec passes and execution continues. If it returns
|
29
29
|
# +true+, then the spec fails with the message returned by <tt>matcher.negative_failure_message</tt>.
|
30
30
|
#
|
31
|
-
#
|
31
|
+
# RMicronaut ships with a standard set of useful matchers, and writing your own
|
32
32
|
# matchers is quite simple. See Micronaut::Matchers for details.
|
33
33
|
module Expectations
|
34
34
|
class << self
|
35
35
|
attr_accessor :differ
|
36
36
|
|
37
|
-
# raises a Micronaut::
|
37
|
+
# raises a Micronaut::Expectations::ExpectationNotMetError with message
|
38
38
|
#
|
39
39
|
# When a differ has been assigned and fail_with is passed
|
40
40
|
# <code>expected</code> and <code>target</code>, passes them
|
@@ -50,7 +50,7 @@ module Micronaut
|
|
50
50
|
message << "\nDiff:" << self.differ.diff_as_object(target, expected)
|
51
51
|
end
|
52
52
|
end
|
53
|
-
Kernel::raise(Micronaut::
|
53
|
+
Kernel::raise(Micronaut::Expectations::ExpectationNotMetError.new(message))
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -2,10 +2,8 @@ module Micronaut
|
|
2
2
|
module Extensions
|
3
3
|
module Kernel
|
4
4
|
|
5
|
-
def describe(name_or_const, desc=nil, &describe_block)
|
6
|
-
|
7
|
-
example_group.instance_eval(&describe_block)
|
8
|
-
Micronaut::ExampleWorld.example_groups << example_group
|
5
|
+
def describe(name_or_const, desc=nil, options={}, &describe_block)
|
6
|
+
Micronaut::BehaviourGroup.create_example_group(name_or_const, desc, options, &describe_block)
|
9
7
|
end
|
10
8
|
|
11
9
|
end
|