transpec 1.3.1 → 1.4.0

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.travis.yml +1 -3
  4. data/CHANGELOG.md +9 -0
  5. data/README.md +141 -24
  6. data/README.md.erb +136 -24
  7. data/lib/transpec/ast/node.rb +7 -3
  8. data/lib/transpec/cli.rb +1 -1
  9. data/lib/transpec/configuration.rb +1 -0
  10. data/lib/transpec/converter.rb +31 -2
  11. data/lib/transpec/dynamic_analyzer.rb +1 -1
  12. data/lib/transpec/option_parser.rb +12 -9
  13. data/lib/transpec/project.rb +23 -12
  14. data/lib/transpec/rspec_version.rb +18 -4
  15. data/lib/transpec/static_context_inspector.rb +0 -15
  16. data/lib/transpec/syntax/example.rb +83 -0
  17. data/lib/transpec/syntax/expect.rb +5 -0
  18. data/lib/transpec/syntax/have.rb +111 -54
  19. data/lib/transpec/syntax/method_stub.rb +58 -37
  20. data/lib/transpec/syntax/mixin/allow_no_message.rb +2 -0
  21. data/lib/transpec/syntax/mixin/any_instance.rb +2 -0
  22. data/lib/transpec/syntax/mixin/should_base.rb +39 -0
  23. data/lib/transpec/syntax/oneliner_should.rb +218 -0
  24. data/lib/transpec/syntax/operator_matcher.rb +1 -0
  25. data/lib/transpec/syntax/should.rb +3 -30
  26. data/lib/transpec/util.rb +54 -0
  27. data/lib/transpec/version.rb +2 -2
  28. data/spec/support/shared_context.rb +21 -29
  29. data/spec/transpec/ast/node_spec.rb +1 -1
  30. data/spec/transpec/commit_message_spec.rb +29 -23
  31. data/spec/transpec/configuration_spec.rb +1 -0
  32. data/spec/transpec/converter_spec.rb +208 -5
  33. data/spec/transpec/dynamic_analyzer_spec.rb +2 -2
  34. data/spec/transpec/option_parser_spec.rb +1 -0
  35. data/spec/transpec/project_spec.rb +10 -0
  36. data/spec/transpec/rspec_version_spec.rb +52 -28
  37. data/spec/transpec/static_context_inspector_spec.rb +2 -2
  38. data/spec/transpec/syntax/be_boolean_spec.rb +6 -13
  39. data/spec/transpec/syntax/be_close_spec.rb +2 -9
  40. data/spec/transpec/syntax/double_spec.rb +2 -9
  41. data/spec/transpec/syntax/example_spec.rb +249 -0
  42. data/spec/transpec/syntax/expect_spec.rb +1 -1
  43. data/spec/transpec/syntax/have_spec.rb +127 -22
  44. data/spec/transpec/syntax/its_spec.rb +9 -18
  45. data/spec/transpec/syntax/method_stub_spec.rb +193 -158
  46. data/spec/transpec/syntax/oneliner_should_spec.rb +653 -0
  47. data/spec/transpec/syntax/operator_matcher_spec.rb +7 -8
  48. data/spec/transpec/syntax/raise_error_spec.rb +6 -13
  49. data/spec/transpec/syntax/rspec_configure_spec.rb +1 -8
  50. data/spec/transpec/syntax/should_receive_spec.rb +19 -28
  51. data/spec/transpec/syntax/should_spec.rb +18 -16
  52. data/spec/transpec/util_spec.rb +30 -0
  53. data/transpec.gemspec +8 -7
  54. metadata +49 -28
