given_core 3.0.0.beta.3 → 3.0.0.beta.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 04ca5be81485061fc57dc73c2e1f8a4a86f799ca
4
- data.tar.gz: 02862c5068077231c9f0dad7df109e0540851750
3
+ metadata.gz: bb2de1d0ef168f096a0c169b3e7374c7ba30d785
4
+ data.tar.gz: e7ad7adad7bcafbedc3b7b71de4fa76a55d23c3f
5
5
  SHA512:
6
- metadata.gz: 425cb795b6a34c8226e9576696b2f01a8e0aea8089f2a3b96a8ffa351b0efe1df090f14eda3f31e58e92b8aed658b0677c58946b3a777114313a0b56944a9966
7
- data.tar.gz: 65db4132658c4285db274b064f463c8a6c8ccb4d58f2f7f561adc61f0dad1277998f9f9f43ec5c4082915f43ea5cf00928c6496d8590bb28f218fbf3fe37e7b5
6
+ metadata.gz: c5ba77de5d6d12fc167409b9f492e358619ddf7749c44158ffa67043480e6eea3b0cca50afe4c860a9a1393e049817f6c0ffb1ab69a8fc9e37a84b9160d34515
7
+ data.tar.gz: a4693b820a814b98a485e232b42dfee6533aa4f069d208f363abe140f1656b9636ffa9b656d926fe622ac02af35b0b92023d67097dc2537386827faefc8aaf0a
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # rspec-given
1
+ # Given/When/Then for RSpec and Minitest
2
2
 
3
3
  | Master |
4
4
  | :----: |
@@ -28,7 +28,7 @@ The rspec-given gem is the original given/when/then extension for
28
28
  RSpec. It now depends on a given_core gem for the basic functionality
29
29
  and then adds the RSpec specific code.
30
30
 
31
- * rspec-given now require RSpec version 2.12 or better.
31
+ * rspec-given now requires RSpec version 2.12 or better.
32
32
 
33
33
  ### Minitest/Given
34
34
 
@@ -58,7 +58,7 @@ things to watch out for:
58
58
 
59
59
  ### Auto Selecting
60
60
 
61
- If you exclusively use natural assertions in your specs, it's quite
61
+ If you use natural assertions exclusively in your specs, it's quite
62
62
  possible to write specs that run under both RSpec and Minitest::Spec.
63
63
 
64
64
  Use this at the start of your spec file:
@@ -94,22 +94,22 @@ describe Stack do
94
94
  end
95
95
 
96
96
  Given(:stack) { stack_with(initial_contents) }
97
- Invariant { stack.empty?.should == (stack.depth == 0) }
97
+ Invariant { stack.empty? == (stack.depth == 0) }
98
98
 
99
99
  context "with no items" do
100
100
  Given(:initial_contents) { [] }
101
- Then { stack.depth.should == 0 }
101
+ Then { stack.depth == 0 }
102
102
 
103
103
  context "when pushing" do
104
104
  When { stack.push(:an_item) }
105
105
 
106
- Then { stack.depth.should == 1 }
107
- Then { stack.top.should == :an_item }
106
+ Then { stack.depth == 1 }
107
+ Then { stack.top == :an_item }
108
108
  end
109
109
 
110
110
  context "when popping" do
111
111
  When(:result) { stack.pop }
112
- Then { result.should have_failed(Stack::UnderflowError, /empty/) }
112
+ Then { result == Failure(Stack::UnderflowError, /empty/) }
113
113
  end
114
114
  end
115
115
 
@@ -119,8 +119,8 @@ describe Stack do
119
119
  context "when popping" do
120
120
  When(:pop_result) { stack.pop }
121
121
 
122
- Then { pop_result.should == :an_item }
123
- Then { stack.depth.should == 0 }
122
+ Then { pop_result == :an_item }
123
+ Then { stack.depth == 0 }
124
124
  end
125
125
  end
126
126
 
@@ -131,16 +131,16 @@ describe Stack do
131
131
  context "when pushing" do
132
132
  When { stack.push(:new_item) }
