mspec 1.5.9 → 1.5.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. data/Rakefile +1 -1
  2. data/lib/mspec/commands/mspec-ci.rb +5 -1
  3. data/lib/mspec/commands/mspec-run.rb +8 -5
  4. data/lib/mspec/guards/background.rb +2 -0
  5. data/lib/mspec/guards/bug.rb +5 -1
  6. data/lib/mspec/guards/compliance.rb +10 -0
  7. data/lib/mspec/guards/conflict.rb +2 -0
  8. data/lib/mspec/guards/endian.rb +4 -0
  9. data/lib/mspec/guards/extensions.rb +2 -0
  10. data/lib/mspec/guards/guard.rb +49 -25
  11. data/lib/mspec/guards/noncompliance.rb +2 -0
  12. data/lib/mspec/guards/platform.rb +5 -0
  13. data/lib/mspec/guards/quarantine.rb +2 -0
  14. data/lib/mspec/guards/runner.rb +4 -0
  15. data/lib/mspec/guards/superuser.rb +2 -0
  16. data/lib/mspec/guards/support.rb +2 -0
  17. data/lib/mspec/guards/tty.rb +2 -0
  18. data/lib/mspec/guards/version.rb +3 -0
  19. data/lib/mspec/matchers.rb +1 -0
  20. data/lib/mspec/matchers/have_constant.rb +30 -0
  21. data/lib/mspec/matchers/method.rb +4 -3
  22. data/lib/mspec/matchers/stringsymboladapter.rb +8 -0
  23. data/lib/mspec/runner/actions/tally.rb +13 -3
  24. data/lib/mspec/runner/context.rb +8 -1
  25. data/lib/mspec/runner/mspec.rb +16 -0
  26. data/lib/mspec/utils/options.rb +10 -3
  27. data/lib/mspec/version.rb +1 -1
  28. data/spec/guards/background_spec.rb +15 -0
  29. data/spec/guards/bug_spec.rb +28 -10
  30. data/spec/guards/compliance_spec.rb +54 -0
  31. data/spec/guards/conflict_spec.rb +19 -0
  32. data/spec/guards/endian_spec.rb +26 -0
  33. data/spec/guards/extensions_spec.rb +20 -0
  34. data/spec/guards/guard_spec.rb +69 -52
  35. data/spec/guards/noncompliance_spec.rb +20 -0
  36. data/spec/guards/platform_spec.rb +26 -0
  37. data/spec/guards/quarantine_spec.rb +16 -0
  38. data/spec/guards/runner_spec.rb +26 -0
  39. data/spec/guards/superuser_spec.rb +13 -0
  40. data/spec/guards/support_spec.rb +20 -0
  41. data/spec/guards/tty_spec.rb +16 -0
  42. data/spec/guards/version_spec.rb +13 -0
  43. data/spec/matchers/have_constant_spec.rb +37 -0
  44. data/spec/matchers/stringsymboladapter_spec.rb +40 -0
  45. data/spec/runner/actions/tagpurge_spec.rb +1 -0
  46. data/spec/runner/actions/tally_spec.rb +64 -0
  47. data/spec/runner/context_spec.rb +24 -11
  48. data/spec/runner/formatters/html_spec.rb +1 -0
  49. data/spec/runner/mspec_spec.rb +31 -0
  50. data/spec/utils/options_spec.rb +59 -0
  51. metadata +6 -3
  52. data/spec/matchers/method_spec.rb +0 -36
@@ -1,10 +1,11 @@
1
- require 'mspec/utils/version'
1
+ require 'mspec/matchers/stringsymboladapter'
2
2
 
3
3
  class MethodMatcher
4
+ include StringSymbolAdapter
5
+
4
6
  def initialize(method, include_super=true)
5
7
  @include_super = include_super
6
- version = SpecVersion.new(RUBY_VERSION) <=> "1.9"
7
- @method = version < 0 ? method.to_s : method
8
+ @method = convert_name method
8
9
  end
9
10
 
10
11
  def matches?(mod)
@@ -0,0 +1,8 @@
1
+ require 'mspec/utils/version'
2
+
3
+ module StringSymbolAdapter
4
+ def convert_name(name)
5
+ version = SpecVersion.new(RUBY_VERSION) <=> "1.9"
6
+ version < 0 ? name.to_s : name
7
+ end
8
+ end
@@ -1,8 +1,8 @@
1
1
  class Tally
2
- attr_accessor :files, :examples, :expectations, :failures, :errors
2
+ attr_accessor :files, :examples, :expectations, :failures, :errors, :guards
3
3
 
