greenpepper-ruby 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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,152 @@
|
|
1
|
+
=begin
|
2
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
3
|
+
date: Feburary 20, 2008
|
4
|
+
=end
|
5
|
+
module GreenPepper
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
require 'libxml'
|
9
|
+
|
10
|
+
require 'greenpepper/converter'
|
11
|
+
require 'greenpepper/argumentparser'
|
12
|
+
require 'greenpepper/common/loadpath'
|
13
|
+
require 'greenpepper/pass/freetextpass'
|
14
|
+
require 'greenpepper/pass/tablepass'
|
15
|
+
require 'greenpepper/repository/atlassianrepository'
|
16
|
+
require 'greenpepper/writer/consolewriter'
|
17
|
+
require 'greenpepper/writer/htmlwriter'
|
18
|
+
require 'greenpepper/writer/xmlwriter'
|
19
|
+
require 'greenpepper/writer/output'
|
20
|
+
require 'greenpepper/logger'
|
21
|
+
require 'greenpepper/executionunit'
|
22
|
+
require 'greenpepper/pass/greenpepperpass'
|
23
|
+
|
24
|
+
$APP_NAME = "GreenPepper"
|
25
|
+
$VERSION = 0.1
|
26
|
+
|
27
|
+
class GreenPepperCore
|
28
|
+
|
29
|
+
def initialize(log = Logger.new(STDERR))
|
30
|
+
@log = log
|
31
|
+
|
32
|
+
# Disable libXML stderr output
|
33
|
+
LibXML::XML::Error.reset_handler
|
34
|
+
end
|
35
|
+
|
36
|
+
=begin
|
37
|
+
entry point for the application
|
38
|
+
=end
|
39
|
+
def run(args)
|
40
|
+
argument_parser = ArgumentParser.new args
|
41
|
+
execution_context = argument_parser.execution_context
|
42
|
+
@writer_options = argument_parser.writer_context
|
43
|
+
|
44
|
+
LoadPath.load execution_context[:load_path]
|
45
|
+
|
46
|
+
console_output = execution_context[:console_output]
|
47
|
+
unless console_output == ""
|
48
|
+
puts console_output
|
49
|
+
@log.log console_output
|
50
|
+
return
|
51
|
+
end
|
52
|
+
|
53
|
+
begin
|
54
|
+
|
55
|
+
results_array = Array.new
|
56
|
+
table_pass = TablePass.new
|
57
|
+
freetext_pass = FreeTextPass.new
|
58
|
+
|
59
|
+
GreenPepperPass.passes = [freetext_pass, table_pass]
|
60
|
+
|
61
|
+
execution_units = []
|
62
|
+
interpreted_html = read_input_file(execution_context)
|
63
|
+
|
64
|
+
# Don't execute if input file is empty
|
65
|
+
if interpreted_html.strip != ""
|
66
|
+
execution_units, interpreted_html =
|
67
|
+
GreenPepperPass.interpret interpreted_html,
|
68
|
+
execution_context[:input_document], @writer_options
|
69
|
+
|
70
|
+
results_array = ExecutionUnit.result_list(execution_units)
|
71
|
+
if execution_context[:html_results_output] &&
|
72
|
+
!execution_context[:xml_output]
|
73
|
+
interpreted_html = write_results interpreted_html, results_array
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
console_output = ConsoleOutput.new
|
78
|
+
console_output.print_output ConsoleWriter.new(results_array).output
|
79
|
+
|
80
|
+
if execution_context[:xml_output]
|
81
|
+
xml_writer = XmlWriter.new interpreted_html
|
82
|
+
interpreted_html = xml_writer.write_results results_array
|
83
|
+
end
|
84
|
+
|
85
|
+
output = FileOutput.new execution_context[:output_document]
|
86
|
+
output.print_output interpreted_html
|
87
|
+
return results_array
|
88
|
+
|
89
|
+
rescue GreenPepperLibXmlError, GreenPepperMalformedTableError => ex
|
90
|
+
@log.log_error "#{ex.to_s}\n #{print_backtrace ex.backtrace}"
|
91
|
+
return -1
|
92
|
+
rescue Exception => ex
|
93
|
+
@log.error "Internal Error."
|
94
|
+
@log.log "#{ex.to_s}\n #{print_backtrace ex.backtrace}"
|
95
|
+
raise ex
|
96
|
+
end
|
97
|
+
return 0
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def write_results(html, results_array)
|
103
|
+
html_doc = (LibXML::XML::Parser.string html,
|
104
|
+
:encoding => LibXML::XML::Encoding::UTF_8,
|
105
|
+
:options => LibXML::XML::Parser::Options::NOBLANKS).parse
|
106
|
+
|
107
|
+
all_result = HtmlTableExecutionResults.get_all_results(results_array)
|
108
|
+
|
109
|
+
# We define another XML tree, since <table> is already the node of
|
110
|
+
# html_doc. We can't add another table to the actual one
|
111
|
+
root = LibXML::XML::Parser.string(
|
112
|
+
"<table><tr><td>Successes: #{all_result.successes}</td>" +
|
113
|
+
"<td>Failures: #{all_result.failures}</td>" +
|
114
|
+
"<td>Errors: #{all_result.errors}</td></tr></table>").
|
115
|
+
parse.root
|
116
|
+
|
117
|
+
results = root.copy(true)
|
118
|
+
|
119
|
+
node = html_doc.find_first 'body'
|
120
|
+
node = html_doc.root if node.nil?
|
121
|
+
if node.first?
|
122
|
+
node.first.prev = results
|
123
|
+
else
|
124
|
+
node << results
|
125
|
+
end
|
126
|
+
html_doc.to_s
|
127
|
+
end
|
128
|
+
|
129
|
+
def print_backtrace backtrace
|
130
|
+
result = ""
|
131
|
+
backtrace.each{|s|
|
132
|
+
result << "\t" << s.to_s << "\n"
|
133
|
+
}
|
134
|
+
end
|
135
|
+
|
136
|
+
def read_input_file(execution_context)
|
137
|
+
if execution_context[:repository] != nil
|
138
|
+
repo = AtlassianRepository.new execution_context[:repository]
|
139
|
+
html = repo.load_document execution_context[:input_document]
|
140
|
+
else
|
141
|
+
file_path = execution_context[:input_document]
|
142
|
+
if !File.exists? file_path
|
143
|
+
raise GreenPepperFileNotFoundError.new(
|
144
|
+
"Cannot open input file : #{execution_context[:input_document]}")
|
145
|
+
end
|
146
|
+
|
147
|
+
html = File.open(file_path, 'r') { |f| f.read }
|
148
|
+
end
|
149
|
+
html
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end #module GreenPepper
|
@@ -0,0 +1,305 @@
|
|
1
|
+
=begin
|
2
|
+
author: Steven Denis (denis.steven@gmail.com)
|
3
|
+
Pascal Ouellet (pas.ouellet@gmail.com)
|
4
|
+
date: March 30, 2009
|
5
|
+
=end
|
6
|
+
|
7
|
+
require 'greenpepper/example/executionresults'
|
8
|
+
require 'greenpepper/exception/greenpepperexception'
|
9
|
+
require 'greenpepper/example/examplewithfixture'
|
10
|
+
require 'greenpepper/example/nameresolver'
|
11
|
+
require 'greenpepper/converter'
|
12
|
+
|
13
|
+
module GreenPepper
|
14
|
+
|
15
|
+
class CollectionExample < ExampleWithFixture
|
16
|
+
attr_reader :data, :headers_array
|
17
|
+
|
18
|
+
FIRST_DATA_ROW = 2
|
19
|
+
|
20
|
+
def initialize(fixture_name)
|
21
|
+
super fixture_name
|
22
|
+
@headers_array = []
|
23
|
+
@data = []
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_row(data)
|
27
|
+
@data.push data
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_headers(headers)
|
31
|
+
@headers_array += headers
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_header(header)
|
35
|
+
@headers_array.push header
|
36
|
+
end
|
37
|
+
|
38
|
+
def do_execute(results, fixture_class)
|
39
|
+
fixture = instantiate_fixture fixture_class
|
40
|
+
|
41
|
+
if fixture.respond_to? 'query'
|
42
|
+
begin
|
43
|
+
collection = fixture.query
|
44
|
+
rescue
|
45
|
+
results.add FIXTURE_NAME_ROW, FIXTURE_NAME_COLUMN, WriteExceptionExampleResult.new($!)
|
46
|
+
return results
|
47
|
+
end
|
48
|
+
else
|
49
|
+
ex = GreenPepperMissingMethodError.new(
|
50
|
+
"Cannot find method 'query' on fixture #{fixture.class}.")
|
51
|
+
results.add FIXTURE_NAME_ROW, FIXTURE_NAME_COLUMN, WriteExceptionExampleResult.new(ex)
|
52
|
+
return results
|
53
|
+
end
|
54
|
+
|
55
|
+
header_error = false
|
56
|
+
collection_object = collection[FIXTURE_NAME_ROW]
|
57
|
+
|
58
|
+
index_list = []
|
59
|
+
@headers_array.each_with_index do |header, header_index|
|
60
|
+
|
61
|
+
if header =='' ||!collection_object.respond_to?(header)
|
62
|
+
error = GreenPepperMissingHeaderError.new(
|
63
|
+
"Cannot find '#{header}' on object '#{fixture.class}'.")
|
64
|
+
results.add HEADER_ROW, header_index, WriteExceptionExampleResult.new(error)
|
65
|
+
index_list << header_index
|
66
|
+
else
|
67
|
+
results.add HEADER_ROW, header_index, NoExampleResult.new
|
68
|
+
end
|
69
|
+
end
|
70
|
+
index_list.each{|index| @headers_array[index] = nil if index != -1}
|
71
|
+
|
72
|
+
collection_data = []
|
73
|
+
collection.each do |collection_element|
|
74
|
+
collection_row = []
|
75
|
+
@headers_array.each do |header|
|
76
|
+
if header != nil
|
77
|
+
begin
|
78
|
+
field_value = NameResolver.get_instance_field(
|
79
|
+
collection_element, header)
|
80
|
+
collection_row << field_value
|
81
|
+
rescue => error
|
82
|
+
collection_row << error
|
83
|
+
end
|
84
|
+
else
|
85
|
+
collection_row << nil
|
86
|
+
end
|
87
|
+
end
|
88
|
+
collection_data << collection_row
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
example_data = []
|
93
|
+
@data.each_index do |row_index|
|
94
|
+
example_row = []
|
95
|
+
@headers_array.each_with_index do |header, header_index|
|
96
|
+
if header != nil
|
97
|
+
example_row << TypeConverter.instance.auto_convert_string(
|
98
|
+
collection_object, header, @data[row_index][header_index])
|
99
|
+
else
|
100
|
+
example_row << nil
|
101
|
+
end
|
102
|
+
end
|
103
|
+
example_data << example_row
|
104
|
+
end
|
105
|
+
do_execute_collection(results, example_data, collection_data)
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
class ListOfExample < CollectionExample
|
112
|
+
def do_execute_collection(results, example_data, collection_data)
|
113
|
+
table_size = [collection_data.size, example_data.size].max
|
114
|
+
|
115
|
+
table_size.times do |row_index|
|
116
|
+
result_compiled = false
|
117
|
+
@headers_array.each_with_index do |header, column_index|
|
118
|
+
if header == nil
|
119
|
+
results.add row_index + FIRST_DATA_ROW, column_index, NoExampleResult.new
|
120
|
+
else
|
121
|
+
if row_index < example_data.size
|
122
|
+
expected_value = example_data[row_index][column_index]
|
123
|
+
else
|
124
|
+
expected_value = :Surplus
|
125
|
+
end
|
126
|
+
|
127
|
+
if row_index < collection_data.size
|
128
|
+
received_value = collection_data[row_index][column_index]
|
129
|
+
else
|
130
|
+
received_value = :Missing
|
131
|
+
end
|
132
|
+
result, result_compiled = execute_cell(expected_value, received_value,
|
133
|
+
result_compiled)
|
134
|
+
results.add row_index + FIRST_DATA_ROW, column_index, result
|
135
|
+
end
|
136
|
+
end
|
137
|
+
results.successes += 1 if result_compiled == false
|
138
|
+
end
|
139
|
+
return results
|
140
|
+
end
|
141
|
+
|
142
|
+
def execute_cell(expected_value, received_value, result_compiled)
|
143
|
+
next_result_compiled = true
|
144
|
+
if result_compiled == false
|
145
|
+
if received_value.is_a? Exception
|
146
|
+
result = WriteExceptionExampleResult.new received_value
|
147
|
+
elsif expected_value == :Surplus
|
148
|
+
result = WriteSurplusExampleResult.new received_value
|
149
|
+
elsif received_value == :Missing
|
150
|
+
result = WriteMissingExampleResult.new
|
151
|
+
elsif (expected_value == received_value)
|
152
|
+
next_result_compiled = false
|
153
|
+
result = SuccessExampleResult.new true
|
154
|
+
else
|
155
|
+
result = WriteExpectedExampleResult.new expected_value, received_value
|
156
|
+
end
|
157
|
+
else
|
158
|
+
if received_value.is_a? Exception
|
159
|
+
result = WriteExceptionExampleResult.new received_value, true
|
160
|
+
elsif expected_value == :Surplus
|
161
|
+
result = WriteSurplusExampleResult.new received_value, true
|
162
|
+
elsif received_value == :Missing
|
163
|
+
result = WriteMissingExampleResult.new true
|
164
|
+
elsif (expected_value == received_value)
|
165
|
+
result = SuccessExampleResult.new true
|
166
|
+
else
|
167
|
+
result = WriteExpectedExampleResult.new expected_value, received_value, true
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
return result, next_result_compiled
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
class CollectionSetExample < CollectionExample
|
176
|
+
def initialize (fixture_name, found_handler,
|
177
|
+
not_found_handler, remain_handler,
|
178
|
+
error_handler = CollectionHandler::ERROR_HANDLER)
|
179
|
+
super fixture_name
|
180
|
+
@found_handler = found_handler
|
181
|
+
@not_found_handler = not_found_handler
|
182
|
+
@remain_handler = remain_handler
|
183
|
+
@error_handler = error_handler
|
184
|
+
end
|
185
|
+
|
186
|
+
def do_execute_collection(results, example_data, collection_data)
|
187
|
+
collection = collection_data.dup
|
188
|
+
last_row_idx = example_data.size
|
189
|
+
|
190
|
+
example_data.each_with_index do |example_row, row_index|
|
191
|
+
index = collection.index(example_row)
|
192
|
+
if index
|
193
|
+
@found_handler.call results, example_row, row_index
|
194
|
+
collection.delete_at index
|
195
|
+
else
|
196
|
+
@not_found_handler.call results, example_row, row_index
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
collection.each do |remaining_row|
|
201
|
+
if remaining_row.find { |value| value.is_a? Exception}
|
202
|
+
@error_handler.call results, remaining_row, last_row_idx
|
203
|
+
else
|
204
|
+
@remain_handler.call results, remaining_row, last_row_idx
|
205
|
+
end
|
206
|
+
last_row_idx += 1
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
class SetOfExample < CollectionSetExample
|
212
|
+
def initialize (fixture_name)
|
213
|
+
super fixture_name,
|
214
|
+
CollectionHandler::SUCCESS_HANDLER,
|
215
|
+
CollectionHandler::MISSING_HANDLER,
|
216
|
+
CollectionHandler::SURPLUS_HANDLER
|
217
|
+
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
class SupersetOfExample < CollectionSetExample
|
222
|
+
def initialize (fixture_name)
|
223
|
+
super fixture_name,
|
224
|
+
CollectionHandler::SUCCESS_HANDLER,
|
225
|
+
CollectionHandler::IGNORE_HANDLER,
|
226
|
+
CollectionHandler::SURPLUS_HANDLER
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
class SubsetOfExample < CollectionSetExample
|
231
|
+
def initialize (fixture_name)
|
232
|
+
super fixture_name,
|
233
|
+
CollectionHandler::SUCCESS_HANDLER,
|
234
|
+
CollectionHandler::MISSING_HANDLER,
|
235
|
+
CollectionHandler::NO_OP_HANDLER
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
module CollectionHandler
|
240
|
+
private
|
241
|
+
FIRST_DATA_ROW = 2
|
242
|
+
|
243
|
+
def self.handler(action)
|
244
|
+
return lambda do |results, row, row_index|
|
245
|
+
row.each_with_index do |value, col_index|
|
246
|
+
if col_index == 0
|
247
|
+
results.add row_index + FIRST_DATA_ROW, col_index, action.create(value)
|
248
|
+
else
|
249
|
+
results.add row_index + FIRST_DATA_ROW, col_index, action.create(value, true)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
class CollectionSuccessResult
|
256
|
+
def self.create(value, silent = false)
|
257
|
+
SuccessExampleResult.new silent
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
class CollectionSurplusResult
|
262
|
+
def self.create(value, silent = false)
|
263
|
+
WriteSurplusExampleResult.new value, silent
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
class CollectionMissingResult
|
268
|
+
def self.create(value, silent = false)
|
269
|
+
WriteMissingExampleResult.new silent
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
class CollectionIgnoredResult
|
274
|
+
def self.create(value, silent = false)
|
275
|
+
NoExampleResult.new silent
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
public
|
280
|
+
SUCCESS_HANDLER = handler CollectionSuccessResult
|
281
|
+
SURPLUS_HANDLER = handler CollectionSurplusResult
|
282
|
+
MISSING_HANDLER = handler CollectionMissingResult
|
283
|
+
IGNORE_HANDLER = handler CollectionIgnoredResult
|
284
|
+
NO_OP_HANDLER = lambda {}
|
285
|
+
|
286
|
+
ERROR_HANDLER = lambda do |results, row, row_index|
|
287
|
+
row.each_with_index do |value, col_index|
|
288
|
+
if col_index == 0
|
289
|
+
if value.is_a? Exception
|
290
|
+
result = WriteExceptionExampleResult.new(value)
|
291
|
+
else
|
292
|
+
result = WriteTextExampleResult.new(value)
|
293
|
+
end
|
294
|
+
else
|
295
|
+
if value.is_a? Exception
|
296
|
+
result = WriteExceptionExampleResult.new value, true
|
297
|
+
else
|
298
|
+
result = WriteTextExampleResult.new value, true
|
299
|
+
end
|
300
|
+
end
|
301
|
+
results.add row_index + FIRST_DATA_ROW, col_index, result
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end #module GreenPepper
|