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

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.
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