4
4
  def initialize
5
- @files = @examples = @expectations = @failures = @errors = 0
5
+ @files = @examples = @expectations = @failures = @errors = @guards = 0
6
6
  end
7
7
 
8
8
  def files!(add=1)
@@ -25,6 +25,10 @@ class Tally
25
25
  @errors += add
26
26
  end
27
27
 
28
+ def guards!(add=1)
29
+ @guards += add
30
+ end
31
+
28
32
  def file
29
33
  pluralize files, "file"
30
34
  end
@@ -45,8 +49,14 @@ class Tally
45
49
  pluralize errors, "error"
46
50
  end
47
51
 
52
+ def guard
53
+ pluralize guards, "guard"
54
+ end
55
+
48
56
  def format
49
- [ file, example, expectation, failure, error ].join(", ")
57
+ results = [ file, example, expectation, failure, error ]
58
+ results << guard if [:report, :report_on, :verify].any? { |m| MSpec.mode? m }
59
+ results.join(", ")
50
60
  end
51
61
 
52
62
  alias_method :to_s, :format
@@ -79,18 +79,23 @@ class ContextState
79
79
 
80
80
  # Records before(:each) and before(:all) blocks.
81
81
  def before(what, &block)
82
+ return if MSpec.guarded?
82
83
  block ? @before[what].push(block) : @before[what]
83
84
  end
84
85
 
85
86
  # Records after(:each) and after(:all) blocks.
86
87
  def after(what, &block)
88
+ return if MSpec.guarded?
87
89
  block ? @after[what].unshift(block) : @after[what]
88
90
  end
89
91
 
90
92
  # Creates an ExampleState instance for the block and stores it
91
93
  # in a list of examples to evaluate unless the example is filtered.
92
94
  def it(desc, &block)
93
- @examples << ExampleState.new(self, desc, block)
95
+ example = ExampleState.new(self, desc, block)
96
+ MSpec.actions :add, example
97
+ return if MSpec.guarded?
98
+ @examples << example
94
99
  end
95
100
 
96
101
  # Evaluates the block and resets the toplevel +ContextState+ to #parent.
@@ -108,6 +113,8 @@ class ContextState
108
113
  # Injects the before/after blocks and examples from the shared
109
114
  # describe block into this +ContextState+ instance.
110
115
  def it_should_behave_like(desc)
116
+ return if MSpec.guarded?
117
+
111
118
  unless state = MSpec.retrieve_shared(desc)
112
119
  raise Exception, "Unable to find shared 'describe' for #{desc}"
113
120
  end
@@ -20,6 +20,7 @@ module MSpec
20
20
  @current = nil
21
21
  @modes = []
22
22
  @shared = {}
23
+ @guarded = []
23
24
  @exception = nil
24
25
  @randomize = nil
25
26
  @expectation = nil
@@ -74,6 +75,20 @@ module MSpec
74
75
  end
75
76
  end
76
77
 
78
+ # Guards can be nested, so a stack is necessary to know when we have
79
+ # exited the toplevel guard.
80
+ def self.guard
81
+ @guarded << true
82
+ end
83
+
84
+ def self.unguard
85
+ @guarded.pop
86
+ end
87
+
88
+ def self.guarded?
89
+ not @guarded.empty?
90
+ end
91
+
77
92
  # Sets the toplevel ContextState to +state+.
78
93
  def self.register_current(state)
79
94
  store :current, state
@@ -161,6 +176,7 @@ module MSpec
161
176
  # :load before a spec file is loaded
162
177
  # :enter before a describe block is run
163
178
  # :before before a single spec is run
179
+ # :add while a describe block is adding examples to run later
164
180
  # :expectation before a 'should', 'should_receive', etc.
165
181
  # :example after an example block is run, passed the block
166
182
  # :exception after an exception is rescued
@@ -360,6 +360,9 @@ class MSpecOptions
360
360
  on("--unguarded", "Turn off all guards") do
361
361
  MSpec.register_mode :unguarded
362
362
  end
363
+ on("--no-ruby_bug", "Turn off the ruby_bug guard") do
364
+ MSpec.register_mode :no_ruby_bug
365
+ end
363
366
  end
364
367
 
365
368
  def randomize
@@ -401,13 +404,17 @@ class MSpecOptions
401
404
  end
402
405
 
403
406
  def verify
