code_driven_development 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +30 -14
- data/Rakefile +7 -0
- data/code_driven_development.gemspec +2 -0
- data/features/my_feature.feature +113 -0
- data/features/support/aruba.rb +1 -0
- data/lib/code_driven_development/code_driven_development.rb +1 -0
- data/lib/code_driven_development/indented_output.rb +1 -1
- data/lib/code_driven_development/rule/boolean_or.rb +61 -0
- data/lib/code_driven_development/rule/constant_method_call.rb +4 -1
- data/lib/code_driven_development/rule/instance_method.rb +1 -1
- data/lib/code_driven_development/rule/instance_method_call.rb +4 -1
- data/lib/code_driven_development/test_component/context.rb +6 -4
- data/lib/code_driven_development/version.rb +1 -1
- data/lib/code_driven_development.rb +1 -0
- data/samples/president.rb +1 -2
- data/spec/samples/lone_sample.yaml +54 -0
- data/spec/spec_helper.rb +1 -1
- metadata +37 -6
- data/spec/my_spec.rb +0 -72
- data/spec/support/have_consecutive_lines_matching_matcher.rb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 546316dbe66b0a333a9dd89b55222bacd74e502b
|
4
|
+
data.tar.gz: 07c3576f12dc0b9667ed79145994e55c5dc344d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 01bc5e3a0b27dcc595473b5bb8312f538c785c1e33efa341e12b7c85f25514ff83e11eded00b194031f6006298f3df764e8b2b316c59542db03e6b9f154af936
|
7
|
+
data.tar.gz: a023a61a8c1ecd86ae3c5e5e353902b53ce51da33e98af64ca36c759d993d9e2c1baddd6b366e3c8e6123aa1875fe7aeb48c3db98db47ccf6c1cb6ec4fe5029f
|
data/README.md
CHANGED
@@ -13,9 +13,8 @@ class Bunker < ActiveRecord::Base
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def alert_president
|
16
|
-
alert_staff
|
17
16
|
SecretService.stand_down
|
18
|
-
|
17
|
+
alert_staff || go_crazy
|
19
18
|
end
|
20
19
|
end
|
21
20
|
```
|
@@ -23,38 +22,55 @@ end
|
|
23
22
|
And this is what CDD thinks of it:
|
24
23
|
|
25
24
|
``` ruby
|
26
|
-
|
27
25
|
describe Bunker do
|
28
26
|
it { should validate_secure_of :password }
|
29
27
|
it { should validate_protected_of :location }
|
30
|
-
|
31
28
|
describe "#alert_staff" do
|
32
29
|
let(:obj) { described_class.new }
|
30
|
+
subject { obj.alert_staff }
|
33
31
|
before do
|
34
32
|
allow(Staff).to receive :alert_all
|
35
|
-
obj.alert_staff
|
36
33
|
end
|
37
34
|
it "calls Staff.alert_all" do
|
35
|
+
subject
|
38
36
|
expect(Staff).to have_received :alert_all
|
39
37
|
end
|
40
38
|
end
|
41
|
-
|
42
39
|
describe "#alert_president" do
|
43
40
|
let(:obj) { described_class.new }
|
41
|
+
subject { obj.alert_president }
|
44
42
|
before do
|
45
|
-
allow(obj).to receive :alert_staff
|
46
43
|
allow(SecretService).to receive :stand_down
|
47
|
-
allow(President).to receive :alert
|
48
|
-
obj.alert_president
|
49
|
-
end
|
50
|
-
it "calls #alert_staff" do
|
51
|
-
expect(obj).to have_received :alert_staff
|
52
44
|
end
|
53
45
|
it "calls SecretService.stand_down" do
|
46
|
+
subject
|
54
47
|
expect(SecretService).to have_received :stand_down
|
55
48
|
end
|
56
|
-
|
57
|
-
|
49
|
+
describe "#alert_staff is truthy" do
|
50
|
+
before do
|
51
|
+
allow(obj).to receive(:alert_staff).and_return('alert_staff')
|
52
|
+
allow(obj).to receive(:go_crazy)
|
53
|
+
end
|
54
|
+
it "returns #alert_staff" do
|
55
|
+
expect(subject).to eq 'alert_staff'
|
56
|
+
end
|
57
|
+
it "doesn't call #go_crazy" do
|
58
|
+
subject
|
59
|
+
expect(obj).not_to have_received :go_crazy
|
60
|
+
end
|
61
|
+
end
|
62
|
+
describe "#alert_staff is falsey" do
|
63
|
+
before do
|
64
|
+
allow(obj).to receive(:alert_staff).and_return(false)
|
65
|
+
allow(obj).to receive(:go_crazy).and_return('go_crazy')
|
66
|
+
end
|
67
|
+
it "returns #go_crazy" do
|
68
|
+
expect(subject).to eq 'go_crazy'
|
69
|
+
end
|
70
|
+
it "calls #alert_staff" do
|
71
|
+
subject
|
72
|
+
expect(obj).to have_received :alert_staff
|
73
|
+
end
|
58
74
|
end
|
59
75
|
end
|
60
76
|
end
|
data/Rakefile
CHANGED
@@ -0,0 +1,113 @@
|
|
1
|
+
Feature: Creates awesome specs
|
2
|
+
Scenario: creating shoulda_matchers
|
3
|
+
Given a file named "my_feature.rb" with:
|
4
|
+
"""ruby
|
5
|
+
class Lolcat < ActiveRecord::Base
|
6
|
+
validate :cuteness, presence: true
|
7
|
+
end
|
8
|
+
"""
|
9
|
+
When I run `cdd my_feature.rb`
|
10
|
+
Then the exit status should be 0
|
11
|
+
And the output should contain:
|
12
|
+
"""ruby
|
13
|
+
describe Lolcat do
|
14
|
+
it { should validate_presence_of :cuteness }
|
15
|
+
end
|
16
|
+
"""
|
17
|
+
|
18
|
+
Scenario: instance methods that call constants
|
19
|
+
Given a file named "my_feature.rb" with:
|
20
|
+
"""ruby
|
21
|
+
class Lolcat
|
22
|
+
def i_call_things
|
23
|
+
CentralBureaucracy.file_report
|
24
|
+
end
|
25
|
+
end
|
26
|
+
"""
|
27
|
+
When I run `cdd my_feature.rb`
|
28
|
+
Then the exit status should be 0
|
29
|
+
And the output should contain:
|
30
|
+
"""ruby
|
31
|
+
describe "#i_call_things" do
|
32
|
+
let(:obj) { described_class.new }
|
33
|
+
subject { obj.i_call_things }
|
34
|
+
before do
|
35
|
+
allow(CentralBureaucracy).to receive :file_report
|
36
|
+
end
|
37
|
+
it "calls CentralBureaucracy.file_report" do
|
38
|
+
subject
|
39
|
+
expect(CentralBureaucracy).to have_received :file_report
|
40
|
+
end
|
41
|
+
end
|
42
|
+
"""
|
43
|
+
|
44
|
+
Scenario: instance methods that call instance methods
|
45
|
+
Given a file named "my_feature.rb" with:
|
46
|
+
"""ruby
|
47
|
+
class Lolcat
|
48
|
+
def i_call_instance_methods
|
49
|
+
meth
|
50
|
+
end
|
51
|
+
end
|
52
|
+
"""
|
53
|
+
When I run `cdd my_feature.rb`
|
54
|
+
Then the exit status should be 0
|
55
|
+
And the output should contain:
|
56
|
+
"""ruby
|
57
|
+
describe "#i_call_instance_methods" do
|
58
|
+
let(:obj) { described_class.new }
|
59
|
+
subject { obj.i_call_instance_methods }
|
60
|
+
before do
|
61
|
+
allow(obj).to receive :meth
|
62
|
+
end
|
63
|
+
it "calls #meth" do
|
64
|
+
subject
|
65
|
+
expect(obj).to have_received :meth
|
66
|
+
end
|
67
|
+
end
|
68
|
+
"""
|
69
|
+
|
70
|
+
Scenario: boolean or
|
71
|
+
Given a file named "my_feature.rb" with:
|
72
|
+
"""ruby
|
73
|
+
class Yolounicorn
|
74
|
+
def dilemma
|
75
|
+
should_i_stay || should_i_go
|
76
|
+
end
|
77
|
+
end
|
78
|
+
"""
|
79
|
+
When I run `cdd my_feature.rb`
|
80
|
+
Then the exit status should be 0
|
81
|
+
And the output should contain:
|
82
|
+
"""ruby
|
83
|
+
describe "#dilemma" do
|
84
|
+
let(:obj) { described_class.new }
|
85
|
+
subject { obj.dilemma }
|
86
|
+
describe "#should_i_stay is truthy" do
|
87
|
+
before do
|
88
|
+
allow(obj).to receive(:should_i_stay).and_return('should_i_stay')
|
89
|
+
allow(obj).to receive(:should_i_go)
|
90
|
+
end
|
91
|
+
it "returns #should_i_stay" do
|
92
|
+
expect(subject).to eq 'should_i_stay'
|
93
|
+
end
|
94
|
+
it "doesn't call #should_i_go" do
|
95
|
+
subject
|
96
|
+
expect(obj).not_to have_received :should_i_go
|
97
|
+
end
|
98
|
+
end
|
99
|
+
describe "#should_i_stay is falsey" do
|
100
|
+
before do
|
101
|
+
allow(obj).to receive(:should_i_stay).and_return(false)
|
102
|
+
allow(obj).to receive(:should_i_go).and_return('should_i_go')
|
103
|
+
end
|
104
|
+
it "returns #should_i_go" do
|
105
|
+
expect(subject).to eq 'should_i_go'
|
106
|
+
end
|
107
|
+
it "calls #should_i_stay" do
|
108
|
+
subject
|
109
|
+
expect(obj).to have_received :should_i_stay
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
"""
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'aruba/cucumber'
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module CodeDrivenDevelopment
|
2
|
+
module Rule
|
3
|
+
class BooleanOr < AbstractRule
|
4
|
+
def capable?
|
5
|
+
code.sexp_type == :or &&
|
6
|
+
left.sexp_type == :call &&
|
7
|
+
right.sexp_type == :call
|
8
|
+
end
|
9
|
+
|
10
|
+
def test
|
11
|
+
left_is_true_context = TestComponent::Context.new(%Q("##{left_method_name} is truthy"))
|
12
|
+
right_is_true_context = TestComponent::Context.new(%Q("##{left_method_name} is falsey"))
|
13
|
+
|
14
|
+
left_is_true_context.befores << "allow(obj).to receive(:#{left_method_name}).and_return('#{left_method_name}')"
|
15
|
+
left_is_true_context.befores << "allow(obj).to receive(:#{right_method_name})"
|
16
|
+
|
17
|
+
left_is_true_context << TestComponent::Test.new("returns ##{left_method_name}", [
|
18
|
+
"expect(subject).to eq '#{left_method_name}'"
|
19
|
+
])
|
20
|
+
|
21
|
+
left_is_true_context << TestComponent::Test.new("doesn't call ##{right_method_name}", [
|
22
|
+
"subject",
|
23
|
+
"expect(obj).not_to have_received :#{right_method_name}"
|
24
|
+
])
|
25
|
+
|
26
|
+
right_is_true_context.befores << "allow(obj).to receive(:#{left_method_name}).and_return(false)"
|
27
|
+
right_is_true_context.befores << "allow(obj).to receive(:#{right_method_name}).and_return('#{right_method_name}')"
|
28
|
+
|
29
|
+
right_is_true_context << TestComponent::Test.new("returns ##{right_method_name}", [
|
30
|
+
"expect(subject).to eq '#{right_method_name}'"
|
31
|
+
])
|
32
|
+
|
33
|
+
right_is_true_context << TestComponent::Test.new("calls ##{left_method_name}", [
|
34
|
+
"subject",
|
35
|
+
"expect(obj).to have_received :#{left_method_name}"
|
36
|
+
])
|
37
|
+
|
38
|
+
test_context << left_is_true_context
|
39
|
+
test_context << right_is_true_context
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def left
|
45
|
+
code[1]
|
46
|
+
end
|
47
|
+
|
48
|
+
def left_method_name
|
49
|
+
left[2]
|
50
|
+
end
|
51
|
+
|
52
|
+
def right
|
53
|
+
code[2]
|
54
|
+
end
|
55
|
+
|
56
|
+
def right_method_name
|
57
|
+
right[2]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -9,7 +9,10 @@ module CodeDrivenDevelopment
|
|
9
9
|
|
10
10
|
def test
|
11
11
|
test_context.befores << "allow(#{receiver_value}).to receive :#{method_name}"
|
12
|
-
body = [
|
12
|
+
body = [
|
13
|
+
"subject",
|
14
|
+
"expect(#{receiver_value}).to have_received :#{method_name}"
|
15
|
+
]
|
13
16
|
test_context << TestComponent::Test.new("calls #{receiver_value}.#{method_name}", body)
|
14
17
|
end
|
15
18
|
|
@@ -11,7 +11,7 @@ module CodeDrivenDevelopment
|
|
11
11
|
test_context << new_context
|
12
12
|
|
13
13
|
# Do this last so that the method invocation is the last line in the before.
|
14
|
-
new_context.
|
14
|
+
new_context.subject = "obj.#{method_name}"
|
15
15
|
new_context.lets << TestComponent::Let.new(:obj, "described_class.new")
|
16
16
|
end
|
17
17
|
|
@@ -9,7 +9,10 @@ module CodeDrivenDevelopment
|
|
9
9
|
|
10
10
|
def test
|
11
11
|
test_context.befores << "allow(#{receiver_value}).to receive :#{method_name}"
|
12
|
-
body = [
|
12
|
+
body = [
|
13
|
+
"subject",
|
14
|
+
"expect(#{receiver_value}).to have_received :#{method_name}"
|
15
|
+
]
|
13
16
|
test_context << TestComponent::Test.new("calls ##{method_name}", body)
|
14
17
|
end
|
15
18
|
|
@@ -1,24 +1,26 @@
|
|
1
1
|
module CodeDrivenDevelopment
|
2
2
|
module TestComponent
|
3
3
|
class Context
|
4
|
-
def initialize(description = nil, befores = [], tests = [], lets = [])
|
5
|
-
@description, @befores, @tests, @lets = description, befores, tests, lets
|
4
|
+
def initialize(description = nil, befores = [], tests = [], lets = [], subject = nil)
|
5
|
+
@description, @befores, @tests, @lets, @subject = description, befores, tests, lets, subject
|
6
6
|
end
|
7
7
|
|
8
8
|
attr_reader :tests, :befores, :lets
|
9
|
-
attr_accessor :description
|
9
|
+
attr_accessor :description, :subject
|
10
10
|
|
11
11
|
def << child
|
12
12
|
@tests << child
|
13
13
|
end
|
14
14
|
|
15
15
|
def indented_output io
|
16
|
-
io << ""
|
17
16
|
io << "describe #@description do"
|
18
17
|
io.indented do
|
19
18
|
lets.each do |let|
|
20
19
|
let.indented_output(io)
|
21
20
|
end
|
21
|
+
if subject
|
22
|
+
io << "subject { #{subject} }"
|
23
|
+
end
|
22
24
|
if befores.any?
|
23
25
|
io << "before do"
|
24
26
|
io.indented do
|
@@ -15,6 +15,7 @@ require "code_driven_development/rule/set"
|
|
15
15
|
require "code_driven_development/rule/constant_method_call"
|
16
16
|
require "code_driven_development/rule/instance_method_call"
|
17
17
|
require "code_driven_development/rule/default"
|
18
|
+
require "code_driven_development/rule/boolean_or"
|
18
19
|
require "code_driven_development/rule/class"
|
19
20
|
require "code_driven_development/rule/validation"
|
20
21
|
require "code_driven_development/rule/instance_method"
|
data/samples/president.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
-
|
2
|
+
title: creates shoulda_matchers
|
3
|
+
input: |
|
4
|
+
class Lolcat < ActiveRecord::Base
|
5
|
+
validate :cuteness, presence: true
|
6
|
+
end
|
7
|
+
output: |
|
8
|
+
describe Lolcat do
|
9
|
+
it { should validate_presence_of :cuteness }
|
10
|
+
end
|
11
|
+
-
|
12
|
+
title: instance methods that call constants
|
13
|
+
input: |
|
14
|
+
class Lolcat
|
15
|
+
def i_call_things
|
16
|
+
CentralBureaucracy.file_report
|
17
|
+
end
|
18
|
+
end
|
19
|
+
output: |
|
20
|
+
describe Lolcat do
|
21
|
+
|
22
|
+
describe "#i_call_things" do
|
23
|
+
let(:obj) { described_class.new }
|
24
|
+
before do
|
25
|
+
allow(CentralBureaucracy).to receive :file_report
|
26
|
+
obj.i_call_things
|
27
|
+
end
|
28
|
+
it "calls CentralBureaucracy.file_report" do
|
29
|
+
expect(CentralBureaucracy).to have_received :file_report
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
-
|
34
|
+
title: instance methods that call instance methods
|
35
|
+
input: |
|
36
|
+
class Lolcat
|
37
|
+
def i_call_instance_methods
|
38
|
+
meth
|
39
|
+
end
|
40
|
+
end
|
41
|
+
output: |
|
42
|
+
describe Lolcat do
|
43
|
+
|
44
|
+
describe "#i_call_instance_methods" do
|
45
|
+
let(:obj) { described_class.new }
|
46
|
+
before do
|
47
|
+
allow(obj).to receive :meth
|
48
|
+
obj.i_call_instance_methods
|
49
|
+
end
|
50
|
+
it "calls #meth" do
|
51
|
+
expect(obj).to have_received :meth
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: code_driven_development
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dan Finnie
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby_parser
|
@@ -80,6 +80,34 @@ dependencies:
|
|
80
80
|
- - '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: cucumber
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: aruba
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
83
111
|
description: Automatically generate stubby tests from your implementation.
|
84
112
|
email:
|
85
113
|
- dan@danfinnie.com
|
@@ -96,10 +124,13 @@ files:
|
|
96
124
|
- Rakefile
|
97
125
|
- bin/cdd
|
98
126
|
- code_driven_development.gemspec
|
127
|
+
- features/my_feature.feature
|
128
|
+
- features/support/aruba.rb
|
99
129
|
- lib/code_driven_development.rb
|
100
130
|
- lib/code_driven_development/code_driven_development.rb
|
101
131
|
- lib/code_driven_development/indented_output.rb
|
102
132
|
- lib/code_driven_development/rule/abstract_rule.rb
|
133
|
+
- lib/code_driven_development/rule/boolean_or.rb
|
103
134
|
- lib/code_driven_development/rule/class.rb
|
104
135
|
- lib/code_driven_development/rule/constant_method_call.rb
|
105
136
|
- lib/code_driven_development/rule/default.rb
|
@@ -114,9 +145,8 @@ files:
|
|
114
145
|
- lib/code_driven_development/test_component/test.rb
|
115
146
|
- lib/code_driven_development/version.rb
|
116
147
|
- samples/president.rb
|
117
|
-
- spec/
|
148
|
+
- spec/samples/lone_sample.yaml
|
118
149
|
- spec/spec_helper.rb
|
119
|
-
- spec/support/have_consecutive_lines_matching_matcher.rb
|
120
150
|
homepage: https://github.com/danfinnie/code-driven-development
|
121
151
|
licenses:
|
122
152
|
- MIT
|
@@ -143,6 +173,7 @@ specification_version: 4
|
|
143
173
|
summary: Ever see a test and think, "wow, this test cares a lot about the exact abstract
|
144
174
|
syntax tree of the code?" CDD aims to generate tests like that.
|
145
175
|
test_files:
|
146
|
-
-
|
176
|
+
- features/my_feature.feature
|
177
|
+
- features/support/aruba.rb
|
178
|
+
- spec/samples/lone_sample.yaml
|
147
179
|
- spec/spec_helper.rb
|
148
|
-
- spec/support/have_consecutive_lines_matching_matcher.rb
|
data/spec/my_spec.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe CodeDrivenDevelopment::CodeDrivenDevelopment do
|
4
|
-
before do
|
5
|
-
implementation = <<-EOT
|
6
|
-
class Lolcat < ActiveRecord::Base
|
7
|
-
validate :cuteness, presence: true
|
8
|
-
|
9
|
-
def i_call_things
|
10
|
-
CentralBureaucracy.file_report
|
11
|
-
end
|
12
|
-
|
13
|
-
def i_call_instance_methods
|
14
|
-
meth
|
15
|
-
end
|
16
|
-
|
17
|
-
def weigh_options
|
18
|
-
should_i_stay || should_i_go
|
19
|
-
end
|
20
|
-
end
|
21
|
-
EOT
|
22
|
-
|
23
|
-
@test = CodeDrivenDevelopment::CodeDrivenDevelopment.new(implementation).test_code
|
24
|
-
end
|
25
|
-
|
26
|
-
it "puts the model name in the describe description" do
|
27
|
-
expect(@test).to match /^describe Lolcat do/
|
28
|
-
end
|
29
|
-
|
30
|
-
it "includes shoulda-matchers for simple validations" do
|
31
|
-
expect(@test).to match /^\tit.*should.*validate_presence_of.*:cuteness/
|
32
|
-
end
|
33
|
-
|
34
|
-
it "stubs out method calls to constants" do
|
35
|
-
expect(@test).to have_consecutive_lines_matching [
|
36
|
-
/^\tdescribe.*"#i_call_things"/,
|
37
|
-
/^\t\tbefore/,
|
38
|
-
/^\t\t\tallow.CentralBureaucracy..to.*receive.*:file_report/,
|
39
|
-
/^\t\t\tobj.i_call_things/,
|
40
|
-
/^\t\tit.*calls Central.*do/,
|
41
|
-
/^\t\t\texpect.CentralBureaucracy..to.*have_received.*:file_report/
|
42
|
-
]
|
43
|
-
end
|
44
|
-
|
45
|
-
it "stubs out instance method calls" do
|
46
|
-
expect(@test).to have_consecutive_lines_matching [
|
47
|
-
/^\tdescribe.*"#i_call_instance_methods"/,
|
48
|
-
/^\t\tlet.:obj.*described_class.new/,
|
49
|
-
/^\t\tbefore/,
|
50
|
-
/^\t\t\tallow.obj..to.*receive.*:meth/,
|
51
|
-
/^\t\t\tobj.i_call_instance_methods/,
|
52
|
-
/^\t\tit.*calls #meth.*do/,
|
53
|
-
/^\t\t\texpect.obj..to.*have_received.*:meth/
|
54
|
-
]
|
55
|
-
end
|
56
|
-
|
57
|
-
it "handles ORs with aplomb" do
|
58
|
-
expect(@test).to have_consecutive_lines_matching [
|
59
|
-
/^\tdescribe.*"#weigh_options"/,
|
60
|
-
/^\t\tlet.:obj.*described_class.new/,
|
61
|
-
/^\t\tbefore/,
|
62
|
-
/^\t\t\tallow.obj..to.*receive.*:should_i_stay/,
|
63
|
-
/^\t\t\tallow.obj..to.*receive.*:should_i_go/,
|
64
|
-
/^\t\tcontext.*when.*should_i_stay.*truthy/,
|
65
|
-
/^\t\tbefore do/,
|
66
|
-
/^\t\t\t
|
67
|
-
/^\t\t\tobj.weigh_options/,
|
68
|
-
/^\t\tit.*calls #meth.*do/,
|
69
|
-
/^\t\t\texpect.obj..to.*have_received.*:meth/
|
70
|
-
]
|
71
|
-
end
|
72
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
RSpec::Matchers.define :have_consecutive_lines_matching do |*regexen|
|
2
|
-
def compute_match(string, regexen)
|
3
|
-
if regexen.empty?
|
4
|
-
return [true]
|
5
|
-
end
|
6
|
-
|
7
|
-
regex = regexen.shift
|
8
|
-
m = string.match(regex)
|
9
|
-
if m
|
10
|
-
remaining = m.post_match
|
11
|
-
newline_i = remaining.index("\n")+1
|
12
|
-
remaining = remaining[newline_i..-1]
|
13
|
-
compute_match(remaining, regexen)
|
14
|
-
else
|
15
|
-
return [false, regex, string]
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
match do |actual|
|
20
|
-
compute_match(actual, regexen.flatten).shift
|
21
|
-
end
|
22
|
-
|
23
|
-
failure_message_for_should do |actual|
|
24
|
-
_, failed_regex, failed_string = compute_match(actual, regexen.flatten)
|
25
|
-
"expected #{failed_regex.inspect} to match #{failed_string.inspect}"
|
26
|
-
end
|
27
|
-
|
28
|
-
diffable
|
29
|
-
end
|