rasta 0.1.8-x86-mswin32-60
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.
- data/LICENSE.txt +32 -0
- data/README.txt +15 -0
- data/bin/rasta +4 -0
- data/examples/crud_worksheet.xls +0 -0
- data/examples/fixtures/ColumnLayout.rb +34 -0
- data/examples/fixtures/HtmlRegistration.rb +103 -0
- data/examples/fixtures/MathFunctions.rb +21 -0
- data/examples/fixtures/StringFunctions.rb +18 -0
- data/examples/fixtures/crud/CrudClass.rb +62 -0
- data/examples/fixtures/crud/CrudFixture.rb +37 -0
- data/examples/html/registration.html +102 -0
- data/examples/rasta_fixture.xls +0 -0
- data/examples/tests_in_column_layout.xls +0 -0
- data/examples/watir_example.xls +0 -0
- data/lib/rasta/extensions/rspec_extensions.rb +174 -0
- data/lib/rasta/fixture/base_fixture.rb +138 -0
- data/lib/rasta/fixture/rasta_fixture.rb +183 -0
- data/lib/rasta/fixture_runner.rb +195 -0
- data/lib/rasta/formatter/spreadsheet_formatter.rb +32 -0
- data/lib/rasta/spreadsheet.rb +528 -0
- data/lib/rasta/version.rb +9 -0
- data/lib/rasta.rb +198 -0
- data/test/fixtures/RastaTestFixture.rb +9 -0
- data/test/spreadsheets/rasta_fixture.xls +0 -0
- data/test/spreadsheets/spreadsheet_parsing.xls +0 -0
- data/test/test_bookmarks.rb +138 -0
- data/test/test_fixtures.rb +66 -0
- data/test/test_spreadsheet.rb +337 -0
- metadata +98 -0
data/LICENSE.txt
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
---------------------------------------------------------------------------
|
2
|
+
Copyright (c) 2007, Hugh McGowan
|
3
|
+
All rights reserved.
|
4
|
+
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
7
|
+
|
8
|
+
1. Redistributions of source code must retain the above copyright notice,
|
9
|
+
this list of conditions and the following disclaimer.
|
10
|
+
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright
|
12
|
+
notice, this list of conditions and the following disclaimer in the
|
13
|
+
documentation and/or other materials provided with the distribution.
|
14
|
+
|
15
|
+
3. Neither the names Hugh McGowan nor the names of any
|
16
|
+
other contributors to this software may be used to endorse or promote
|
17
|
+
products derived from this software without specific prior written
|
18
|
+
permission.
|
19
|
+
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
|
21
|
+
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
22
|
+
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
23
|
+
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
|
24
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
25
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
26
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
27
|
+
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
28
|
+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
29
|
+
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
30
|
+
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
--------------------------------------------------------------------------
|
32
|
+
(based on BSD Open Source License)
|
data/README.txt
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
BUILD AND INSTALL GEM
|
2
|
+
======================
|
3
|
+
rake install
|
4
|
+
|
5
|
+
|
6
|
+
RUNNING EXAMPLES
|
7
|
+
=================
|
8
|
+
Running simple examples using the fixture
|
9
|
+
|
10
|
+
rasta examples/rasta_fixture.xls -f examples/fixtures
|
11
|
+
rasta examples/google_search.xls -f examples/fixtures
|
12
|
+
rasta examples/crud_worksheet.xls -f examples/fixtures/crud
|
13
|
+
|
14
|
+
--help gives other options which control where and how much of the
|
15
|
+
spreadsheet to parse
|
data/bin/rasta
ADDED
Binary file
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# :stopdoc:
|
2
|
+
|
3
|
+
require 'rasta/fixture/rasta_fixture'
|
4
|
+
require 'watir'
|
5
|
+
|
6
|
+
##
|
7
|
+
# Fixture for tests_in_column_layout.xls
|
8
|
+
class ColumnLayout
|
9
|
+
|
10
|
+
include Rasta::Fixture::RastaFixture
|
11
|
+
|
12
|
+
attr_accessor :site
|
13
|
+
|
14
|
+
##
|
15
|
+
# Global setup.
|
16
|
+
def before_all
|
17
|
+
@@ie = Watir::IE.new
|
18
|
+
@@ie.set_fast_speed
|
19
|
+
end
|
20
|
+
|
21
|
+
##
|
22
|
+
# Verify the browser's title is as expected for the loaded site.
|
23
|
+
def title?
|
24
|
+
@@ie.goto @site
|
25
|
+
@@ie.title
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Global teardown.
|
30
|
+
def after_all
|
31
|
+
@@ie.close
|
32
|
+
end
|
33
|
+
|
34
|
+
end # class
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# :stopdoc:
|
2
|
+
|
3
|
+
require 'rasta/fixture/rasta_fixture'
|
4
|
+
require 'watir'
|
5
|
+
|
6
|
+
##
|
7
|
+
# Fixture for watir_example.xls
|
8
|
+
class RaceRegistration
|
9
|
+
|
10
|
+
include Rasta::Fixture::RastaFixture
|
11
|
+
|
12
|
+
attr_accessor :name, :address, :participation_type, :additional_donation,
|
13
|
+
:t_shirt_size, :car_pooling
|
14
|
+
|
15
|
+
def before_all
|
16
|
+
@@ie = Watir::IE.new
|
17
|
+
@@ie.set_fast_speed
|
18
|
+
end
|
19
|
+
|
20
|
+
def before_each
|
21
|
+
@@ie.goto(File.expand_path(File.dirname(__FILE__)) + "/../html/registration.html")
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Requirement: The registration form should not be submitted if additional donation < 0.
|
26
|
+
# An error should be shown on the form page instead.
|
27
|
+
#--
|
28
|
+
# NOTE: The example registration app does NOT have this requirement implemented; hence,
|
29
|
+
# the negative tests based on this scenario will fail correctly.
|
30
|
+
def error?
|
31
|
+
populate_form
|
32
|
+
@@ie.button(:value, 'Submit').fire_event("onClick")
|
33
|
+
return is_error_shown_in_page?
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# Requirement: The summary page (after submitting form) should show the itemized charges.
|
38
|
+
#--
|
39
|
+
# NOTE: The expected output is defined as an Array of ints in the itemized_charges? column
|
40
|
+
# in the test spreadsheet; hence, we'll also need to return an Array of ints.
|
41
|
+
def itemized_charges?
|
42
|
+
return get_itemized_charges_from_accounting_table
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# Requirement: The summary page should show the total charges.
|
47
|
+
#--
|
48
|
+
# NOTE: total_charges? is defined as int in the spreadsheet; hence, we'll also need to
|
49
|
+
# return in int.
|
50
|
+
def total_charges?
|
51
|
+
return get_total_charges_from_accounting_table.to_i
|
52
|
+
end
|
53
|
+
|
54
|
+
##
|
55
|
+
# Populates the form page with instance variables defined in the test spreadsheet.
|
56
|
+
def populate_form
|
57
|
+
@@ie.text_field(:name, 'name').set(@name)
|
58
|
+
@@ie.text_field(:name, 'address').set(@address)
|
59
|
+
@@ie.radio(:name, 'ptype', @participation_type).set
|
60
|
+
@@ie.text_field(:name, 'additional').set(@additional_donation.to_s)
|
61
|
+
@@ie.select_list(:name, 'tshirt').select_value(@t_shirt_size)
|
62
|
+
@@ie.checkbox(:name, 'carpooling').set if @car_pooling
|
63
|
+
end
|
64
|
+
private :populate_form
|
65
|
+
|
66
|
+
##
|
67
|
+
# Returns true if the form page exists in the current page.
|
68
|
+
#--
|
69
|
+
# NOTE: It is assumed that (should the functionality be implemented) the form page is
|
70
|
+
# reloaded when a validation error occurs.
|
71
|
+
def is_error_shown_in_page?
|
72
|
+
@@ie.form(:id, 'test').exists?
|
73
|
+
end
|
74
|
+
private :is_error_shown_in_page?
|
75
|
+
|
76
|
+
##
|
77
|
+
# Returns the itemized charges shown in the accounting table within the summary page
|
78
|
+
# as an Array of ints.
|
79
|
+
def get_itemized_charges_from_accounting_table
|
80
|
+
@rows = @@ie.table(:id, 'accounting_summary').row_count
|
81
|
+
last_row_with_itemized_charges = @rows - 2
|
82
|
+
itemized_charges = []
|
83
|
+
for i in 3..last_row_with_itemized_charges
|
84
|
+
itemized_charges << @@ie.table(:id, 'accounting_summary')[i][0].text.delete('$').to_i
|
85
|
+
end
|
86
|
+
itemized_charges
|
87
|
+
end
|
88
|
+
private :get_itemized_charges_from_accounting_table
|
89
|
+
|
90
|
+
##
|
91
|
+
# Returns the total charges shown in the accounting table withing the summary page.
|
92
|
+
def get_total_charges_from_accounting_table
|
93
|
+
@@ie.table(:id, 'accounting_summary')[@rows][0].text.delete('$')
|
94
|
+
end
|
95
|
+
private :get_total_charges_from_accounting_table
|
96
|
+
|
97
|
+
##
|
98
|
+
# Teardown.
|
99
|
+
def after_all
|
100
|
+
@@ie.close
|
101
|
+
end
|
102
|
+
|
103
|
+
end # class
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rasta/fixture/rasta_fixture'
|
2
|
+
|
3
|
+
class MathFunctions
|
4
|
+
include Rasta::Fixture::RastaFixture
|
5
|
+
attr_accessor :x, :y
|
6
|
+
def add
|
7
|
+
x+y
|
8
|
+
end
|
9
|
+
def subtract
|
10
|
+
x-y
|
11
|
+
end
|
12
|
+
def multiply
|
13
|
+
x*y
|
14
|
+
end
|
15
|
+
def divide
|
16
|
+
x/y
|
17
|
+
end
|
18
|
+
def x_is_even?
|
19
|
+
x % 2 == 0
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rasta/fixture/rasta_fixture'
|
2
|
+
|
3
|
+
class StringFunctions
|
4
|
+
include Rasta::Fixture::RastaFixture
|
5
|
+
attr_accessor :phrase, :searchterm
|
6
|
+
def chop
|
7
|
+
phrase.chop
|
8
|
+
end
|
9
|
+
def reverse
|
10
|
+
phrase.reverse
|
11
|
+
end
|
12
|
+
def contains_term?
|
13
|
+
phrase[searchterm] != nil
|
14
|
+
end
|
15
|
+
def length
|
16
|
+
phrase.length
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class CrudClass
|
2
|
+
def initialize
|
3
|
+
@crud_hash = {}
|
4
|
+
end
|
5
|
+
|
6
|
+
def create(isbn,title,authors,publisher)
|
7
|
+
if @crud_hash.has_key? isbn
|
8
|
+
return false
|
9
|
+
end
|
10
|
+
|
11
|
+
book = {:isbn => isbn, :title => title, :authors => authors, :publisher => publisher}
|
12
|
+
@crud_hash[isbn] = book
|
13
|
+
|
14
|
+
return true
|
15
|
+
end
|
16
|
+
|
17
|
+
def count
|
18
|
+
@crud_hash.size
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_title(isbn)
|
22
|
+
if @crud_hash.has_key? isbn
|
23
|
+
@crud_hash[isbn][:title]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_authors(isbn)
|
28
|
+
if @crud_hash.has_key? isbn
|
29
|
+
@crud_hash[isbn][:authors]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_publisher(isbn)
|
34
|
+
if @crud_hash.has_key? isbn
|
35
|
+
@crud_hash[isbn][:publisher]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def update(isbn,field,value)
|
40
|
+
if @crud_hash.has_key? isbn
|
41
|
+
if field == "title"
|
42
|
+
@crud_hash[isbn][:title] = value
|
43
|
+
return true
|
44
|
+
elsif field == "authors"
|
45
|
+
@crud_hash[isbn][:authors] = value
|
46
|
+
return true
|
47
|
+
elsif field == "publisher"
|
48
|
+
@crud_hash[isbn][:publisher] = value
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
|
55
|
+
def delete(isbn)
|
56
|
+
if @crud_hash.has_key? isbn
|
57
|
+
@crud_hash.delete isbn
|
58
|
+
return true
|
59
|
+
end
|
60
|
+
return false
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rasta/fixture/rasta_fixture'
|
2
|
+
require 'examples/fixtures/crud/CrudClass'
|
3
|
+
|
4
|
+
class CrudFixture
|
5
|
+
include Rasta::Fixture::RastaFixture
|
6
|
+
attr_accessor :isbn, :title, :authors, :publisher, :field, :value
|
7
|
+
|
8
|
+
@@crud = CrudClass.new
|
9
|
+
|
10
|
+
def create
|
11
|
+
@@crud.create(isbn,title,authors,publisher)
|
12
|
+
end
|
13
|
+
|
14
|
+
def count
|
15
|
+
@@crud.count
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_title
|
19
|
+
@@crud.get_title(isbn)
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_authors
|
23
|
+
@@crud.get_authors(isbn)
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_publisher
|
27
|
+
@@crud.get_publisher(isbn)
|
28
|
+
end
|
29
|
+
|
30
|
+
def update
|
31
|
+
@@crud.update(isbn,field,value)
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete
|
35
|
+
@@crud.delete(isbn)
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
<!-- give the file the Make of the Web to stop the security warning -->
|
2
|
+
<!-- saved from url=(0014)about:internet -->
|
3
|
+
|
4
|
+
<html><head><title>Rasta Web Example</title></head>
|
5
|
+
<body>
|
6
|
+
<script type="text/javascript">
|
7
|
+
function process() {
|
8
|
+
var summary = ""
|
9
|
+
var charge_summary = ""
|
10
|
+
var charge_detail = ""
|
11
|
+
var participation = "Runner"
|
12
|
+
var carpool = "No"
|
13
|
+
var total = 0
|
14
|
+
var header = "<div style=\"height=25px;margin=0 1px 1px 1px;background=#006400;color=#ffffff;font-size=1.4em;\">Rasta Example - Watir</div><br>"
|
15
|
+
|
16
|
+
if (document.test.ptype[1].checked) {
|
17
|
+
participation = "Walker"
|
18
|
+
charge_detail += "<tr><td>Registration Fee (Walker)</td><td>$10</td></tr>";
|
19
|
+
total += 10;
|
20
|
+
} else {
|
21
|
+
charge_detail += "<tr><td>Registration Fee (Runner)</td><td>$15</td></tr>";
|
22
|
+
total += 15;
|
23
|
+
}
|
24
|
+
if (document.test.tshirt.value == "X-large") {
|
25
|
+
charge_detail += "<tr><td>T-Shirt (X-large)</td><td>$3</td></tr>";
|
26
|
+
total += 3;
|
27
|
+
} else if (document.test.tshirt.value == "Large") {
|
28
|
+
charge_detail += "<tr><td>T-Shirt (Large)</td><td>$2</td></tr>";
|
29
|
+
total += 2;
|
30
|
+
}
|
31
|
+
if (document.test.additional.value) {
|
32
|
+
charge_detail += "<tr><td>Additional Donation</td><td>$" + document.test.additional.value + "</td></tr>";
|
33
|
+
total += parseInt(document.test.additional.value);
|
34
|
+
<!-- This can be added to demonstrate bug in output (comment above line too)-->
|
35
|
+
<!-- total += document.test.additional.value; -->
|
36
|
+
}
|
37
|
+
if (document.test.carpooling.checked) {
|
38
|
+
carpool = "Yes";
|
39
|
+
}
|
40
|
+
|
41
|
+
summary = "<hr><b>REGISTRATION</b><hr/><br><br><table>" +
|
42
|
+
"<tr><td align=right><b>Name</td>" +
|
43
|
+
"<td>" + document.test.name.value + "</td></tr>" +
|
44
|
+
"<tr><td align=right><b>Address</th>" +
|
45
|
+
"<td>" + document.test.address.value + "</td></tr>" +
|
46
|
+
"<tr><td align=right><b>Participation Type</th>" +
|
47
|
+
"<td>" + participation + "</td></tr>" +
|
48
|
+
"<tr><td align=right><b>Shirt Size</th>" +
|
49
|
+
"<td>" + document.test.tshirt.value + "</td></tr>" +
|
50
|
+
"<tr><td align=right><b>Carpooling?</th>" +
|
51
|
+
"<td>" + carpool + "</td></tr>";
|
52
|
+
summary += "</table><br/><br/>"
|
53
|
+
|
54
|
+
charge_summary = "<hr><b>ACCOUNTING</b><hr/><br><br><table id='accounting_summary'>"
|
55
|
+
if (total != 0) {
|
56
|
+
charge_summary += "<tr><th colspan=2 align=left>Itemized Charges</th></tr>" +
|
57
|
+
"<tr><td colspan=2><hr></td></tr>" +
|
58
|
+
charge_detail +
|
59
|
+
"<tr><td colspan=2><hr></td></tr>" +
|
60
|
+
"<tr><td align=right><b>Total Charges</td><td>$" + total+ "</td></tr>"
|
61
|
+
} else {
|
62
|
+
charge_summary += "<tr><th align=right>Total Charges</th><td>$0</td></tr>"
|
63
|
+
}
|
64
|
+
charge_summary += "</table>";
|
65
|
+
|
66
|
+
document.write(header + summary + charge_summary);
|
67
|
+
document.close();
|
68
|
+
}
|
69
|
+
</script>
|
70
|
+
<div style="height=25px;margin=0 1px 1px 1px;background=#006400;color=#ffffff;font-size=1.4em;">Rasta Example - Watir</div>
|
71
|
+
<form name = "test" id="test" >
|
72
|
+
<table>
|
73
|
+
<tr>
|
74
|
+
<th align=right>Name</th>
|
75
|
+
<td><input name="name" type="text"></td>
|
76
|
+
</tr><tr>
|
77
|
+
<th align=right>Address</th>
|
78
|
+
<td><input name="address" type="text"></td>
|
79
|
+
</tr><tr>
|
80
|
+
<th align=right>Participation Type</th>
|
81
|
+
<td><input name="ptype" type="radio" value="Runner">Runner (15$)<br>
|
82
|
+
<input name="ptype" type="radio" value="Walker">Walker (10$)<br>
|
83
|
+
</td>
|
84
|
+
</tr><tr>
|
85
|
+
<th align=right>Additional Donation</th>
|
86
|
+
<td><input name="additional" type="text"></td>
|
87
|
+
</tr><tr>
|
88
|
+
<th align=right>T-Shirt Size</th>
|
89
|
+
<td><select name="tshirt">
|
90
|
+
<option value="X-large">X-large ($3 extra)
|
91
|
+
<option value="Large">Large ($2 extra)
|
92
|
+
<option value="Medium" selected>Medium
|
93
|
+
<option value="Small">Small
|
94
|
+
<option value="X-Small">X-Small
|
95
|
+
</select></td>
|
96
|
+
</tr><tr>
|
97
|
+
<td> </td>
|
98
|
+
<td><input name="carpooling" type="checkbox" value="unchecked"> I'm interested in carpooling
|
99
|
+
</td>
|
100
|
+
</tr></table>
|
101
|
+
<input id="submitButton" type="button" value="Submit" onclick="process()">
|
102
|
+
</form></body></html>
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,174 @@
|
|
1
|
+
# Extensions to RSPEC's Spec::Runner::Reporter
|
2
|
+
|
3
|
+
require 'spec/runner/reporter'
|
4
|
+
|
5
|
+
#=========================
|
6
|
+
# CHANGING TEST EXECUTION
|
7
|
+
#=========================
|
8
|
+
# We need to modify the Spec::Runner::Reporter class
|
9
|
+
# so we can use a custom formatter and pass along cell information
|
10
|
+
# to the formatter via the reporter
|
11
|
+
# (there's no built in way for the examples to pass
|
12
|
+
# data into the formatters).
|
13
|
+
#
|
14
|
+
# Additionally, we're making a change to the workflow. By default,
|
15
|
+
# rspec runs all of the examples at exit. We want to run them at
|
16
|
+
# the time we read the cell, execture one or more tests, and update that cell.
|
17
|
+
# Additionally, we don't want to report results after each call to the
|
18
|
+
# rspec runner but instead wait until we're totally done.
|
19
|
+
module Spec
|
20
|
+
module Runner
|
21
|
+
class Reporter
|
22
|
+
|
23
|
+
|
24
|
+
@@started_formatters = false
|
25
|
+
|
26
|
+
# Initialize the start time
|
27
|
+
# and set up the superclass' dump
|
28
|
+
# method to run after we're all done
|
29
|
+
def initialize_spreadsheet
|
30
|
+
@start_time = Time.new
|
31
|
+
#at_exit {original_dump}
|
32
|
+
end
|
33
|
+
|
34
|
+
# Call the formatter's method and pass in the reference
|
35
|
+
# to the spreadsheet cell so it can use it for updating
|
36
|
+
# the cell contents based on the test result
|
37
|
+
def set_current_spreadsheet_cell=(cell_reference)
|
38
|
+
formatters.each { |f| f.cell=(cell_reference) if f.methods.include?('cell=') }
|
39
|
+
end
|
40
|
+
|
41
|
+
# Stub out the dump method and call it
|
42
|
+
# after all tests are run
|
43
|
+
alias :original_dump :dump
|
44
|
+
def dump; end
|
45
|
+
|
46
|
+
# Change so we don't clear the state after each run
|
47
|
+
# and don't reset the start time
|
48
|
+
alias :original_start :start
|
49
|
+
def start(number_of_examples)
|
50
|
+
|
51
|
+
#clear [REMOVED so we keep state across tests]
|
52
|
+
#@start_time = Time.new [MOVED to initialize_spreadsheet]
|
53
|
+
if !@@started_formatters
|
54
|
+
formatters.each{|f| f.start(number_of_examples)}
|
55
|
+
@@started_formatters = true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Expose the failure count to Rasta
|
60
|
+
def failure_count
|
61
|
+
@failures.length
|
62
|
+
end
|
63
|
+
|
64
|
+
alias :old_example_finished :example_finished
|
65
|
+
def example_finished(*args)
|
66
|
+
error = args[1]
|
67
|
+
if error
|
68
|
+
if ::Spec::Matchers.given_error
|
69
|
+
error.set_backtrace(::Spec::Matchers.given_error.backtrace)
|
70
|
+
else
|
71
|
+
error.set_backtrace(nil)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
old_example_finished(*args)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
module Spec
|
82
|
+
module Runner
|
83
|
+
class Options
|
84
|
+
def clear_format_options
|
85
|
+
@formatters = [];
|
86
|
+
@format_options = [];
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
#=========================
|
93
|
+
# HANDLING EXCEPTIONS
|
94
|
+
#=========================
|
95
|
+
# RSpec currently throws an exception for where the test failed in
|
96
|
+
# the rspec test code. Instead, it's more useful for us to see
|
97
|
+
# the exception thrown in the proc that is called by rspec
|
98
|
+
# so we're going to provide a way to get at it
|
99
|
+
|
100
|
+
# After calling the matcher we should store the
|
101
|
+
# actual exception (not the rspec exception) for reporting
|
102
|
+
require 'spec/matchers/raise_error'
|
103
|
+
module Spec
|
104
|
+
module Matchers
|
105
|
+
class RaiseError
|
106
|
+
alias :old_matches? :matches?
|
107
|
+
def matches?(*args)
|
108
|
+
old_matches?(*args)
|
109
|
+
if @given_error
|
110
|
+
::Spec::Matchers.given_error = @given_error
|
111
|
+
else
|
112
|
+
::Spec::Matchers.given_error = nil
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# Find a place to store the actal error
|
120
|
+
# that the example code can see.
|
121
|
+
|
122
|
+
require 'spec/matchers'
|
123
|
+
module Spec
|
124
|
+
module Matchers
|
125
|
+
class << self
|
126
|
+
attr_accessor :given_error
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
require 'spec/runner/formatter/html_formatter'
|
133
|
+
# Ignore empty backtraces. It would be good
|
134
|
+
# if we could show a snippet from the code that
|
135
|
+
# was called in the test fixture here. Not sure
|
136
|
+
# how hard that would be.
|
137
|
+
#
|
138
|
+
# Also show exceptions as Yellow and test
|
139
|
+
# failures as Red
|
140
|
+
module Spec
|
141
|
+
module Runner
|
142
|
+
module Formatter
|
143
|
+
class HtmlFormatter < BaseTextFormatter
|
144
|
+
|
145
|
+
def example_failed(example, counter, failure)
|
146
|
+
failure.exception.backtrace ? extra = extra_failure_content(failure) : extra = ''
|
147
|
+
failure_style = failure.pending_fixed? ? 'pending_fixed' : 'failed'
|
148
|
+
@output.puts " <script type=\"text/javascript\">makeRed('rspec-header');</script>" unless @header_red
|
149
|
+
@header_red = true
|
150
|
+
@output.puts " <script type=\"text/javascript\">makeRed(\"example_group_#{example_group_number}\");</script>" unless @example_group_red
|
151
|
+
@example_group_red = true
|
152
|
+
move_progress
|
153
|
+
@output.puts " <dd class=\"spec #{failure_style}\">"
|
154
|
+
@output.puts " <span class=\"failed_spec_name\">#{h(example.description)}</span>"
|
155
|
+
@output.puts " <div class=\"failure\" id=\"failure_#{counter}\">"
|
156
|
+
@output.puts " <div class=\"message\"><pre>#{h(failure.exception.message)}</pre></div>" unless failure.exception.nil?
|
157
|
+
@output.puts " <div class=\"backtrace\"><pre>#{format_backtrace(failure.exception.backtrace)}</pre></div>" unless failure.exception.nil?
|
158
|
+
@output.puts extra unless extra == ""
|
159
|
+
@output.puts " </div>"
|
160
|
+
@output.puts " </dd>"
|
161
|
+
@output.flush
|
162
|
+
end
|
163
|
+
|
164
|
+
def extra_failure_content(failure)
|
165
|
+
require 'spec/runner/formatter/snippet_extractor'
|
166
|
+
@snippet_extractor ||= SnippetExtractor.new
|
167
|
+
" <pre class=\"ruby\"><code>#{@snippet_extractor.snippet(failure.exception)}</code></pre>"
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
|