404
- on("-Y", "--verify",
405
- "Verify that guarded specs pass and fail as expected") do
406
- MSpec.register_mode :verify
407
+ on("--report-on", "GUARD", "Report specs guarded by GUARD") do |g|
408
+ MSpec.register_mode :report_on
409
+ SpecGuard.guards << g.to_sym
407
410
  end
408
411
  on("-O", "--report", "Report guarded specs") do
409
412
  MSpec.register_mode :report
410
413
  end
414
+ on("-Y", "--verify",
415
+ "Verify that guarded specs pass and fail as expected") do
416
+ MSpec.register_mode :verify
417
+ end
411
418
  end
412
419
 
413
420
  def action_filters
data/lib/mspec/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'mspec/utils/version'
2
2
 
3
3
  module MSpec
4
- VERSION = SpecVersion.new "1.5.9"
4
+ VERSION = SpecVersion.new "1.5.10"
5
5
  end
@@ -5,6 +5,9 @@ describe Object, "#process_is_foreground" do
5
5
  before :each do
6
6
  MSpec.clear_modes
7
7
  ScratchPad.clear
8
+
9
+ @guard = BackgroundGuard.new
10
+ BackgroundGuard.stub!(:new).and_return(@guard)
8
11
  end
9
12
 
10
13
  it "yields if MSpec.mode?(:background) is false" do
@@ -18,4 +21,16 @@ describe Object, "#process_is_foreground" do
18
21
  process_is_foreground { ScratchPad.record :yield }
19
22
  ScratchPad.recorded.should_not == :yield
20
23
  end
24
+
25
+ it "sets the name of the guard to :process_is_foreground" do
26
+ process_is_foreground { ScratchPad.record :yield }
27
+ @guard.name.should == :process_is_foreground
28
+ end
29
+
30
+ it "calls #unregister even when an exception is raised in the guard block" do
31
+ @guard.should_receive(:unregister)
32
+ lambda do
33
+ process_is_foreground { raise Exception }
34
+ end.should raise_error(Exception)
35
+ end
21
36
  end
@@ -46,6 +46,12 @@ describe BugGuard, "#match? when #implementation? is 'ruby'" do
46
46
  BugGuard.new("#1", "1.8").match?.should == true
47
47
  BugGuard.new("#1", "1.8.6").match?.should == true
48
48
  end
49
+
50
+ it "returns false when MSpec.mode?(:no_ruby_bug) is true" do
51
+ MSpec.should_receive(:mode?).with(:no_ruby_bug).twice.and_return(:true)
52
+ BugGuard.new("#1", "1.8.5").match?.should == false
53
+ BugGuard.new("#1", "1.8").match?.should == false
54
+ end
49
55
  end
50
56
 
51
57
  describe BugGuard, "#match? when #implementation? is not 'ruby'" do
@@ -87,6 +93,13 @@ describe BugGuard, "#match? when #implementation? is not 'ruby'" do
87
93
  BugGuard.new("#1", "1.8.7").match?.should == false
88
94
  BugGuard.new("#1", "1.8.6.115").match?.should == false
89
95
  end
96
+
97
+ it "returns false when MSpec.mode?(:no_ruby_bug) is true" do
98
+ MSpec.should_receive(:mode?).with(:no_ruby_bug).any_number_of_times.and_return(:true)
99
+ BugGuard.new("#1", "1.8.6").match?.should == false
100
+ BugGuard.new("#1", "1.8.6.114").match?.should == false
101
+ BugGuard.new("#1", "1.8.6.115").match?.should == false
102
+ end
90
103
  end
91
104
 
92
105
  describe Object, "#ruby_bug" do
@@ -98,25 +111,30 @@ describe Object, "#ruby_bug" do
98
111
 
99
112
  it "yields when #match? returns false" do
100
113
  @guard.stub!(:match?).and_return(false)
101
- ruby_bug { ScratchPad.record :yield }
114
+ ruby_bug("#1234", "1.8.6") { ScratchPad.record :yield }
102
115
  ScratchPad.recorded.should == :yield
103
116
  end
104
117
 
105
118
  it "does not yield when #match? returns true" do
106
119
  @guard.stub!(:match?).and_return(true)
107
- ruby_bug { ScratchPad.record :yield }
120
+ ruby_bug("#1234", "1.8.6") { ScratchPad.record :yield }
108
121
  ScratchPad.recorded.should_not == :yield
109
122
  end
110
123
 
