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,44 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: October 3, 2009
4
+ =end
5
+
6
+ module GreenPepper
7
+
8
+ require 'rubygems'
9
+ require 'libxml'
10
+
11
+ require 'greenpepper/writer/freetextresult'
12
+ require 'greenpepper/parser/freetextparser'
13
+ require 'greenpepper/parser/scenario'
14
+
15
+ class FreeTextWriter
16
+ include KeywordFormat
17
+
18
+ def support? execution_unit
19
+ execution_unit.result.is_a? FreeTextExecutionResults
20
+ end
21
+ # Write the results
22
+ # Returns a string of the document
23
+ def write(html_doc, execution_units, write_options ={})
24
+
25
+ html_results = []
26
+ execution_units.each{ |unit|
27
+ html_results << example_to_html(unit.example, unit.result)
28
+ }
29
+
30
+ # Use the parser to replace the old scenario with the new one
31
+ parser = FreeTextParser.new
32
+ parser.replace_scenarios html_doc, html_results
33
+ end
34
+
35
+ # Visible for testing
36
+ def example_to_html(ex, results)
37
+ res = newline(results[0].write(nil))
38
+ results[1..-1].each_with_index{ |result, index|
39
+ res += indent(result.write(ex.actions[index]))
40
+ }
41
+ res
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,14 @@
1
+ =begin
2
+ author: Pascal Ouellet (pas.ouellet@gmail.com)
3
+ date: March 17, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ module Html
8
+ # HTML Hex colors
9
+ RED = "#F08080"
10
+ YELLOW = "#F0E68C"
11
+ GREEN = "#98FB98"
12
+ GREY ="#D3D3D3"
13
+ end
14
+ end #module GreenPepper
@@ -0,0 +1,82 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: March 13, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ require 'rubygems'
8
+ require 'libxml'
9
+ require 'greenpepper/writer/htmlruleforwriter'
10
+ require 'greenpepper/writer/htmlimportwriter'
11
+ require 'greenpepper/writer/htmlsetupwriter'
12
+ require 'greenpepper/writer/htmldowithwriter'
13
+ require 'greenpepper/writer/htmlcollectionwriter'
14
+ require 'greenpepper/writer/nullwriter'
15
+
16
+ class HtmlDocumentWriter
17
+ attr_reader :modified_doc
18
+ def initialize(base_html)
19
+ @html_doc = (LibXML::XML::HTMLParser.string base_html,
20
+ :encoding => LibXML::XML::Encoding::UTF_8,
21
+ :options => LibXML::XML::HTMLParser::Options::NOBLANKS).parse
22
+ @table_index = 0
23
+ @modified_doc = ""
24
+ @tables = @html_doc.find '//table'
25
+ end
26
+
27
+ def write(results)
28
+ table = @tables[@table_index]
29
+ w = create_writer results, table
30
+ @modified_doc = (w.write results)
31
+ @modified_doc = @modified_doc.doc.root.to_s unless @modified_doc == nil
32
+
33
+ @table_index += w.table_count
34
+ @modified_doc
35
+ end
36
+
37
+ def write_results(all_results)
38
+ stats_doc = ""
39
+
40
+ # We define another XML tree, since <table> is already the node of
41
+ # html_doc. We can't add another table to the actual one
42
+ stats = LibXML::XML::Parser.string(
43
+ "<table><tr><td>Successes: #{all_results.successes}</td>" +
44
+ "<td>Failures: #{all_results.failures}</td>" +
45
+ "<td>Errors: #{all_results.errors}</td></tr></table>").
46
+ parse.root.copy(true)
47
+
48
+
49
+ node = @html_doc.find_first 'body'
50
+ node = @html_doc.root if node == nil
51
+ if node.first?
52
+ node.first.prev = stats
53
+ else
54
+ node << stats
55
+ end
56
+ @modified_doc = @html_doc.to_s
57
+ end
58
+
59
+ private
60
+ def create_writer(results, table)
61
+ # TODO: Why is doesn't this create an exception? None of those class exist
62
+ # anymore.
63
+ if results.class == RuleForExampleExecutionStats
64
+ row_modifier = HtmlRuleForWriter.create_row_modifier
65
+ w = HtmlRuleForWriter.new table, row_modifier
66
+ elsif results.class == ImportExampleExecutionStats
67
+ row_modifier = HtmlImportWriter.create_row_modifier
68
+ w = HtmlImportWriter.new table, row_modifier
69
+ elsif results.class == SetupExampleExecutionStats
70
+ row_modifier = HtmlSetupWriter.create_row_modifier
71
+ w = HtmlSetupWriter.new table, row_modifier
72
+ elsif results.class == DoWithExampleExecutionStats
73
+ w = HtmlDoWithWriter.new table
74
+ elsif results.class == CollectionExampleExecutionStats
75
+ row_modifier = HtmlCollectionWriter.create_row_modifier
76
+ w = HtmlCollectionWriter.new table, row_modifier
77
+ else
78
+ w = NullWriter.new table
79
+ end
80
+ end
81
+ end
82
+ end #module GreenPepper
@@ -0,0 +1,192 @@
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/html'
8
+ require 'greenpepper/exception/greenpepperexception'
9
+ require 'greenpepper/writer/result'
10
+
11
+ class HtmlExampleResult < ExampleResult
12
+ attr_accessor :row, :column
13
+
14
+ def write(cell, options = {})
15
+ unless cell.instance_of? LibXML::XML::Node
16
+ raise GreenPepperArgumentError.new
17
+ end
18
+ cell
19
+ end
20
+ end
21
+
22
+ class NoExampleResult < HtmlExampleResult
23
+ end
24
+
25
+ class WriteTextExampleResult < HtmlExampleResult
26
+ def initialize(result, silent=false)
27
+ super(silent)
28
+ @result = result
29
+ end
30
+
31
+ def write(cell, options = {})
32
+ cell.content = "" if cell.content == " "
33
+ cell = super(cell, options)
34
+ cell << @result
35
+ cell
36
+ end
37
+ end
38
+
39
+ class SuccessExampleResult < HtmlExampleResult
40
+ def success?
41
+ true
42
+ end
43
+
44
+ def write(cell, options = {})
45
+ cell = super(cell, options)
46
+ cell["style"] = "background-color: #{Html::GREEN}"
47
+ cell
48
+ end
49
+ end
50
+
51
+ class FailureExampleResult < HtmlExampleResult
52
+ def failure?
53
+ true
54
+ end
55
+
56
+ def write(cell, options = {})
57
+ cell = super(cell, options)
58
+ cell["style"] = "background-color: #{Html::RED}"
59
+ cell
60
+ end
61
+ end
62
+
63
+ class ErrorExampleResult < HtmlExampleResult
64
+ def error?
65
+ true
66
+ end
67
+
68
+ def write(cell, options = {})
69
+ cell = super(cell, options)
70
+ cell["style"] = "background-color: #{Html::YELLOW}"
71
+ cell
72
+ end
73
+ end
74
+
75
+ class IgnoredExampleResult < HtmlExampleResult
76
+ def ignored?
77
+ true
78
+ end
79
+
80
+ def write(cell, options = {})
81
+ cell["style"] = "background-color: #{Html::GREY}"
82
+ cell
83
+ end
84
+ end
85
+
86
+ class WriteIgnoredExampleResult < WriteTextExampleResult
87
+ def ignored?
88
+ true
89
+ end
90
+
91
+ def write(cell, options = {})
92
+ cell = super(cell, options)
93
+ cell["style"] = "background-color: #{Html::GREY}"
94
+ cell
95
+ end
96
+ end
97
+
98
+ class WriteSucessExampleResult < SuccessExampleResult
99
+ def write(cell, options = {})
100
+ cell = super(cell, options)
101
+ cell << "Success"
102
+ end
103
+ end
104
+
105
+ class WriteFailExampleResult < FailureExampleResult
106
+ def write(cell, options = {})
107
+ cell = super(cell, options)
108
+ cell << "Fail"
109
+ end
110
+ end
111
+
112
+ class WriteExpectedExampleResult < FailureExampleResult
113
+ attr_reader :expected, :received
114
+ def initialize(expected, received, silent=false)
115
+ super(silent)
116
+ @expected = expected
117
+ @received = received
118
+ end
119
+
120
+ def write(cell, options = {})
121
+ cell = super(cell, options)
122
+
123
+ cell.children.each{|current_node|current_node.remove!}
124
+ cell << LibXML::XML::Node.new_text("")
125
+
126
+ expected_node = LibXML::XML::Node.new "b", "Expected: "
127
+ cell << expected_node
128
+ cell << @expected
129
+
130
+ received_node = LibXML::XML::Node.new "b", " Received: "
131
+ cell << received_node
132
+ cell << @received
133
+ end
134
+ end
135
+
136
+ class WriteExceptionExampleResult < ErrorExampleResult
137
+ attr :exception
138
+
139
+ def initialize(exception, silent=false)
140
+ super(silent)
141
+ @exception = exception
142
+ end
143
+
144
+ def write(cell, options = {})
145
+ cell = super(cell, options)
146
+
147
+ cell.content = "#{@exception.class}: #{@exception.to_s}"
148
+ if @exception.backtrace && !options[:no_exception_stack]
149
+ cell << LibXML::XML::Node.new('hr')
150
+ @exception.backtrace.each { |step|
151
+ cell << step
152
+ cell << LibXML::XML::Node.new('br')
153
+ }
154
+ end
155
+ cell
156
+ end
157
+ end
158
+
159
+ class WriteMissingExampleResult < FailureExampleResult
160
+ def write(cell, options = {})
161
+ super(cell, options)
162
+
163
+ missing = LibXML::XML::Node.new('i')
164
+ missing << "Missing "
165
+
166
+ content = cell.content
167
+
168
+ cell.content = ""
169
+ cell << missing
170
+ cell << content
171
+ end
172
+ end
173
+
174
+ class WriteSurplusExampleResult < FailureExampleResult
175
+ attr_reader :value
176
+ def initialize(value, silent=false)
177
+ super(silent)
178
+ @value = value
179
+ end
180
+
181
+ def write(cell, options = {})
182
+ super(cell, options)
183
+ surplus = LibXML::XML::Node.new('i')
184
+ surplus << "Surplus "
185
+
186
+ cell.content = ""
187
+ cell << surplus
188
+ cell << @value
189
+ end
190
+ end
191
+
192
+ end #module GreenPepper
@@ -0,0 +1,112 @@
1
+ =begin
2
+ author: Martin Provencher (martin.provencher@usherbrooke.ca)
3
+ date: April 25, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ require 'rubygems'
8
+ require 'libxml'
9
+ require 'greenpepper/example/executionresults'
10
+ require 'greenpepper/context/htmlcontext'
11
+ require 'greenpepper/parser/table'
12
+
13
+ class HtmlWriter
14
+ attr_reader :execution_units
15
+
16
+ def initialize
17
+ end
18
+
19
+ def output
20
+ @html_doc.to_s
21
+ end
22
+
23
+ def support? execution_unit
24
+ execution_unit.result.is_a? HtmlTableExecutionResults
25
+ end
26
+
27
+ def load_document(base_html, execution_units, write_options = {})
28
+ @html_doc = (LibXML::XML::HTMLParser.string base_html,
29
+ :encoding => LibXML::XML::Encoding::UTF_8,
30
+ :options => LibXML::XML::HTMLParser::Options::NOBLANKS).parse
31
+ @execution_units = execution_units
32
+ @tables = @html_doc.find('//table').to_a
33
+ @write_options = write_options
34
+
35
+ nb_results_table = 0
36
+ @execution_units.each{ |unit|
37
+ nb_results_table += unit.context.nb_table
38
+ }
39
+
40
+ if @tables.size != nb_results_table
41
+ raise "Execution results doesn't have the same number of html " +
42
+ "table than the file"
43
+ end
44
+ end
45
+
46
+ def write(base_html, execution_units, write_options = {})
47
+
48
+ load_document(base_html, execution_units, write_options)
49
+
50
+ @execution_units.each{ |unit|
51
+ all_example_table = []
52
+
53
+ @tables[unit.context.first_table_index, unit.context.nb_table].each{
54
+ |table|
55
+ all_example_table << table
56
+ }
57
+ write_results_to_html all_example_table, unit.result
58
+ }
59
+
60
+ @html_doc.to_s
61
+ end
62
+
63
+ private
64
+ def write_results_to_html(tables, result)
65
+ rows = []
66
+ tables.each{ |table|
67
+ rows += table.find('.//tr').to_a
68
+ }
69
+
70
+ result.each{ |result|
71
+ missing_row = result.row - (rows.size-1)
72
+ if missing_row > 0
73
+ unless rows.size > 0
74
+ raise GreenPepperMalformedTableError.new(
75
+ "Error : Example without row")
76
+ end
77
+ copy_row = rows[-1].copy true
78
+
79
+ missing_row.times {
80
+ new_row = LibXML::XML::Node.new rows[-1].name
81
+ copy_row.each_element{ |cell|
82
+ new_row << LibXML::XML::Node.new(cell.name)
83
+ }
84
+
85
+ rows[-1].parent << new_row
86
+ rows << new_row
87
+ }
88
+ end
89
+
90
+ cells = rows[result.row].find('.//td|.//th').to_a
91
+
92
+ missing_cell = result.column - (cells.size-1)
93
+ if missing_cell > 0
94
+ unless cells.size > 0
95
+ raise GreenPepperMalformedTableError.new(
96
+ "Error : Example without cell")
97
+ end
98
+ copy_cell = cells[-1].copy true
99
+
100
+ missing_cell.times{
101
+ new_cell = LibXML::XML::Node.new cells[-1].name
102
+
103
+ cells[-1].parent << new_cell
104
+ cells << new_cell
105
+ }
106
+ end
107
+
108
+ result.write cells[result.column], @write_options
109
+ }
110
+ end
111
+ end
112
+ end #module GreenPepper
@@ -0,0 +1,26 @@
1
+ =begin
2
+ author: Martin Provencher(martin.provencher@usherbrooke.ca)
3
+ date: Mars 4, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ class FileOutput
8
+ def initialize(output_document)
9
+ @output_document = output_document
10
+ end
11
+
12
+ def print_output(result)
13
+ dir = File.dirname @output_document
14
+ Dir.mkdir(dir) unless File.exists? dir
15
+ File.open(@output_document, "w") { |f| f.write result }
16
+ end
17
+ end
18
+
19
+ class ConsoleOutput
20
+ def print_output(result)
21
+ puts result
22
+ result
23
+ end
24
+ end
25
+
26
+ end #module GreenPepper