133
133
 
134
- Then { stack.top.should == :new_item }
135
- Then { stack.depth.should == original_depth + 1 }
134
+ Then { stack.top == :new_item }
135
+ Then { stack.depth == original_depth + 1 }
136
136
  end
137
137
 
138
138
  context "when popping" do
139
139
  When(:pop_result) { stack.pop }
140
140
 
141
- Then { pop_result.should == :top_item }
142
- Then { stack.top.should == :second_item }
143
- Then { stack.depth.should == original_depth - 1 }
141
+ Then { pop_result == :top_item }
142
+ Then { stack.top == :second_item }
143
+ Then { stack.depth == original_depth - 1 }
144
144
  end
145
145
  end
146
146
  end
@@ -307,7 +307,7 @@ should use an empty _Then_ clause, like this:
307
307
  #### Then examples:
308
308
 
309
309
  ```ruby
310
- Then { stack.should be_empty }
310
+ Then { stack.empty? }
311
311
  ```
312
312
 
313
313
  After the related block for the _When_ clause is run, the stack should
@@ -354,9 +354,9 @@ stick with _Then_ clauses.
354
354
  #### Then/And examples:
355
355
 
356
356
  ```ruby
357
- Then { pop_result.should == :top_item } # Required
358
- And { stack.top.should == :second_item } # No Setup rerun
359
- And { stack.depth.should == original_depth - 1 } # ... for these
357
+ Then { pop_result == :top_item } # Required
358
+ And { stack.top == :second_item } # No Setup rerun
359
+ And { stack.depth == original_depth - 1 } # ... for these
360
360
  ```
361
361
 
362
362
  ### Invariant
@@ -420,29 +420,56 @@ clauses and _before_ blocks.
420
420
 
421
421
  ## Natural Assertions
422
422
 
423
- **NOTE:** <em>Natural assertions are currently an experimental feature
424
- of RSpec/Given. They are currently disabled by default, but can be
425
- enabled by a simple configuration option (see "use_natural_assertions"
426
- below).</em>
427
-
428
423
  RSpec/Given now supports the use of "natural assertions" in _Then_,
429
424
  _And_, and _Invariant_ blocks. Natural assertions are just Ruby
430
425
  conditionals, without the _should_ or _expect_ methods that RSpec
431
- provides. Here are the Then/And examples from above, but written using
432
- natural assertions:
426
+ provides. Here are the Then/And examples showing natural assertions:
427
+
428
+ ### Using Natural Assertions
429
+
430
+ ```ruby
431
+ Then { stack.top == :second_item }
432
+ Then { stack.depth == original_depth - 1 }
433
+ Then { result == Failure(Stack::UnderflowError, /empty/) }
434
+ ```
435
+
436
+ ### Using RSpec expect().to
433
437
 
434
438
  ```ruby
435
- Then { pop_result == :top_item }
436
- And { stack.top == :second_item }
437
- And { stack.depth == original_depth - 1 }
439
+ Then { expect(stack.top).to eq(:second_item) }
440
+ Then { expect(stack.depth).to eq(original_depth - 1) }
441
+ Then { expect(result).to have_failed(Stack::UnderflowError, /empty/) }
438
442
  ```
439
443
 
440
- Natural assertions must be enabled, either globally or on a per
441
- context basis, to be recognized.
444
+ ### Using Minitest asserts
442
445
 
443
- Here's a heads up: If you use natural assertions, but fail to enable
444
- them, all your specs will mysteriously pass. This is why the **red**
445
- part of _Red/Green/Refactor_ is so important.
446
+ ```ruby
447
+ Then { assert_equal :second_item, stack.top }
448
+ Then { assert_equal original_depth - 1, stack.depth }
449
+ Then {
450
+ assert_raises(Stack::UnderflowError, /empty/) do
451
+ result.call()
452
+ end
453
+ }
454
+ ```
455
+
456
+ ### Using Minitest expectations
457
+
458
+ ```ruby
459
+ Then { stack.top.must_equal :second_item }
460
+ Then { stack.depth.must_equal original_depth - 1}
461
+ Then { result.must_raise(Stack::UnderflowError, /empty/) }
462
+ ```
463
+
464
+ ### Disabling Natural Assertions
465
+
466
+ Natural assertions may be disabled, either globally or on a per
467
+ context basis. See the **configuration** section below to see how to
468
+ disable natural assertions project wide.
469
+
470
+ Here's a heads up: If you use natural assertions, but configure Given
471
+ to disable them, then all your specs will mysteriously pass. This is
472
+ why the **red** part of _Red/Green/Refactor_ is so important.
446
473
 
