transpec 0.0.1

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.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rubocop.yml +13 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +9 -0
  6. data/Guardfile +14 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +37 -0
  9. data/Rakefile +27 -0
  10. data/bin/transpec +8 -0
  11. data/lib/transpec/ast/scanner.rb +51 -0
  12. data/lib/transpec/ast/scope_stack.rb +76 -0
  13. data/lib/transpec/cli.rb +162 -0
  14. data/lib/transpec/configuration.rb +40 -0
  15. data/lib/transpec/git.rb +24 -0
  16. data/lib/transpec/rewriter.rb +109 -0
  17. data/lib/transpec/syntax/double.rb +21 -0
  18. data/lib/transpec/syntax/matcher.rb +60 -0
  19. data/lib/transpec/syntax/method_stub.rb +142 -0
  20. data/lib/transpec/syntax/send_node_syntax.rb +39 -0
  21. data/lib/transpec/syntax/should.rb +49 -0
  22. data/lib/transpec/syntax/should_receive.rb +120 -0
  23. data/lib/transpec/syntax.rb +58 -0
  24. data/lib/transpec/util.rb +50 -0
  25. data/lib/transpec/version.rb +14 -0
  26. data/lib/transpec.rb +17 -0
  27. data/spec/.rubocop.yml +19 -0
  28. data/spec/spec_helper.rb +33 -0
  29. data/spec/spec_spec.rb +54 -0
  30. data/spec/support/file_helper.rb +25 -0
  31. data/spec/support/shared_context.rb +63 -0
  32. data/spec/transpec/ast/scanner_spec.rb +177 -0
  33. data/spec/transpec/ast/scope_stack_spec.rb +94 -0
  34. data/spec/transpec/cli_spec.rb +290 -0
  35. data/spec/transpec/configuration_spec.rb +52 -0
  36. data/spec/transpec/git_spec.rb +85 -0
  37. data/spec/transpec/rewriter_spec.rb +203 -0
  38. data/spec/transpec/syntax/double_spec.rb +88 -0
  39. data/spec/transpec/syntax/matcher_spec.rb +407 -0
  40. data/spec/transpec/syntax/method_stub_spec.rb +386 -0
  41. data/spec/transpec/syntax/should_receive_spec.rb +286 -0
  42. data/spec/transpec/syntax/should_spec.rb +262 -0
  43. data/spec/transpec/util_spec.rb +48 -0
  44. data/transpec.gemspec +32 -0
  45. metadata +233 -0
