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