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,36 @@
1
+ =begin
2
+ author: Murat Edouard
3
+ date: September 5, 2009
4
+ =end
5
+
6
+ module GreenPepper
7
+
8
+ require 'greenpepper/exception/greenpepperexception'
9
+
10
+ class InstanceFieldAccessor
11
+ def access_instance_field(fixture, field_name, value=nil)
12
+ method = fixture.public_methods.find{
13
+ |method| method.to_s == field_name
14
+ }
15
+ if method.nil?
16
+ raise ErrorHelper.raise_greenpepper_missing_method(
17
+ field_name, fixture)
18
+ else
19
+ call_accessor fixture.method(field_name), value
20
+ end
21
+ end
22
+ end
23
+
24
+ class ReaderFieldAccessor < InstanceFieldAccessor
25
+ def call_accessor(method, value)
26
+ return method.call
27
+ end
28
+ end
29
+
30
+ class WriterFieldAccessor < InstanceFieldAccessor
31
+ def call_accessor(method, value)
32
+ method.call value
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,51 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: September 13, 2009
4
+ =end
5
+
6
+ module GreenPepper
7
+
8
+ require 'greenpepper/example/executionresults'
9
+ require 'greenpepper/example/nameresolver'
10
+ require 'greenpepper/example/examplewithfixture'
11
+ require 'greenpepper/writer/freetextresult'
12
+
13
+ class FreeTextExample
14
+ attr_reader :actions, :fixture_name
15
+
16
+ def initialize(fixture_name)
17
+ @fixture_name = fixture_name
18
+ @actions = []
19
+ end
20
+
21
+ def add_action(action)
22
+ @actions << action
23
+ end
24
+
25
+ def execute
26
+ results = FreeTextExecutionResults.new
27
+ fixture_class = NameResolver.solve_fixture_name(@fixture_name)
28
+
29
+ if fixture_class.nil?
30
+ results.add_result HeaderError.new(@fixture_name,
31
+ GreenPepperMissingHeaderError.new)
32
+ return results
33
+ end
34
+
35
+ results.add_result HeaderSuccess.new(@fixture_name)
36
+
37
+ fixture = fixture_class.new
38
+
39
+ @actions.each_with_index{ |action, index|
40
+ begin
41
+ keyword = fixture.greenpepper_map_action action
42
+ results.add_result keyword.get_result
43
+ rescue Exception => e
44
+ results.add_result ActionError.new(e)
45
+ end
46
+ }
47
+
48
+ results
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,39 @@
1
+ =begin
2
+ authors: Pascal Ouellet (pas.ouellet@gmail.com)
3
+ date: March 6, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ require 'greenpepper/example/executionresults'
8
+ require 'greenpepper/writer/htmlresult'
9
+
10
+ class ImportExample
11
+ attr_reader :imports
12
+
13
+ FIRST_DATA_ROW = 1
14
+ DATA_COLUMN = 0
15
+
16
+ def initialize
17
+ @imports = Array.new
18
+ end
19
+
20
+ def add(*imports)
21
+ @imports.concat imports
22
+ end
23
+
24
+ def execute
25
+ results = HtmlTableExecutionResults.new
26
+ @imports.each_with_index do |import, index|
27
+ begin
28
+ require import
29
+ results.add index + FIRST_DATA_ROW, DATA_COLUMN, NoExampleResult.new
30
+ rescue Exception => e
31
+ e = e.exception "Failed to import #{import}: #{e.exception}"
32
+ results.add index + FIRST_DATA_ROW, DATA_COLUMN, WriteExceptionExampleResult.new(e, true)
33
+ end
34
+ end
35
+ results
36
+ end
37
+ end
38
+
39
+ end #module GreenPepper
@@ -0,0 +1,69 @@
1
+ =begin
2
+ author: Sebastien Boisclair (SebBoisclair@gmail.com)
3
+ date: March 8, 2009
4
+ =end
5
+
6
+ require 'greenpepper/example/fieldaccessor'
7
+ require 'accents'
8
+
9
+ module GreenPepper
10
+
11
+ module NameResolver
12
+ def NameResolver.solve_fixture_name(fixture_name)
13
+ # Remove accents using third party library
14
+ # Ex. é => e
15
+ fixture_name = fixture_name.removeaccents
16
+
17
+ # Ignore illegal caracters
18
+ fixture_name = fixture_name.gsub /[^a-zA-Z0-9_\s]/, ""
19
+ regex = create_regex(fixture_name)
20
+ fixture_classes = []
21
+
22
+ Module.constants.each{|constant|
23
+ if(regex.match(constant))
24
+ fixture_classes.push(constant)
25
+ end
26
+ }
27
+ return nil if(fixture_classes.length == 0)
28
+
29
+
30
+ fixture_name_class = fixture_classes.find{|fixture_string|
31
+ /.*(f|F)ixture$/ === fixture_string
32
+ }
33
+
34
+ if fixture_name_class == nil
35
+ fixture_name_class = fixture_classes[0]
36
+ end
37
+ Object.const_get fixture_name_class
38
+ end
39
+
40
+ def NameResolver.format_column_name name
41
+ string = name.strip.downcase.split(' ').join('_')
42
+ end
43
+
44
+ def NameResolver.set_instance_field fixture, field_name, value
45
+ writer = WriterFieldAccessor.new
46
+ writer.access_instance_field fixture, field_name + "=", value
47
+ end
48
+
49
+ def NameResolver.get_instance_field fixture, field_name
50
+ reader = ReaderFieldAccessor.new
51
+ reader.access_instance_field fixture, field_name
52
+ end
53
+
54
+ private
55
+
56
+ def NameResolver.create_regex(fixture_name)
57
+ fixture_regex = '^'
58
+ fixture_name = fixture_name.gsub( / |_/, "_?")
59
+ if lower_word = fixture_name.scan( /[^A-Z]*/)
60
+ fixture_regex += lower_word[0]
61
+ end
62
+ fixture_name.scan(/[A-Z][^A-Z]*/).each{|word|fixture_regex += "_?" + word}
63
+
64
+ fixture_regex +='_?(fixture)?\s*$'
65
+ Regexp.new fixture_regex, 'i'
66
+ end
67
+ end # Module NameResolver
68
+
69
+ end # Module GreenPepper
@@ -0,0 +1,117 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: March 9, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ require 'greenpepper/example/executionresults'
8
+ require 'greenpepper/example/nameresolver'
9
+ require 'greenpepper/example/examplewithfixture'
10
+ require 'greenpepper/example/exampleheader'
11
+ require 'greenpepper/converter'
12
+ require 'greenpepper/exception/greenpepperexception'
13
+
14
+ class RuleForExample < ExampleWithFixture
15
+
16
+ attr_reader :values
17
+
18
+ FIRST_DATA_ROW = 2
19
+
20
+ def initialize(fixture_name, name_resolver = NameResolver)
21
+ super fixture_name
22
+ @values = Array.new
23
+ @name_resolver = name_resolver
24
+ end
25
+
26
+ def add_header(name)
27
+ output_header_regex = /\s*(.*)\?\s*\Z/
28
+ if output_header_regex === name
29
+ add_output_header($1)
30
+ else
31
+ add_input_header(name)
32
+ end
33
+ end
34
+
35
+ def add_input_header(name)
36
+ header = ExampleInputHeader.new(name, @name_resolver)
37
+ @headers.push header
38
+ header
39
+ end
40
+
41
+ def add_output_header(name)
42
+ header = RuleForOutputHeader.new(name, @name_resolver)
43
+ @headers.push header
44
+ header
45
+ end
46
+
47
+ def add_row(values_array)
48
+ @values.push values_array
49
+ end
50
+
51
+ def do_execute(results, fixture_class)
52
+ @values.each_index{ |row_index|
53
+ # We instantiate a fixture every row to reset the object
54
+ fixture = instantiate_fixture fixture_class
55
+
56
+ headers.each_index{ |column_index|
57
+ header = headers[column_index]
58
+ string_value = @values[row_index][column_index]
59
+ value = TypeConverter.instance.auto_convert_string(
60
+ fixture, header.name, string_value)
61
+
62
+ #The output header needs to keep the value of an empty string
63
+ #instead of nil because it needs to differentiate the nil value
64
+ #and an ignored cell.
65
+ if header.class == RuleForOutputHeader &&
66
+ (string_value == '')
67
+ value = ''
68
+ end
69
+ result = header.execute( value, fixture, string_value)
70
+ results.add row_index + FIRST_DATA_ROW, column_index,
71
+ result unless result == nil
72
+ }
73
+ }
74
+ results
75
+ end
76
+
77
+ end
78
+
79
+ class RuleForOutputHeader < ExampleBaseHeader
80
+
81
+ def execute(value, fixture, value_format)
82
+ return NoExampleResult.new if !fixture.respond_to? @formated_name
83
+
84
+ begin
85
+ result = get_result fixture
86
+ rescue Exception => e
87
+ if value.is_a? Exception
88
+ return SuccessExampleResult.new
89
+ end
90
+ return WriteExceptionExampleResult.new(e)
91
+ end
92
+
93
+ return SuccessExampleResult.new if value == result
94
+
95
+ formated_result = TypeConverter.instance.auto_convert_object(
96
+ fixture,
97
+ @name,
98
+ value_format,
99
+ result)
100
+
101
+ formated_value = TypeConverter.instance.auto_convert_object(
102
+ fixture,
103
+ @name,
104
+ value_format,
105
+ value)
106
+
107
+ return WriteIgnoredExampleResult.new(formated_result) if value == ''
108
+ return WriteExpectedExampleResult.new(formated_value, formated_result)
109
+ end
110
+
111
+ private
112
+ def get_result(fixture)
113
+ fixture.send @formated_name
114
+ end
115
+ end
116
+
117
+ end #module GreenPepper
@@ -0,0 +1,79 @@
1
+ =begin
2
+ author: Martin Provencher (martin.provencher@usherbrooke.ca)
3
+ date: March 23, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ require 'greenpepper/example/nameresolver'
8
+ require 'greenpepper/example/examplewithfixture'
9
+ require 'greenpepper/example/exampleheader'
10
+ require 'greenpepper/converter'
11
+ require 'greenpepper/exception/greenpepperexception'
12
+
13
+ class SetupExample < ExampleWithFixture
14
+
15
+ attr_reader :values
16
+ FIXTURE_NAME_ROW = 0
17
+ FIXTURE_NAME_COL = 1
18
+ FIRST_DATA_ROW = 2
19
+ HEADER_ROW = 1
20
+
21
+ def initialize(fixture_name, name_resolver = NameResolver)
22
+ super fixture_name
23
+ @values = Array.new
24
+ @name_resolver= name_resolver
25
+ end
26
+
27
+ def add_header(name)
28
+ header = ExampleInputHeader.new(@name_resolver.format_column_name(name),
29
+ @name_resolver)
30
+ @headers.push header
31
+ header
32
+ end
33
+
34
+ def add_row(values_array)
35
+ @values.push values_array
36
+ end
37
+
38
+ def do_execute(results, fixture_class)
39
+ fixture = instantiate_fixture fixture_class
40
+
41
+ if !(fixture.respond_to? "enter_row")
42
+ ex = ErrorHelper.create_greenpepper_missing_method 'enter_row',
43
+ fixture_class
44
+ results.add FIXTURE_NAME_ROW, FIXTURE_NAME_COL,
45
+ WriteExceptionExampleResult.new(ex)
46
+ return results
47
+ end
48
+
49
+ @values.each_index{ |row_index|
50
+ headers.each_index{ |column_index|
51
+ header = headers[column_index]
52
+ string_value = @values[row_index][column_index]
53
+ value = TypeConverter.instance.auto_convert_string(
54
+ fixture, header.name, string_value)
55
+
56
+ begin
57
+ header.execute value, fixture
58
+ rescue => error
59
+ result = WriteExceptionExampleResult.new(error)
60
+ results.add row_index + FIRST_DATA_ROW, column_index, result
61
+ end
62
+ }
63
+ begin
64
+ result = fixture.enter_row
65
+ if result
66
+ result = WriteSucessExampleResult.new true
67
+ else
68
+ result = WriteFailExampleResult.new
69
+ end
70
+ rescue => error
71
+ result = WriteExceptionExampleResult.new(error)
72
+ end
73
+ results.add row_index + FIRST_DATA_ROW, headers.size, result
74
+ }
75
+ results
76
+ end
77
+
78
+ end
79
+ end #module GreenPepper
@@ -0,0 +1,14 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: September 27, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ class SilentExample
8
+ def execute
9
+ results = HtmlTableExecutionResults.new
10
+ results.add(0, 0, IgnoredExampleResult.new)
11
+ results
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: March 30, 2009
4
+ =end
5
+
6
+ require 'greenpepper/example/executionresults'
7
+
8
+ module GreenPepper
9
+
10
+ class UnknownExample
11
+ def execute
12
+ results = HtmlTableExecutionResults.new
13
+ results.add 0, 0, ErrorExampleResult.new
14
+ results
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,57 @@
1
+ =begin
2
+ author: Pascal Ouellet (pas.ouellet@gmail.com)
3
+ date: March 17, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ class GreenPepperError < StandardError
8
+ end
9
+
10
+ class GreenPepperArgumentError < GreenPepperError
11
+ end
12
+
13
+ class GreenPepperMalformedTableError < GreenPepperError
14
+ end
15
+
16
+ class GreenPepperLibXmlError < GreenPepperError
17
+ end
18
+
19
+ class GreenPepperTypeError < GreenPepperError
20
+ end
21
+
22
+ class GreenPepperSecurityError < GreenPepperError
23
+ end
24
+
25
+ class GreenPepperMissingMethodError < GreenPepperError
26
+ end
27
+
28
+ class GreenPepperMissingHeaderError < GreenPepperError
29
+ end
30
+
31
+ class GreenPepperElementError < GreenPepperError
32
+ end
33
+
34
+ class GreenPepperFileNotFoundError < GreenPepperError
35
+ end
36
+
37
+ class GreenPepperRepositoryError < GreenPepperError
38
+ end
39
+
40
+ class GreenPepperUnknownActionError < GreenPepperError
41
+ end
42
+
43
+ class GreenPepperNoScenarioInTag < GreenPepperError
44
+ end
45
+
46
+ module ErrorHelper
47
+ def ErrorHelper.raise_greenpepper_missing_method(func, fixture)
48
+ raise create_greenpepper_missing_method(func, fixture)
49
+ end
50
+
51
+ def ErrorHelper.create_greenpepper_missing_method(func, fixture)
52
+ GreenPepperMissingMethodError.new(
53
+ "Cannot find method #{func} on fixture #{fixture.class}.")
54
+ end
55
+ end
56
+
57
+ end #module GreenPepper