@@ -0,0 +1,407 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Transpec
6
+ class Syntax
7
+ describe Matcher do
8
+ include_context 'parsed objects'
9
+ include_context 'should object'
10
+
11
+ subject(:matcher) do
12
+ Matcher.new(should_object.matcher_node, in_example_group_context?, source_rewriter)
13
+ end
14
+
15
+ let(:in_example_group_context?) { true }
16
+
17
+ describe '#method_name' do
18
+ context 'when it is operator matcher' do
19
+ let(:source) do
20
+ <<-END
21
+ it 'is 1' do
22
+ subject.should == 1
23
+ end
24
+ END
25
+ end
26
+
27
+ # (block
28
+ # (send nil :it
29
+ # (str "is 1"))
30
+ # (args)
31
+ # (send
32
+ # (send
33
+ # (send nil :subject) :should) :==
34
+ # (int 1)))
35
+
36
+ it 'returns the method name' do
37
+ matcher.method_name.should == :==
38
+ end
39
+ end
40
+
41
+ context 'when it is non-operator matcher' do
42
+ let(:source) do
43
+ <<-END
44
+ it 'is 1' do
45
+ subject.should eq(1)
46
+ end
47
+ END
48
+ end
49
+
50
+ # (block
51
+ # (send nil :it
52
+ # (str "is 1"))
53
+ # (args)
54
+ # (send
55
+ # (send nil :subject) :should
56
+ # (send nil :eq
57
+ # (int 1))))
58
+
59
+ it 'returns the method name' do
60
+ matcher.method_name.should == :eq
61
+ end
62
+ end
63
+ end
64
+
65
+ describe '#correct_operator!' do
66
+ before do
67
+ matcher.correct_operator!(parenthesize_arg)
68
+ end
69
+
70
+ let(:parenthesize_arg) { true }
71
+
72
+ context 'when it is `== 1` form' do
73
+ let(:source) do
74
+ <<-END
75
+ it 'is 1' do
76
+ subject.should == 1
77
+ end
78
+ END
79
+ end
80
+
81
+ let(:expected_source) do
82
+ <<-END
83
+ it 'is 1' do
84
+ subject.should eq(1)
85
+ end
86
+ END
87
+ end
88
+
89
+ it 'converts into `eq(1)` form' do
90
+ rewritten_source.should == expected_source
91
+ end
92
+
93
+ # Operator methods allow their argument to be in the next line,
94
+ # but non-operator methods do not.
95
+ #
96
+ # [1] pry(main)> 1 ==
97
+ # [1] pry(main)* 1
98
+ # => true
99
+ # [2] pry(main)> 1.eql?
100
+ # ArgumentError: wrong number of arguments (0 for 1)
101
+ context 'and its argument is in the next line' do
102
+ let(:source) do
103
+ <<-END
104
+ it 'is 1' do
105
+ subject.should ==
106
+ 1
107
+ end
108
+ END
109
+ end
110
+
111
+ let(:expected_source) do
112
+ <<-END
113
+ it 'is 1' do
114
+ subject.should eq(
115
+ 1
116
+ )
117
+ end
118
+ END
119
+ end
120
+
121
+ it 'inserts parentheses properly' do
122
+ rewritten_source.should == expected_source
123
+ end
124
+
125
+ context 'and false is passed as `parenthesize_arg` argument' do
126
+ let(:parenthesize_arg) { false }
127
+
128
+ it 'inserts parentheses properly because they are necessary' do
129
+ rewritten_source.should == expected_source
130
+ end
131
+ end
132
+ end
133
+ end
134
+
135
+ context "when it is `== { 'key' => 'value' }` form" do
136
+ let(:source) do
137
+ <<-END
138
+ it 'is 1' do
139
+ subject.should == { 'key' => 'value' }
140
+ end
141
+ END
142
+ end
143
+
144
+ let(:expected_source) do
145
+ <<-END
146
+ it 'is 1' do
147
+ subject.should eq({ 'key' => 'value' })
148
+ end
149
+ END
150
+ end
151
+
152
+ it "converts into `eq({ 'key' => 'value' })` form" do
153
+ rewritten_source.should == expected_source
154
+ end
155
+
156
+ context 'and false is passed as `parenthesize_arg` argument' do
157
+ let(:parenthesize_arg) { false }
158
+
159
+ it 'inserts parentheses to avoid the hash from be interpreted as a block' do
160
+ rewritten_source.should == expected_source
161
+ end
162
+ end
163
+ end
164
+
165
+ [
166
+ [:===, 'case-equals to'],
167
+ [:<, 'is less than'],
168
+ [:<=, 'is less than or equals to'],
169
+ [:>, 'is greater than'],
170
+ [:>=, 'is greater than or equals to']
171
+ ].each do |operator, description|
172
+ context "when it is `#{operator} 1` form" do
173
+ let(:source) do
174
+ <<-END
175
+ it '#{description} 1' do
176
+ subject.should #{operator} 1
177
+ end
178
+ END
179
+ end
180
+
181
+ let(:expected_source) do
182
+ <<-END
183
+ it '#{description} 1' do
184
+ subject.should be #{operator} 1
185
+ end
186
+ END
187
+ end
188
+
189
+ it "converts into `be #{operator} 1` form" do
190
+ rewritten_source.should == expected_source
191
+ end
192
+ end
193
+ end
194
+
195
+ context 'when it is `=~ /pattern/` form' do
196
+ let(:source) do
197
+ <<-END
198
+ it 'matches the pattern' do
199
+ subject.should =~ /pattern/
200
+ end
201
+ END
202
+ end
203
+
204
+ let(:expected_source) do
205
+ <<-END
206
+ it 'matches the pattern' do
207
+ subject.should match(/pattern/)
208
+ end
209
+ END
210
+ end
211
+
212
+ it 'converts into `match(/pattern/)` form' do
213
+ rewritten_source.should == expected_source
214
+ end
215
+ end
216
+
217
+ context 'when it is `=~ [1, 2]` form' do
218
+ let(:source) do
219
+ <<-END
220
+ it 'contains 1 and 2' do
221
+ subject.should =~ [1, 2]
222
+ end
223
+ END
224
+ end
225
+
226
+ let(:expected_source) do
227
+ <<-END
228
+ it 'contains 1 and 2' do
229
+ subject.should match_array([1, 2])
230
+ end
231
+ END
232
+ end
233
+
234
+ it 'converts into `match_array([1, 2])` form' do
235
+ rewritten_source.should == expected_source
236
+ end
237
+ end
238
+ end
239
+
240
+ describe '#parenthesize!' do
241
+ before do
242
+ matcher.parenthesize!(always)
243
+ end
244
+
245
+ let(:always) { true }
246
+
247
+ context 'when its argument is already in parentheses' do
248
+ let(:source) do
249
+ <<-END
250
+ it 'is 1' do
251
+ subject.should eq(1)
252
+ end
253
+ END
254
+ end
255
+
256
+ it 'does nothing' do
257
+ rewritten_source.should == source
258
+ end
259
+ end
260
+
261
+ context 'when its argument is not in parentheses' do
262
+ let(:source) do
263
+ <<-END
264
+ it 'is 1' do
265
+ subject.should eq 1
266
+ end
267
+ END
268
+ end
269
+
270
+ context 'and true is passed as `always` argument' do
271
+ let(:always) { true }
272
+
273
+ let(:expected_source) do
274
+ <<-END
275
+ it 'is 1' do
276
+ subject.should eq(1)
277
+ end
278
+ END
279
+ end
280
+
281
+ it 'inserts parentheses' do
282
+ rewritten_source.should == expected_source
283
+ end
284
+ end
285
+
286
+ context 'and false is passed as `always` argument' do
287
+ let(:always) { false }
288
+
289
+ let(:expected_source) do
290
+ <<-END
291
+ it 'is 1' do
292
+ subject.should eq 1
293
+ end
294
+ END
295
+ end
296
+
297
+ it 'does not nothing' do
298
+ rewritten_source.should == expected_source
299
+ end
300
+ end
301
+ end
302
+
303
+ context 'when its multiple arguments are not in parentheses' do
304
+ let(:source) do
305
+ <<-END
306
+ it 'contains 1 and 2' do
307
+ subject.should include 1, 2
308
+ end
309
+ END
310
+ end
311
+
312
+ let(:expected_source) do
313
+ <<-END
314
+ it 'contains 1 and 2' do
315
+ subject.should include(1, 2)
316
+ end
317
+ END
318
+ end
319
+
320
+ it 'inserts parentheses' do
321
+ rewritten_source.should == expected_source
322
+ end
323
+ end
324
+
325
+ context 'when its argument is a string literal' do
326
+ let(:source) do
327
+ <<-END
328
+ it "is 'string'" do
329
+ subject.should eq 'string'
330
+ end
331
+ END
332
+ end
333
+
334
+ let(:expected_source) do
335
+ <<-END
336
+ it "is 'string'" do
337
+ subject.should eq('string')
338
+ end
339
+ END
340
+ end
341
+
342
+ it 'inserts parentheses' do
343
+ rewritten_source.should == expected_source
344
+ end
345
+ end
346
+
347
+ context 'when its argument is a here document' do
348
+ let(:source) do
349
+ <<-END
350
+ it 'returns the document' do
351
+ subject.should eq <<-HEREDOC
352
+ foo
353
+ HEREDOC
354
+ end
355
+ END
356
+ end
357
+
358
+ # (block
359
+ # (send nil :it
360
+ # (str "returns the document"))
361
+ # (args)
362
+ # (send
363
+ # (send nil :subject) :should
364
+ # (send nil :eq
365
+ # (str " foo\n"))))
366
+
367
+ it 'does nothing' do
368
+ rewritten_source.should == source
369
+ end
370
+ end
371
+
372
+ context 'when its argument is a here document with interpolation' do
373
+ let(:source) do
374
+ <<-'END'
375
+ it 'returns the document' do
376
+ string = 'foo'
377
+ subject.should eq <<-HEREDOC
378
+ #{string}
379
+ HEREDOC
380
+ end
381
+ END
382
+ end
383
+
384
+ # (block
385
+ # (send nil :it
386
+ # (str "returns the document"))
387
+ # (args)
388
+ # (begin
389
+ # (lvasgn :string
390
+ # (str "foo"))
391
+ # (send
392
+ # (send nil :subject) :should
393
+ # (send nil :eq
394
+ # (dstr
395
+ # (str " ")
396
+ # (begin
397
+ # (lvar :string))
398
+ # (str "\n"))))))
399
+
400
+ it 'does nothing' do
401
+ rewritten_source.should == source
402
+ end
403
+ end
404
+ end
405
+ end
406
+ end
407
+ end