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.
Files changed (120) hide show
  1. data/bin/greenpepperize +71 -0
  2. data/bin/greenpepperrails +33 -0
  3. data/bin/greenpepperruby +15 -0
  4. data/data/greenpepper.rake +37 -0
  5. data/data/helper.rb +32 -0
  6. data/data/tags +6 -0
  7. data/lib/greenpepper/argumentparser.rb +161 -0
  8. data/lib/greenpepper/common/loadpath.rb +7 -0
  9. data/lib/greenpepper/context/htmlcontext.rb +26 -0
  10. data/lib/greenpepper/converter.rb +347 -0
  11. data/lib/greenpepper/core.rb +152 -0
  12. data/lib/greenpepper/example/collectionexample.rb +305 -0
  13. data/lib/greenpepper/example/dowithexample.rb +192 -0
  14. data/lib/greenpepper/example/exampleheader.rb +41 -0
  15. data/lib/greenpepper/example/examplewithfixture.rb +73 -0
  16. data/lib/greenpepper/example/executionresults.rb +160 -0
  17. data/lib/greenpepper/example/fieldaccessor.rb +36 -0
  18. data/lib/greenpepper/example/freetextexample.rb +51 -0
  19. data/lib/greenpepper/example/importexample.rb +39 -0
  20. data/lib/greenpepper/example/nameresolver.rb +69 -0
  21. data/lib/greenpepper/example/ruleforexample.rb +117 -0
  22. data/lib/greenpepper/example/setupexample.rb +79 -0
  23. data/lib/greenpepper/example/silentexample.rb +14 -0
  24. data/lib/greenpepper/example/unknownexample.rb +17 -0
  25. data/lib/greenpepper/exception/greenpepperexception.rb +57 -0
  26. data/lib/greenpepper/executionunit.rb +39 -0
  27. data/lib/greenpepper/factory/collectionexamplefactory.rb +59 -0
  28. data/lib/greenpepper/factory/dowithexamplefactory.rb +71 -0
  29. data/lib/greenpepper/factory/examplefactory.rb +14 -0
  30. data/lib/greenpepper/factory/freetextexamplefactory.rb +29 -0
  31. data/lib/greenpepper/factory/htmlexamplefactory.rb +49 -0
  32. data/lib/greenpepper/factory/importexamplefactory.rb +27 -0
  33. data/lib/greenpepper/factory/ruleforexamplefactory.rb +46 -0
  34. data/lib/greenpepper/factory/setupexamplefactory.rb +31 -0
  35. data/lib/greenpepper/factory/silentexamplefactory.rb +21 -0
  36. data/lib/greenpepper/factory/unknownexamplefactory.rb +16 -0
  37. data/lib/greenpepper/freetext.rb +164 -0
  38. data/lib/greenpepper/grammar/array.treetop +51 -0
  39. data/lib/greenpepper/grammar/arrayparser.rb +14 -0
  40. data/lib/greenpepper/greenpepperconfig.rb +19 -0
  41. data/lib/greenpepper/greenpeppertask.rb +60 -0
  42. data/lib/greenpepper/logger.rb +45 -0
  43. data/lib/greenpepper/parser/freetextparser.rb +96 -0
  44. data/lib/greenpepper/parser/htmlparser.rb +70 -0
  45. data/lib/greenpepper/parser/scenario.rb +25 -0
  46. data/lib/greenpepper/parser/table.rb +37 -0
  47. data/lib/greenpepper/parser/wikiparser.rb +26 -0
  48. data/lib/greenpepper/pass/freetextpass.rb +24 -0
  49. data/lib/greenpepper/pass/greenpepperpass.rb +92 -0
  50. data/lib/greenpepper/pass/tablepass.rb +38 -0
  51. data/lib/greenpepper/railsargumentparser.rb +46 -0
  52. data/lib/greenpepper/redpeppertask.rb +89 -0
  53. data/lib/greenpepper/repository/atlassianrepository.rb +100 -0
  54. data/lib/greenpepper/writer/consolewriter.rb +21 -0
  55. data/lib/greenpepper/writer/freetextresult.rb +233 -0
  56. data/lib/greenpepper/writer/freetextwriter.rb +44 -0
  57. data/lib/greenpepper/writer/html.rb +14 -0
  58. data/lib/greenpepper/writer/htmldocwriter.rb +82 -0
  59. data/lib/greenpepper/writer/htmlresult.rb +192 -0
  60. data/lib/greenpepper/writer/htmlwriter.rb +112 -0
  61. data/lib/greenpepper/writer/output.rb +26 -0
  62. data/lib/greenpepper/writer/result.rb +35 -0
  63. data/lib/greenpepper/writer/xmlwriter.rb +32 -0
  64. data/test/coreseedstest.rb +39 -0
  65. data/test/greenpepper/argumentparsertest.rb +162 -0
  66. data/test/greenpepper/common/loadpathtest.rb +24 -0
  67. data/test/greenpepper/common/stattest.rb +186 -0
  68. data/test/greenpepper/convertertest.rb +371 -0
  69. data/test/greenpepper/coretest.rb +159 -0
  70. data/test/greenpepper/example/collectionexampletest.rb +484 -0
  71. data/test/greenpepper/example/dowithexampletest.rb +148 -0
  72. data/test/greenpepper/example/exampletest.rb +28 -0
  73. data/test/greenpepper/example/freetextexampletest.rb +151 -0
  74. data/test/greenpepper/example/importexampletest.rb +79 -0
  75. data/test/greenpepper/example/nameresolvertest.rb +56 -0
  76. data/test/greenpepper/example/ruleforexampletest.rb +225 -0
  77. data/test/greenpepper/example/setupexampletest.rb +140 -0
  78. data/test/greenpepper/example/silentexampletest.rb +17 -0
  79. data/test/greenpepper/example/unknownexampletest.rb +17 -0
  80. data/test/greenpepper/factory/collectionexamplefactorytest.rb +51 -0
  81. data/test/greenpepper/factory/dowithexamplefactorytest.rb +48 -0
  82. data/test/greenpepper/factory/examplefactorytest.rb +88 -0
  83. data/test/greenpepper/factory/freetextexamplefactorytest.rb +54 -0
  84. data/test/greenpepper/factory/importexamplefactorytest.rb +40 -0
  85. data/test/greenpepper/factory/ruleforexamplefactorytest.rb +55 -0
  86. data/test/greenpepper/factory/setupexamplefactorytest.rb +29 -0
  87. data/test/greenpepper/factory/silentexamplefactorytest.rb +38 -0
  88. data/test/greenpepper/freetexttest.rb +222 -0
  89. data/test/greenpepper/grammar/arrayparsertest.rb +45 -0
  90. data/test/greenpepper/loggertest.rb +26 -0
  91. data/test/greenpepper/parser/freetextparsertest.rb +124 -0
  92. data/test/greenpepper/parser/htmlparsertest.rb +77 -0
  93. data/test/greenpepper/parser/wikiparsertest.rb +21 -0
  94. data/test/greenpepper/pass/freetextpasstest.rb +54 -0
  95. data/test/greenpepper/pass/greenpepperpasstest.rb +47 -0
  96. data/test/greenpepper/pass/tablepasstest.rb +23 -0
  97. data/test/greenpepper/repository/atlassionrepositorytest.rb +85 -0
  98. data/test/greenpepper/writer/freetextwritertest.rb +301 -0
  99. data/test/greenpepper/writer/htmlcollectionwritertest.rb +145 -0
  100. data/test/greenpepper/writer/htmldowithwritertest.rb +87 -0
  101. data/test/greenpepper/writer/htmlruleforwritertest.rb +147 -0
  102. data/test/greenpepper/writer/htmlsetupwritertest.rb +107 -0
  103. data/test/greenpepper/writer/htmlstatresulttest.rb +118 -0
  104. data/test/greenpepper/writer/htmlwriterpositiontest.rb +53 -0
  105. data/test/greenpepper/writer/writertest.rb +33 -0
  106. data/test/greenpepper/writer/xmlwritertest.rb +34 -0
  107. data/test/integration/collectionexampleintegrationtest.rb +64 -0
  108. data/test/integration/errorhandlingintegrationtest.rb +68 -0
  109. data/test/integration/freetextexampleintegrationtest.rb +75 -0
  110. data/test/integration/greenpepperexecutableintegrationtest.rb +22 -0
  111. data/test/integration/importexampleintegrationtest.rb +41 -0
  112. data/test/integration/interpretationordertest.rb +48 -0
  113. data/test/integration/ruleforexampleintegrationtest.rb +102 -0
  114. data/test/integration/securityintegrationtest.rb +30 -0
  115. data/test/integration/setupexampleintegrationtest.rb +31 -0
  116. data/test/integration/silentexampleintegrationtest.rb +29 -0
  117. data/test/task/greenpeppertasktest.rb +96 -0
  118. data/test/task/redpeppertasktest.rb +120 -0
  119. data/vendor/accents.rb +85 -0
  120. 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