111
- it "accepts an optional String identifying the bug tracker number" do
112
- @guard.stub!(:match?).and_return(false)
113
- ruby_bug("#1234") { ScratchPad.record :yield }
114
- ScratchPad.recorded.should == :yield
124
+ it "requires a bug tracker number and a version number" do
125
+ lambda { ruby_bug { } }.should raise_error(ArgumentError)
126
+ lambda { ruby_bug("#1234") { } }.should raise_error(ArgumentError)
115
127
  end
116
128
 
117
- it "accepts an optional String identifying the version number" do
118
- @guard.stub!(:match?).and_return(false)
119
- ruby_bug("#1234", "1.8.6") { ScratchPad.record :yield }
120
- ScratchPad.recorded.should == :yield
129
+ it "sets the name of the guard to :ruby_bug" do
130
+ ruby_bug("#1234", "1.8.6") { }
131
+ @guard.name.should == :ruby_bug
132
+ end
133
+
134
+ it "calls #unregister even when an exception is raised in the guard block" do
135
+ @guard.should_receive(:unregister)
136
+ lambda do
137
+ ruby_bug("", "") { raise Exception }
138
+ end.should raise_error(Exception)
121
139
  end
122
140
  end
@@ -21,6 +21,14 @@ describe Object, "#compliant_on" do
21
21
  ScratchPad.clear
22
22
  end
23
23
 
24
+ it "raises an Exception when passed :ruby" do
25
+ Object.const_set :RUBY_NAME, "jruby"
26
+ lambda {
27
+ compliant_on(:ruby) { ScratchPad.record :yield }
28
+ }.should raise_error(Exception)
29
+ ScratchPad.recorded.should_not == :yield
30
+ end
31
+
24
32
  it "does not yield when #standard? and #implementation? return false" do
25
33
  Object.const_set :RUBY_NAME, "jruby"
26
34
  compliant_on(:rubinius, :ironruby) { ScratchPad.record :yield }
@@ -46,6 +54,25 @@ describe Object, "#compliant_on" do
46
54
  end
47
55
  end
48
56
 
57
+ describe Object, "#compliant_on" do
58
+ before :each do
59
+ @guard = CompliantOnGuard.new :any
60
+ CompliantOnGuard.stub!(:new).and_return(@guard)
61
+ end
62
+
63
+ it "sets the name of the guard to :compliant_on" do
64
+ compliant_on(:rubinius) { }
65
+ @guard.name.should == :compliant_on
66
+ end
67
+
68
+ it "calls #unregister even when an exception is raised in the guard block" do
69
+ @guard.should_receive(:unregister)
70
+ lambda do
71
+ compliant_on(:rubinius) { raise Exception }
72
+ end.should raise_error(Exception)
73
+ end
74
+ end
75
+
49
76
  describe Object, "#not_compliant_on" do
50
77
  before :all do
51
78
  @verbose = $VERBOSE
@@ -66,6 +93,14 @@ describe Object, "#not_compliant_on" do
66
93
  ScratchPad.clear
67
94
  end
68
95
 
96
+ it "raises an Exception when passed :ruby" do
97
+ Object.const_set :RUBY_NAME, "jruby"
98
+ lambda {
99
+ not_compliant_on(:ruby) { ScratchPad.record :yield }
100
+ }.should raise_error(Exception)
101
+ ScratchPad.recorded.should_not == :yield
102
+ end
103
+
69
104
  it "yields when #standard? returns true" do
70
105
  Object.const_set :RUBY_NAME, "ruby"
71
106
  not_compliant_on(:rubinius) { ScratchPad.record :yield }
@@ -84,3 +119,22 @@ describe Object, "#not_compliant_on" do
84
119
  ScratchPad.recorded.should == :yield
85
120
  end
86
121
  end
122
+
123
+ describe Object, "#not_compliant_on" do
124
+ before :each do
125
+ @guard = NotCompliantOnGuard.new :any
126
+ NotCompliantOnGuard.stub!(:new).and_return(@guard)
127
+ end
128
+
129
+ it "sets the name of the guard to :not_compliant_on" do
130
+ not_compliant_on(:rubinius) { }
131
+ @guard.name.should == :not_compliant_on
132
+ end
133
+
134
+ it "calls #unregister even when an exception is raised in the guard block" do
135
+ @guard.should_receive(:unregister)
136
+ lambda do
137
+ not_compliant_on(:rubinius) { raise Exception }
138
+ end.should raise_error(Exception)
139
+ end
140
+ end
@@ -18,3 +18,22 @@ describe Object, "#conflicts_with" do
18
18
  ScratchPad.recorded.should == :yield
19
19
  end
20
20
  end