@@ -0,0 +1,653 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'transpec/syntax/oneliner_should'
5
+
6
+ module Transpec
7
+ class Syntax
8
+ describe OnelinerShould do
9
+ include_context 'parsed objects'
10
+ include_context 'syntax object', OnelinerShould, :should_object
11
+
12
+ let(:record) { should_object.report.records.first }
13
+
14
+ describe '#matcher_node' do
15
+ context 'when it is taking operator matcher' do
16
+ let(:source) do
17
+ <<-END
18
+ describe 'example' do
19
+ it { should == 1 }
20
+ end
21
+ END
22
+ end
23
+
24
+ it 'returns its parent node' do
25
+ should_object.parent_node.children[1].should == :==
26
+ should_object.matcher_node.should == should_object.parent_node
27
+ end
28
+ end
29
+
30
+ context 'when it is taking non-operator matcher without argument' do
31
+ let(:source) do
32
+ <<-END
33
+ describe 'example' do
34
+ it { should be_empty }
35
+ end
36
+ END
37
+ end
38
+
39
+ it 'returns its argument node' do
40
+ should_object.arg_node.children[1].should == :be_empty
41
+ should_object.matcher_node.should == should_object.arg_node
42
+ end
43
+ end
44
+
45
+ context 'when it is taking non-operator matcher with argument' do
46
+ let(:source) do
47
+ <<-END
48
+ describe 'example' do
49
+ it { should eq(1) }
50
+ end
51
+ END
52
+ end
53
+
54
+ it 'returns its argument node' do
55
+ should_object.arg_node.children[1].should == :eq
56
+ should_object.matcher_node.should == should_object.arg_node
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '#operator_matcher' do
62
+ subject { should_object.operator_matcher }
63
+
64
+ context 'when it is taking operator matcher' do
65
+ let(:source) do
66
+ <<-END
67
+ describe 'example' do
68
+ it { should == 1 }
69
+ end
70
+ END
71
+ end
72
+
73
+ it 'returns an instance of OperatorMatcher' do
74
+ should be_an(OperatorMatcher)
75
+ end
76
+ end
77
+
78
+ context 'when it is taking non-operator matcher' do
79
+ let(:source) do
80
+ <<-END
81
+ describe 'example' do
82
+ it { should be_empty }
83
+ end
84
+ END
85
+ end
86
+
87
+ it 'returns nil' do
88
+ should be_nil
89
+ end
90
+ end
91
+ end
92
+
93
+ describe '#have_matcher' do
94
+ subject { should_object.have_matcher }
95
+
96
+ context 'when it is taking #have matcher' do
97
+ let(:source) do
98
+ <<-END
99
+ describe 'example' do
100
+ it { should have(2).items }
101
+ end
102
+ END
103
+ end
104
+
105
+ it 'returns an instance of Have' do
106
+ should be_an(Have)
107
+ end
108
+ end
109
+
110
+ context 'when it is taking operator matcher' do
111
+ let(:source) do
112
+ <<-END
113
+ describe 'example' do
114
+ it { should == 1 }
115
+ end
116
+ END
117
+ end
118
+
119
+ it 'returns nil' do
120
+ should be_nil
121
+ end
122
+ end
123
+
124
+ context 'when it is taking any other non-operator matcher' do
125
+ let(:source) do
126
+ <<-END
127
+ describe 'example' do
128
+ it { should be_empty }
129
+ end
130
+ END
131
+ end
132
+
133
+ it 'returns nil' do
134
+ should be_nil
135
+ end
136
+ end
137
+ end
138
+
139
+ describe '#expectize!' do
140
+ context 'when it has an operator matcher' do
141
+ let(:source) do
142
+ <<-END
143
+ describe 'example' do
144
+ it { should == 1 }
145
+ end
146
+ END
147
+ end
148
+
149
+ it 'invokes OperatorMatcher#convert_operator!' do
150
+ should_object.operator_matcher.should_receive(:convert_operator!)
151
+ should_object.expectize!
152
+ end
153
+ end
154
+
155
+ context 'when it is `it { should be true }` form' do
156
+ let(:source) do
157
+ <<-END
158
+ describe 'example' do
159
+ it { should be true }
160
+ end
161
+ END
162
+ end
163
+
164
+ let(:expected_source) do
165
+ <<-END
166
+ describe 'example' do
167
+ it { is_expected.to be true }
168
+ end
169
+ END
170
+ end
171
+
172
+ it 'converts into `it { is_expected.to be true }` form' do
173
+ should_object.expectize!
174
+ rewritten_source.should == expected_source
175
+ end
176
+
177
+ it 'adds record `it { should ... }` -> `it { is_expected.to ... }`' do
178
+ should_object.expectize!
179
+ record.original_syntax.should == 'it { should ... }'
180
+ record.converted_syntax.should == 'it { is_expected.to ... }'
181
+ end
182
+ end
183
+
184
+ context 'when it is `it { should() == 1 }` form' do
185
+ let(:source) do
186
+ <<-END
187
+ describe 'example' do
188
+ it { should() == 1 }
189
+ end
190
+ END
191
+ end
192
+
193
+ let(:expected_source) do
194
+ <<-END
195
+ describe 'example' do
196
+ it { is_expected.to eq(1) }
197
+ end
198
+ END
199
+ end
200
+
201
+ it 'converts into `it { is_expected.to eq(1) }` form' do
202
+ should_object.expectize!
203
+ rewritten_source.should == expected_source
204
+ end
205
+ end
206
+ end
207
+
208
+ shared_examples 'does not convert if project requires have(n).items matcher' do
209
+ context 'when rspec-rails is loaded in the spec' do
210
+ include_context 'dynamic analysis objects'
211
+
212
+ let(:source) do
213
+ <<-END
214
+ module RSpec
215
+ module Rails
216
+ end
217
+ end
218
+
219
+ describe [:foo, :bar] do
220
+ it { should have(2).items }
221
+ end
222
+ END
223
+ end
224
+
225
+ it 'does nothing' do
226
+ rewritten_source.should == source
227
+ end
228
+ end
229
+
230
+ context 'when rspec-collection_matchers is loaded in the spec' do
231
+ include_context 'dynamic analysis objects'
232
+
233
+ let(:source) do
234
+ <<-END
235
+ module RSpec
236
+ module CollectionMatchers
237
+ end
238
+ end
239
+
240
+ describe [:foo, :bar] do
241
+ it { should have(2).items }
242
+ end
243
+ END
244
+ end
245
+
246
+ let(:have_object) { should_object.have_matcher }
247
+
248
+ it 'does nothing' do
249
+ rewritten_source.should == source
250
+ end
251
+ end
252
+ end
253
+
254
+ describe '#convert_have_items_to_standard_should!' do
255
+ before do
256
+ should_object.convert_have_items_to_standard_should!
257
+ end
258
+
259
+ include_examples 'does not convert if project requires have(n).items matcher'
260
+
261
+ context 'when it is `it { should have(2).items }` form' do
262
+ let(:source) do
263
+ <<-END
264
+ describe 'example' do
265
+ it { should have(2).items }
266
+ end
267
+ END
268
+ end
269
+
270
+ let(:expected_source) do
271
+ <<-END
272
+ describe 'example' do
273
+ it 'has 2 items' do
274
+ subject.size.should == 2
275
+ end
276
+ end
277
+ END
278
+ end
279
+
280
+ it "converts into `it 'has 2 items' do subject.size.should == 2 end` form" do
281
+ rewritten_source.should == expected_source
282
+ end
283
+
284
+ it 'adds record ' +
285
+ '`it { should have(n).items }` -> `it \'has n items\' do subject.size.should == n end`' do
286
+ record.original_syntax.should == 'it { should have(n).items }'
287
+ record.converted_syntax.should == "it 'has n items' do subject.size.should == n end"
288
+ end
289
+ end
290
+
291
+ context 'when it is `it { should_not have(2).items }` form' do
292
+ let(:source) do
293
+ <<-END
294
+ describe 'example' do
295
+ it { should_not have(2).items }
296
+ end
297
+ END
298
+ end
299
+
300
+ let(:expected_source) do
301
+ <<-END
302
+ describe 'example' do
303
+ it 'does not have 2 items' do
304
+ subject.size.should_not == 2
305
+ end
306
+ end
307
+ END
308
+ end
309
+
310
+ it "converts into `it 'does not have 2 items' do subject.size.should_not == 2 end` form" do
311
+ rewritten_source.should == expected_source
312
+ end
313
+
314
+ it 'adds record `it { should_not have(n).items }`' +
315
+ ' -> `it \'does not have n items\' do subject.size.should_not == n end`' do
316
+ record.original_syntax.should == 'it { should_not have(n).items }'
317
+ record.converted_syntax.should == "it 'does not have n items' do subject.size.should_not == n end"
318
+ end
319
+ end
320
+
321
+ context 'when it is `it { should have(1).items }` form' do
322
+ let(:source) do
323
+ <<-END
324
+ describe 'example' do
325
+ it { should have(1).items }
326
+ end
327
+ END
328
+ end
329
+
330
+ let(:expected_source) do
331
+ <<-END
332
+ describe 'example' do
333
+ it 'has 1 item' do
334
+ subject.size.should == 1
335
+ end
336
+ end
337
+ END
338
+ end
339
+
340
+ it "converts into `it 'has 1 item' do subject.size.should == 1 end` form" do
341
+ rewritten_source.should == expected_source
342
+ end
343
+
344
+ it 'adds record ' +
345
+ '`it { should have(n).items }` -> `it \'has n items\' do subject.size.should == n end`' do
346
+ record.original_syntax.should == 'it { should have(n).items }'
347
+ record.converted_syntax.should == "it 'has n items' do subject.size.should == n end"
348
+ end
349
+ end
350
+
351
+ context 'when it is `it { should have(0).items }` form' do
352
+ let(:source) do
353
+ <<-END
354
+ describe 'example' do
355
+ it { should have(0).items }
356
+ end
357
+ END
358
+ end
359
+
360
+ let(:expected_source) do
361
+ <<-END
362
+ describe 'example' do
363
+ it 'has no items' do
364
+ subject.size.should == 0
365
+ end
366
+ end
367
+ END
368
+ end
369
+
370
+ it "converts into `it 'has no items' do subject.size.should == 0 end` form" do
371
+ rewritten_source.should == expected_source
372
+ end
373
+
374
+ it 'adds record ' +
375
+ '`it { should have(n).items }` -> `it \'has n items\' do subject.size.should == n end`' do
376
+ record.original_syntax.should == 'it { should have(n).items }'
377
+ record.converted_syntax.should == "it 'has n items' do subject.size.should == n end"
378
+ end
379
+ end
380
+
381
+ context 'when it is `it { should have(variable).items }` form' do
382
+ let(:source) do
383
+ <<-END
384
+ describe 'example' do
385
+ it { should have(number_of).items }
386
+ end
387
+ END
388
+ end
389
+
390
+ let(:expected_source) do
391
+ <<-END
392
+ describe 'example' do
393
+ it 'has number_of items' do
394
+ subject.size.should == number_of
395
+ end
396
+ end
397
+ END
398
+ end
399
+
400
+ it "converts into `it 'has variable items' do subject.size.should == variable end` form" do
401
+ rewritten_source.should == expected_source
402
+ end
403
+
404
+ it 'adds record ' +
405
+ '`it { should have(n).items }` -> `it \'has n items\' do subject.size.should == n end`' do
406
+ record.original_syntax.should == 'it { should have(n).items }'
407
+ record.converted_syntax.should == "it 'has n items' do subject.size.should == n end"
408
+ end
409
+ end
410
+
411
+ context 'when it is `it { should_not have(0).items }` form' do
412
+ let(:source) do
413
+ <<-END
414
+ describe 'example' do
415
+ it { should_not have(0).items }
416
+ end
417
+ END
418
+ end
419
+
420
+ let(:expected_source) do
421
+ <<-END
422
+ describe 'example' do
423
+ it 'does not have 0 items' do
424
+ subject.size.should_not == 0
425
+ end
426
+ end
427
+ END
428
+ end
429
+
430
+ it "converts into `it 'does not have 0 items' do subject.size.should_not == 0 end` form" do
431
+ rewritten_source.should == expected_source
432
+ end
433
+
434
+ it 'adds record `it { should_not have(n).items }`' +
435
+ ' -> `it \'does not have n items\' do subject.size.should_not == n end`' do
436
+ record.original_syntax.should == 'it { should_not have(n).items }'
437
+ record.converted_syntax.should == "it 'does not have n items' do subject.size.should_not == n end"
438
+ end
439
+ end
440
+
441
+ context 'when it is multiline `it { should have(2).items }` form' do
442
+ let(:source) do
443
+ <<-END
444
+ describe 'example' do
445
+ it {
446
+ should have(2).items
447
+ }
448
+ end
449
+ END
450
+ end
451
+
452
+ let(:expected_source) do
453
+ <<-END
454
+ describe 'example' do
455
+ it 'has 2 items' {
456
+ subject.size.should == 2
457
+ }
458
+ end
459
+ END
460
+ end
461
+
462
+ it "converts into `it 'has 2 items' { subject.size.should == 2 }` form" do
463
+ rewritten_source.should == expected_source
464
+ end
465
+
466
+ it 'adds record ' +
467
+ '`it { should have(n).items }` -> `it \'has n items\' do subject.size.should == n end`' do
468
+ record.original_syntax.should == 'it { should have(n).items }'
469
+ record.converted_syntax.should == "it 'has n items' do subject.size.should == n end"
470
+ end
471
+ end
472
+
473
+ context "when it is `it 'has 2 items' do should have(2).items end` form" do
474
+ let(:source) do
475
+ <<-END
476
+ describe 'example' do
477
+ it 'has 2 items' do
478
+ should have(2).items
479
+ end
480
+ end
481
+ END
482
+ end
483
+
484
+ let(:expected_source) do
485
+ <<-END
486
+ describe 'example' do
487
+ it 'has 2 items' do
488
+ subject.size.should == 2
489
+ end
490
+ end
491
+ END
492
+ end
493
+
494
+ it "converts into `it 'has 2 items' do subject.size.should == 2 end` form" do
495
+ rewritten_source.should == expected_source
496
+ end
497
+
498
+ it 'adds record ' +
499
+ '`it \'...\' { should have(n).items }` -> `it \'...\' do subject.size.should == n end`' do
500
+ record.original_syntax.should == "it '...' do should have(n).items end"
501
+ record.converted_syntax.should == "it '...' do subject.size.should == n end"
502
+ end
503
+ end
504
+
505
+ context 'when it is `it { should have_at_least(2).items }` form' do
506
+ let(:source) do
507
+ <<-END
508
+ describe 'example' do
509
+ it { should have_at_least(2).items }
510
+ end
511
+ END
512
+ end
513
+
514
+ let(:expected_source) do
515
+ <<-END
516
+ describe 'example' do
517
+ it 'has at least 2 items' do
518
+ subject.size.should >= 2
519
+ end
520
+ end
521
+ END
522
+ end
523
+
524
+ it "converts into `it 'has at least 2 items' do subject.size.should >= 2 end` form" do
525
+ rewritten_source.should == expected_source
526
+ end
527
+
528
+ it 'adds record `it { should have_at_least(n).items }` ' +
529
+ '-> `it \'has at least n items\' do subject.size.should >= n end`' do
530
+ record.original_syntax.should == 'it { should have_at_least(n).items }'
531
+ record.converted_syntax.should == "it 'has at least n items' do subject.size.should >= n end"
532
+ end
533
+ end
534
+
535
+ context 'when it is `it { should have(2).words }` form' do
536
+ context 'with runtime information' do
537
+ include_context 'dynamic analysis objects'
538
+
539
+ context 'when the subject responds to #words and #words responds to #size' do
540
+ let(:source) do
541
+ <<-END
542
+ class String
543
+ def words
544
+ split(' ')
545
+ end
546
+ end
547
+
548
+ describe 'a string' do
549
+ it { should have(2).words }
550
+ end
551
+ END
552
+ end
553
+
554
+ let(:expected_source) do
555
+ <<-END
556
+ class String
557
+ def words
558
+ split(' ')
559
+ end
560
+ end
561
+
562
+ describe 'a string' do
563
+ it 'has 2 words' do
564
+ subject.words.size.should == 2
565
+ end
566
+ end
567
+ END
568
+ end
569
+
570
+ it "converts into `it 'has 2 words' do subject.words.size.should == 2 end` form" do
571
+ rewritten_source.should == expected_source
572
+ end
573
+
574
+ it 'adds record `it { should have(n).words }` ' +
575
+ '-> `it \'has n words\' do subject.words.size.should == n end`' do
576
+ record.original_syntax.should == 'it { should have(n).words }'
577
+ record.converted_syntax.should == "it 'has n words' do subject.words.size.should == n end"
578
+ end
579
+ end
580
+ end
581
+ end
582
+ end
583
+
584
+ describe '#convert_have_items_to_standard_expect!' do
585
+ before do
586
+ should_object.convert_have_items_to_standard_expect!
587
+ end
588
+
589
+ include_examples 'does not convert if project requires have(n).items matcher'
590
+
591
+ context 'when it is `it { should have(2).items }` form' do
592
+ let(:source) do
593
+ <<-END
594
+ describe 'example' do
595
+ it { should have(2).items }
596
+ end
597
+ END
598
+ end
599
+
600
+ let(:expected_source) do
601
+ <<-END
602
+ describe 'example' do
603
+ it 'has 2 items' do
604
+ expect(subject.size).to eq(2)
605
+ end
606
+ end
607
+ END
608
+ end
609
+
610
+ it "converts into `it 'has 2 items' do expect(subject.size).to eq(2) end` form" do
611
+ rewritten_source.should == expected_source
612
+ end
613
+
614
+ it 'adds record ' +
615
+ '`it { should have(n).items }` -> `it \'has n items\' do expect(subject.size).to eq(n) end`' do
616
+ record.original_syntax.should == 'it { should have(n).items }'
617
+ record.converted_syntax.should == "it 'has n items' do expect(subject.size).to eq(n) end"
618
+ end
619
+ end
620
+
621
+ context 'when it is `it { should_not have(2).items }` form' do
622
+ let(:source) do
623
+ <<-END
624
+ describe 'example' do
625
+ it { should_not have(2).items }
626
+ end
627
+ END
628
+ end
629
+
630
+ let(:expected_source) do
631
+ <<-END
632
+ describe 'example' do
633
+ it 'does not have 2 items' do
634
+ expect(subject.size).not_to eq(2)
635
+ end
636
+ end
637
+ END
638
+ end
639
+
640
+ it "converts into `it 'does not have 2 items' do expect(subject.size).not_to eq(2) end` form" do
641
+ rewritten_source.should == expected_source
642
+ end
643
+
644
+ it 'adds record `it { should_not have(n).items }`' +
645
+ ' -> `it \'does not have n items\' do expect(subject.size).not_to eq(n) end`' do
646
+ record.original_syntax.should == 'it { should_not have(n).items }'
647
+ record.converted_syntax.should == "it 'does not have n items' do expect(subject.size).not_to eq(n) end"
648
+ end
649
+ end
650
+ end
651
+ end
652
+ end
653
+ end