447
474
  ### Failure Messages with Natural Assertions
448
475
 
@@ -552,19 +579,18 @@ problems with And clauses.
552
579
 
553
580
  ### Mixing Natural Assertions and RSpec Assertions
554
581
 
555
- Natural assertions and RSpec assertions for the most part can be
556
- intermixed in a single test suite, even within a single context.
557
- Because there are a few corner cases that might cause problems, they
558
- must be explicitly enabled before they will be considered.
559
-
560
- To enable natural assertions in a context, call the
561
- _use_natural_assertions_ method in that context. For example:
582
+ Natural assertions, RSpec should assertions and Minitest assertions
583
+ can be intermixed in a single test suite, even within a single
584
+ context.
562
585
 
563
586
  ```ruby
564
587
  context "Outer" do
565
- use_natural_assertions
566
-
567
588
  context "Inner" do
589
+ Then { a == b } # Natural Assertions
590
+ Then { a.should == b } # RSpec style
591
+ Then { expect(a).to eq(b) } # RSpec style
592
+ Then { assert_equal b, a } # Minitest style
593
+ Then { a.must_equal b } # Minitest style
568
594
  end
569
595
 
570
596
  context "Disabled" do
@@ -577,7 +603,7 @@ Both the _Outer_ and _Inner_ contexts will use natural assertions. The
577
603
  _Disabled_ context overrides the setting inherited from _Outer_ and
578
604
  will not process natural assertions.
579
605
 
580
- See the **configuration** section below to see how to enable natural
606
+ See the **configuration** section below to see how to disable natural
581
607
  assertions project wide.
582
608
 
583
609
  ### Matchers and Natural Assertions
@@ -622,7 +648,7 @@ There are several ways of creating fuzzy numbers:
622
648
 
623
649
  * <code>about(n)</code> -- Same as <code>about(n).epsilon(10)</code>.
624
650
 
625
- When the file <code>rspec/given/fuzzy_shortcuts</code> is required,
651
+ When the file <code>given/fuzzy_shortcuts</code> is required,
626
652
  the following unicode shortcut methods are added to Numeric to create
627
653
  fuzzy numbers.
628
654
 
@@ -648,7 +674,7 @@ For example, the following two Then clauses are equivalent:
648
674
  Then { result.should have_failed(StandardError, /message/) }
649
675
 
650
676
  # Using natural assertions
651
- Then { result == have_failed(StandardError, /message/) }
677
+ Then { result == Failure(StandardError, /message/) }
652
678
  ```
653
679
 
654
680
  ### Processing Natural Assertions
