greenpepper-ruby 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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