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