rspec-given 2.4.3 → 2.4.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: 597d1af2f4799295361d42c7a1773f8a24ad074c
4
- data.tar.gz: 06583bda82f1a1e79ddfbba10c3a30a8c2748e9a
3
+ metadata.gz: 7fa764beb3f6235d2df486b17a82bd32e6baabf3
4
+ data.tar.gz: 342b46e68f107347086b1e5b3f39c32a780ffe8c
5
5
  SHA512:
6
- metadata.gz: 5ef2848df4c589eb3ea5b14b17f3401c42dea62aa6e81d9da9a2eb1ee4222ac30ff300266bcdc96fbc3cff493d8a6c20a6f2b4903100f52df06ddbc4fed7a838
7
- data.tar.gz: f6aa6a51e0c447a7b331e33776f7b3f5244ab86b86864f5ef7d3a0960ecf2e9fceffa3c91c4ff1660061df130aeb14ab2b510f5e121a81e7fa89ab0f308b9b29
6
+ metadata.gz: 0ef51b6ece9777061f028324521516e2b2af557368332c8c959e311db004d12a751c6fd00b5143c676c898806e10f8696cb4601273bd3ce6f254f7b645d11e55
7
+ data.tar.gz: f432743f366d21e45c54c46578f7d55c372343ae0a0efb50c753d6d3f69251bec5d370cbc6b3c682b7f472cb91f9f7a2280d0b7727d6727082372e6e2b950b14
data/Gemfile.lock CHANGED
@@ -10,17 +10,18 @@ GEM
10
10
  specs:
11
11
  diff-lcs (1.2.4)
12
12
  rake (10.0.4)
13
- rspec (2.13.0)
14
- rspec-core (~> 2.13.0)
15
- rspec-expectations (~> 2.13.0)
16
- rspec-mocks (~> 2.13.0)
17
- rspec-core (2.13.1)
18
- rspec-expectations (2.13.0)
13
+ rspec (2.14.0)
14
+ rspec-core (~> 2.14.0)
15
+ rspec-expectations (~> 2.14.0)
16
+ rspec-mocks (~> 2.14.0)
17
+ rspec-core (2.14.0)
18
+ rspec-expectations (2.14.0)
19
19
  diff-lcs (>= 1.1.3, < 2.0)
20
- rspec-mocks (2.13.1)
20
+ rspec-mocks (2.14.1)
21
21
  sorcerer (0.3.10)
22
22
 
23
23
  PLATFORMS
24
+ java
24
25
  ruby
25
26
 
26
27
  DEPENDENCIES