@@ -662,7 +688,9 @@ following are true:
662
688
  1. The block returns false (blocks that return true pass the
663
689
  assertion and don't need a failure message).
664
690
 
665
- 1. The block does not use RSpec's _should_ or _expect_ methods.
691
+ 1. The block does not use the native frameworks assertions or
692
+ expectations (e.g. RSpec's _should_ or _expect_ methods, or
693
+ Minitest's _assert\_xxx_ or _must\_xxx_ methods).
666
694
 
667
695
  Detecting that last point (the use of _should_ and _expect_) is done
668
696
  by modifying the RSpec runtime to report uses of _should_ and
@@ -672,11 +700,11 @@ _expect_.
672
700
 
673
701
  Natural assertions use the Ripper library to parse the failing
674
702
  condition and find all the sub-expression values upon a failure.
675
- Currently Ripper is not supported on JRuby 1.7.2. Charles Nutter has
676
- said that Ripper support is coming soon and may arrive as early as
677
- version 1.7.3. Until then, natural assertions are disabled when
678
- running under JRuby. Never fear, JRuby supports all the other features
679
- of rspec-given and will work just fine.
703
+ Currently Ripper is not fully supported on JRuby 1.7.4. Charles Nutter
704
+ has said that Ripper support is coming soon and may arrive soon. Until
705
+ then, natural assertions are disabled when running under JRuby. Never
706
+ fear, JRuby supports all the other features of rspec-given and will
707
+ work just fine.
680
708
 
681
709
  ### Further Reading
682
710
 
@@ -697,7 +725,7 @@ the pretty output and wish to disable source code caching
697
725
  unconditionally, then add the following line to your spec helper file:
698
726
 
699
727
  ```ruby
700
- RSpec::Given.source_caching_disabled = true
728
+ Given.source_caching_disabled = true
701
729
  ```
702
730
 
703
731
  Natural assertions are disabled by default. To globally configure
@@ -714,8 +742,8 @@ file:
714
742
 
715
743
  # License
716
744
 
717
- RSpec-Given is available under the MIT License. See the MIT-LICENSE
718
- file in the source distribution.
745
+ rspec-given, minitest-given and given_core are available under the MIT
746
+ License. See the MIT-LICENSE file in the source distribution.
719
747
 
720
748
  # History
721
749
 
data/Rakefile CHANGED
@@ -57,8 +57,11 @@ end
57
57
 
58
58
  EXAMPLES = FileList['examples/**/*_spec.rb'].
59
59
  exclude('examples/failing/*.rb').
60
+ exclude('examples/minitest/*.rb').
60
61
  exclude('examples/integration/failing/*.rb')
61
62
 
63
+ MT_EXAMPLES = FileList['examples/minitest/**/*_spec.rb']
64
+
62
65
  unless Given::NATURAL_ASSERTIONS_SUPPORTED
63
66
  EXAMPLES.exclude("examples/stack/*.rb")
64
67
  end
@@ -80,7 +83,7 @@ end
80
83
  desc "Run the examples in Minitest"
81
84
  task :mt_examples do
82
85
  puts "Running examples (with Minitest)"
83
- sh "ruby -Ilib:examples examples/loader.rb #{EXAMPLES}"
86
+ sh "ruby -Ilib:examples examples/loader.rb #{EXAMPLES} #{MT_EXAMPLES}"
84
87
  end
85
88
 
86
89
  desc "Run failing examples"
@@ -126,15 +126,19 @@ module Given
126
126
  @_Gvn_invariants ||= []
127
127
  end
128
128
 
129
- def _Gvn_and_blocks
129
+ # List of the and blocks directly in the current describe/context
130
+ # block.
131
+ def _Gvn_and_blocks # :nodoc:
130
132
  @_Gvn_and_blocks ||= []
131
133
  end
132
134
 
133
- def _Gvn_context_info
135
+ # Context information ofr the current describe/context block.
136
+ def _Gvn_context_info # :nodoc:
134
137
  @_Gvn_context_info ||= {}
135
138
  end
136
139
 
137
- def _Gvn_lines
140
+ # Line extractor for the context.
141
+ def _Gvn_lines # :nodoc:
138
142
  @_Gvn_lines ||= LineExtractor.new
139
143
  end
140
144
 
@@ -182,23 +186,34 @@ module Given
182
186
  #
183
187
  def When(*args, &block)
184
188
  if args.first.is_a?(Symbol)
185
- let(args.first) do
186
- begin
187
- _gvn_establish_givens
188
- instance_eval(&block)
189
- rescue Given.pending_error => ex
190
- raise
191
- rescue Exception => ex
192
- Failure.new(ex)
193
- end
194
- end
195
- _Gvn_before do __send__(args.first) end
189
+ _Gvn_when_actions_with_capture(args.first, block)
196
190
  else
197
- _Gvn_before do
191
+ _Gvn_when_actions(block)
192
+ end
193
+ end
194
+
195
+ # Normal When clause actions.
196
+ def _Gvn_when_actions(block) # :nodoc:
197
+ _Gvn_before do
198
+ _gvn_establish_givens
199
+ instance_eval(&block)
200
+ end
201
+ end
202
+
203
+ # Normal When clause actions except that exceptions are captured
204
+ # in a Failure object.
205
+ def _Gvn_when_actions_with_capture(name, block) # :nodoc:
206
+ let(name) do
207
+ begin
198
208
  _gvn_establish_givens
199
209
  instance_eval(&block)
210
+ rescue Given.pending_error => ex
211
+ raise
212
+ rescue Exception => ex
213
+ Failure.new(ex)
200
214
  end
201
215
  end
216
+ _Gvn_before do __send__(name) end
202
217
  end
203
218
 
204
219
  # Provide an assertion about the specification.
@@ -211,14 +226,9 @@ module Given
211
226
  # Then { ... assertion ... }
212
227
  #
213
228
  def Then(&block)
214
- env = block.binding
215
- file, line = eval "[__FILE__, __LINE__]", env
229
+ file, line = eval "[__FILE__, __LINE__]", block.binding
216
230
  description = _Gvn_lines.line(file, line) unless Given.source_caching_disabled
217
- if description
218
- cmd = "it(description)"
219
- else
220
- cmd = "specify"
221
- end
231
+ cmd = description ? "it(description)" : "specify"
222
232
  eval %{#{cmd} do _gvn_then(&block) end}, binding, file, line
223
233
  _Gvn_context_info[:then_defined] = true
224
234
  end
@@ -229,11 +239,13 @@ module Given
229
239
  _Gvn_invariants << block
230
240
  end
231
241
 
242
+ # Provide an assertion that shares setup with a peer Then command.
232
243
  def And(&block)
233
244
  fail "And defined without a Then" unless _Gvn_context_info[:then_defined]
234
245
  _Gvn_and_blocks << block
235
246
  end
236
247
 
248
+ # Configure the use of natural assertions in this context.
237
249
  def use_natural_assertions(enabled=true)
238
250
  Given.ok_to_use_natural_assertions(enabled)
239
251
  _Gvn_context_info[:natural_assertions_enabled] = enabled
data/lib/given/failure.rb CHANGED
@@ -6,6 +6,12 @@ module Given
6
6
  class Failure < BasicObject
7
7
  undef_method :==, :!=, :!
8
8
 
9
+ def must_raise(*args)
10
+ ::Minitest::Spec.current.assert_raises(*args) do
11
+ die
12
+ end
13
+ end
14
+
9
15
  def initialize(exception)
10
16
  @exception = exception
11
17
  end
@@ -49,7 +55,7 @@ module Given
49
55
 
50
56
  def failure_matcher?(other)
51
57
  other.is_a?(::Given::FailureMatcher) ||
52
- other.is_a?(::RSpec::Given::HaveFailed::HaveFailedMatcher)
58
+ (defined?(::RSpec) && other.is_a?(::RSpec::Given::HaveFailed::HaveFailedMatcher))
53
59
  end
54
60
 
55
61
  end
@@ -10,13 +10,29 @@ module Given
10
10
  @no_pattern = true
11
11
  elsif @expected_message_pattern.is_a?(String)
12
12
  @expected_message_pattern =
13
- Regexp.new("\\A" + Regexp.quote(@expected_message_pattern) + "\\Z")
13
+ Regexp.new("\\A" + Regexp.quote(@expected_message_pattern) + "\\z")
14
+ end
15
+ end
16
+
17
+ def ==(other)
18
+ if other.respond_to?(:call)
19
+ matches?(other)
20
+ else
21
+ super
22
+ end
23
+ end
24
+
25
+ def !=(other)
26
+ if other.respond_to?(:call)
27
+ does_not_match?(other)
28
+ else
29
+ super
14
30
  end
15
31
  end
16
32
 
17
33
  def matches?(possible_failure)
18
34
  if possible_failure.respond_to?(:call)
19
- make_sure_it_throws_an_exception(possible_failure)
35
+ match_or_fail(possible_failure)
20
36
  else
21
37
  Given.fail_with("#{description}, but nothing failed")
22
38
  end
@@ -24,34 +40,55 @@ module Given
24
40
 
25
41
  def does_not_match?(possible_failure)
26
42
  if possible_failure.respond_to?(:call)
27
- false
43
+ mismatch_or_fail(possible_failure)
28
44
  else
29
45
  true
30
46
  end
31
47
  end
32
48
 
49
+ def inspect
50
+ result = "<Failure on #{@expected_exception_class}"
51
+ result << " matching #{@expected_message_pattern.inspect}" unless @no_pattern
52
+ result << ">"
53
+ end
54
+
33
55
  private
34
56
 
35
- def make_sure_it_throws_an_exception(possible_failure)
57
+ def match_or_fail(possible_failure)
58
+ ex = extract_exception(possible_failure)
59
+ match_exception(ex) ||
60
+ Given.fail_with("#{description}, but got #{ex.inspect}")
61
+ end
62
+
63
+ def mismatch_or_fail(possible_failure)
64
+ ex = extract_exception(possible_failure)
65
+ (! match_exception(ex)) ||
66
+ Given.fail_with("#{unexpected_description}, but got #{ex.inspect}")
67
+ end
68
+
69
+ def match_exception(ex)
70
+ ex.is_a?(@expected_exception_class) && @expected_message_pattern =~ ex.message
71
+ end
72
+
73
+ def extract_exception(possible_failure)
36
74
  possible_failure.call
37
75
  Given.fail_with("Expected an exception")
76
+ return nil
38
77
  rescue Exception => ex
39
- if ! ex.is_a?(@expected_exception_class)
40
- Given.fail_with("#{description}, but got #{ex.inspect}")
41
- elsif @expected_message_pattern !~ ex.message
42
- Given.fail_with("#{description}, but got #{ex.inspect}")
43
- else
44
- true
45
- end
78
+ return ex
46
79
  end
47
80
 
48
- private
49
-
50
81
  def description
51
82
  result = "Expected failure with #{@expected_exception_class}"
52
83
  result << " matching #{@expected_message_pattern.inspect}" unless @no_pattern
53
84
  result
54
85
  end
86
+
87
+ def unexpected_description
88
+ result = "Did not expect failure with #{@expected_exception_class}"
89
+ result << " matching #{@expected_message_pattern.inspect}" unless @no_pattern
90
+ result
91
+ end
55
92
  end
56
93
 
57
94
  module FailureMethod
@@ -1,6 +1,7 @@
1
1
 
2
2
  # Configure Minitest to use the Given extensions.
3
3
 
4
- Minitest::Spec.send(:extend, Given::ClassExtensions)
4
+ Minitest::Spec.send(:extend, Given::ClassExtensions)
5
5
  Minitest::Spec.send(:include, Given::FailureMethod)
6
6
  Minitest::Spec.send(:include, Given::InstanceExtensions)
7
+ Given.use_natural_assertions if Given::NATURAL_ASSERTIONS_SUPPORTED
@@ -15,5 +15,6 @@ RSpec.configure do |c|
15
15
  c.backtrace_clean_patterns << /lib\/rspec\/given/
16
16
  end
17
17
 
18
+ Given.use_natural_assertions if Given::NATURAL_ASSERTIONS_SUPPORTED
18
19
  Given.detect_formatters(c)
19
20
  end
data/lib/given/version.rb CHANGED
@@ -5,7 +5,7 @@ module Given
5
5
  VERSION_MINOR = 0,
6
6
  VERSION_BUILD = 0,
7
7
  BETA = 'beta',
8
- BETA_NUMBER = 3,
8
+ BETA_NUMBER = 4,
9
9
  ]
10
10
  VERSION = VERSION_NUMBERS.join(".")
11
11
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: given_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.beta.3
4
+ version: 3.0.0.beta.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Weirich