shared_should 0.6.2 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -114,7 +114,7 @@ Some rules:
114
114
 
115
115
  ### Initialization Block
116
116
 
117
- The shared invocation accepts an initialization block by chaining <tt>when</tt> followed by a block. This block can be used to create or modify instance variables used by the shared functionality. It always executes before the shared functionality.
117
+ The shared invocation accepts an initialization block by chaining <tt>with</tt> (or its alias <tt>when</tt>) followed by a block. This block can be used to create or modify instance variables used by the shared functionality. It always executes before the shared functionality.
118
118
 
119
119
  context "Book" do
120
120
  setup { @book = Book.new(:quantity => 1, :price => 10_00) }
@@ -123,7 +123,7 @@ The shared invocation accepts an initialization block by chaining <tt>when</tt>
123
123
 
124
124
  context "with a rentable book" do
125
125
  # when share_should "be available for checkout" is executed, @book will have rentable equal to true
126
- use_should("be available for checkout").when("rentable") { @book.rentable = true }
126
+ use_should("be available for checkout").with("a rentable book") { @book.rentable = true }
127
127
  end
128
128
 
129
129
  context "with a purchasable book" do
@@ -133,7 +133,7 @@ The shared invocation accepts an initialization block by chaining <tt>when</tt>
133
133
 
134
134
  ### Parameterizing Shares
135
135
 
136
- Shared functions can also be parameterized using block parameters. This can be done for shared setups, shoulds, and the setups and shoulds contained within a shared context. The value passed to the shared function is the return value of the <tt>with</tt> parameterization block. The below example parameterizes a shared setup.
136
+ Shared functions can also be parameterized using block parameters. This can be done for shared setups, shoulds, and the setups and shoulds contained within a shared context. The value passed to the shared function is the return value of the <tt>given</tt> parameterization block. The below example parameterizes a shared setup.
137
137
 
138
138
  context "Book" do
139
139
  share_setup "for an in-stock book" do |rentable|
@@ -142,7 +142,7 @@ Shared functions can also be parameterized using block parameters. This can be d
142
142
 
143
143
  context "with rentable book" do
144
144
  # the return value of the block is "true" which will be passed as the block parameter "rentable"
145
- use_setup("for an in-stock book").with { true }
145
+ use_setup("for an in-stock book").given { true }
146
146
 
147
147
  should "be available for checkout" { assert @book.available_for_checkout? }
148
148
  end
@@ -159,8 +159,8 @@ Here is a parameterized shared should.
159
159
  assert_false @book.available_for_checkout?
160
160
  end
161
161
 
162
- use_should("be unavailable for checkout for price").with("zero") { 0 }
163
- use_should("be unavailable for checkout for price").with("a negative price") { -1 }
162
+ use_should("be unavailable for checkout for price").given("zero") { 0 }
163
+ use_should("be unavailable for checkout for price").given("a negative price") { -1 }
164
164
  end
165
165
  end
166
166
 
@@ -180,7 +180,7 @@ And a parameterized shared context.
180
180
  should "be rentable or purchasable" { assert @book.rentable || @book.purchasable }
181
181
  end
182
182
 
183
- use_context("for a book available for checkout at price").with("a positive price") { 10_00 }
183
+ use_context("for a book available for checkout at price").given("a positive price") { 10_00 }
184
184
  end
185
185
  end
186
186
 
@@ -196,8 +196,8 @@ The shared functions also accept multiple parameters when the parameterization b
196
196
  assert_false @book.available_for_checkout?
197
197
  end
198
198
 
199
- use_should("be unavailable for checkout for quantity and price").with("a zero quantity") { [0, 10_00] }
200
- use_should("be unavailable for checkout for quantity and price").with("a zero price") { [1, 0] }
199
+ use_should("be unavailable for checkout for quantity and price").given("a zero quantity") { [0, 10_00] }
200
+ use_should("be unavailable for checkout for quantity and price").given("a zero price") { [1, 0] }
201
201
  end