data/README ADDED
@@ -0,0 +1,679 @@
1
+ = rspec-given
2
+
3
+ | Master |
4
+ | :----: |
5
+ | [![Master Build Status](https://secure.travis-ci.org/jimweirich/rspec-given.png?branch=master)](https://travis-ci.org/jimweirich/rspec-given) |
6
+
7
+ Covering rspec-given, version 2.4.4.
8
+
9
+ rspec-given is an RSpec extension to allow Given/When/Then notation in
10
+ RSpec specifications. It is a natural extension of the experimental
11
+ work done on the Given framework.
12
+
13
+ = Why Given/When/Then
14
+
15
+ RSpec has done a great job of making specifications more readable for
16
+ humans. However, I really like the given / when / then nature of
17
+ Cucumber stories and would like to follow the same structure in my
18
+ unit tests. rspec-given allows a simple given/when/then structure
19
+ RSpec specifications.
20
+
21
+ == Status
22
+
23
+ rspec-given is ready for production use.
24
+
25
+ == Example
26
+
27
+ Here is a specification written in the rspec-given framework:
28
+
29
+ ```ruby
30
+ require 'rspec/given'
31
+ require 'spec_helper'
32
+ require 'stack'
33
+
34
+ describe Stack do
35
+ def stack_with(initial_contents)
36
+ stack = Stack.new
37
+ initial_contents.each do |item| stack.push(item) end
38
+ stack
39
+ end
40
+
41
+ Given(:stack) { stack_with(initial_contents) }
42
+ Invariant { stack.empty?.should == (stack.depth == 0) }
43
+
44
+ context "with no items" do
45
+ Given(:initial_contents) { [] }
46
+ Then { stack.depth.should == 0 }
47
+
48
+ context "when pushing" do
49
+ When { stack.push(:an_item) }
50
+
51
+ Then { stack.depth.should == 1 }
52
+ Then { stack.top.should == :an_item }
53
+ end
54
+
55
+ context "when popping" do
56
+ When(:result) { stack.pop }
57
+ Then { result.should have_failed(Stack::UnderflowError, /empty/) }
58
+ end
59
+ end
60
+
61
+ context "with one item" do
62
+ Given(:initial_contents) { [:an_item] }
63
+
64
+ context "when popping" do
65
+ When(:pop_result) { stack.pop }
66
+
67
+ Then { pop_result.should == :an_item }
68
+ Then { stack.depth.should == 0 }
69
+ end
70
+ end
71
+
72
+ context "with several items" do
73
+ Given(:initial_contents) { [:second_item, :top_item] }
74
+ Given!(:original_depth) { stack.depth }
75
+
76
+ context "when pushing" do
77
+ When { stack.push(:new_item) }
78
+
79
+ Then { stack.top.should == :new_item }
80
+ Then { stack.depth.should == original_depth + 1 }
81
+ end
82
+
83
+ context "when popping" do
84
+ When(:pop_result) { stack.pop }
85
+
86
+ Then { pop_result.should == :top_item }
87
+ Then { stack.top.should == :second_item }
88
+ Then { stack.depth.should == original_depth - 1 }
89
+ end
90
+ end
91
+ end
92
+ ```
93
+
94
+ Let's talk about the individual statements used in the Given
95
+ framework.
96
+
97
+ === Given
98
+
99
+ The _Given_ section specifies a starting point, a set of preconditions
100
+ that must be true before the code under test is allowed to be run. In
101
+ standard test frameworks the preconditions are established with a
102
+ combination of setup methods (or :before actions in RSpec) and code in
103
+ the test.
104
+
105
+ In the example code above the preconditions are started with _Given_
106
+ statements. A top level _Given_ (that applies to the entire describe
107
+ block) says that one of the preconditions is that there is a stack
108
+ with some initial contents.
109
+
110
+ Note that initial contents are not specified in the top level describe
111
+ block, but are given in each of the nested contexts. By pushing the
112
+ definition of "initial_contents" into the nested contexts, we can vary
113
+ them as needed for that particular context.
114
+
115
+ A precondition in the form "Given(:var) {...}" creates an accessor
116
+ method named "var". The accessor is lazily initialized by the code
117
+ block. If you want a non-lazy given, use "Given!(:var) {...}".
118
+
119
+ A precondition in the form "Given {...}" just executes the code block
120
+ for side effects. Since there is no accessor, the code block is
121
+ executed immediately (i.e. no lazy evaluation).
122
+
123
+ The preconditions are run in order of definition. Nested contexts
124
+ will inherit the preconditions from the enclosing context, with outer
125
+ preconditions running before inner preconditions.
126
+
127
+ ==== Given examples:
128
+
129
+ ```ruby
130
+ Given(:stack) { Stack.new }
131
+ ```
132
+
133
+ The block for the given clause is lazily run and its value bound to
134
+ 'stack' if 'stack' is ever referenced in the test.
135
+ The first reference to 'stack' in the specification will cause the
136
+ code block to execute. Futher references to 'stack' will reuse the
137
+ previously generated value.
138
+
139
+ ```ruby
140
+ Given!(:original_size) { stack.size }
141
+ ```
142
+
143
+ The code block is run unconditionally once before each test and the
144
+ value of the block is bound to 'original_size'. This form is useful
145
+ when you want to record the value of something that might be affected
146
+ by the When code.
147
+
148
+ ```ruby
149
+ Given { stack.clear }
150
+ ```
151
+
152
+ The block for the given clause is run unconditionally once before each
153
+ test. This form of given is used for code that is executed for side
154
+ effects.
155
+
156
+ === When
157
+
158
+ The _When_ clause specifies the code to be tested ... oops, excuse me
159
+ ... specified. After the preconditions in the given section are met,
160
+ the when code block is run.
161
+
162
+ In general there should not be more than one _When_ clause for a given
163
+ direct context. However, a _When_ in an outer context will be run
164
+ after all the _Givens_ but before the inner _When_. You can think of
165
+ an outer _When_ as setting up additional given state for the inner
166
+ _When_.
167
+
168
+ E.g.
169
+
170
+ ```ruby
171
+ context "outer context" do
172
+ When { code specified in the outer context }
173
+ Then { assert something about the outer context }
174
+
175
+ context "inner context" do
176
+
177
+ # At this point, the _When_ of the outer context
178
+ # should be treated as a _Given_ of the inner context
179
+
180
+ When { code specified in the inner context }
181
+ Then { assert something about the inner context }
182
+ end
183
+ end
184
+ ```
185
+
186
+ ==== When examples:
187
+
188
+ ```ruby
189
+ When { stack.push(:item) }
190
+ ```
191
+
192
+ The code block is executed once per test. The effect of the _When{}_
193
+ block is very similar to _Given{}_. However, When is used to identify
194
+ the particular code that is being specified in the current context or
195
+ describe block.
196
+
197
+ ```ruby
198
+ When(:result) { stack.pop }
199
+ ```
200
+
201
+ The code block is executed once per test and the value of the code
202
+ block is bound to 'result'. Use this form when the code under test
203
+ returns a value that you wish to interrogate in the _Then_ code.
204
+
205
+ If an exception occurs during the execution of the block for the When
206
+ clause, the exception is caught and a failure object is bound to
207
+ 'result'. The failure can be checked in a then block with the
208
+ 'have_failed' matcher.
209
+
210
+ The failure object will rethrow the captured exception if anything
211
+ other than have_failed matcher is used on the failure object.
212
+
213
+ For example, if the stack is empty when it is popped, then it is
214
+ reasonable for pop to raise an UnderflowError. This is how you might
215
+ specify that behavior:
216
+
217
+ ```ruby
218
+ When(:result) { stack.pop }
219
+ Then { result.should have_failed(UnderflowError, /empty/) }
220
+ ```
221
+
222
+ Note that the arguments to the 'have_failed' matcher are the same as
223
+ those given to the standard RSpec matcher 'raise_error'.
224
+
225
+ === Then
226
+
227
+ The _Then_ clauses are the postconditions of the specification. These
228
+ then conditions must be true after the code under test (the _When_
229
+ clause) is run.
230
+
231
+ The code in the block of a _Then_ clause should be a single _should_
232
+ assertion. Code in _Then_ clauses should not have any side effects.
233
+
234
+ Let me repeat that: <b>_Then_ clauses should not have any side
235
+ effects!</b> _Then_ clauses with side effects are erroneous. _Then_
236
+ clauses need to be idempotent, so that running them once, twice, a
237
+ hundred times, or never does not change the state of the program. (The
238
+ same is true of _And_ and _Invariant_ clauses).
239
+
240
+ In RSpec terms, a _Then_ clause forms a RSpec Example that runs in the
241
+ context of an Example Group (defined by a describe or context clause).
242
+
243
+ Each Example Group must have at least one _Then_ clause, otherwise
244
+ there will be no examples to be run for that group. If all the
245
+ assertions in an example group are done via Invariants, then the group
246
+ should use an empty _Then_ clause, like this:
247
+
248
+ ```ruby
249
+ Then { }
250
+ ```
251
+
252
+ ==== Then examples:
253
+
254
+ ```ruby
255
+ Then { stack.should be_empty }
256
+ ```
257
+
258
+ After the related block for the _When_ clause is run, the stack should
259
+ be empty. If it is not empty, the test will fail.
260
+
261
+ === And
262
+
263
+ The _And_ clause is similar to _Then_, but does not form its own RSpec
264
+ example. This means that _And_ clauses reuse the setup from a sibling
265
+ _Then_ clause. Using a single _Then_ and multiple _And_ clauses in an
266
+ example group means the setup for that group is run only once (for the
267
+ _Then_ clause) and reused for all the _And_ clauses. This can be a
268
+ significant speed savings where the setup for an example group is
269
+ expensive.
270
+
271
+ Some things to keep in mind about _And_ clauses:
272
+
273
+ * There must be at least one _Then_ in the example group and it must
274
+ be declared before the _And_ clauses. Forgetting the _Then_ clause
275
+ is an error.
276
+
277
+ * The code in the _And_ clause is run immediately after the first
278
+ (executed) _Then_ of an example group.
279
+
280
+ * An assertion failure in a _Then_ clause or an _And_ clause will
281
+ cause all the subsequent _And_ clauses to be skipped.
282
+
283
+ * Since _And_ clauses do not form their own RSpec examples, they are
284
+ not represented in the formatted output of RSpec. That means _And_
285
+ clauses do not produce dots in the Progress format, nor do they
286
+ appear in the documentation, html or textmate formats (options
287
+ -fhtml, -fdoc, or -ftextmate).
288
+
289
+ * Like _Then_ clauses, _And_ clauses must be idempotent. That means
290
+ they should not execute any code that changes global program state.
291
+ (See the section on the _Then_ clause).
292
+
293
+ The choice to use an _And_ clause is primarily a speed consideration.
294
+ If an example group has expensive setup and there are a lot of _Then_
295
+ clauses, then choosing to make some of the _Then_ clauses into _And_
296
+ clauses will speed up the spec. Otherwise it is probably better to
297
+ stick with _Then_ clauses.
298
+
299
+ ==== Then/And examples:
300
+
301
+ ```ruby
302
+ Then { pop_result.should == :top_item } # Required
303
+ And { stack.top.should == :second_item } # No Setup rerun
304
+ And { stack.depth.should == original_depth - 1 } # ... for these
305
+ ```
306
+
307
+ === Invariant
308
+
309
+ The _Invariant_ clause is a new idea that doesn't have an analog in
310
+ RSpec or Test::Unit. The invariant allows you specify things that must
311
+ always be true in the scope of the invariant. In the stack example, the method
312
+ <tt>empty?</tt> is defined in term of <tt>size</tt>.
313
+
314
+ ```ruby
315
+ Invariant { stack.empty? == (stack.depth == 0) }
316
+ ```
317
+
318
+ This invariant states that <code>empty?</code> is true if and only if
319
+ the stack depth is zero, and that assertion is checked at every _Then_
320
+ clause that is in the same scope.
321
+
322
+ You can conceptually think of an _Invariant_ clause as a _Then_ block
323
+ that automatically gets added to every _Then_ within its scope.
324
+ Invariants nested within a context only apply to the _Then_ clauses
325
+ that are in the scope of that context.
326
+
327
+ Invariants that reference a _Given_ precondition accessor must only be
328
+ used in contexts that define that accessor.
329
+
330
+ Notes:
331
+
332
+ * Since Invariants do not form their own RSpec example, they are not
333
+ represented in the RSpec formatted output (e.g. the '--format html'
334
+ option).
335
+
336
+ == Execution Ordering
337
+
338
+ When running the test for a specific _Then_ clause, the following will
339
+ be true:
340
+
341
+ * The non-lazy _Given_ clauses will be run in the order that they are
342
+ specified, from the outermost scope to the innermost scope
343
+ containing the _Then_. (The lazy _Given_ clauses will be run upon
344
+ demand).
345
+
346
+ * All of the _Given_ clauses in all of the relevant scopes will run
347
+ before the first (outermost) _When_ clause in those same scopes.
348
+ That means that the _When_ code can assume that the givens have been
349
+ established, even if the givens are in a more nested scope than the
350
+ When.
351
+
352
+ * _When_ clauses and RSpec _before_ blocks will be executed in the
353
+ order that they are specified, from the outermost block to the
354
+ innermost block. This makes _before_ blocks an excellent choice when
355
+ writing narrative tests to specify actions that happen between the
356
+ "whens" of a narrative-style test.
357
+
358
+ Note that the ordering between _Given_ clauses and _before_ blocks are
359
+ not strongly specified. Hoisting a _When_ clause out of an inner scope
360
+ to an outer scope may change the order of execution between related
361
+ _Given_ clauses and any _before_ blocks (hoisting the _When_ clause
362
+ might cause the related _Given_ clauses to possibly run earlier).
363
+ Because of this, do not split order dependent code between _Given_
364
+ clauses and _before_ blocks.
365
+
366
+ == Natural Assertions
367
+
368
+ **NOTE:** <em>Natural assertions are currently an experimental feature
369
+ of RSpec/Given. They are currently disabled by default, but can be
370
+ enabled by a simple configuration option (see "use_natural_assertions"
371
+ below).</em>
372
+
373
+ RSpec/Given now supports the use of "natural assertions" in _Then_,
374
+ _And_, and _Invariant_ blocks. Natural assertions are just Ruby
375
+ conditionals, without the _should_ or _expect_ methods that RSpec
376
+ provides. Here are the Then/And examples from above, but written using
377
+ natural assertions:
378
+
379
+ ```ruby
380
+ Then { pop_result == :top_item }
381
+ And { stack.top == :second_item }
382
+ And { stack.depth == original_depth - 1 }
383
+ ```
384
+
385
+ Natural assertions must be enabled, either globally or on a per
386
+ context basis, to be recognized.
387
+
388
+ Here's a heads up: If you use natural assertions, but fail to enable
389
+ them, all your specs will mysteriously pass. This is why the **red**
390
+ part of _Red/Green/Refactor_ is so important.
391
+
392
+ === Failure Messages with Natural Assertions
393
+
394
+ Since natural assertions do not depend upon matchers, you don't get
395
+ customized error messages from them. What you _do_ get is a complete
396
+ analsysis of the expression that failed.
397
+
398
+ For example, given the following failing specification:
399
+
400
+ ```ruby
401
+ RSpec::Given.use_natural_assertions
402
+
403
+ describe "Natural Assertions" do
404
+ Given(:foo) { 1 }
405
+ Given(:bar) { 2 }
406
+ Then { foo + bar == 2 }
407
+ end
408
+ ```
409
+
410
+ You would get:
411
+
412
+ ```
413
+ 1) Natural Assertions
414
+ Failure/Error: Then { foo + bar == 2 }
415
+ Then expression failed at /Users/jim/working/git/rspec-given/examples/failing/sample_spec.rb:6
416
+ expected: 3
417
+ to equal: 2
418
+ false <- foo + bar == 2
419
+ 3 <- foo + bar
420
+ 1 <- foo
421
+ 2 <- bar
422
+ # ./examples/failing/sample_spec.rb:6:in `block in Then'
423
+ ```
424
+
425
+ Notice how the failing expression "<code>foo+bar == 2</code>" was
426
+ broken down into subexpressions and values for each subexpression.
427
+ This gives you all the information you need to figure out exactly what
428
+ part of the expression is causing the failure.
429
+
430
+ Natural assertions will give additional information (e.g. "expected:
431
+ 3 to equal: 2") for top level expressions involving any of the
432
+ comparison operators (==, !=, <, <=, >, >=) or matching operators (=~,
433
+ !~).
434
+
435
+ === Caveats on Natural Assertions
436
+
437
+ Keep the following in mind when using natural assertions.
438
+
439
+ * Only a single expression/assertion per _Then_. The single expression
440
+ of the _Then_ block will be considered when determining pass/fail
441
+ for the assertion. If you _want_ to express a complex condition for
442
+ the _Then_, you need to use ||, && or some other logical operation
443
+ to join the conditions into a single expression (and the failure
444
+ message will break down the values for each part).
445
+
446
+ * Then clauses need be **idempotent**. This is true in general, but it
447
+ is particularly important for natural assertions to obey this
448
+ restriction. This means that assertions in a Then clause should not
449
+ change anything. Since the Natural Assertion error message contains
450
+ the values of all the subexpressions, the expression and its
451
+ subexpressions will be evaluated multiple times. If the Then clause
452
+ is not idempotent, you will get changing answers as the
453
+ subexpressions are evaluated.
454
+
455
+ That last point is important. If you write code like this:
456
+
457
+ ```ruby
458
+ # DO NOT WRITE CODE LIKE THIS
459
+ context "Incorrect non-idempotent conditions" do
460
+ Given(:ary) { [1, 2, 3] }
461
+ Then { ary.delete(1) == nil }
462
+ end
463
+ ```
464
+
465
+ Then the assertion will fail (because <code>ary.delete(1)</code> will
466
+ initially return 1). But when the error message is formated, the
467
+ system reports that <code>ary.delete(1)</code> returns nil. You will
468
+ scratch your head over that for a good while.
469
+
470
+ Instead, move the state changing code into a _When(:result)_ block, then
471
+ assert what you need to about :result. Something
472
+ like this is good:
473
+
474
+ ```ruby
475
+ context "Correct idempotent conditions" do
476
+ Given(:ary) { [1, 2, 3] }
477
+ When(:result) { ary.delete(1) }
478
+ Then { result == nil }
479
+ end
480
+ ```
481
+
482
+ It is good to note that non-idempotent assertions will also cause
483
+ problems with And clauses.
484
+
485
+ === Mixing Natural Assertions and RSpec Assertions
486
+
487
+ Natural assertions and RSpec assertions for the most part can be
488
+ intermixed in a single test suite, even within a single context.
489
+ Because there are a few corner cases that might cause problems, they
490
+ must be explicitly enabled before they will be considered.
491
+
492
+ To enable natural assertions in a context, call the
493
+ _use_natural_assertions_ method in that context. For example:
494
+
495
+ ```ruby
496
+ context "Outer" do
497
+ use_natural_assertions
498
+
499
+ context "Inner" do
500
+ end
501
+
502
+ context "Disabled" do
503
+ use_natural_assertions false
504
+ end
505
+ end
506
+ ```
507
+
508
+ Both the _Outer_ and _Inner_ contexts will use natural assertions. The
509
+ _Disabled_ context overrides the setting inherited from _Outer_ and
510
+ will not process natural assertions.
511
+
512
+ See the **configuration** section below to see how to enable natural
513
+ assertions project wide.
514
+
515
+ === Matchers and Natural Assertions
516
+
517
+ In RSpec, matchers are used to provide nice, readable error messages
518
+ when an assertion is not met. Natural assertions provide
519
+ self-explanatory failure messages for most things without requiring
520
+ any special matchers from the programmer.
521
+
522
+ In the rare case that some extra information would be helpful, it is
523
+ useful to create special objects that respond to the == operator.
524
+
525
+ ==== Asserting Nearly Equal with Fuzzy Numbers
526
+
527
+ Operations on floating point numbers rarely create numbers that are
528
+ exactly equal, therefore it is useful to assert that two floating
529
+ point numbers are nearly equal. We do that by creating a fuzzy number
530
+ that has a looser interpretation of what it means to be equal.
531
+
532
+ For example, the following asserts that the square root of 10 is about
533
+ 3.1523 with an accuracy of 1 percent.
534
+
535
+ ```ruby
536
+ Then { Math.sqrt(10) == about(3.1623).percent(1) }
537
+ ```
538
+
539
+ As long as the real value of <code>Math.sqrt(10)</code> is within plus
540
+ or minus 1% of 3.1623 (i.e. 3.1623 +/- 0.031623), then the assertion
541
+ will pass.
542
+
543
+ There are several ways of creating fuzzy numbers:
544
+
545
+ * <code>about(n).delta(d)</code> -- A fuzzy number matching the range
546
+ (n-d)..(n+d)
547
+
548
+ * <code>about(n).percent(p)</code> -- A fuzzy number matching the
549
+ range (n-(n*p/100)) .. (n+(n*p/100))
550
+
551
+ * <code>about(n).epsilon(neps)</code> -- A fuzzy number matching the
552
+ range (n-(neps*e)) .. (n+(neps*e)), where e is the difference
553
+ between 1.0 and the next smallest floating point number.
554
+
555
+ * <code>about(n)</code> -- Same as <code>about(n).epsilon(10)</code>.
556
+
557
+ When the file <code>rspec/given/fuzzy_shortcuts</code> is required,
558
+ the following unicode shortcut methods are added to Numeric to create
559
+ fuzzy numbers.
560
+
561
+ * <code>n.±(del)</code> is the same as <code>about(n).delta(del)</code>
562
+
563
+ * <code>n.‰(percentage)</code> is the same as <code>about(n).percent(percentage)</code>
564
+
565
+ * <code>n.€(neps)</code> is the same as <code>about(n).epsilon(neps)</code>
566
+
567
+ * <code>n.±</code>, <code>n.‰</code>, and <code>n.€</code> are all
568
+ the same as <code>about(n)</code>
569
+
570
+ ==== Detecting Exceptions
571
+
572
+ The RSpec matcher used for detecting exceptions will work with natural
573
+ assertions out of the box. Just check for equality against the
574
+ <code>have_failed</code> return value.
575
+
576
+ For example, the following two Then clauses are equivalent:
577
+
578
+ ```ruby
579
+ # Using an RSpec matcher
580
+ Then { result.should have_failed(StandardError, /message/) }
581
+
582
+ # Using natural assertions
583
+ Then { result == have_failed(StandardError, /message/) }
584
+ ```
585
+
586
+ === Processing Natural Assertions
587
+
588
+ When natural assertions are enabled, they are only used if all of the
589
+ following are true:
590
+
591
+ 1. The block does not throw an RSpec assertion failure (or any other
592
+ exception for that matter).
593
+
594
+ 1. The block returns false (blocks that return true pass the
595
+ assertion and don't need a failure message).
596
+
597
+ 1. The block does not use RSpec's _should_ or _expect_ methods.
598
+
599
+ Detecting that last point (the use of _should_ and _expect_) is done
600
+ by modifying the RSpec runtime to report uses of _should_ and
601
+ _expect_.
602
+
603
+ === Platform Support
604
+
605
+ Natural assertions use the Ripper library to parse the failing
606
+ condition and find all the sub-expression values upon a failure.
607
+ Currently Ripper is not supported on JRuby 1.7.2. Charles Nutter has
608
+ said that Ripper support is coming soon and may arrive as early as
609
+ version 1.7.3. Until then, natural assertions are disabled when
610
+ running under JRuby. Never fear, JRuby supports all the other features
611
+ of rspec-given and will work just fine.
612
+
613
+ === Further Reading
614
+
615
+ Natural assertions were inspired by the [wrong assertion
616
+ library](http://rubygems.org/gems/wrong) by [Alex
617
+ Chaffee](http://rubygems.org/profiles/alexch) and [Steve
618
+ Conover](http://rubygems.org/profiles/sconoversf).
619
+
620
+ == Configuration
621
+
622
+ Just require 'rspec/given' in the spec helper of your project and it
623
+ is ready to go.
624
+
625
+ If the RSpec format option document, html or textmate is chosen,
626
+ RSpec/Given will automatically add additional source code information to
627
+ the examples to produce better looking output. If you don't care about
628
+ the pretty output and wish to disable source code caching
629
+ unconditionally, then add the following line to your spec helper file:
630
+
631
+ ```ruby
632
+ RSpec::Given.source_caching_disabled = true
633
+ ```
634
+
635
+ Natural assertions are disabled by default. To globally configure
636
+ natural assertions, add one of the following lines to your spec_helper
637
+ file:
638
+
639
+ ```ruby
640
+ RSpec::Given.use_natural_assertions # Enable natural assertions
641
+ RSpec::Given.use_natural_assertions true # Same as above
642
+ RSpec::Given.use_natural_assertions false # Disable natural assertions
643
+ RSpec::Given.use_natural_assertions :always # Always process natural assertions
644
+ # ... even when should/expect are detected
645
+ ```
646
+
647
+ = License
648
+
649
+ RSpec-Given is available under the MIT License. See the MIT-LICENSE
650
+ file in the source distribution.
651
+
652
+ = History
653
+
654
+ * Version 2.4.2
655
+
656
+ * Minor adjustment to natural assertion error messages to better
657
+ handle multi-line values.
658
+
659
+ * Remove flog, flay and other development tools from the bundle and
660
+ gemspec. The Rakefile was updated to suggest installing them if
661
+ they are not there.
662
+
663
+ * Version 2.4.1
664
+
665
+ * Fix bug where constants from nested modules were not properly
666
+ accessed.
667
+
668
+ * Version 2.4.0
669
+
670
+ * Add fuzzy number helper methods (with unicode method shortcuts).
671
+
672
+ * Fix bug caused by blank lines in Thens.
673
+
674
+ = Links
675
+
676
+ * Github: [https://github.com/jimweirich/rspec-given](https://github.com/jimweirich/rspec-given)
677
+ * Clone URL: git://github.com/jimweirich/rspec-given.git
678
+ * Bug/Issue Reporting: [https://github.com/jimweirich/rspec-given/issues](https://github.com/jimweirich/rspec-given/issues)
679
+ * Continuous Integration: [http://travis-ci.org/#!/jimweirich/rspec-given](http://travis-ci.org/#!/jimweirich/rspec-given)
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  | :----: |
5
5
  | [![Master Build Status](https://secure.travis-ci.org/jimweirich/rspec-given.png?branch=master)](https://travis-ci.org/jimweirich/rspec-given) |
6
6
 
7
- Covering rspec-given, version 2.4.3.
7
+ Covering rspec-given, version 2.4.4.
8
8
 
9
9
  rspec-given is an RSpec extension to allow Given/When/Then notation in
10
10
  RSpec specifications. It is a natural extension of the experimental
data/README.old CHANGED
@@ -4,7 +4,7 @@
4
4
  | :----: |
5
5
  | [![Master Build Status](https://secure.travis-ci.org/jimweirich/rspec-given.png?branch=master)](https://travis-ci.org/jimweirich/rspec-given) |
6
6
 
7
- Covering rspec-given, version 2.4.2.
7
+ Covering rspec-given, version 2.4.3.
8
8
 
9
9
  rspec-given is an RSpec extension to allow Given/When/Then notation in
10
10
  RSpec specifications. It is a natural extension of the experimental
@@ -6,7 +6,7 @@ describe "And" do
6
6
  Given(:info) { [] }
7
7
 
8
8
  describe "And is called after Then" do
9
- Given(:m) { mock("mock") }
9
+ Given(:m) { double("mock") }
10
10
  Given { m.should_receive(:and_ran) }
11
11
  Then { info << "T" }
12
12
  And {
@@ -10,7 +10,11 @@ RSpec.configure do |c|
10
10
  c.include(RSpec::Given::HaveFailed)
11
11
  c.include(RSpec::Given::Fuzzy)
12
12
 
13
- c.backtrace_clean_patterns << /lib\/rspec\/given/
13
+ if c.respond_to?(:backtrace_exclusion_patterns)
14
+ c.backtrace_exclusion_patterns << /lib\/rspec\/given/
15
+ else
16
+ c.backtrace_clean_patterns << /lib\/rspec\/given/
17
+ end
14
18
 
15
19
  RSpec::Given.detect_formatters(c)
16
20
  end
@@ -34,6 +34,10 @@ module RSpec
34
34
  die
35
35
  end
36
36
 
37
+ def respond_to?(method_name)
38
+ method_name == :call
39
+ end
40
+
37
41
  private
38
42
 
39
43
  def die
@@ -2,7 +2,9 @@ module RSpec
2
2
  module Given
3
3
  # Does this platform support natural assertions?
4
4
  RBX_IN_USE = (defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx')
5
- NATURAL_ASSERTIONS_SUPPORTED = ! defined?(JRUBY_VERSION) && ! RBX_IN_USE
5
+ JRUBY_IN_USE = defined?(JRUBY_VERSION)
6
+
7
+ NATURAL_ASSERTIONS_SUPPORTED = ! (JRUBY_IN_USE || RBX_IN_USE)
6
8
 
7
9
  def self.matcher_called
8
10
  @_matcher_called
@@ -3,7 +3,7 @@ module RSpec
3
3
  VERSION_NUMBERS = [
4
4
  VERSION_MAJOR = 2,
5
5
  VERSION_MINOR = 4,
6
- VERSION_BUILD = 3,
6
+ VERSION_BUILD = 4,
7
7
  ]
8
8
  VERSION = VERSION_NUMBERS.join(".")
9
9
  end
@@ -196,7 +196,7 @@ describe "use_natural_assertions" do
196
196
  When(:result) { CONTEXT.use_natural_assertions }
197
197
 
198
198
  if RSpec::Given::NATURAL_ASSERTIONS_SUPPORTED
199
- Then { result.should_not have_failed(ArgumentError) }
199
+ Then { result.should_not have_failed }
200
200
  else
201
201
  Then { result.should have_failed(ArgumentError) }
202
202
  end
@@ -35,7 +35,6 @@ describe "#have_failed" do
35
35
 
36
36
  context "with a different failure" do
37
37
  When(:result) { fail CustomError, "Ouch" }
38
- Then { result.should_not have_failed(DifferentError) }
39
38
  Then { expect { result.should have_failed(DifferentError) }.to raise_error(ExpectationError) }
40
39
  end
41
40
 
@@ -5,7 +5,7 @@ describe "RSpec::Given.use_natural_assertions" do
5
5
  When(:result) { RSpec::Given.use_natural_assertions }
6
6
 
7
7
  if RSpec::Given::NATURAL_ASSERTIONS_SUPPORTED
8
- Then { result.should_not have_failed(ArgumentError) }
8
+ Then { result.should_not have_failed }
9
9
  else
10
10
  Then { result.should have_failed(ArgumentError) }
11
11
  end
@@ -36,7 +36,7 @@ describe "Configuration Options" do
36
36
 
37
37
  Given(:rspec) { false }
38
38
  Given(:content) { true }
39
- Given(:nassert) { stub(:using_rspec_assertion? => rspec, :has_content? => content) }
39
+ Given(:nassert) { double(:using_rspec_assertion? => rspec, :has_content? => content) }
40
40
 
41
41
  after do
42
42
  RSpec::Given.use_natural_assertions false
@@ -0,0 +1,22 @@
1
+ require "minitest/autorun"
2
+ require "minitest/given"
3
+
4
+ Given.use_natural_assertions
5
+
6
+ describe "Before" do
7
+ _Gvn_before { puts "Before 1" }
8
+ def setup
9
+ puts "Setup 1"
10
+ super
11
+ end
12
+
13
+ describe "not nil" do
14
+ _Gvn_before { puts "Before 2a" }
15
+ _Gvn_before { puts "Before 2b" }
16
+ def setup
17
+ super
18
+ puts "Setup 2"
19
+ end
20
+ Then { 1 != nil }
21
+ end
22
+ end
data/test/meme_test.rb ADDED
@@ -0,0 +1,36 @@
1
+ require "minitest/autorun"
2
+ require "minitest/given"
3
+
4
+ class Meme
5
+ def will_it_blend?
6
+ end
7
+
8
+ def i_can_has_cheezburger?
9
+ "OHAI!"
10
+ end
11
+ end
12
+
13
+
14
+ Given.use_natural_assertions
15
+
16
+ describe Meme do
17
+ def setup
18
+ super
19
+ puts "SETUP"
20
+ end
21
+
22
+ Given(:meme) { Meme.new }
23
+
24
+ describe "not nil" do
25
+ def setup
26
+ super
27
+ puts "Setup 2"
28
+ end
29
+ _Gvn_before { puts "BEFORE" }
30
+ Then { meme != nil }
31
+ end
32
+
33
+ Then { meme.i_can_has_cheezburger? == "OHAI!" }
34
+ Then { meme.will_it_blend? !~ /^no/i }
35
+ Then { skip "test this later" }
36
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-given
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.3
4
+ version: 2.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Weirich
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-25 00:00:00.000000000 Z
11
+ date: 2013-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -39,8 +39,8 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.3.7
41
41
  description: |
42
- Given is an RSpec extension that allows explicit definition of the
43
- pre and post-conditions for code under test.
42
+ Given is an RSpec extension that allows the use of Given/When/Then
43
+ terminology when defining specifications.
44
44
  email: jim.weirich@gmail.com
45
45
  executables: []
46
46
  extensions: []
@@ -49,6 +49,7 @@ files:
49
49
  - Gemfile
50
50
  - Gemfile.lock
51
51
  - MIT-LICENSE
52
+ - README
52
53
  - README.md
53
54
  - README.old
54
55
  - Rakefile
@@ -70,6 +71,8 @@ files:
70
71
  - lib/rspec/given/natural_assertion.rb
71
72
  - lib/rspec/given/rspec1_given.rb
72
73
  - lib/rspec/given/version.rb
74
+ - test/before_test.rb
75
+ - test/meme_test.rb
73
76
  - spec/lib/rspec/given/evaluator_spec.rb
74
77
  - spec/lib/rspec/given/ext/numeric_spec.rb
75
78
  - spec/lib/rspec/given/ext/numeric_specifications.rb