Updated MSpec source to 1c3ee1c8.
[rbx.git] / mspec / spec / runner / formatters / html_spec.rb
blob8ca251f168d4a4342b8b008bc4104c2dc1a3275f
1 require File.dirname(__FILE__) + '/../../spec_helper'
2 require 'mspec/guards/guard'
3 require 'mspec/runner/formatters/html'
4 require 'mspec/runner/mspec'
5 require 'mspec/runner/example'
7 describe HtmlFormatter do
8   before :each do
9     @formatter = HtmlFormatter.new
10   end
12   it "responds to #register by registering itself with MSpec for appropriate actions" do
13     MSpec.stub!(:register)
14     MSpec.should_receive(:register).with(:start, @formatter)
15     MSpec.should_receive(:register).with(:enter, @formatter)
16     MSpec.should_receive(:register).with(:leave, @formatter)
17     @formatter.register
18   end
19 end
21 describe HtmlFormatter, "#start" do
22   before :each do
23     $stdout = @out = IOStub.new
24     @formatter = HtmlFormatter.new
25   end
27   after :each do
28     $stdout = STDOUT
29   end
31   it "prints the HTML head" do
32     @formatter.start
33     ruby_name = RUBY_NAME
34     ruby_name.should =~ /^ruby/
35     @out.should ==
36 %[<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
37     "http://www.w3.org/TR/html4/strict.dtd">
38 <html>
39 <head>
40 <title>Spec Output For #{ruby_name} (1.8.6)</title>
41 <style type="text/css">
42 ul {
43   list-style: none;
45 .fail {
46   color: red;
48 .pass {
49   color: green;
51 #details :target {
52   background-color: #ffffe0;
54 </style>
55 </head>
56 <body>
58   end
59 end
61 describe HtmlFormatter, "#enter" do
62   before :each do
63     $stdout = @out = IOStub.new
64     @formatter = HtmlFormatter.new
65   end
67   after :each do
68     $stdout = STDOUT
69   end
71   it "prints the #describe string" do
72     @formatter.enter "describe"
73     @out.should == "<div><p>describe</p>\n<ul>\n"
74   end
75 end
77 describe HtmlFormatter, "#leave" do
78   before :each do
79     $stdout = @out = IOStub.new
80     @formatter = HtmlFormatter.new
81   end
83   after :each do
84     $stdout = STDOUT
85   end
87   it "prints the closing tags for the #describe string" do
88     @formatter.leave
89     @out.should == "</ul>\n</div>\n"
90   end
91 end
93 describe HtmlFormatter, "#exception" do
94   before :each do
95     $stdout = @out = IOStub.new
96     @formatter = HtmlFormatter.new
97     @formatter.register
98     @state = ExampleState.new ContextState.new("describe"), "it"
99   end
101   after :each do
102     $stdout = STDOUT
103   end
105   it "prints the #it string once for each exception raised" do
106     exc = ExceptionState.new @state, nil, ExpectationNotMetError.new("disappointing")
107     @formatter.exception exc
108     exc = ExceptionState.new @state, nil, MSpecExampleError.new("painful")
109     @formatter.exception exc
110     @out.should == 
111 %[<li class="fail">- it (<a href="#details-1">FAILED - 1</a>)</li>
112 <li class="fail">- it (<a href="#details-2">ERROR - 2</a>)</li>
114   end
117 describe HtmlFormatter, "#after" do
118   before :each do
119     $stdout = @out = IOStub.new
120     @formatter = HtmlFormatter.new
121     @formatter.register
122     @state = ExampleState.new ContextState.new("describe"), "it"
123   end
125   after :each do
126     $stdout = STDOUT
127   end
129   it "prints the #it once when there are no exceptions raised" do
130     @formatter.after @state
131     @out.should == %[<li class="pass">- it</li>\n]
132   end
134   it "does not print any output if an exception is raised" do
135     exc = ExceptionState.new @state, nil, ExpectationNotMetError.new("disappointing")
136     @formatter.exception exc
137     out = @out.dup
138     @formatter.after @state
139     @out.should == out
140   end
143 describe HtmlFormatter, "#finish" do
144   before :each do
145     @tally = mock("tally", :null_object => true)
146     TallyAction.stub!(:new).and_return(@tally)
147     @timer = mock("timer", :null_object => true)
148     TimerAction.stub!(:new).and_return(@timer)
150     $stdout = @out = IOStub.new
151     context = ContextState.new "describe"
152     @state = ExampleState.new(context, "it")
153     MSpec.stub!(:register)
154     @formatter = HtmlFormatter.new
155     @formatter.register
156     @exception = MSpecExampleError.new("broken")
157     @exception.stub!(:backtrace).and_return(["file.rb:1", "file.rb:2"])
158   end
160   after :each do
161     $stdout = STDOUT
162   end
164   it "prints a failure message for an exception" do
165     exc = ExceptionState.new @state, nil, @exception
166     @formatter.exception exc
167     @formatter.finish
168     @out.should =~ %r[<p>describe it ERROR</p>]
169   end
171   it "prints a backtrace for an exception" do
172     exc = ExceptionState.new @state, nil, @exception
173     exc.stub!(:backtrace).and_return("path/to/some/file.rb:35:in method")
174     @formatter.exception exc
175     @formatter.finish
176     @out.should =~ %r[<pre>.*path/to/some/file.rb:35:in method.*</pre>]m
177   end
179   it "prints a summary of elapsed time" do
180     @timer.should_receive(:format).and_return("Finished in 2.0 seconds")
181     @formatter.finish
182     @out.should =~ %r[<p>Finished in 2.0 seconds</p>\n]
183   end
185   it "prints a tally of counts" do
186     @tally.should_receive(:format).and_return("1 example, 0 failures")
187     @formatter.finish
188     @out.should =~ %r[<p class="pass">1 example, 0 failures</p>]
189   end
191   it "prints errors, backtraces, elapsed time, and tallies" do
192     exc = ExceptionState.new @state, nil, @exception
193     exc.stub!(:backtrace).and_return("path/to/some/file.rb:35:in method")
194     @formatter.exception exc
195     
196     @timer.should_receive(:format).and_return("Finished in 2.0 seconds")
197     @tally.should_receive(:format).and_return("1 example, 1 failures")
198     @formatter.finish
199     @out.should ==
200 %[<li class=\"fail\">- it (<a href=\"#details-1\">ERROR - 1</a>)</li>
201 <hr>
202 <ol id="details">
203 <li id="details-1"><p>describe it ERROR</p>
204 <p>MSpecExampleError: broken</p>
205 <pre>
206 path/to/some/file.rb:35:in method</pre>
207 </li>
208 </ol>
209 <p>Finished in 2.0 seconds</p>
210 <p class="fail">1 example, 1 failures</p>
211 </body>
212 </html>
214   end