202
202
  end
203
203
 
@@ -217,7 +217,7 @@ In your test file:
217
217
 
218
218
  class BookTest < Test::Unit::TestCase
219
219
  context "with an in-stock book" do
220
- use_setup("for an in-stock book").with { [true, true] }
220
+ use_setup("for an in-stock book").given { [true, true] }
221
221
 
222
222
  should "be in stock" { assert @book.quantity > 0 }
223
223
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.2
1
+ 0.6.3
data/lib/shared_should.rb CHANGED
@@ -18,8 +18,8 @@ end
18
18
  class Test::Unit::TestCase
19
19
  attr_accessor :shared_value
20
20
  attr_accessor :shared_name
21
- @@shared_proxies_executed = false
22
- @@setup_blocks = []
21
+ @@shared_proxies_executed = {}
22
+ @@setup_blocks = {}
23
23
 
24
24
  class << self
25
25
  # these methods need to be aliased for both the test class and the should context
@@ -27,11 +27,12 @@ class Test::Unit::TestCase
27
27
  end
28
28
 
29
29
  def self.suite
30
- unless @@shared_proxies_executed
30
+ # assuming 'suite' is called before executing any tests - may be a poor assumption. Find something better?
31
+ unless @@shared_proxies_executed[self]
31
32
  shared_proxies.each do |shared_proxy|
32
33
  shared_proxy.execute(self)
33
34
  end
34
- @@shared_proxies_executed = true
35
+ @@shared_proxies_executed[self] = true
35
36
  end
36
37
 
37
38
  suite_without_shared_should_execute
@@ -42,13 +43,14 @@ class Test::Unit::TestCase
42
43
  end
43
44
 
44
45
  def setup
45
- @@setup_blocks.each do |setup_block|
46
+ (@@setup_blocks[self.class] || []).each do |setup_block|
46
47
  setup_block.bind(self).call
47
48
  end
48
49
  end
49
50
 
50
51
  def self.setup(&setup_block)
51
- @@setup_blocks << setup_block
52
+ @@setup_blocks[self] = [] unless @@setup_blocks[self]
53
+ @@setup_blocks[self] << setup_block
52
54
  end
53
55
 
54
56
  def setup_shared_values(name, initialization_block)
@@ -317,14 +319,16 @@ class Shoulda::SharedProxy
317
319
  self.initialization_blocks = []
318
320
  end
319
321
 
322
+ def with(description = nil, &initialization_block)
323
+ with_helper("with", description, &initialization_block)
324
+ end
325
+
320
326
  def when(description = nil, &initialization_block)
321
- when_helper("when", description, &initialization_block)
322
- return self
327
+ with_helper("when", description, &initialization_block)
323
328
  end
324
329
 
325
- def with(description = nil, &initialization_block)
326
- when_helper("with", description, &initialization_block)
327
- return nil
330
+ def given(description = nil, &initialization_block)
331
+ with_helper("given", description, :disable_and => true, &initialization_block)
328
332
  end
329
333
 
330
334
  def execute(context)
@@ -341,10 +345,12 @@ class Shoulda::SharedProxy
341
345
 
342
346
  private
343
347
 
344
- def when_helper(conditional, description = nil, &initialization_block)
348
+ def with_helper(conditional, description, options = {}, &initialization_block)
345
349
  if description
346
- self.description = "#{self.description}#{self.description.nil? ? nil : ' and '}#{conditional} #{description}"
350
+ and_text = options[:disable_and] ? ' ' : ' and '
351
+ self.description = "#{self.description}#{self.description.nil? ? nil : and_text}#{conditional} #{description}"
347
352
  end
348
353
  self.initialization_blocks << initialization_block
354
+ return self
349
355
  end
