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