transpec 1.10.4 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -3
- data/CHANGELOG.md +9 -0
- data/README.md +96 -18
- data/README.md.erb +117 -51
- data/lib/transpec/base_rewriter.rb +25 -28
- data/lib/transpec/cli.rb +27 -14
- data/lib/transpec/configuration.rb +2 -1
- data/lib/transpec/converter.rb +54 -32
- data/lib/transpec/dynamic_analyzer/helper.rb.erb +44 -0
- data/lib/transpec/dynamic_analyzer/node_util.rb +17 -0
- data/lib/transpec/dynamic_analyzer/rewriter.rb +12 -4
- data/lib/transpec/dynamic_analyzer/runtime_data.rb +3 -4
- data/lib/transpec/dynamic_analyzer.rb +14 -52
- data/lib/transpec/option_parser.rb +89 -81
- data/lib/transpec/processed_source.rb +48 -0
- data/lib/transpec/record.rb +2 -2
- data/lib/transpec/report.rb +5 -1
- data/lib/transpec/rspec_dsl.rb +12 -2
- data/lib/transpec/rspec_version.rb +8 -7
- data/lib/transpec/spec_suite.rb +114 -0
- data/lib/transpec/syntax/example.rb +4 -20
- data/lib/transpec/syntax/example_group.rb +38 -0
- data/lib/transpec/syntax/have.rb +6 -9
- data/lib/transpec/syntax/its.rb +5 -7
- data/lib/transpec/syntax/method_stub.rb +12 -13
- data/lib/transpec/syntax/mixin/any_instance_block.rb +14 -6
- data/lib/transpec/syntax/mixin/context_sensitive.rb +41 -0
- data/lib/transpec/syntax/mixin/matcher_owner.rb +16 -26
- data/lib/transpec/syntax/mixin/monkey_patch_any_instance.rb +1 -1
- data/lib/transpec/syntax/mixin/no_message_allowance.rb +2 -2
- data/lib/transpec/syntax/mixin/useless_and_return.rb +2 -2
- data/lib/transpec/syntax/oneliner_should.rb +9 -13
- data/lib/transpec/syntax/operator.rb +3 -7
- data/lib/transpec/syntax/pending.rb +4 -20
- data/lib/transpec/syntax/rspec_configure/configuration_modification.rb +86 -0
- data/lib/transpec/syntax/rspec_configure/framework.rb +45 -86
- data/lib/transpec/syntax/rspec_configure.rb +18 -6
- data/lib/transpec/syntax/should.rb +3 -5
- data/lib/transpec/syntax/should_receive.rb +1 -1
- data/lib/transpec/syntax.rb +8 -0
- data/lib/transpec/util.rb +0 -8
- data/lib/transpec/version.rb +2 -2
- data/spec/acceptance/configuration_modification_spec.rb +132 -0
- data/spec/acceptance/conversion_spec.rb +114 -0
- data/spec/support/shared_context.rb +6 -12
- data/spec/transpec/cli_spec.rb +21 -23
- data/spec/transpec/configuration_spec.rb +2 -1
- data/spec/transpec/converter_spec.rb +292 -213
- data/spec/transpec/dynamic_analyzer/rewriter_spec.rb +3 -3
- data/spec/transpec/dynamic_analyzer_spec.rb +8 -2
- data/spec/transpec/option_parser_spec.rb +42 -4
- data/spec/transpec/processed_source_spec.rb +67 -0
- data/spec/transpec/rspec_version_spec.rb +8 -2
- data/spec/transpec/spec_suite_spec.rb +107 -0
- data/spec/transpec/syntax/allow_spec.rb +9 -27
- data/spec/transpec/syntax/example_group_spec.rb +172 -0
- data/spec/transpec/syntax/expect_spec.rb +18 -54
- data/spec/transpec/syntax/have_spec.rb +35 -14
- data/spec/transpec/syntax/its_spec.rb +27 -7
- data/spec/transpec/syntax/method_stub_spec.rb +31 -8
- data/spec/transpec/syntax/oneliner_should_spec.rb +22 -131
- data/spec/transpec/syntax/rspec_configure_spec.rb +118 -15
- data/spec/transpec/syntax/should_spec.rb +51 -82
- data/tasks/fixtures/guard/COMMIT_EDITMSG +80 -0
- data/tasks/fixtures/mail/COMMIT_EDITMSG +84 -0
- data/tasks/fixtures/twitter/COMMIT_EDITMSG +36 -0
- data/tasks/lib/transpec_test.rb +23 -2
- data/tasks/readme.rake +35 -0
- metadata +22 -4
- data/lib/transpec/parser.rb +0 -9
@@ -10,8 +10,8 @@ module Transpec
|
|
10
10
|
|
11
11
|
subject(:rewriter) { Rewriter.new }
|
12
12
|
|
13
|
-
describe '#
|
14
|
-
subject { rewriter.
|
13
|
+
describe '#rewrite_source' do
|
14
|
+
subject { rewriter.rewrite_source(source) }
|
15
15
|
|
16
16
|
let(:source) do
|
17
17
|
<<-END
|
@@ -43,7 +43,7 @@ module Transpec
|
|
43
43
|
# rubocop:disable LineLength
|
44
44
|
let(:expected_source) do
|
45
45
|
<<-'END'
|
46
|
-
transpec_analyze((transpec_analyze((subject), self, "(string)_14_21", { :should_source_location => [:object, "method(:should).source_location"], :should_example_method_defined_by_user? => [:object, "owner = method(:should).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] }).should), self, "(string)_14_28", { :"=~_source_location" => [:object, "method(:=~).source_location"], :"=~_example_method_defined_by_user?" => [:object, "owner = method(:=~).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"]
|
46
|
+
transpec_analyze((transpec_analyze((subject), self, "(string)_14_21", { :should_source_location => [:object, "method(:should).source_location"], :should_example_method_defined_by_user? => [:object, "owner = method(:should).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] }).should), self, "(string)_14_28", { :expect_available? => [:context, "self.class.ancestors.any? { |a| a.name.start_with?('RSpec::') } && respond_to?(:expect)"], :"=~_source_location" => [:object, "method(:=~).source_location"], :"=~_example_method_defined_by_user?" => [:object, "owner = method(:=~).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] }) =~ transpec_analyze((<<-HEREDOC.gsub('foo', 'bar')), self, "(string)_32_61", { :enumerable_arg? => [:object, "is_a?(Enumerable)"] })
|
47
47
|
foo
|
48
48
|
HEREDOC
|
49
49
|
END
|
@@ -92,7 +92,10 @@ module Transpec
|
|
92
92
|
|
93
93
|
context 'when no path is passed' do
|
94
94
|
it 'rewrites all files in the "spec" directory' do
|
95
|
-
DynamicAnalyzer::Rewriter.any_instance.should_receive(:rewrite_file!)
|
95
|
+
DynamicAnalyzer::Rewriter.any_instance.should_receive(:rewrite_file!) do |spec|
|
96
|
+
spec.path.should == file_path
|
97
|
+
end
|
98
|
+
|
96
99
|
dynamic_analyzer.analyze
|
97
100
|
end
|
98
101
|
end
|
@@ -103,7 +106,10 @@ module Transpec
|
|
103
106
|
end
|
104
107
|
|
105
108
|
it 'rewrites only files in the passed paths' do
|
106
|
-
DynamicAnalyzer::Rewriter.any_instance.should_receive(:rewrite_file!)
|
109
|
+
DynamicAnalyzer::Rewriter.any_instance.should_receive(:rewrite_file!) do |spec|
|
110
|
+
spec.path.should == file_path
|
111
|
+
end
|
112
|
+
|
107
113
|
dynamic_analyzer.analyze([file_path])
|
108
114
|
end
|
109
115
|
end
|
@@ -101,6 +101,32 @@ module Transpec
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
|
+
describe '-v/--convert option' do
|
105
|
+
[
|
106
|
+
['stub_with_hash', :convert_stub_with_hash_to_allow_to_receive_and_return?],
|
107
|
+
['example_group', :convert_example_group?]
|
108
|
+
].each do |cli_type, config_attr|
|
109
|
+
context "when #{cli_type.inspect} is specified" do
|
110
|
+
let(:args) { ['--convert', cli_type] }
|
111
|
+
|
112
|
+
it "sets Configuration##{config_attr} true" do
|
113
|
+
parser.parse(args)
|
114
|
+
configuration.send(config_attr).should be_true
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'when unknown type is specified' do
|
120
|
+
let(:args) { ['--convert', 'unknown'] }
|
121
|
+
|
122
|
+
it 'raises error' do
|
123
|
+
-> { parser.parse(args) }.should raise_error(ArgumentError) { |error|
|
124
|
+
error.message.should == 'Unknown syntax type "unknown"'
|
125
|
+
}
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
104
130
|
describe '-n/--negative-form option' do
|
105
131
|
['not_to', 'to_not'].each do |form|
|
106
132
|
context "when #{form.inspect} is specified" do
|
@@ -159,9 +185,21 @@ module Transpec
|
|
159
185
|
describe '-t/--convert-stub-with-hash option' do
|
160
186
|
let(:args) { ['--convert-stub-with-hash'] }
|
161
187
|
|
162
|
-
|
188
|
+
before do
|
189
|
+
parser.stub(:warn)
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'sets Configuration#convert_stub_with_hash_to_allow_to_receive_and_return? true' do
|
193
|
+
parser.parse(args)
|
194
|
+
configuration.convert_stub_with_hash_to_allow_to_receive_and_return?.should be_true
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'is deprecated' do
|
198
|
+
parser.should_receive(:warn) do |message|
|
199
|
+
message.should =~ /--convert-stub-with-hash.+deprecated/i
|
200
|
+
end
|
201
|
+
|
163
202
|
parser.parse(args)
|
164
|
-
configuration.convert_stub_with_hash_to_stub_and_return?.should be_true
|
165
203
|
end
|
166
204
|
end
|
167
205
|
|
@@ -212,9 +250,9 @@ module Transpec
|
|
212
250
|
parser.help
|
213
251
|
end
|
214
252
|
|
215
|
-
it 'does not exceed
|
253
|
+
it 'does not exceed 100 characters in each line' do
|
216
254
|
help_text.each_line do |line|
|
217
|
-
line.chomp.length.should <=
|
255
|
+
line.chomp.length.should <= 100
|
218
256
|
end
|
219
257
|
end
|
220
258
|
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'transpec/processed_source'
|
5
|
+
|
6
|
+
module Transpec
|
7
|
+
describe ProcessedSource do
|
8
|
+
describe '.parse_file' do
|
9
|
+
include FileHelper
|
10
|
+
include_context 'isolated environment'
|
11
|
+
|
12
|
+
let(:spec_path) { 'spec/example_spec.rb' }
|
13
|
+
|
14
|
+
before do
|
15
|
+
create_file(spec_path, "puts 'foo'")
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'parses the file and returns processed source' do
|
19
|
+
processed_source = ProcessedSource.parse_file(spec_path)
|
20
|
+
processed_source.path.should == spec_path
|
21
|
+
processed_source.ast.should_not be_nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '.parse' do
|
26
|
+
it 'parses the source and returns processed source' do
|
27
|
+
processed_source = ProcessedSource.parse("puts 'foo'")
|
28
|
+
processed_source.ast.should_not be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when a file path is passed' do
|
32
|
+
let(:spec_path) { 'spec/example_spec.rb' }
|
33
|
+
|
34
|
+
it 'sets the path to the instance' do
|
35
|
+
processed_source = ProcessedSource.parse("puts 'foo'", spec_path)
|
36
|
+
processed_source.path.should == spec_path
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'when no file path is passed' do
|
41
|
+
it 'does not set the path to the instance' do
|
42
|
+
processed_source = ProcessedSource.parse("puts 'foo'")
|
43
|
+
processed_source.path.should be_nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when the file has invalid source' do
|
48
|
+
it 'sets syntax error to the instance' do
|
49
|
+
processed_source = ProcessedSource.parse('<')
|
50
|
+
processed_source.syntax_error.should be_a(Parser::SyntaxError)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#to_s' do
|
56
|
+
it 'returns the original source' do
|
57
|
+
source = [
|
58
|
+
"puts 'foo'",
|
59
|
+
"puts 'bar'"
|
60
|
+
].join("\n")
|
61
|
+
|
62
|
+
processed_source = ProcessedSource.parse(source)
|
63
|
+
processed_source.to_s.should == source
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -54,7 +54,9 @@ module Transpec
|
|
54
54
|
]
|
55
55
|
end
|
56
56
|
|
57
|
-
[
|
57
|
+
[
|
58
|
+
:receive_messages_available?
|
59
|
+
].each do |method|
|
58
60
|
include_examples 'version comparisons', method, [
|
59
61
|
['2.14.0', false],
|
60
62
|
['2.99.0.beta1', false],
|
@@ -66,7 +68,11 @@ module Transpec
|
|
66
68
|
]
|
67
69
|
end
|
68
70
|
|
69
|
-
[
|
71
|
+
[
|
72
|
+
:receive_message_chain_available?,
|
73
|
+
:non_should_matcher_protocol_available?,
|
74
|
+
:non_monkey_patch_example_group_available?
|
75
|
+
].each do |method|
|
70
76
|
include_examples 'version comparisons', method, [
|
71
77
|
['2.14.0', false],
|
72
78
|
['2.99.0.beta1', false],
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'transpec/spec_suite'
|
5
|
+
require 'transpec/dynamic_analyzer'
|
6
|
+
|
7
|
+
module Transpec
|
8
|
+
describe SpecSuite do
|
9
|
+
include FileHelper
|
10
|
+
include_context 'isolated environment'
|
11
|
+
|
12
|
+
subject(:spec_suite) { SpecSuite.new(base_paths, runtime_data) }
|
13
|
+
let(:runtime_data) { nil }
|
14
|
+
let(:base_paths) { [] }
|
15
|
+
|
16
|
+
describe '#need_to_modify_yield_receiver_to_any_instance_implementation_blocks_config?' do
|
17
|
+
subject do
|
18
|
+
spec_suite.need_to_modify_yield_receiver_to_any_instance_implementation_blocks_config?
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when there's an any_instance block to convert" do
|
22
|
+
before do
|
23
|
+
create_file('spec/example_spec.rb', <<-END)
|
24
|
+
describe 'example' do
|
25
|
+
it 'responds to #message' do
|
26
|
+
Object.any_instance.stub(:message) do |arg|
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
END
|
31
|
+
end
|
32
|
+
|
33
|
+
it { should be_true }
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when there's no any_instance block to convert" do
|
37
|
+
before do
|
38
|
+
create_file('spec/example_spec.rb', <<-END)
|
39
|
+
describe 'example' do
|
40
|
+
it 'responds to #message' do
|
41
|
+
Object.any_instance.stub(:message) do
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
END
|
46
|
+
end
|
47
|
+
|
48
|
+
it { should be_false }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#main_rspec_configure_node?' do
|
53
|
+
before do
|
54
|
+
create_file('spec/spec_helper.rb', <<-END)
|
55
|
+
RSpec.configure do |config|
|
56
|
+
end
|
57
|
+
END
|
58
|
+
|
59
|
+
create_file('spec/unit/spec_helper.rb', <<-END)
|
60
|
+
require 'spec_helper'
|
61
|
+
|
62
|
+
RSpec.configure do |config|
|
63
|
+
end
|
64
|
+
END
|
65
|
+
|
66
|
+
create_file('spec/unit/unit_spec.rb', <<-END)
|
67
|
+
require 'unit/spec_helper'
|
68
|
+
END
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'without runtime information' do
|
72
|
+
it 'returns true for every node' do
|
73
|
+
spec_suite.specs.each do |spec|
|
74
|
+
spec.ast.each_node do |node|
|
75
|
+
spec_suite.main_rspec_configure_node?(node).should be_true
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'with runtime information' do
|
82
|
+
let(:runtime_data) { Transpec::DynamicAnalyzer.new(silent: true).analyze(base_paths) }
|
83
|
+
|
84
|
+
let(:main_rspec_configure_node) do
|
85
|
+
spec_suite.specs.each do |spec|
|
86
|
+
next unless spec.path == 'spec/spec_helper.rb'
|
87
|
+
spec.ast.each_node do |node|
|
88
|
+
return node if node.send_type? && node.children[1] == :configure
|
89
|
+
end
|
90
|
+
end
|
91
|
+
fail 'Main RSpec.configure node not found!'
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'returns true only for the main RSpec.configure node' do
|
95
|
+
spec_suite.main_rspec_configure_node?(main_rspec_configure_node).should be_true
|
96
|
+
|
97
|
+
spec_suite.specs.each do |spec|
|
98
|
+
spec.ast.each_node do |node|
|
99
|
+
next if node.equal?(main_rspec_configure_node)
|
100
|
+
spec_suite.main_rspec_configure_node?(node).should be_false
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -65,36 +65,18 @@ module Transpec
|
|
65
65
|
describe '#receive_matcher' do
|
66
66
|
subject { allow_object.receive_matcher }
|
67
67
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
allow(subject).to receive(:foo)
|
74
|
-
end
|
68
|
+
let(:source) do
|
69
|
+
<<-END
|
70
|
+
describe 'example' do
|
71
|
+
it 'receives :foo' do
|
72
|
+
allow(subject).to receive(:foo)
|
75
73
|
end
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
it 'returns an instance of Receive' do
|
80
|
-
should be_an(Receive)
|
81
|
-
end
|
74
|
+
end
|
75
|
+
END
|
82
76
|
end
|
83
77
|
|
84
|
-
|
85
|
-
|
86
|
-
<<-END
|
87
|
-
describe 'example' do
|
88
|
-
it 'is empty' do
|
89
|
-
allow(subject).to be_empty
|
90
|
-
end
|
91
|
-
end
|
92
|
-
END
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'returns nil' do
|
96
|
-
should be_nil
|
97
|
-
end
|
78
|
+
it 'returns an instance of Receive' do
|
79
|
+
should be_an(Receive)
|
98
80
|
end
|
99
81
|
end
|
100
82
|
|
@@ -0,0 +1,172 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'transpec/syntax/example_group'
|
5
|
+
|
6
|
+
module Transpec
|
7
|
+
class Syntax
|
8
|
+
describe ExampleGroup do
|
9
|
+
include_context 'parsed objects'
|
10
|
+
include_context 'syntax object', ExampleGroup, :example_group
|
11
|
+
|
12
|
+
let(:record) { example_group.report.records.first }
|
13
|
+
|
14
|
+
describe '#convert_to_non_monkey_patch!' do
|
15
|
+
context 'when it is in top level scope' do
|
16
|
+
[
|
17
|
+
:describe,
|
18
|
+
:shared_examples,
|
19
|
+
:shared_context,
|
20
|
+
:share_examples_for,
|
21
|
+
:shared_examples_for
|
22
|
+
].each do |method|
|
23
|
+
context "with expression `#{method} 'something' do ... end`" do
|
24
|
+
let(:source) do
|
25
|
+
<<-END
|
26
|
+
#{method} 'something' do
|
27
|
+
end
|
28
|
+
END
|
29
|
+
end
|
30
|
+
|
31
|
+
let(:expected_source) do
|
32
|
+
<<-END
|
33
|
+
RSpec.#{method} 'something' do
|
34
|
+
end
|
35
|
+
END
|
36
|
+
end
|
37
|
+
|
38
|
+
it "converts to `RSpec.#{method} 'something' do ... end`" do
|
39
|
+
example_group.convert_to_non_monkey_patch!
|
40
|
+
rewritten_source.should == expected_source
|
41
|
+
end
|
42
|
+
|
43
|
+
it "adds record `#{method} 'something' { }` -> `RSpec.#{method} 'something' { }`" do
|
44
|
+
example_group.convert_to_non_monkey_patch!
|
45
|
+
record.original_syntax.should == "#{method} 'something' { }"
|
46
|
+
record.converted_syntax.should == "RSpec.#{method} 'something' { }"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when the #describe is in a module' do
|
53
|
+
let(:source) do
|
54
|
+
<<-END
|
55
|
+
module SomeModule
|
56
|
+
describe 'something' do
|
57
|
+
end
|
58
|
+
end
|
59
|
+
END
|
60
|
+
end
|
61
|
+
|
62
|
+
let(:expected_source) do
|
63
|
+
<<-END
|
64
|
+
module SomeModule
|
65
|
+
RSpec.describe 'something' do
|
66
|
+
end
|
67
|
+
end
|
68
|
+
END
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'converts' do
|
72
|
+
example_group.convert_to_non_monkey_patch!
|
73
|
+
rewritten_source.should == expected_source
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
shared_context 'multiple #describes' do
|
78
|
+
before do
|
79
|
+
ast.each_node do |node|
|
80
|
+
example_group = described_class.new(node, source_rewriter, runtime_data)
|
81
|
+
next unless example_group.conversion_target?
|
82
|
+
example_group.convert_to_non_monkey_patch!
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'when #describes are nested' do
|
88
|
+
include_context 'multiple #describes'
|
89
|
+
|
90
|
+
let(:source) do
|
91
|
+
<<-END
|
92
|
+
describe 'something' do
|
93
|
+
describe '#some_method' do
|
94
|
+
end
|
95
|
+
end
|
96
|
+
END
|
97
|
+
end
|
98
|
+
|
99
|
+
let(:expected_source) do
|
100
|
+
<<-END
|
101
|
+
RSpec.describe 'something' do
|
102
|
+
describe '#some_method' do
|
103
|
+
end
|
104
|
+
end
|
105
|
+
END
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'converts only the outermost #describe' do
|
109
|
+
rewritten_source.should == expected_source
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'when logical-inner #describe is placed outside of the outer #describe in source' do
|
114
|
+
include_context 'multiple #describes'
|
115
|
+
|
116
|
+
let(:source) do
|
117
|
+
<<-END
|
118
|
+
inner_proc = proc do
|
119
|
+
describe 'inner' do
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe 'outer' do
|
124
|
+
instance_eval(&inner_proc)
|
125
|
+
end
|
126
|
+
END
|
127
|
+
end
|
128
|
+
|
129
|
+
context 'without runtime information' do
|
130
|
+
let(:expected_source) do
|
131
|
+
<<-END
|
132
|
+
inner_proc = proc do
|
133
|
+
RSpec.describe 'inner' do
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
RSpec.describe 'outer' do
|
138
|
+
instance_eval(&inner_proc)
|
139
|
+
end
|
140
|
+
END
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'unfortunately converts both #describe' do
|
144
|
+
rewritten_source.should == expected_source
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'with runtime information' do
|
149
|
+
include_context 'dynamic analysis objects'
|
150
|
+
|
151
|
+
let(:expected_source) do
|
152
|
+
<<-END
|
153
|
+
inner_proc = proc do
|
154
|
+
describe 'inner' do
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
RSpec.describe 'outer' do
|
159
|
+
instance_eval(&inner_proc)
|
160
|
+
end
|
161
|
+
END
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'properly converts only the outermost #describe' do
|
165
|
+
rewritten_source.should == expected_source
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -151,72 +151,36 @@ module Transpec
|
|
151
151
|
describe '#have_matcher' do
|
152
152
|
subject { expect_object.have_matcher }
|
153
153
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
expect(subject).to have(2).items
|
160
|
-
end
|
154
|
+
let(:source) do
|
155
|
+
<<-END
|
156
|
+
describe 'example' do
|
157
|
+
it 'has 2 items' do
|
158
|
+
expect(subject).to have(2).items
|
161
159
|
end
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
it 'returns an instance of Have' do
|
166
|
-
should be_an(Have)
|
167
|
-
end
|
160
|
+
end
|
161
|
+
END
|
168
162
|
end
|
169
163
|
|
170
|
-
|
171
|
-
|
172
|
-
<<-END
|
173
|
-
describe 'example' do
|
174
|
-
it 'is empty' do
|
175
|
-
expect(subject).to be_empty
|
176
|
-
end
|
177
|
-
end
|
178
|
-
END
|
179
|
-
end
|
180
|
-
|
181
|
-
it 'returns nil' do
|
182
|
-
should be_nil
|
183
|
-
end
|
164
|
+
it 'returns an instance of Have' do
|
165
|
+
should be_an(Have)
|
184
166
|
end
|
185
167
|
end
|
186
168
|
|
187
169
|
describe '#receive_matcher' do
|
188
170
|
subject { expect_object.receive_matcher }
|
189
171
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
expect(subject).to receive(:foo)
|
196
|
-
end
|
172
|
+
let(:source) do
|
173
|
+
<<-END
|
174
|
+
describe 'example' do
|
175
|
+
it 'receives :foo' do
|
176
|
+
expect(subject).to receive(:foo)
|
197
177
|
end
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
it 'returns an instance of Receive' do
|
202
|
-
should be_an(Receive)
|
203
|
-
end
|
178
|
+
end
|
179
|
+
END
|
204
180
|
end
|
205
181
|
|
206
|
-
|
207
|
-
|
208
|
-
<<-END
|
209
|
-
describe 'example' do
|
210
|
-
it 'is empty' do
|
211
|
-
expect(subject).to be_empty
|
212
|
-
end
|
213
|
-
end
|
214
|
-
END
|
215
|
-
end
|
216
|
-
|
217
|
-
it 'returns nil' do
|
218
|
-
should be_nil
|
219
|
-
end
|
182
|
+
it 'returns an instance of Receive' do
|
183
|
+
should be_an(Receive)
|
220
184
|
end
|
221
185
|
end
|
222
186
|
|