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