350
356
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{shared_should}
8
- s.version = "0.6.2"
8
+ s.version = "0.6.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Michael Pearce"]
12
- s.date = %q{2011-03-04}
12
+ s.date = %q{2011-03-18}
13
13
  s.description = %q{Share and reuse shoulds, contexts, and setup in Shoulda.}
14
14
  s.email = %q{michael.pearce@bookrenter.com}
15
15
  s.extra_rdoc_files = [
@@ -64,7 +64,7 @@ class TestSharedShould < Test::Unit::TestCase
64
64
  end
65
65
  end
66
66
 
67
- use_context("for a valid specified value").with("true") { true }
67
+ use_context("for a valid specified value").given("true") { true }
68
68
 
69
69
  context "with chaining" do
70
70
  share_context "for a chained value" do
@@ -74,7 +74,8 @@ class TestSharedShould < Test::Unit::TestCase
74
74
  end
75
75
  end
76
76
 
77
- use_context("for a chained value").when("using initialization chain") { @chain = true }.with("true") { true }
77
+ use_context("for a chained value").with("an initialization chain") { @chain = true }.given("true") { true }
78
+ use_context("for a chained value").when("using initialization chain") { @chain = true }.given("true") { true }
78
79
  end
79
80
  end
80
81
  end
@@ -162,7 +163,7 @@ class TestSharedShould < Test::Unit::TestCase
162
163
  assert_equal value, @value
163
164
  end
164
165
 
165
- use_should("be a valid specified value").with("true") { true }
166
+ use_should("be a valid specified value").given("true") { true }
166
167
 
167
168
  context "with chaining" do
168
169
  share_should "be a valid specified value" do |value|
@@ -170,8 +171,8 @@ class TestSharedShould < Test::Unit::TestCase
170
171
  assert value
171
172
  end
172
173
 
173
- use_should("be a valid specified value").when("using initialization chain") { @chain = true }.with("true") { true }
174
- use_should("be a valid specified value").when("using initialization chain xxxx") { @chain = true }.with("true") { true }
174
+ use_should("be a valid specified value").when("using initialization chain") { @chain = true }.given("true") { true }
175
+ use_should("be a valid specified value").with("an initialization chain") { @chain = true }.given("true") { true }
175
176
  end
176
177
  end
177
178
  end
@@ -288,7 +289,7 @@ class TestSharedShould < Test::Unit::TestCase
288
289
  @value = false
289
290
  end
290
291
 
291
- use_setup("for value").with("true") { true }
292
+ use_setup("for value").given("true") { true }
292
293
 
293
294
  should "have a true value from shared setup" do
294
295
  assert @value
@@ -305,7 +306,8 @@ class TestSharedShould < Test::Unit::TestCase
305
306
  @value = value
306
307
  end
307
308
 
308
- use_setup("for value").when("using initialization chain") { @chain = true }.with("true") { true }
309
+ use_setup("for value").when("using initialization chain") { @chain = true }.given("true") { true }
310
+ use_setup("for value").with("an initialization chain") { @chain = true }.given("true") { true }
309
311
 
310
312
  should "have used share with chain and params" do
311
313
  assert @chain
@@ -431,58 +433,70 @@ class TestSharedShould < Test::Unit::TestCase
431
433
  end
432
434
  end
433
435
 
434
- # ensure test methods are created
435
- expected_method_names = [
436
- 'test: should be a valid should test in class. ',
437
- 'test: .share_context with params with chaining when using initialization chain and with true for a chained value should chain initialization block and be with params. ',
438
- 'test: .share_context with params with true for a valid specified value should call setup in shared context. ',
439
- 'test: .share_context with params with true for a valid specified value should have specified value. ',
440
- 'test: .share_context with params with true for a valid specified value should setup @expected_value. ',
441
- 'test: .share_context without params with value in initializer when a true value for a valid value should call setup in shared context. ',
442
- 'test: .share_context without params with value in initializer when a true value for a valid value should have true value. ',
443
- 'test: .share_context without params with value in setup for a valid value should call setup in shared context. ',
444
- 'test: .share_context without params with value in setup for a valid value should have true value. ',
445
- 'test: .share_setup with param block with chaining should have used share with chain and params. ',
446
- 'test: .share_setup with param block with shared setup value should have a true value from shared setup. ',
447
- 'test: .share_setup without params with initialization block should have a true value from shared setup. ',
448
- 'test: .share_setup without params without initialization block should have a true value from shared setup. ',
449
- 'test: .share_should with params with chaining when using initialization chain and with true should be a valid specified value. ',
450
- 'test: .share_should with params with chaining when using initialization chain xxxx and with true should be a valid specified value. ',
451
- 'test: .share_should with params with true should be a valid specified value. ',
452
- 'test: .share_should without params when value in initializer when value is true should be a true value. ',
453
- 'test: .share_should without params with value in initializer when value is true should be a true value. ',
454
- 'test: .share_should without params with value in setup should be a true value. ',
455
- 'test: .shared_context_should with params be valid for specified value should call setup in shared context. ',
456
- 'test: .shared_context_should with params be valid for specified value should have specified value. ',
457
- 'test: .shared_context_should with params be valid for specified value should setup @expected_value. ',
458
- 'test: .shared_context_should without params be valid should call setup in shared context. ',
459
- 'test: .shared_context_should without params be valid should have true value. ',
460
- 'test: .shared_setup with params with shared setup value should have a true value from shared setup. ',
461
- 'test: .shared_setup without params with shared setup value should have a true value from shared setup. ',
462
- 'test: .shared_should with params should have specified value. ',
463
- 'test: .shared_should without params should have true value. ',
464
- 'test: SharedShould should execute setup instance method. ',
465
- 'test: context directly under test class for a valid context test should have a true value. ',
466
- 'test: context directly under test class should be a valid should test. ',
467
- 'test: for a valid context test in class should have a true value. ',
468
- 'test: parameterized block with an array be valid with shared context should do something with shared_value. ',
469
- 'test: parameterized block with an array be valid with shared context should do something with value block param. ',
470
- 'test: parameterized block with an array be valid with shared context should do something with value block params. ',
471
- 'test: parameterized block with an array should be valid with shared should. ',
472
- 'test: shoulda macro should be a valid macro. '
473
- ].inject({}) do |hash, expected_method_name|
474
- hash[expected_method_name] = true
475
- hash
476
- end
477
- actual_method_names = suite.tests.inject({}) do |hash, test_case|
478
- hash[test_case.method_name] = true
479
- hash
480
- end
481
-
482
- expected_method_names.each do |method_name, value|
483
- raise "Test method not found: '#{method_name}'" unless actual_method_names.include?(method_name)
484
- end
485
- actual_method_names.each do |method_name, value|
486
- raise "Unexpected test method: '#{method_name}'" unless expected_method_names.include?(method_name)
436
+ context "expected methods" do
437
+ should "have expected methods in test" do
438
+ # ensure test methods are created
439
+ expected_method_names = [
440
+ 'test: should be a valid should test in class. ',
441
+ 'test: .share_context without params with value in initializer when a true value for a valid value should call setup in shared context. ',
442
+ 'test: .share_context without params with value in initializer when a true value for a valid value should have true value. ',
443
+ 'test: .share_context without params with value in setup for a valid value should call setup in shared context. ',
444
+ 'test: .share_context without params with value in setup for a valid value should have true value. ',
445
+ 'test: .share_setup with param block with chaining should have used share with chain and params. ',
446
+ 'test: .share_setup with param block with shared setup value should have a true value from shared setup. ',
447
+ 'test: .share_setup without params with initialization block should have a true value from shared setup. ',
448
+ 'test: .share_setup without params without initialization block should have a true value from shared setup. ',
449
+ 'test: .share_should without params when value in initializer when value is true should be a true value. ',
450
+ 'test: .share_should without params with value in initializer when value is true should be a true value. ',
451
+ 'test: .share_should without params with value in setup should be a true value. ',
452
+ 'test: .shared_context_should with params be valid for specified value should call setup in shared context. ',
453
+ 'test: .shared_context_should with params be valid for specified value should have specified value. ',
454
+ 'test: .shared_context_should with params be valid for specified value should setup @expected_value. ',
455
+ 'test: .shared_context_should without params be valid should call setup in shared context. ',
456
+ 'test: .shared_context_should without params be valid should have true value. ',
457
+ 'test: .shared_setup with params with shared setup value should have a true value from shared setup. ',
458
+ 'test: .shared_setup without params with shared setup value should have a true value from shared setup. ',
459
+ 'test: .shared_should with params should have specified value. ',
460
+ 'test: .shared_should without params should have true value. ',
461
+ 'test: SharedShould should execute setup instance method. ',
462
+ 'test: context directly under test class for a valid context test should have a true value. ',
463
+ 'test: context directly under test class should be a valid should test. ',
464
+ 'test: for a valid context test in class should have a true value. ',
465
+ 'test: parameterized block with an array be valid with shared context should do something with shared_value. ',
466
+ 'test: parameterized block with an array be valid with shared context should do something with value block param. ',
467
+ 'test: parameterized block with an array be valid with shared context should do something with value block params. ',
468
+ 'test: parameterized block with an array should be valid with shared should. ',
469
+ 'test: shoulda macro should be a valid macro. ',
470
+ 'test: expected methods should have expected methods in test. ',
471
+ "test: .share_context with params given true for a valid specified value should call setup in shared context. ",
472
+ "test: .share_context with params with chaining with an initialization chain given true for a chained value should chain initialization block and be with params. ",
473
+ "test: .share_context with params given true for a valid specified value should setup @expected_value. ",
474
+ "test: .share_should with params with chaining with an initialization chain given true should be a valid specified value. ",
475
+ "test: .share_context with params given true for a valid specified value should have specified value. ",
476
+ "test: .share_context with params with chaining when using initialization chain given true for a chained value should chain initialization block and be with params. ",
477
+ "test: .share_should with params with chaining when using initialization chain given true should be a valid specified value. ",
478
+ "test: .share_should with params given true should be a valid specified value. "
479
+ ].inject({}) do |hash, expected_method_name|
480
+ hash[expected_method_name] = true
481
+ hash
482
+ end
483
+ actual_method_names = self.class.suite.tests.inject({}) do |hash, test_case|
484
+ hash[test_case.method_name] = true
485
+ hash
486
+ end
487
+
488
+ actual_methods_not_found = []
489
+ actual_method_names.each do |method_name, value|
490
+ actual_methods_not_found << method_name unless expected_method_names.include?(method_name)
491
+ end
492
+ assert_equal [], actual_methods_not_found, "Unknown methods exist in the test suite"
493
+
494
+ expected_methods_not_found = []
495
+ expected_method_names.each do |method_name, value|
496
+ expected_methods_not_found << method_name unless actual_method_names.include?(method_name)
497
+ end
498
+ assert_equal [], expected_methods_not_found, "Unknown methods exist in the list of expected tests"
499
+
500
+ end
487
501
  end
488
502
  end
@@ -1,6 +1,6 @@
1
1
  require 'helper'
2
2
 
3
- # re-open ActiveSupport::TestCase class for some shares
3
+ # Create a subclass for some shares
4
4
  class SubclassTestCase < Test::Unit::TestCase
5
5
  shared_should "have true value for shared should helper" do
6
6
  assert @value
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shared_should
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 1
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 2
10
- version: 0.6.2
9
+ - 3
10
+ version: 0.6.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Michael Pearce
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-04 00:00:00 -08:00
18
+ date: 2011-03-18 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency