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,192 @@
|
|
1
|
+
=begin
|
2
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
3
|
+
date: March 9, 2009
|
4
|
+
=end
|
5
|
+
|
6
|
+
require 'greenpepper/example/examplewithfixture'
|
7
|
+
require 'greenpepper/example/nameresolver'
|
8
|
+
require 'greenpepper/converter'
|
9
|
+
require 'greenpepper/example/executionresults'
|
10
|
+
|
11
|
+
module GreenPepper
|
12
|
+
|
13
|
+
class DoWithExample < ExampleWithFixture
|
14
|
+
attr_reader :lines
|
15
|
+
|
16
|
+
def initialize(fixture_name, line_factory = DoWithLineFactory.new)
|
17
|
+
super fixture_name
|
18
|
+
@lines = []
|
19
|
+
@line_factory = line_factory
|
20
|
+
end
|
21
|
+
|
22
|
+
def do_execute(results, fixture_class)
|
23
|
+
fixture = instantiate_fixture fixture_class
|
24
|
+
|
25
|
+
if fixture.is_a? Class
|
26
|
+
e = GreenPepperSecurityError.new(
|
27
|
+
"Can't instantiate a subclass of Class.")
|
28
|
+
results.add FIXTURE_NAME_ROW, FIXTURE_NAME_COLUMN, WriteExceptionExampleResult.new(e)
|
29
|
+
return results
|
30
|
+
end
|
31
|
+
|
32
|
+
@lines.each_with_index{ |line, line_index|
|
33
|
+
begin
|
34
|
+
res = line.execute(fixture)
|
35
|
+
rescue => error
|
36
|
+
res = WriteExceptionExampleResult.new(error)
|
37
|
+
end
|
38
|
+
unless res.nil?
|
39
|
+
results.add line_index + FIRST_DATA_ROW, line.result_column, res
|
40
|
+
end
|
41
|
+
}
|
42
|
+
results
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_function_call(function, result_column, *params)
|
46
|
+
@lines << @line_factory.create_function_call(function,
|
47
|
+
result_column, params)
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_check(function, result_column, expected_val, *params)
|
51
|
+
@lines << @line_factory.create_check(function,
|
52
|
+
result_column, expected_val, params)
|
53
|
+
end
|
54
|
+
|
55
|
+
def add_accept(function, result_column, *params)
|
56
|
+
@lines << @line_factory.create_accept(function, result_column, params)
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_reject(function, result_column, *params)
|
60
|
+
@lines << @line_factory.create_reject(function, result_column, params)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class DoWithLineFactory
|
65
|
+
def create_function_call(function, result_column, params)
|
66
|
+
DoWithLineNoKeyword.new(function, result_column, params)
|
67
|
+
end
|
68
|
+
|
69
|
+
def create_check(function, result_column, expected_val, params)
|
70
|
+
DoWithLineCheck.new(function, result_column, expected_val, params)
|
71
|
+
end
|
72
|
+
|
73
|
+
def create_accept(function, result_column, params)
|
74
|
+
DoWithLineAccept.new(function, result_column, params)
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_reject(function, result_column, params)
|
78
|
+
DoWithLineReject.new(function, result_column, params)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class DoWithLine
|
83
|
+
attr_reader :function, :parameters, :result_column
|
84
|
+
|
85
|
+
def initialize(func, column, params)
|
86
|
+
@parameters = params
|
87
|
+
@function = NameResolver.format_column_name func
|
88
|
+
@result_column = column
|
89
|
+
end
|
90
|
+
|
91
|
+
def function?
|
92
|
+
false
|
93
|
+
end
|
94
|
+
|
95
|
+
def check?
|
96
|
+
false
|
97
|
+
end
|
98
|
+
|
99
|
+
def accept?
|
100
|
+
false
|
101
|
+
end
|
102
|
+
|
103
|
+
def reject?
|
104
|
+
false
|
105
|
+
end
|
106
|
+
|
107
|
+
protected
|
108
|
+
def call_func(fixture)
|
109
|
+
if !fixture.respond_to? @function
|
110
|
+
ErrorHelper.raise_greenpepper_missing_method @function, fixture
|
111
|
+
end
|
112
|
+
@parameters = convert_values(@parameters, fixture)
|
113
|
+
fixture.send @function, *@parameters
|
114
|
+
end
|
115
|
+
|
116
|
+
private
|
117
|
+
def convert_values(string_values, fixture)
|
118
|
+
TypeConverter.instance.auto_convert_string(
|
119
|
+
fixture, @function, string_values)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
class DoWithLineNoKeyword < DoWithLine
|
124
|
+
def execute(fixture)
|
125
|
+
call_func fixture
|
126
|
+
nil #Do not add a result
|
127
|
+
end
|
128
|
+
|
129
|
+
def function?
|
130
|
+
true
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
class DoWithLineCheck < DoWithLine
|
135
|
+
def initialize(func, column, expected_value, params)
|
136
|
+
super func, column, params
|
137
|
+
@expected_value = expected_value
|
138
|
+
end
|
139
|
+
|
140
|
+
def execute(fixture)
|
141
|
+
res = call_func fixture
|
142
|
+
#For Check functions, we need to have a way in the fixture to
|
143
|
+
#convert the string in the fixture. The function called by the
|
144
|
+
#converter will be parse_check_#{@function}
|
145
|
+
expected = TypeConverter.instance.auto_convert_string(
|
146
|
+
fixture, 'check_' + @function, @expected_value)
|
147
|
+
return SuccessExampleResult.new if res == expected
|
148
|
+
|
149
|
+
formated_result = TypeConverter.instance.auto_convert_object(
|
150
|
+
fixture,
|
151
|
+
'check_' + @function,
|
152
|
+
@expected_value,
|
153
|
+
res)
|
154
|
+
|
155
|
+
WriteExpectedExampleResult.new formated_result, @expected_value
|
156
|
+
end
|
157
|
+
|
158
|
+
def check?
|
159
|
+
true
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
class DoWithLineAccept < DoWithLine
|
164
|
+
def execute(fixture)
|
165
|
+
res = call_func fixture
|
166
|
+
return SuccessExampleResult.new if res == true
|
167
|
+
FailureExampleResult.new
|
168
|
+
end
|
169
|
+
|
170
|
+
def accept?
|
171
|
+
true
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
class DoWithLineReject < DoWithLine
|
176
|
+
def execute(fixture)
|
177
|
+
begin
|
178
|
+
res = call_func fixture
|
179
|
+
rescue Exception => e
|
180
|
+
res = false
|
181
|
+
end
|
182
|
+
|
183
|
+
return SuccessExampleResult.new if res == false
|
184
|
+
FailureExampleResult.new
|
185
|
+
end
|
186
|
+
|
187
|
+
def reject?
|
188
|
+
true
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
=begin
|
2
|
+
author: S�bastien Boisclair (Sebastien.Boisclair2@usherbrooke.ca)
|
3
|
+
date: September 15, 2009
|
4
|
+
=end
|
5
|
+
|
6
|
+
module GreenPepper
|
7
|
+
class ExampleBaseHeader
|
8
|
+
attr_accessor :name
|
9
|
+
|
10
|
+
def initialize(name="", name_resolver = NameResolver)
|
11
|
+
@name = name
|
12
|
+
@name_resolver= name_resolver
|
13
|
+
@formated_name = name_resolver.format_column_name name
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
@name
|
18
|
+
end
|
19
|
+
|
20
|
+
def verify_accessor(fixture_class)
|
21
|
+
return NoExampleResult.new(true) if @name == ''
|
22
|
+
if fixture_class.method_defined? "#{@formated_name}"
|
23
|
+
return NoExampleResult.new(true)
|
24
|
+
else
|
25
|
+
error = GreenPepperMissingHeaderError.new(
|
26
|
+
"Cannot find method \"#{@formated_name}\".")
|
27
|
+
return WriteExceptionExampleResult.new(error)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class ExampleInputHeader < ExampleBaseHeader
|
33
|
+
def execute(value, fixture, value_format = nil)
|
34
|
+
if @formated_name.strip != ''
|
35
|
+
return NoExampleResult.new if !fixture.respond_to? @formated_name
|
36
|
+
@name_resolver.set_instance_field fixture, @formated_name, value
|
37
|
+
end
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
=begin
|
2
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
3
|
+
date: March 19, 2009
|
4
|
+
=end
|
5
|
+
|
6
|
+
require 'greenpepper/example/executionresults'
|
7
|
+
require 'greenpepper/example/nameresolver'
|
8
|
+
|
9
|
+
module GreenPepper
|
10
|
+
class ExampleWithFixture
|
11
|
+
attr_accessor :fixture_name, :fixture_arguments, :headers
|
12
|
+
|
13
|
+
EXAMPLE_NAME_ROW = 0
|
14
|
+
EXAMPLE_NAME_COLUMN = 0
|
15
|
+
FIXTURE_NAME_ROW = 0
|
16
|
+
FIXTURE_NAME_COLUMN = 1
|
17
|
+
HEADER_ROW = 1
|
18
|
+
FIRST_DATA_ROW = 1
|
19
|
+
|
20
|
+
def initialize(fixture_name)
|
21
|
+
if fixture_name == nil
|
22
|
+
raise GreenPepperMalformedTableError.new(
|
23
|
+
'No fixture name provided')
|
24
|
+
end
|
25
|
+
@fixture_name = fixture_name
|
26
|
+
@fixture_arguments = []
|
27
|
+
@headers = []
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_fixture_argument(value)
|
31
|
+
@fixture_arguments <<
|
32
|
+
TypeConverter.instance.convert_string(value)
|
33
|
+
end
|
34
|
+
|
35
|
+
def execute
|
36
|
+
fixture_class = NameResolver.solve_fixture_name(@fixture_name)
|
37
|
+
results = HtmlTableExecutionResults.new
|
38
|
+
|
39
|
+
if fixture_class.nil?
|
40
|
+
results.add FIXTURE_NAME_ROW, FIXTURE_NAME_COLUMN,
|
41
|
+
ErrorExampleResult.new
|
42
|
+
return results
|
43
|
+
end
|
44
|
+
|
45
|
+
begin
|
46
|
+
check_headers fixture_class, results, HEADER_ROW
|
47
|
+
do_execute results, fixture_class
|
48
|
+
rescue GreenPepperError => e
|
49
|
+
raise e
|
50
|
+
rescue Exception => e
|
51
|
+
results.add FIXTURE_NAME_ROW, FIXTURE_NAME_COLUMN,
|
52
|
+
WriteExceptionExampleResult.new(e)
|
53
|
+
end
|
54
|
+
results
|
55
|
+
end
|
56
|
+
|
57
|
+
protected
|
58
|
+
def check_headers(fixture, results, row_number)
|
59
|
+
@headers.each_with_index do |header,header_index|
|
60
|
+
result = header.verify_accessor(fixture)
|
61
|
+
results.add(row_number, header_index, result)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def instantiate_fixture(fixture_class)
|
66
|
+
if fixture_class.instance_method(:initialize).arity > 0
|
67
|
+
fixture_class.new *@fixture_arguments
|
68
|
+
else
|
69
|
+
fixture_class.new
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,160 @@
|
|
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/htmlresult'
|
8
|
+
|
9
|
+
class ExecutionResults
|
10
|
+
attr_accessor :successes, :failures, :errors, :ignored
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@successes = 0
|
14
|
+
@failures = 0
|
15
|
+
@errors = 0
|
16
|
+
@ignored = 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_success
|
20
|
+
@successes += 1
|
21
|
+
end
|
22
|
+
|
23
|
+
def add_failure
|
24
|
+
@failures += 1
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_error
|
28
|
+
@errors += 1
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_ignore
|
32
|
+
@ignored += 1
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.get_all_results(results_array)
|
36
|
+
results = HtmlTableExecutionResults.new
|
37
|
+
|
38
|
+
results_array.each{ |result|
|
39
|
+
results.successes += result.successes
|
40
|
+
results.failures += result.failures
|
41
|
+
results.errors += result.errors
|
42
|
+
results.ignored += result.ignored
|
43
|
+
}
|
44
|
+
results
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
def update_stats(result)
|
49
|
+
unless result.silent
|
50
|
+
@successes += 1 if result.success?
|
51
|
+
@failures += 1 if result.failure?
|
52
|
+
@errors += 1 if result.error?
|
53
|
+
@ignored += 1 if result.ignored?
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class FreeTextExecutionResults < ExecutionResults
|
59
|
+
attr_reader :results
|
60
|
+
def initialize
|
61
|
+
super
|
62
|
+
@results = []
|
63
|
+
end
|
64
|
+
|
65
|
+
def add_result(result)
|
66
|
+
@results << result
|
67
|
+
result.update_stats(self)
|
68
|
+
end
|
69
|
+
|
70
|
+
def [](value)
|
71
|
+
results[value]
|
72
|
+
end
|
73
|
+
|
74
|
+
def to_s
|
75
|
+
@results.join("\n")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class HtmlTableExecutionResults < ExecutionResults
|
80
|
+
attr_accessor :context
|
81
|
+
attr_reader :size
|
82
|
+
|
83
|
+
def initialize
|
84
|
+
super
|
85
|
+
@results = Array.new
|
86
|
+
@size = 0
|
87
|
+
end
|
88
|
+
|
89
|
+
def add(row, column, result)
|
90
|
+
(row - (@results.size - 1)).times{ @results << []}
|
91
|
+
(column - (@results[row].size - 1)).times{ @results[row] << nil}
|
92
|
+
|
93
|
+
result.row = row
|
94
|
+
result.column = column
|
95
|
+
@results[row][column] = result
|
96
|
+
@size += 1
|
97
|
+
|
98
|
+
update_stats result
|
99
|
+
result
|
100
|
+
end
|
101
|
+
|
102
|
+
def delete_at(row, column)
|
103
|
+
result = @results[row][column] unless check_index(row, column) == false
|
104
|
+
return nil if result == nil
|
105
|
+
|
106
|
+
unless result.silent
|
107
|
+
@successes -= 1 if result.success?
|
108
|
+
@failures -= 1 if result.failure?
|
109
|
+
@errors -= 1 if result.error?
|
110
|
+
@ignored -= 1 if result.ignored?
|
111
|
+
end
|
112
|
+
|
113
|
+
@results[row][column] = nil
|
114
|
+
@size -= 1
|
115
|
+
result
|
116
|
+
end
|
117
|
+
|
118
|
+
def each
|
119
|
+
@results.each{ |row|
|
120
|
+
row.each{ |result|
|
121
|
+
yield result unless result == nil
|
122
|
+
}
|
123
|
+
}
|
124
|
+
end
|
125
|
+
|
126
|
+
def each_with_index_and_nil
|
127
|
+
@results.each_with_index{ |row, row_idx|
|
128
|
+
row.each_with_index{ |cell, cell_idx|
|
129
|
+
yield cell, row_idx, cell_idx
|
130
|
+
}
|
131
|
+
}
|
132
|
+
end
|
133
|
+
|
134
|
+
def at(row, column)
|
135
|
+
return @results[row][column] unless check_index(row, column) == false
|
136
|
+
nil
|
137
|
+
end
|
138
|
+
|
139
|
+
def to_s
|
140
|
+
s = ""
|
141
|
+
@results.each{|row|
|
142
|
+
s << "|"
|
143
|
+
row.each{|result|
|
144
|
+
s << sprintf("%25s |", result.class.to_s)
|
145
|
+
}
|
146
|
+
s << "\n"
|
147
|
+
}
|
148
|
+
s[-1] = ""
|
149
|
+
s
|
150
|
+
end
|
151
|
+
|
152
|
+
private
|
153
|
+
def check_index(row, column)
|
154
|
+
return false if row >= @results.size or column >= @results[row].size
|
155
|
+
true
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
end #module GreenPepper
|