mspec 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. data/LICENSE +22 -0
  2. data/README +101 -0
  3. data/Rakefile +44 -0
  4. data/bin/mkspec +7 -0
  5. data/bin/mspec +7 -0
  6. data/bin/mspec-ci +8 -0
  7. data/bin/mspec-run +8 -0
  8. data/bin/mspec-tag +8 -0
  9. data/lib/mspec.rb +6 -0
  10. data/lib/mspec/commands/mkspec.rb +147 -0
  11. data/lib/mspec/commands/mspec-ci.rb +71 -0
  12. data/lib/mspec/commands/mspec-run.rb +80 -0
  13. data/lib/mspec/commands/mspec-tag.rb +87 -0
  14. data/lib/mspec/commands/mspec.rb +143 -0
  15. data/lib/mspec/expectations.rb +2 -0
  16. data/lib/mspec/expectations/expectations.rb +12 -0
  17. data/lib/mspec/expectations/should.rb +23 -0
  18. data/lib/mspec/guards.rb +13 -0
  19. data/lib/mspec/guards/bug.rb +27 -0
  20. data/lib/mspec/guards/compliance.rb +18 -0
  21. data/lib/mspec/guards/conflict.rb +16 -0
  22. data/lib/mspec/guards/endian.rb +40 -0
  23. data/lib/mspec/guards/extensions.rb +12 -0
  24. data/lib/mspec/guards/guard.rb +120 -0
  25. data/lib/mspec/guards/noncompliance.rb +12 -0
  26. data/lib/mspec/guards/platform.rb +38 -0
  27. data/lib/mspec/guards/quarantine.rb +15 -0
  28. data/lib/mspec/guards/runner.rb +30 -0
  29. data/lib/mspec/guards/superuser.rb +15 -0
  30. data/lib/mspec/guards/support.rb +12 -0
  31. data/lib/mspec/guards/version.rb +40 -0
  32. data/lib/mspec/helpers.rb +6 -0
  33. data/lib/mspec/helpers/bignum.rb +5 -0
  34. data/lib/mspec/helpers/const_lookup.rb +5 -0
  35. data/lib/mspec/helpers/flunk.rb +5 -0
  36. data/lib/mspec/helpers/io.rb +13 -0
  37. data/lib/mspec/helpers/scratch.rb +17 -0
  38. data/lib/mspec/helpers/tmp.rb +32 -0
  39. data/lib/mspec/matchers.rb +16 -0
  40. data/lib/mspec/matchers/base.rb +95 -0
  41. data/lib/mspec/matchers/be_ancestor_of.rb +24 -0
  42. data/lib/mspec/matchers/be_close.rb +27 -0
  43. data/lib/mspec/matchers/be_empty.rb +20 -0
  44. data/lib/mspec/matchers/be_false.rb +20 -0
  45. data/lib/mspec/matchers/be_kind_of.rb +24 -0
  46. data/lib/mspec/matchers/be_nil.rb +20 -0
  47. data/lib/mspec/matchers/be_true.rb +20 -0
  48. data/lib/mspec/matchers/complain.rb +56 -0
  49. data/lib/mspec/matchers/eql.rb +26 -0
  50. data/lib/mspec/matchers/equal.rb +26 -0
  51. data/lib/mspec/matchers/equal_utf16.rb +34 -0
  52. data/lib/mspec/matchers/include.rb +32 -0
  53. data/lib/mspec/matchers/output.rb +67 -0
  54. data/lib/mspec/matchers/output_to_fd.rb +71 -0
  55. data/lib/mspec/matchers/raise_error.rb +48 -0
  56. data/lib/mspec/mocks.rb +3 -0
  57. data/lib/mspec/mocks/mock.rb +123 -0
  58. data/lib/mspec/mocks/object.rb +28 -0
  59. data/lib/mspec/mocks/proxy.rb +112 -0
  60. data/lib/mspec/runner.rb +13 -0
  61. data/lib/mspec/runner/actions.rb +6 -0
  62. data/lib/mspec/runner/actions/debug.rb +17 -0
  63. data/lib/mspec/runner/actions/filter.rb +40 -0
  64. data/lib/mspec/runner/actions/gdb.rb +17 -0
  65. data/lib/mspec/runner/actions/tag.rb +97 -0
  66. data/lib/mspec/runner/actions/tally.rb +80 -0
  67. data/lib/mspec/runner/actions/timer.rb +22 -0
  68. data/lib/mspec/runner/filters.rb +4 -0
  69. data/lib/mspec/runner/filters/match.rb +22 -0
  70. data/lib/mspec/runner/filters/profile.rb +54 -0
  71. data/lib/mspec/runner/filters/regexp.rb +7 -0
  72. data/lib/mspec/runner/filters/tag.rb +29 -0
  73. data/lib/mspec/runner/formatters.rb +7 -0
  74. data/lib/mspec/runner/formatters/dotted.rb +81 -0
  75. data/lib/mspec/runner/formatters/html.rb +87 -0
  76. data/lib/mspec/runner/formatters/specdoc.rb +27 -0
  77. data/lib/mspec/runner/formatters/spinner.rb +89 -0
  78. data/lib/mspec/runner/formatters/summary.rb +8 -0
  79. data/lib/mspec/runner/formatters/unit.rb +25 -0
  80. data/lib/mspec/runner/formatters/yaml.rb +43 -0
  81. data/lib/mspec/runner/mspec.rb +232 -0
  82. data/lib/mspec/runner/object.rb +20 -0
  83. data/lib/mspec/runner/shared.rb +12 -0
  84. data/lib/mspec/runner/state.rb +116 -0
  85. data/lib/mspec/runner/tag.rb +20 -0
  86. data/lib/mspec/utils/name_map.rb +130 -0
  87. data/lib/mspec/utils/options.rb +344 -0
  88. data/lib/mspec/utils/script.rb +77 -0
  89. data/lib/mspec/version.rb +3 -0
  90. data/spec/commands/mkspec_spec.rb +321 -0
  91. data/spec/commands/mspec_ci_spec.rb +139 -0
  92. data/spec/commands/mspec_run_spec.rb +146 -0
  93. data/spec/commands/mspec_spec.rb +359 -0
  94. data/spec/commands/mspec_tag_spec.rb +131 -0
  95. data/spec/expectations/expectations_spec.rb +16 -0
  96. data/spec/expectations/should_spec.rb +99 -0
  97. data/spec/guards/bug_spec.rb +137 -0
  98. data/spec/guards/compliance_spec.rb +70 -0
  99. data/spec/guards/conflict_spec.rb +20 -0
  100. data/spec/guards/endian_spec.rb +42 -0
  101. data/spec/guards/extensions_spec.rb +36 -0
  102. data/spec/guards/guard_spec.rb +355 -0
  103. data/spec/guards/noncompliance_spec.rb +36 -0
  104. data/spec/guards/platform_spec.rb +84 -0
  105. data/spec/guards/quarantine_spec.rb +19 -0
  106. data/spec/guards/runner_spec.rb +75 -0
  107. data/spec/guards/superuser_spec.rb +22 -0
  108. data/spec/guards/support_spec.rb +22 -0
  109. data/spec/guards/version_spec.rb +133 -0
  110. data/spec/helpers/bignum_spec.rb +11 -0
  111. data/spec/helpers/const_lookup_spec.rb +19 -0
  112. data/spec/helpers/flunk_spec.rb +15 -0
  113. data/spec/helpers/io_spec.rb +34 -0
  114. data/spec/helpers/scratch_spec.rb +22 -0
  115. data/spec/helpers/tmp_spec.rb +72 -0
  116. data/spec/matchers/base_spec.rb +180 -0
  117. data/spec/matchers/be_ancestor_of_spec.rb +28 -0
  118. data/spec/matchers/be_close_spec.rb +46 -0
  119. data/spec/matchers/be_empty_spec.rb +26 -0
  120. data/spec/matchers/be_false_spec.rb +28 -0
  121. data/spec/matchers/be_kind_of_spec.rb +29 -0
  122. data/spec/matchers/be_nil_spec.rb +27 -0
  123. data/spec/matchers/be_true_spec.rb +28 -0
  124. data/spec/matchers/complain_spec.rb +52 -0
  125. data/spec/matchers/eql_spec.rb +33 -0
  126. data/spec/matchers/equal_spec.rb +33 -0
  127. data/spec/matchers/equal_utf16_spec.rb +47 -0
  128. data/spec/matchers/include_spec.rb +37 -0
  129. data/spec/matchers/output_spec.rb +74 -0
  130. data/spec/matchers/output_to_fd_spec.rb +33 -0
  131. data/spec/matchers/raise_error_spec.rb +56 -0
  132. data/spec/mocks/mock_spec.rb +272 -0
  133. data/spec/mocks/proxy_spec.rb +259 -0
  134. data/spec/runner/actions/debug_spec.rb +61 -0
  135. data/spec/runner/actions/filter_spec.rb +84 -0
  136. data/spec/runner/actions/gdb_spec.rb +61 -0
  137. data/spec/runner/actions/tag_spec.rb +253 -0
  138. data/spec/runner/actions/tally_spec.rb +107 -0
  139. data/spec/runner/actions/timer_spec.rb +42 -0
  140. data/spec/runner/filters/a.yaml +4 -0
  141. data/spec/runner/filters/b.yaml +11 -0
  142. data/spec/runner/filters/match_spec.rb +44 -0
  143. data/spec/runner/filters/profile_spec.rb +117 -0
  144. data/spec/runner/filters/regexp_spec.rb +13 -0
  145. data/spec/runner/filters/tag_spec.rb +77 -0
  146. data/spec/runner/formatters/dotted_spec.rb +184 -0
  147. data/spec/runner/formatters/html_spec.rb +191 -0
  148. data/spec/runner/formatters/specdoc_spec.rb +57 -0
  149. data/spec/runner/formatters/spinner_spec.rb +78 -0
  150. data/spec/runner/formatters/summary_spec.rb +29 -0
  151. data/spec/runner/formatters/unit_spec.rb +71 -0
  152. data/spec/runner/formatters/yaml_spec.rb +123 -0
  153. data/spec/runner/mspec_spec.rb +393 -0
  154. data/spec/runner/shared_spec.rb +41 -0
  155. data/spec/runner/state_spec.rb +535 -0
  156. data/spec/runner/tag_spec.rb +93 -0
  157. data/spec/runner/tags.txt +3 -0
  158. data/spec/spec_helper.rb +46 -0
  159. data/spec/utils/name_map_spec.rb +178 -0
  160. data/spec/utils/options_spec.rb +862 -0
  161. data/spec/utils/script_spec.rb +240 -0
  162. metadata +217 -0
