mspec 1.0.0

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