21
+
22
+ describe Object, "#conflicts_with" do
23
+ before :each do
24
+ @guard = ConflictsGuard.new
25
+ ConflictsGuard.stub!(:new).and_return(@guard)
26
+ end
27
+
28
+ it "sets the name of the guard to :conflicts_with" do
29
+ conflicts_with(:AClass, :BClass) { }
30
+ @guard.name.should == :conflicts_with
31
+ end
32
+
33
+ it "calls #unregister even when an exception is raised in the guard block" do
34
+ @guard.should_receive(:unregister)
35
+ lambda do
36
+ conflicts_with(:AClass, :BClass) { raise Exception }
37
+ end.should raise_error(Exception)
38
+ end
39
+ end
@@ -19,6 +19,19 @@ describe Object, "#big_endian" do
19
19
  big_endian { ScratchPad.record :yield }
20
20
  ScratchPad.recorded.should_not == :yield
21
21
  end
22
+
23
+ it "sets the name of the guard to :big_endian" do
24
+ big_endian { }
25
+ @guard.name.should == :big_endian
26
+ end
27
+
28
+ it "calls #unregister even when an exception is raised in the guard block" do
29
+ @guard.stub!(:pattern).and_return([1])
30
+ @guard.should_receive(:unregister)
31
+ lambda do
32
+ big_endian { raise Exception }
33
+ end.should raise_error(Exception)
34
+ end
22
35
  end
23
36
 
24
37
  describe Object, "#little_endian" do
@@ -39,4 +52,17 @@ describe Object, "#little_endian" do
39
52
  little_endian { ScratchPad.record :yield }
40
53
  ScratchPad.recorded.should_not == :yield
41
54
  end
55
+
56
+ it "sets the name of the guard to :little_endian" do
57
+ little_endian { }
58
+ @guard.name.should == :little_endian
59
+ end
60
+
61
+ it "calls #unregister even when an exception is raised in the guard block" do
62
+ @guard.stub!(:pattern).and_return([0])
63
+ @guard.should_receive(:unregister)
64
+ lambda do
65
+ little_endian { raise Exception }
66
+ end.should raise_error(Exception)
67
+ end
42
68
  end
@@ -47,3 +47,23 @@ describe Object, "#extended_on" do
47
47
  ScratchPad.recorded.should == :yield
48
48
  end
49
49
  end
50
+
51
+ describe Object, "#extended_on" do
52
+ before :each do
53
+ @guard = ExtensionsGuard.new
54
+ ExtensionsGuard.stub!(:new).and_return(@guard)
55
+ end
56
+
57
+ it "sets the name of the guard to :extended_on" do
58
+ extended_on(:rubinius) { }
59
+ @guard.name.should == :extended_on
60
+ end
61
+
62
+ it "calls #unregister even when an exception is raised in the guard block" do
63
+ @guard.should_receive(:match?).and_return(true)
64
+ @guard.should_receive(:unregister)
65
+ lambda do
66
+ extended_on(:rubinius) { raise Exception }
67
+ end.should raise_error(Exception)
68
+ end
69
+ end
@@ -3,42 +3,6 @@ require 'mspec/utils/ruby_name'
3
3
  require 'mspec/guards/guard'
4
4
  require 'rbconfig'
5
5
 
6
- describe SpecGuard, ".register" do
7
- before :each do
8
- @tally = mock("tally")
9
- @tally.stub!(:register)
10
- TallyAction.stub!(:new).and_return(@tally)
11
- SpecGuard.instance_variable_set(:@registered, nil)
12
- end
13
-
14
- it "creates a new TallyAction if one does not exist" do
15
- TallyAction.should_receive(:new).and_return(@tally)
16
- @tally.should_receive(:register)
17
- SpecGuard.register
18
- SpecGuard.register
19
- end
20
-
21
- it "registers itself with MSpec :finish actions" do
22
- MSpec.should_receive(:register).with(:finish, SpecGuard)
23
- SpecGuard.register
24
- end
25
- end
26
-
27
- describe SpecGuard, ".unregister" do
28
- before :each do
29
- @tally = mock("tally")
30
- @tally.stub!(:register)
31
- TallyAction.stub!(:new).and_return(@tally)
32
- SpecGuard.instance_variable_set(:@registered, nil)
33
- end
34
-
35
- it "unregisters its tally action" do
36
- @tally.should_receive(:unregister)
37
- SpecGuard.register
38
- SpecGuard.unregister
39
- end
40
- end
41
-
42
6
  describe SpecGuard, ".ruby_version" do