@@ -0,0 +1,107 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'mspec/expectations/expectations'
3
+ require 'mspec/runner/actions/tally'
4
+ require 'mspec/runner/mspec'
5
+ require 'mspec/runner/state'
6
+
7
+ describe Tally do
8
+ before :each do
9
+ @tally = Tally.new
10
+ end
11
+
12
+ it "responds to #files! by incrementing the count returned by #files" do
13
+ @tally.files! 3
14
+ @tally.files.should == 3
15
+ @tally.files!
16
+ @tally.files.should == 4
17
+ end
18
+
19
+ it "responds to #examples! by incrementing the count returned by #examples" do
20
+ @tally.examples! 2
21
+ @tally.examples.should == 2
22
+ @tally.examples! 2
23
+ @tally.examples.should == 4
24
+ end
25
+
26
+ it "responds to #expectations! by incrementing the count returned by #expectations" do
27
+ @tally.expectations!
28
+ @tally.expectations.should == 1
29
+ @tally.expectations! 3
30
+ @tally.expectations.should == 4
31
+ end
32
+
33
+ it "responds to #failures! by incrementing the count returned by #failures" do
34
+ @tally.failures! 1
35
+ @tally.failures.should == 1
36
+ @tally.failures!
37
+ @tally.failures.should == 2
38
+ end
39
+
40
+ it "responds to #errors! by incrementing the count returned by #errors" do
41
+ @tally.errors!
42
+ @tally.errors.should == 1
43
+ @tally.errors! 2
44
+ @tally.errors.should == 3
45
+ end
46
+
47
+ it "responds to #format by returning a formatted string of counts" do
48
+ @tally.files!
49
+ @tally.examples! 2
50
+ @tally.expectations! 4
51
+ @tally.errors!
52
+ @tally.format.should == "1 file, 2 examples, 4 expectations, 0 failures, 1 error"
53
+ end
54
+ end
55
+
56
+ describe TallyAction do
57
+ before :each do
58
+ @tally = TallyAction.new
59
+ @state = SpecState.new("describe", "it")
60
+ @state.exceptions << ["msg", Exception.new("it broke")]
61
+ @state.exceptions << ["msg", ExpectationNotMetError.new("disappointment")]
62
+ end
63
+
64
+ it "responds to #counter by returning the Tally object" do
65
+ @tally.counter.should be_kind_of(Tally)
66
+ end
67
+
68
+ it "responds to #load by incrementing the count returned by Tally#files" do
69
+ @tally.load
70
+ @tally.counter.files.should == 1
71
+ end
72
+
73
+ it "responds to #expectation by incrementing the count returned by Tally#expectations" do
74
+ @tally.expectation @state
75
+ @tally.counter.expectations.should == 1
76
+ end
77
+
78
+ it "responds to #after by incrementing counts returned by Tally#examples, #failures, #errors" do
79
+ @tally.after @state
80
+ @tally.counter.examples.should == 1
81
+ @tally.counter.expectations.should == 0
82
+ @tally.counter.failures.should == 1
83
+ @tally.counter.errors.should == 1
84
+ end
85
+
86
+ it "responds to #format by returning a readable string of counts" do
87
+ @tally.load
88
+ @tally.after @state
89
+ @tally.expectation @state
90
+ @tally.expectation @state
91
+ @tally.format.should == "1 file, 1 example, 2 expectations, 1 failure, 1 error"
92
+ end
93
+
94
+ it "responds to #register by registering itself with MSpec for appropriate actions" do
95
+ MSpec.should_receive(:register).with(:load, @tally)
96
+ MSpec.should_receive(:register).with(:after, @tally)
97
+ MSpec.should_receive(:register).with(:expectation, @tally)
98
+ @tally.register
99
+ end
100
+
101
+ it "responds to #unregister by unregistering itself with MSpec for appropriate actions" do
102
+ MSpec.should_receive(:unregister).with(:load, @tally)
103
+ MSpec.should_receive(:unregister).with(:after, @tally)
104
+ MSpec.should_receive(:unregister).with(:expectation, @tally)
105
+ @tally.unregister
106
+ end
107
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'mspec/runner/actions/timer'
3
+ require 'mspec/runner/mspec'
4
+ require 'time'
5
+
6
+ describe TimerAction do
7
+ before :each do
8
+ @timer = TimerAction.new
9
+ end
10
+
11
+ it "responds to #start by recording the current time" do
12
+ Time.should_receive(:now)
13
+ @timer.start
14
+ end
15
+
16
+ it "responds to #finish by recording the current time" do
17
+ Time.should_receive(:now)
18
+ @timer.finish
19
+ end
20
+
21
+ it "responds to #elapsed by returning the difference between stop and start" do
22
+ Time.stub!(:now).and_return(Time.parse('10/18/2007 5:43:18'))
23
+ @timer.start
24
+ Time.stub!(:now).and_return(Time.parse('10/18/2007 5:43:51'))
25
+ @timer.finish
26
+ @timer.elapsed.should == 33
27
+ end
28
+
29
+ it "responds to #format by returning a readable string of elapsed time" do
30
+ Time.stub!(:now).and_return(Time.parse('10/18/2007 5:43:18'))
31
+ @timer.start
32
+ Time.stub!(:now).and_return(Time.parse('10/18/2007 5:43:51'))
33
+ @timer.finish
34
+ @timer.format.should == "Finished in 33.000000 seconds"
35
+ end
36
+
37
+ it "responds to #register by registering itself with MSpec for appropriate actions" do
38
+ MSpec.should_receive(:register).with(:start, @timer)
39
+ MSpec.should_receive(:register).with(:finish, @timer)
40
+ @timer.register
41
+ end
42
+ end
@@ -0,0 +1,4 @@
1
+ ---
2
+ A#:
3
+ - a
4
+ - aa
@@ -0,0 +1,11 @@
1
+ ---
2
+ B.:
3
+ - b
4
+ - bb
5
+ B::C#:
6
+ - b!
7
+ - b=
8
+ - b?
9
+ - "-"
10
+ - "[]"
11
+ - "[]="
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'mspec/runner/mspec'
3
+ require 'mspec/runner/filters/match'
4
+
5
+ describe MatchFilter, "#to_regexp" do
6
+ before :each do
7
+ @filter = MatchFilter.new nil
8
+ end
9
+
10
+ it "converts its arguments to Regexp instances" do
11
+ @filter.to_regexp('a', 'b', 'c').should == [/a/, /b/, /c/]
12
+ end
13
+ end
14
+
15
+ describe MatchFilter, "#===" do
16
+ before :each do
17
+ @filter = MatchFilter.new nil, 'a', 'b', 'c'
18
+ end
19
+
20
+ it "returns true if the argument matches any of the #initialize strings" do
21
+ @filter.===('aaa').should == true
22
+ @filter.===('bccb').should == true
23
+ end
24
+
25
+ it "returns false if the argument matches none of the #initialize strings" do
26
+ @filter.===('d').should == false
27
+ end
28
+ end
29
+
30
+ describe MatchFilter, "#register" do
31
+ it "registers itself with MSpec for the designated action list" do
32
+ filter = MatchFilter.new :include
33
+ MSpec.should_receive(:register).with(:include, filter)
34
+ filter.register
35
+ end
36
+ end
37
+
38
+ describe MatchFilter, "#unregister" do
39
+ it "unregisters itself with MSpec for the designated action list" do
40
+ filter = MatchFilter.new :exclude
41
+ MSpec.should_receive(:unregister).with(:exclude, filter)
42
+ filter.unregister
43
+ end
44
+ end
@@ -0,0 +1,117 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'mspec/runner/mspec'
3
+ require 'mspec/runner/filters/profile'
4
+
5
+ describe ProfileFilter, "#find" do
6
+ before :each do
7
+ @filter = ProfileFilter.new nil
8
+ File.stub!(:exist?).and_return(false)
9
+ @file = "rails.yaml"
10
+ end
11
+
12
+ it "attempts to locate the file through the expanded path name" do
13
+ File.should_receive(:expand_path).with(@file).and_return(@file)
14
+ File.should_receive(:exist?).with(@file).and_return(true)
15
+ @filter.find(@file).should == @file
16
+ end
17
+
18
+ it "attemps to locate the file in 'spec/profiles'" do
19
+ path = File.join "spec/profiles", @file
20
+ File.should_receive(:exist?).with(path).and_return(true)
21
+ @filter.find(@file).should == path
22
+ end
23
+
24
+ it "attemps to locate the file in 'spec'" do
25
+ path = File.join "spec", @file
26
+ File.should_receive(:exist?).with(path).and_return(true)
27
+ @filter.find(@file).should == path
28
+ end
29
+
30
+ it "attemps to locate the file in 'profiles'" do
31
+ path = File.join "profiles", @file
32
+ File.should_receive(:exist?).with(path).and_return(true)
33
+ @filter.find(@file).should == path
34
+ end
35
+
36
+ it "attemps to locate the file in '.'" do
37
+ path = File.join ".", @file
38
+ File.should_receive(:exist?).with(path).and_return(true)
39
+ @filter.find(@file).should == path
40
+ end
41
+ end
42
+
43
+ describe ProfileFilter, "#parse" do
44
+ before :each do
45
+ @filter = ProfileFilter.new nil
46
+ @file = File.open(File.dirname(__FILE__) + "/b.yaml", "r")
47
+ end
48
+
49
+ after :each do
50
+ @file.close
51
+ end
52
+
53
+ it "creates a Hash of the contents of the YAML file" do
54
+ @filter.parse(@file).should == {
55
+ "B." => ["b", "bb"],
56
+ "B::C#" => ["b!", "b=", "b?", "-", "[]", "[]="]
57
+ }
58
+ end
59
+ end
60
+
61
+ describe ProfileFilter, "#load" do
62
+ before :each do
63
+ @filter = ProfileFilter.new nil
64
+ @files = [
65
+ File.dirname(__FILE__) + "/a.yaml",
66
+ File.dirname(__FILE__) + "/b.yaml"
67
+ ]
68
+ end
69
+
70
+ it "generates a composite hash from multiple YAML files" do
71
+ @filter.load(*@files).should == {
72
+ "A#" => ["a", "aa"],
73
+ "B." => ["b", "bb"],
74
+ "B::C#" => ["b!", "b=", "b?", "-", "[]", "[]="]
75
+ }
76
+ end
77
+ end
78
+
79
+ describe ProfileFilter, "#===" do
80
+ before :each do
81
+ @filter = ProfileFilter.new nil
82
+ @filter.stub!(:load).and_return({ "A#" => ["[]=", "a", "a!", "a?", "aa="]})
83
+ @filter.send :initialize, nil
84
+ end
85
+
86
+ it "returns true if the spec description is for a method in the profile" do
87
+ @filter.===("The A#[]= method").should == true
88
+ @filter.===("A#a returns").should == true
89
+ @filter.===("A#a! replaces").should == true
90
+ @filter.===("A#a? returns").should == true
91
+ @filter.===("A#aa= raises").should == true
92
+ end
93
+
94
+ it "returns false if the spec description is for a method not in the profile" do
95
+ @filter.===("The A#[] method").should == false
96
+ @filter.===("B#a returns").should == false
97
+ @filter.===("A.a! replaces").should == false
98
+ @filter.===("AA#a? returns").should == false
99
+ @filter.===("A#aa raises").should == false
100
+ end
101
+ end
102
+
103
+ describe ProfileFilter, "#register" do
104
+ it "registers itself with MSpec for the designated action list" do
105
+ filter = ProfileFilter.new :include
106
+ MSpec.should_receive(:register).with(:include, filter)
107
+ filter.register
108
+ end
109
+ end
110
+
111
+ describe ProfileFilter, "#unregister" do
112
+ it "unregisters itself with MSpec for the designated action list" do
113
+ filter = ProfileFilter.new :exclude
114
+ MSpec.should_receive(:unregister).with(:exclude, filter)
115
+ filter.unregister
116
+ end
117
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'mspec/runner/mspec'
3
+ require 'mspec/runner/filters/regexp'
4
+
5
+ describe RegexpFilter, "#to_regexp" do
6
+ before :each do
7
+ @filter = RegexpFilter.new nil
8
+ end
9
+
10
+ it "converts its arguments to Regexp instances" do
11
+ @filter.to_regexp('a(b|c)', 'b[^ab]', 'cc?').should == [/a(b|c)/, /b[^ab]/, /cc?/]
12
+ end
13
+ end
@@ -0,0 +1,77 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'mspec/runner/mspec'
3
+ require 'mspec/runner/filters/match'
4
+ require 'mspec/runner/filters/tag'
5
+
6
+ describe TagFilter, "#load" do
7
+ before :each do
8
+ @match = mock("match filter", :null_object => true)
9
+ @filter = TagFilter.new :include, "tag", "key"
10
+ @tag = SpecTag.new "tag(comment):description"
11
+ MSpec.stub!(:read_tags).and_return([@tag])
12
+ MSpec.stub!(:register)
13
+ end
14
+
15
+ it "loads tags from the tag file" do
16
+ MSpec.should_receive(:read_tags).with("tag", "key").and_return([])
17
+ @filter.load
18
+ end
19
+
20
+ it "creates a MatchFilter from the descriptions matching the tags" do
21
+ MatchFilter.should_receive(:new).with(:include, "description").and_return(@match)
22
+ @filter.load
23
+ end
24
+
25
+ it "creates an empty MatchFilter if no tags were found" do
26
+ MSpec.should_receive(:read_tags).and_return([])
27
+ MatchFilter.should_receive(:new).with(:include).and_return(@match)
28
+ @filter.load
29
+ end
30
+
31
+ it "registers the MatchFilter if there were tags found in the tag file" do
32
+ @match.should_receive(:register)
33
+ MatchFilter.should_receive(:new).with(:include, "description").and_return(@match)
34
+ @filter.load
35
+ end
36
+
37
+ it "registers the empty MatchFilter if no tags were found" do
38
+ @match.should_receive(:register)
39
+ MSpec.should_receive(:read_tags).and_return([])
40
+ MatchFilter.should_receive(:new).with(:include).and_return(@match)
41
+ @filter.load
42
+ end
43
+ end
44
+
45
+ describe TagFilter, "#unload" do
46
+ before :each do
47
+ @filter = TagFilter.new :include, "tag", "key"
48
+ @tag = SpecTag.new "tag(comment):description"
49
+ MSpec.stub!(:read_tags).and_return([@tag])
50
+ end
51
+
52
+ it "unregisters the MatchFilter if one was registered" do
53
+ match = mock("match filter", :null_object => true)
54
+ match.should_receive(:unregister)
55
+ MatchFilter.stub!(:new).with(:include, "description").and_return(match)
56
+ @filter.load
57
+ @filter.unload
58
+ end
59
+ end
60
+
61
+ describe TagFilter, "#register" do
62
+ it "registers itself with MSpec for the :load, :unload actions" do
63
+ filter = TagFilter.new(nil)
64
+ MSpec.should_receive(:register).with(:load, filter)
65
+ MSpec.should_receive(:register).with(:unload, filter)
66
+ filter.register
67
+ end
68
+ end
69
+
70
+ describe TagFilter, "#unregister" do
71
+ it "unregisters itself with MSpec for the :load, :unload actions" do
72
+ filter = TagFilter.new(nil)
73
+ MSpec.should_receive(:unregister).with(:load, filter)
74
+ MSpec.should_receive(:unregister).with(:unload, filter)
75
+ filter.unregister
76
+ end
77
+ end
@@ -0,0 +1,184 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'mspec/runner/formatters/dotted'
3
+ require 'mspec/runner/mspec'
4
+ require 'mspec/runner/state'
5
+
6
+ describe DottedFormatter, "#initialize" do
7
+ it "permits zero arguments" do
8
+ DottedFormatter.new
9
+ end
10
+
11
+ it "accepts one argument" do
12
+ DottedFormatter.new nil
13
+ end
14
+ end
15
+
16
+ describe DottedFormatter, "#register" do
17
+ before :each do
18
+ @formatter = DottedFormatter.new
19
+ end
20
+
21
+ it "registers self with MSpec for appropriate actions" do
22
+ MSpec.stub!(:register)
23
+ MSpec.should_receive(:register).with(:after, @formatter)
24
+ MSpec.should_receive(:register).with(:finish, @formatter)
25
+ @formatter.register
26
+ end
27
+
28
+ it "creates TimerAction and TallyAction" do
29
+ timer = mock("timer")
30
+ tally = mock("tally")
31
+ timer.should_receive(:register)
32
+ tally.should_receive(:register)
33
+ tally.should_receive(:counter)
34
+ TimerAction.should_receive(:new).and_return(timer)
35
+ TallyAction.should_receive(:new).and_return(tally)
36
+ @formatter.register
37
+ end
38
+ end
39
+
40
+ describe DottedFormatter, "#print" do
41
+ after :each do
42
+ $stdout = STDOUT
43
+ end
44
+
45
+ it "writes to $stdout by default" do
46
+ $stdout = IOStub.new
47
+ formatter = DottedFormatter.new
48
+ formatter.print "begonias"
49
+ $stdout.should == "begonias"
50
+ end
51
+
52
+ it "writes to the file specified when the formatter was created" do
53
+ out = IOStub.new
54
+ File.should_receive(:open).with("some/file", "w").and_return(out)
55
+ formatter = DottedFormatter.new "some/file"
56
+ formatter.print "begonias"
57
+ out.should == "begonias"
58
+ end
59
+ end
60
+
61
+ describe DottedFormatter, "#message" do
62
+ before :each do
63
+ @formatter = DottedFormatter.new
64
+ end
65
+
66
+ it "returns <No message> if the exception message is empty" do
67
+ exc = Exception.new ""
68
+ @formatter.message(exc).should == "<No message>"
69
+ end
70
+
71
+ it "returns the message without exception class when the exception is ExpectationNotMetError" do
72
+ exc = Exception.new "message"
73
+ @formatter.message(exc).should == "Exception: message"
74
+ end
75
+
76
+ it "returns the message with exception class when the exception is not ExpectationNotMetError" do
77
+ exc = ExpectationNotMetError.new "message"
78
+ @formatter.message(exc).should == "message"
79
+ end
80
+ end
81
+
82
+ describe DottedFormatter, "#after" do
83
+ before :each do
84
+ $stdout = @out = IOStub.new
85
+ @formatter = DottedFormatter.new
86
+ @state = SpecState.new("describe", "it")
87
+ end
88
+
89
+ after :each do
90
+ $stdout = STDOUT
91
+ end
92
+
93
+ it "prints a '.' if there was no exception raised" do
94
+ @formatter.after(@state)
95
+ @out.should == "."
96
+ end
97
+
98
+ it "prints an 'F' if there was an expectation failure" do
99
+ @state.exceptions << ["msg", ExpectationNotMetError.new("failed")]
100
+ @formatter.after(@state)
101
+ @out.should == "F"
102
+ end
103
+
104
+ it "prints an 'E' if there was an exception other than expectation failure" do
105
+ @state.exceptions << ["msg", MSpecExampleError.new("boom!")]
106
+ @formatter.after(@state)
107
+ @out.should == "E"
108
+ end
109
+
110
+ it "prints an 'E' if there are mixed exceptions and exepctation failures" do
111
+ @state.exceptions << ["msg", ExpectationNotMetError.new("failed")]
112
+ @state.exceptions << ["msg", MSpecExampleError.new("boom!")]
113
+ @formatter.after(@state)
114
+ @out.should == "E"
115
+ end
116
+ end
117
+
118
+ describe DottedFormatter, "#finish" do
119
+ before :each do
120
+ @tally = mock("tally", :null_object => true)
121
+ TallyAction.stub!(:new).and_return(@tally)
122
+ @timer = mock("timer", :null_object => true)
123
+ TimerAction.stub!(:new).and_return(@timer)
124
+
125
+ $stdout = @out = IOStub.new
126
+ @state = SpecState.new("describe", "it")
127
+ MSpec.stub!(:register)
128
+ @formatter = DottedFormatter.new
129
+ @formatter.register
130
+ end
131
+
132
+ after :each do
133
+ $stdout = STDOUT
134
+ end
135
+
136
+ it "prints a failure message for an exception" do
137
+ @state.exceptions << ["msg", MSpecExampleError.new("broken")]
138
+ @formatter.after @state
139
+ @formatter.finish
140
+ @out.should =~ /^1\)\ndescribe it ERROR$/
141
+ end
142
+
143
+ it "prints a backtrace for an exception" do
144
+ @formatter.stub!(:backtrace).and_return("path/to/some/file.rb:35:in method")
145
+ @state.exceptions << ["msg", MSpecExampleError.new("broken")]
146
+ @formatter.after @state
147
+ @formatter.finish
148
+ @out.should =~ %r[path/to/some/file.rb:35:in method$]
149
+ end
150
+
151
+ it "prints a summary of elapsed time" do
152
+ @timer.should_receive(:format).and_return("Finished in 2.0 seconds")
153
+ @formatter.finish
154
+ @out.should =~ /^Finished in 2.0 seconds$/
155
+ end
156
+
157
+ it "prints a tally of counts" do
158
+ @tally.should_receive(:format).and_return("1 example, 0 failures")
159
+ @formatter.finish
160
+ @out.should =~ /^1 example, 0 failures$/
161
+ end
162
+
163
+ it "prints errors, backtraces, elapsed time, and tallies" do
164
+ @state.exceptions << ["msg", MSpecExampleError.new("broken")]
165
+ @formatter.stub!(:backtrace).and_return("path/to/some/file.rb:35:in method")
166
+ @timer.should_receive(:format).and_return("Finished in 2.0 seconds")
167
+ @tally.should_receive(:format).and_return("1 example, 0 failures")
168
+ @formatter.after @state
169
+ @formatter.finish
170
+ @out.should ==
171
+ %[E
172
+
173
+ 1)
174
+ describe it ERROR
175
+ MSpecExampleError occurred during: msg
176
+ MSpecExampleError: broken
177
+ path/to/some/file.rb:35:in method
178
+
179
+ Finished in 2.0 seconds
180
+
181
+ 1 example, 0 failures
182
+ ]
183
+ end
184
+ end