greenpepper-ruby 0.0.1
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/bin/greenpepperize +71 -0
- data/bin/greenpepperrails +33 -0
- data/bin/greenpepperruby +15 -0
- data/data/greenpepper.rake +37 -0
- data/data/helper.rb +32 -0
- data/data/tags +6 -0
- data/lib/greenpepper/argumentparser.rb +161 -0
- data/lib/greenpepper/common/loadpath.rb +7 -0
- data/lib/greenpepper/context/htmlcontext.rb +26 -0
- data/lib/greenpepper/converter.rb +347 -0
- data/lib/greenpepper/core.rb +152 -0
- data/lib/greenpepper/example/collectionexample.rb +305 -0
- data/lib/greenpepper/example/dowithexample.rb +192 -0
- data/lib/greenpepper/example/exampleheader.rb +41 -0
- data/lib/greenpepper/example/examplewithfixture.rb +73 -0
- data/lib/greenpepper/example/executionresults.rb +160 -0
- data/lib/greenpepper/example/fieldaccessor.rb +36 -0
- data/lib/greenpepper/example/freetextexample.rb +51 -0
- data/lib/greenpepper/example/importexample.rb +39 -0
- data/lib/greenpepper/example/nameresolver.rb +69 -0
- data/lib/greenpepper/example/ruleforexample.rb +117 -0
- data/lib/greenpepper/example/setupexample.rb +79 -0
- data/lib/greenpepper/example/silentexample.rb +14 -0
- data/lib/greenpepper/example/unknownexample.rb +17 -0
- data/lib/greenpepper/exception/greenpepperexception.rb +57 -0
- data/lib/greenpepper/executionunit.rb +39 -0
- data/lib/greenpepper/factory/collectionexamplefactory.rb +59 -0
- data/lib/greenpepper/factory/dowithexamplefactory.rb +71 -0
- data/lib/greenpepper/factory/examplefactory.rb +14 -0
- data/lib/greenpepper/factory/freetextexamplefactory.rb +29 -0
- data/lib/greenpepper/factory/htmlexamplefactory.rb +49 -0
- data/lib/greenpepper/factory/importexamplefactory.rb +27 -0
- data/lib/greenpepper/factory/ruleforexamplefactory.rb +46 -0
- data/lib/greenpepper/factory/setupexamplefactory.rb +31 -0
- data/lib/greenpepper/factory/silentexamplefactory.rb +21 -0
- data/lib/greenpepper/factory/unknownexamplefactory.rb +16 -0
- data/lib/greenpepper/freetext.rb +164 -0
- data/lib/greenpepper/grammar/array.treetop +51 -0
- data/lib/greenpepper/grammar/arrayparser.rb +14 -0
- data/lib/greenpepper/greenpepperconfig.rb +19 -0
- data/lib/greenpepper/greenpeppertask.rb +60 -0
- data/lib/greenpepper/logger.rb +45 -0
- data/lib/greenpepper/parser/freetextparser.rb +96 -0
- data/lib/greenpepper/parser/htmlparser.rb +70 -0
- data/lib/greenpepper/parser/scenario.rb +25 -0
- data/lib/greenpepper/parser/table.rb +37 -0
- data/lib/greenpepper/parser/wikiparser.rb +26 -0
- data/lib/greenpepper/pass/freetextpass.rb +24 -0
- data/lib/greenpepper/pass/greenpepperpass.rb +92 -0
- data/lib/greenpepper/pass/tablepass.rb +38 -0
- data/lib/greenpepper/railsargumentparser.rb +46 -0
- data/lib/greenpepper/redpeppertask.rb +89 -0
- data/lib/greenpepper/repository/atlassianrepository.rb +100 -0
- data/lib/greenpepper/writer/consolewriter.rb +21 -0
- data/lib/greenpepper/writer/freetextresult.rb +233 -0
- data/lib/greenpepper/writer/freetextwriter.rb +44 -0
- data/lib/greenpepper/writer/html.rb +14 -0
- data/lib/greenpepper/writer/htmldocwriter.rb +82 -0
- data/lib/greenpepper/writer/htmlresult.rb +192 -0
- data/lib/greenpepper/writer/htmlwriter.rb +112 -0
- data/lib/greenpepper/writer/output.rb +26 -0
- data/lib/greenpepper/writer/result.rb +35 -0
- data/lib/greenpepper/writer/xmlwriter.rb +32 -0
- data/test/coreseedstest.rb +39 -0
- data/test/greenpepper/argumentparsertest.rb +162 -0
- data/test/greenpepper/common/loadpathtest.rb +24 -0
- data/test/greenpepper/common/stattest.rb +186 -0
- data/test/greenpepper/convertertest.rb +371 -0
- data/test/greenpepper/coretest.rb +159 -0
- data/test/greenpepper/example/collectionexampletest.rb +484 -0
- data/test/greenpepper/example/dowithexampletest.rb +148 -0
- data/test/greenpepper/example/exampletest.rb +28 -0
- data/test/greenpepper/example/freetextexampletest.rb +151 -0
- data/test/greenpepper/example/importexampletest.rb +79 -0
- data/test/greenpepper/example/nameresolvertest.rb +56 -0
- data/test/greenpepper/example/ruleforexampletest.rb +225 -0
- data/test/greenpepper/example/setupexampletest.rb +140 -0
- data/test/greenpepper/example/silentexampletest.rb +17 -0
- data/test/greenpepper/example/unknownexampletest.rb +17 -0
- data/test/greenpepper/factory/collectionexamplefactorytest.rb +51 -0
- data/test/greenpepper/factory/dowithexamplefactorytest.rb +48 -0
- data/test/greenpepper/factory/examplefactorytest.rb +88 -0
- data/test/greenpepper/factory/freetextexamplefactorytest.rb +54 -0
- data/test/greenpepper/factory/importexamplefactorytest.rb +40 -0
- data/test/greenpepper/factory/ruleforexamplefactorytest.rb +55 -0
- data/test/greenpepper/factory/setupexamplefactorytest.rb +29 -0
- data/test/greenpepper/factory/silentexamplefactorytest.rb +38 -0
- data/test/greenpepper/freetexttest.rb +222 -0
- data/test/greenpepper/grammar/arrayparsertest.rb +45 -0
- data/test/greenpepper/loggertest.rb +26 -0
- data/test/greenpepper/parser/freetextparsertest.rb +124 -0
- data/test/greenpepper/parser/htmlparsertest.rb +77 -0
- data/test/greenpepper/parser/wikiparsertest.rb +21 -0
- data/test/greenpepper/pass/freetextpasstest.rb +54 -0
- data/test/greenpepper/pass/greenpepperpasstest.rb +47 -0
- data/test/greenpepper/pass/tablepasstest.rb +23 -0
- data/test/greenpepper/repository/atlassionrepositorytest.rb +85 -0
- data/test/greenpepper/writer/freetextwritertest.rb +301 -0
- data/test/greenpepper/writer/htmlcollectionwritertest.rb +145 -0
- data/test/greenpepper/writer/htmldowithwritertest.rb +87 -0
- data/test/greenpepper/writer/htmlruleforwritertest.rb +147 -0
- data/test/greenpepper/writer/htmlsetupwritertest.rb +107 -0
- data/test/greenpepper/writer/htmlstatresulttest.rb +118 -0
- data/test/greenpepper/writer/htmlwriterpositiontest.rb +53 -0
- data/test/greenpepper/writer/writertest.rb +33 -0
- data/test/greenpepper/writer/xmlwritertest.rb +34 -0
- data/test/integration/collectionexampleintegrationtest.rb +64 -0
- data/test/integration/errorhandlingintegrationtest.rb +68 -0
- data/test/integration/freetextexampleintegrationtest.rb +75 -0
- data/test/integration/greenpepperexecutableintegrationtest.rb +22 -0
- data/test/integration/importexampleintegrationtest.rb +41 -0
- data/test/integration/interpretationordertest.rb +48 -0
- data/test/integration/ruleforexampleintegrationtest.rb +102 -0
- data/test/integration/securityintegrationtest.rb +30 -0
- data/test/integration/setupexampleintegrationtest.rb +31 -0
- data/test/integration/silentexampleintegrationtest.rb +29 -0
- data/test/task/greenpeppertasktest.rb +96 -0
- data/test/task/redpeppertasktest.rb +120 -0
- data/vendor/accents.rb +85 -0
- metadata +234 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
|
3
|
+
date: October 3, 2009
|
|
4
|
+
=end
|
|
5
|
+
|
|
6
|
+
module GreenPepper
|
|
7
|
+
|
|
8
|
+
require 'rubygems'
|
|
9
|
+
require 'libxml'
|
|
10
|
+
|
|
11
|
+
require 'greenpepper/writer/freetextresult'
|
|
12
|
+
require 'greenpepper/parser/freetextparser'
|
|
13
|
+
require 'greenpepper/parser/scenario'
|
|
14
|
+
|
|
15
|
+
class FreeTextWriter
|
|
16
|
+
include KeywordFormat
|
|
17
|
+
|
|
18
|
+
def support? execution_unit
|
|
19
|
+
execution_unit.result.is_a? FreeTextExecutionResults
|
|
20
|
+
end
|
|
21
|
+
# Write the results
|
|
22
|
+
# Returns a string of the document
|
|
23
|
+
def write(html_doc, execution_units, write_options ={})
|
|
24
|
+
|
|
25
|
+
html_results = []
|
|
26
|
+
execution_units.each{ |unit|
|
|
27
|
+
html_results << example_to_html(unit.example, unit.result)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# Use the parser to replace the old scenario with the new one
|
|
31
|
+
parser = FreeTextParser.new
|
|
32
|
+
parser.replace_scenarios html_doc, html_results
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Visible for testing
|
|
36
|
+
def example_to_html(ex, results)
|
|
37
|
+
res = newline(results[0].write(nil))
|
|
38
|
+
results[1..-1].each_with_index{ |result, index|
|
|
39
|
+
res += indent(result.write(ex.actions[index]))
|
|
40
|
+
}
|
|
41
|
+
res
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Pascal Ouellet (pas.ouellet@gmail.com)
|
|
3
|
+
date: March 17, 2009
|
|
4
|
+
=end
|
|
5
|
+
module GreenPepper
|
|
6
|
+
|
|
7
|
+
module Html
|
|
8
|
+
# HTML Hex colors
|
|
9
|
+
RED = "#F08080"
|
|
10
|
+
YELLOW = "#F0E68C"
|
|
11
|
+
GREEN = "#98FB98"
|
|
12
|
+
GREY ="#D3D3D3"
|
|
13
|
+
end
|
|
14
|
+
end #module GreenPepper
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
|
3
|
+
date: March 13, 2009
|
|
4
|
+
=end
|
|
5
|
+
module GreenPepper
|
|
6
|
+
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
require 'libxml'
|
|
9
|
+
require 'greenpepper/writer/htmlruleforwriter'
|
|
10
|
+
require 'greenpepper/writer/htmlimportwriter'
|
|
11
|
+
require 'greenpepper/writer/htmlsetupwriter'
|
|
12
|
+
require 'greenpepper/writer/htmldowithwriter'
|
|
13
|
+
require 'greenpepper/writer/htmlcollectionwriter'
|
|
14
|
+
require 'greenpepper/writer/nullwriter'
|
|
15
|
+
|
|
16
|
+
class HtmlDocumentWriter
|
|
17
|
+
attr_reader :modified_doc
|
|
18
|
+
def initialize(base_html)
|
|
19
|
+
@html_doc = (LibXML::XML::HTMLParser.string base_html,
|
|
20
|
+
:encoding => LibXML::XML::Encoding::UTF_8,
|
|
21
|
+
:options => LibXML::XML::HTMLParser::Options::NOBLANKS).parse
|
|
22
|
+
@table_index = 0
|
|
23
|
+
@modified_doc = ""
|
|
24
|
+
@tables = @html_doc.find '//table'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def write(results)
|
|
28
|
+
table = @tables[@table_index]
|
|
29
|
+
w = create_writer results, table
|
|
30
|
+
@modified_doc = (w.write results)
|
|
31
|
+
@modified_doc = @modified_doc.doc.root.to_s unless @modified_doc == nil
|
|
32
|
+
|
|
33
|
+
@table_index += w.table_count
|
|
34
|
+
@modified_doc
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def write_results(all_results)
|
|
38
|
+
stats_doc = ""
|
|
39
|
+
|
|
40
|
+
# We define another XML tree, since <table> is already the node of
|
|
41
|
+
# html_doc. We can't add another table to the actual one
|
|
42
|
+
stats = LibXML::XML::Parser.string(
|
|
43
|
+
"<table><tr><td>Successes: #{all_results.successes}</td>" +
|
|
44
|
+
"<td>Failures: #{all_results.failures}</td>" +
|
|
45
|
+
"<td>Errors: #{all_results.errors}</td></tr></table>").
|
|
46
|
+
parse.root.copy(true)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
node = @html_doc.find_first 'body'
|
|
50
|
+
node = @html_doc.root if node == nil
|
|
51
|
+
if node.first?
|
|
52
|
+
node.first.prev = stats
|
|
53
|
+
else
|
|
54
|
+
node << stats
|
|
55
|
+
end
|
|
56
|
+
@modified_doc = @html_doc.to_s
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
def create_writer(results, table)
|
|
61
|
+
# TODO: Why is doesn't this create an exception? None of those class exist
|
|
62
|
+
# anymore.
|
|
63
|
+
if results.class == RuleForExampleExecutionStats
|
|
64
|
+
row_modifier = HtmlRuleForWriter.create_row_modifier
|
|
65
|
+
w = HtmlRuleForWriter.new table, row_modifier
|
|
66
|
+
elsif results.class == ImportExampleExecutionStats
|
|
67
|
+
row_modifier = HtmlImportWriter.create_row_modifier
|
|
68
|
+
w = HtmlImportWriter.new table, row_modifier
|
|
69
|
+
elsif results.class == SetupExampleExecutionStats
|
|
70
|
+
row_modifier = HtmlSetupWriter.create_row_modifier
|
|
71
|
+
w = HtmlSetupWriter.new table, row_modifier
|
|
72
|
+
elsif results.class == DoWithExampleExecutionStats
|
|
73
|
+
w = HtmlDoWithWriter.new table
|
|
74
|
+
elsif results.class == CollectionExampleExecutionStats
|
|
75
|
+
row_modifier = HtmlCollectionWriter.create_row_modifier
|
|
76
|
+
w = HtmlCollectionWriter.new table, row_modifier
|
|
77
|
+
else
|
|
78
|
+
w = NullWriter.new table
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end #module GreenPepper
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Martin Provencher (martin.provencher@usherbrooke.ca)
|
|
3
|
+
date: April 25, 2009
|
|
4
|
+
=end
|
|
5
|
+
module GreenPepper
|
|
6
|
+
|
|
7
|
+
require 'greenpepper/writer/html'
|
|
8
|
+
require 'greenpepper/exception/greenpepperexception'
|
|
9
|
+
require 'greenpepper/writer/result'
|
|
10
|
+
|
|
11
|
+
class HtmlExampleResult < ExampleResult
|
|
12
|
+
attr_accessor :row, :column
|
|
13
|
+
|
|
14
|
+
def write(cell, options = {})
|
|
15
|
+
unless cell.instance_of? LibXML::XML::Node
|
|
16
|
+
raise GreenPepperArgumentError.new
|
|
17
|
+
end
|
|
18
|
+
cell
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class NoExampleResult < HtmlExampleResult
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class WriteTextExampleResult < HtmlExampleResult
|
|
26
|
+
def initialize(result, silent=false)
|
|
27
|
+
super(silent)
|
|
28
|
+
@result = result
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def write(cell, options = {})
|
|
32
|
+
cell.content = "" if cell.content == " "
|
|
33
|
+
cell = super(cell, options)
|
|
34
|
+
cell << @result
|
|
35
|
+
cell
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class SuccessExampleResult < HtmlExampleResult
|
|
40
|
+
def success?
|
|
41
|
+
true
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def write(cell, options = {})
|
|
45
|
+
cell = super(cell, options)
|
|
46
|
+
cell["style"] = "background-color: #{Html::GREEN}"
|
|
47
|
+
cell
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
class FailureExampleResult < HtmlExampleResult
|
|
52
|
+
def failure?
|
|
53
|
+
true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def write(cell, options = {})
|
|
57
|
+
cell = super(cell, options)
|
|
58
|
+
cell["style"] = "background-color: #{Html::RED}"
|
|
59
|
+
cell
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
class ErrorExampleResult < HtmlExampleResult
|
|
64
|
+
def error?
|
|
65
|
+
true
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def write(cell, options = {})
|
|
69
|
+
cell = super(cell, options)
|
|
70
|
+
cell["style"] = "background-color: #{Html::YELLOW}"
|
|
71
|
+
cell
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
class IgnoredExampleResult < HtmlExampleResult
|
|
76
|
+
def ignored?
|
|
77
|
+
true
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def write(cell, options = {})
|
|
81
|
+
cell["style"] = "background-color: #{Html::GREY}"
|
|
82
|
+
cell
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
class WriteIgnoredExampleResult < WriteTextExampleResult
|
|
87
|
+
def ignored?
|
|
88
|
+
true
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def write(cell, options = {})
|
|
92
|
+
cell = super(cell, options)
|
|
93
|
+
cell["style"] = "background-color: #{Html::GREY}"
|
|
94
|
+
cell
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
class WriteSucessExampleResult < SuccessExampleResult
|
|
99
|
+
def write(cell, options = {})
|
|
100
|
+
cell = super(cell, options)
|
|
101
|
+
cell << "Success"
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
class WriteFailExampleResult < FailureExampleResult
|
|
106
|
+
def write(cell, options = {})
|
|
107
|
+
cell = super(cell, options)
|
|
108
|
+
cell << "Fail"
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
class WriteExpectedExampleResult < FailureExampleResult
|
|
113
|
+
attr_reader :expected, :received
|
|
114
|
+
def initialize(expected, received, silent=false)
|
|
115
|
+
super(silent)
|
|
116
|
+
@expected = expected
|
|
117
|
+
@received = received
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def write(cell, options = {})
|
|
121
|
+
cell = super(cell, options)
|
|
122
|
+
|
|
123
|
+
cell.children.each{|current_node|current_node.remove!}
|
|
124
|
+
cell << LibXML::XML::Node.new_text("")
|
|
125
|
+
|
|
126
|
+
expected_node = LibXML::XML::Node.new "b", "Expected: "
|
|
127
|
+
cell << expected_node
|
|
128
|
+
cell << @expected
|
|
129
|
+
|
|
130
|
+
received_node = LibXML::XML::Node.new "b", " Received: "
|
|
131
|
+
cell << received_node
|
|
132
|
+
cell << @received
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
class WriteExceptionExampleResult < ErrorExampleResult
|
|
137
|
+
attr :exception
|
|
138
|
+
|
|
139
|
+
def initialize(exception, silent=false)
|
|
140
|
+
super(silent)
|
|
141
|
+
@exception = exception
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def write(cell, options = {})
|
|
145
|
+
cell = super(cell, options)
|
|
146
|
+
|
|
147
|
+
cell.content = "#{@exception.class}: #{@exception.to_s}"
|
|
148
|
+
if @exception.backtrace && !options[:no_exception_stack]
|
|
149
|
+
cell << LibXML::XML::Node.new('hr')
|
|
150
|
+
@exception.backtrace.each { |step|
|
|
151
|
+
cell << step
|
|
152
|
+
cell << LibXML::XML::Node.new('br')
|
|
153
|
+
}
|
|
154
|
+
end
|
|
155
|
+
cell
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
class WriteMissingExampleResult < FailureExampleResult
|
|
160
|
+
def write(cell, options = {})
|
|
161
|
+
super(cell, options)
|
|
162
|
+
|
|
163
|
+
missing = LibXML::XML::Node.new('i')
|
|
164
|
+
missing << "Missing "
|
|
165
|
+
|
|
166
|
+
content = cell.content
|
|
167
|
+
|
|
168
|
+
cell.content = ""
|
|
169
|
+
cell << missing
|
|
170
|
+
cell << content
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
class WriteSurplusExampleResult < FailureExampleResult
|
|
175
|
+
attr_reader :value
|
|
176
|
+
def initialize(value, silent=false)
|
|
177
|
+
super(silent)
|
|
178
|
+
@value = value
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def write(cell, options = {})
|
|
182
|
+
super(cell, options)
|
|
183
|
+
surplus = LibXML::XML::Node.new('i')
|
|
184
|
+
surplus << "Surplus "
|
|
185
|
+
|
|
186
|
+
cell.content = ""
|
|
187
|
+
cell << surplus
|
|
188
|
+
cell << @value
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
end #module GreenPepper
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Martin Provencher (martin.provencher@usherbrooke.ca)
|
|
3
|
+
date: April 25, 2009
|
|
4
|
+
=end
|
|
5
|
+
module GreenPepper
|
|
6
|
+
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
require 'libxml'
|
|
9
|
+
require 'greenpepper/example/executionresults'
|
|
10
|
+
require 'greenpepper/context/htmlcontext'
|
|
11
|
+
require 'greenpepper/parser/table'
|
|
12
|
+
|
|
13
|
+
class HtmlWriter
|
|
14
|
+
attr_reader :execution_units
|
|
15
|
+
|
|
16
|
+
def initialize
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def output
|
|
20
|
+
@html_doc.to_s
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def support? execution_unit
|
|
24
|
+
execution_unit.result.is_a? HtmlTableExecutionResults
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def load_document(base_html, execution_units, write_options = {})
|
|
28
|
+
@html_doc = (LibXML::XML::HTMLParser.string base_html,
|
|
29
|
+
:encoding => LibXML::XML::Encoding::UTF_8,
|
|
30
|
+
:options => LibXML::XML::HTMLParser::Options::NOBLANKS).parse
|
|
31
|
+
@execution_units = execution_units
|
|
32
|
+
@tables = @html_doc.find('//table').to_a
|
|
33
|
+
@write_options = write_options
|
|
34
|
+
|
|
35
|
+
nb_results_table = 0
|
|
36
|
+
@execution_units.each{ |unit|
|
|
37
|
+
nb_results_table += unit.context.nb_table
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if @tables.size != nb_results_table
|
|
41
|
+
raise "Execution results doesn't have the same number of html " +
|
|
42
|
+
"table than the file"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def write(base_html, execution_units, write_options = {})
|
|
47
|
+
|
|
48
|
+
load_document(base_html, execution_units, write_options)
|
|
49
|
+
|
|
50
|
+
@execution_units.each{ |unit|
|
|
51
|
+
all_example_table = []
|
|
52
|
+
|
|
53
|
+
@tables[unit.context.first_table_index, unit.context.nb_table].each{
|
|
54
|
+
|table|
|
|
55
|
+
all_example_table << table
|
|
56
|
+
}
|
|
57
|
+
write_results_to_html all_example_table, unit.result
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@html_doc.to_s
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
def write_results_to_html(tables, result)
|
|
65
|
+
rows = []
|
|
66
|
+
tables.each{ |table|
|
|
67
|
+
rows += table.find('.//tr').to_a
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
result.each{ |result|
|
|
71
|
+
missing_row = result.row - (rows.size-1)
|
|
72
|
+
if missing_row > 0
|
|
73
|
+
unless rows.size > 0
|
|
74
|
+
raise GreenPepperMalformedTableError.new(
|
|
75
|
+
"Error : Example without row")
|
|
76
|
+
end
|
|
77
|
+
copy_row = rows[-1].copy true
|
|
78
|
+
|
|
79
|
+
missing_row.times {
|
|
80
|
+
new_row = LibXML::XML::Node.new rows[-1].name
|
|
81
|
+
copy_row.each_element{ |cell|
|
|
82
|
+
new_row << LibXML::XML::Node.new(cell.name)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
rows[-1].parent << new_row
|
|
86
|
+
rows << new_row
|
|
87
|
+
}
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
cells = rows[result.row].find('.//td|.//th').to_a
|
|
91
|
+
|
|
92
|
+
missing_cell = result.column - (cells.size-1)
|
|
93
|
+
if missing_cell > 0
|
|
94
|
+
unless cells.size > 0
|
|
95
|
+
raise GreenPepperMalformedTableError.new(
|
|
96
|
+
"Error : Example without cell")
|
|
97
|
+
end
|
|
98
|
+
copy_cell = cells[-1].copy true
|
|
99
|
+
|
|
100
|
+
missing_cell.times{
|
|
101
|
+
new_cell = LibXML::XML::Node.new cells[-1].name
|
|
102
|
+
|
|
103
|
+
cells[-1].parent << new_cell
|
|
104
|
+
cells << new_cell
|
|
105
|
+
}
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
result.write cells[result.column], @write_options
|
|
109
|
+
}
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end #module GreenPepper
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Martin Provencher(martin.provencher@usherbrooke.ca)
|
|
3
|
+
date: Mars 4, 2009
|
|
4
|
+
=end
|
|
5
|
+
module GreenPepper
|
|
6
|
+
|
|
7
|
+
class FileOutput
|
|
8
|
+
def initialize(output_document)
|
|
9
|
+
@output_document = output_document
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def print_output(result)
|
|
13
|
+
dir = File.dirname @output_document
|
|
14
|
+
Dir.mkdir(dir) unless File.exists? dir
|
|
15
|
+
File.open(@output_document, "w") { |f| f.write result }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class ConsoleOutput
|
|
20
|
+
def print_output(result)
|
|
21
|
+
puts result
|
|
22
|
+
result
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end #module GreenPepper
|