43
7
  before :all do
44
8
  @ruby_version = Object.const_get :RUBY_VERSION
@@ -116,6 +80,12 @@ describe SpecGuard, "#yield?" do
116
80
  @guard = SpecGuard.new
117
81
  end
118
82
 
83
+ after :each do
84
+ MSpec.unregister :add, @guard
85
+ MSpec.clear_modes
86
+ SpecGuard.clear_guards
87
+ end
88
+
119
89
  it "returns true if MSpec.mode?(:unguarded) is true" do
120
90
  MSpec.register_mode :unguarded
121
91
  @guard.yield?.should == true
@@ -141,6 +111,14 @@ describe SpecGuard, "#yield?" do
141
111
  @guard.yield?(true).should == true
142
112
  end
143
113
 
114
+ it "returns true if MSpec.mode?(:report_on) is true and SpecGuards.guards contains the named guard" do
115
+ MSpec.register_mode :report_on
116
+ SpecGuard.guards << :guard_name
117
+ @guard.yield?.should == false
118
+ @guard.name = :guard_name
119
+ @guard.yield?.should == true
120
+ end
121
+
144
122
  it "returns #match? if neither report nor verify mode are true" do
145
123
  @guard.stub!(:match?).and_return(false)
146
124
  @guard.yield?.should == false
@@ -430,30 +408,69 @@ end
430
408
 
431
409
  describe SpecGuard, "#unregister" do
432
410
  before :each do
433
- @tally = mock("tally")
434
- @tally.stub!(:register)
435
- TallyAction.stub!(:new).and_return(@tally)
436
411
  MSpec.stub!(:unregister)
437
412
  @guard = SpecGuard.new
438
-
439
- SpecGuard.instance_variable_set(:@registered, nil)
440
- SpecGuard.register
441
413
  end
442
414
 
443
- it "unregisters from MSpec :exclude actions" do
444
- MSpec.should_receive(:unregister).with(:exclude, @guard)
445
- @tally.should_receive(:unregister)
415
+ it "unregisters from MSpec :add actions" do
416
+ MSpec.should_receive(:unregister).with(:add, @guard)
446
417
  @guard.unregister
447
418
  end
419
+ end
448
420
 
449
- it "unregisters from MSpec :after actions" do
450
- MSpec.should_receive(:unregister).with(:after, @guard)
451
- @tally.should_receive(:unregister)
452
- @guard.unregister
421
+ describe SpecGuard, "#record" do
422
+ after :each do
423
+ SpecGuard.clear
453
424
  end
454
425
 
455
- it "invokes the class's unregister method" do
456
- SpecGuard.should_receive(:unregister)
457
- @guard.unregister
426
+ it "saves the name of the guarded spec under the name of the guard" do
427
+ guard = SpecGuard.new "a", "1.8"..."1.9"
428
+ guard.name = :named_guard
429
+ guard.record "SomeClass#action returns true"
430
+ SpecGuard.report.should == {
431
+ 'named_guard a, 1.8...1.9' => ["SomeClass#action returns true"]
432
+ }
433
+ end
434
+ end
435
+
436
+ describe SpecGuard, ".guards" do
437
+ it "returns an Array" do
438
+ SpecGuard.guards.should be_kind_of(Array)
439
+ end
440
+ end
441
+
442
+ describe SpecGuard, ".clear_guards" do
443
+ it "resets the array to empty" do
444
+ SpecGuard.guards << :guard
445
+ SpecGuard.guards.should == [:guard]
446
+ SpecGuard.clear_guards
447
+ SpecGuard.guards.should == []
448
+ end
449
+ end
450
+
451
+ describe SpecGuard, ".finish" do
452
+ before :each do
453
+ $stdout = @out = IOStub.new
454
+ end
455
+
456
+ after :each do
457
+ $stdout = STDOUT
458
+ SpecGuard.clear
459
+ end
460
+
461
+ it "prints the descriptions of the guarded specs" do
462
+ guard = SpecGuard.new "a", "1.8"..."1.9"
463
+ guard.name = :named_guard
464
+ guard.record "SomeClass#action returns true"
465
+ guard.record "SomeClass#reverse returns false"
466
+ SpecGuard.finish
467
+ $stdout.should == %[
468
+
469
+ 2 specs omitted by guard: named_guard a, 1.8...1.9:
470
+
471
+ SomeClass#action returns true
472
+ SomeClass#reverse returns false
473
+
474
+ ]
458
475
  end
459
476
  end