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,39 @@
1
+ =begin
2
+ author: Pascal Ouellet (pas.ouellet@gmail.com)
3
+ Sebastien Boisclair (sebboisclair@gmail.com)
4
+ date: October 24, 2009
5
+ =end
6
+
7
+ module GreenPepper
8
+ class ExecutionUnit
9
+ attr_accessor :content, # Raw HTML content
10
+ :context, # Context of extraction of the content
11
+ :example, # Example that can be executed
12
+ :result # Result of the execution
13
+
14
+ def initialize(content, context, example = nil, result = nil)
15
+ @content = content
16
+ @context = context
17
+ @example = example
18
+ @result = result
19
+ end
20
+
21
+ def execute
22
+ @result = example.execute
23
+ end
24
+
25
+ def self.result_list(execution_units)
26
+ result_list = []
27
+
28
+ execution_units.each {|ex_unit| result_list << ex_unit.result}
29
+ result_list
30
+ end
31
+
32
+ def self.content_list(execution_units)
33
+ contents = []
34
+
35
+ execution_units.each {|ex_unit| contents << ex_unit.content}
36
+ contents
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,59 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: March 30, 2009
4
+ =end
5
+
6
+ module GreenPepper
7
+
8
+ require 'greenpepper/example/collectionexample'
9
+ require 'greenpepper/factory/examplefactory'
10
+
11
+ class CollectionExampleFactory < ExampleFactory
12
+ def create_example(table)
13
+ ex = do_create_example table[0][1]
14
+ table[1].each{|header| ex.add_header header}
15
+ table[2..-1].each{|row| ex.add_row row}
16
+ ex
17
+ end
18
+ end
19
+
20
+ class ListOfExampleFactory < CollectionExampleFactory
21
+ def support?(table)
22
+ /^\s*List\s*Of\s*$/i === table[0][0]
23
+ end
24
+
25
+ def do_create_example(fixture_name)
26
+ ListOfExample.new fixture_name
27
+ end
28
+ end
29
+
30
+ class SetOfExampleFactory < CollectionExampleFactory
31
+ def support?(table)
32
+ /^\s*set\s*Of\s*$/i === table[0][0]
33
+ end
34
+
35
+ def do_create_example(fixture_name)
36
+ SetOfExample.new fixture_name
37
+ end
38
+ end
39
+
40
+ class SubsetOfExampleFactory < CollectionExampleFactory
41
+ def support?(table)
42
+ /^\s*subset\s*Of\s*$/i === table[0][0]
43
+ end
44
+
45
+ def do_create_example(fixture_name)
46
+ SubsetOfExample.new fixture_name
47
+ end
48
+ end
49
+
50
+ class SupersetOfExampleFactory < CollectionExampleFactory
51
+ def support?(table)
52
+ /^\s*superset\s*Of\s*$/i === table[0][0]
53
+ end
54
+
55
+ def do_create_example(fixture_name)
56
+ SupersetOfExample.new fixture_name
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,71 @@
1
+ =begin
2
+ author: Steven Denis (denis.steven@gmail.com)
3
+ date: March 23, 2009
4
+ =end
5
+
6
+ module GreenPepper
7
+
8
+ require 'greenpepper/example/dowithexample'
9
+ require 'greenpepper/factory/examplefactory'
10
+
11
+ class DoWithExampleFactory < ExampleFactory
12
+ def create_example(table)
13
+ return nil unless support? table
14
+
15
+ # fixture name in cell 0,1
16
+ example = create_example_factory table[0][1]
17
+
18
+ # data in next rows
19
+ table[1..-1].each {|row|
20
+ execute_dowith_line row, example
21
+ }
22
+ return example
23
+ end
24
+
25
+ def support?(table)
26
+ /^\s*do\s*with\s*$/i === table[0][0]
27
+ end
28
+
29
+ def last_table?(table)
30
+ /^\s*end\s*$/i === table[-1][0]
31
+ end
32
+
33
+ protected
34
+ def create_example_factory(name)
35
+ DoWithExample.new(name)
36
+ end
37
+
38
+ def execute_dowith_line(row, example)
39
+ case row[0]
40
+ when /^\s*check\s*$/i
41
+ function, params = parse_row row[1..-2]
42
+ example.add_check function, row.length-1, row[-1], *params
43
+ when /^\s*accept\s*$/i
44
+ function, params = parse_row row[1..-1]
45
+ example.add_accept function, 0, *params
46
+ when /^\s*reject\s*$/i
47
+ function, params = parse_row row[1..-1]
48
+ example.add_reject function, 0, *params
49
+ when /^\s*end\s*$/i
50
+ # Do Nothing
51
+ else
52
+ function, params = parse_row row
53
+ example.add_function_call function, 0, *params
54
+ end
55
+ end
56
+
57
+ def parse_row(row)
58
+ function = ""
59
+ params = []
60
+
61
+ row.each_index{|cell_index|
62
+ if cell_index % 2 == 0
63
+ function += " " + row[cell_index]
64
+ else
65
+ params.push row[cell_index]
66
+ end
67
+ }
68
+ return function, params
69
+ end
70
+ end
71
+ end #module GreenPepper
@@ -0,0 +1,14 @@
1
+ =begin
2
+ author: Steven Denis (denis.steven@gmail.com)
3
+ Simon Mathieu (simon.math@gmail.com)
4
+ date: March 25, 2009
5
+ =end
6
+
7
+ module GreenPepper
8
+
9
+ class ExampleFactory
10
+ def last_table?(table)
11
+ true
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,29 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: September 30, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ require 'greenpepper/example/freetextexample'
8
+ require 'greenpepper/factory/examplefactory'
9
+
10
+ class FreeTextExampleFactory
11
+ def push_content(scenario)
12
+ @scenario = scenario
13
+ end
14
+
15
+ def need_more_content?
16
+ @scenario ? false : true
17
+ end
18
+
19
+ def build_example
20
+ example = FreeTextExample.new @scenario.fixture_name
21
+ @scenario.lines.each{ |line|
22
+ example.add_action line.strip
23
+ }
24
+ @scenario = nil
25
+ example
26
+ end
27
+ end
28
+
29
+ end
@@ -0,0 +1,49 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: September 29, 2009
4
+ =end
5
+
6
+ module GreenPepper
7
+
8
+ require 'greenpepper/factory/unknownexamplefactory'
9
+ require 'greenpepper/executionunit'
10
+ require 'greenpepper/context/htmlcontext'
11
+
12
+ class HtmlExampleFactory
13
+ def initialize(factories = [])
14
+ @factories = factories
15
+ @table_included = false
16
+ @current_table = 0
17
+ @current_factory = nil
18
+ @more_table = nil
19
+ @content = nil
20
+ end
21
+
22
+ def push_content(table)
23
+ if @table_included == false
24
+ @more_table = true
25
+ @table_included = true
26
+ @current_factory = @factories.find{ |f| f.support? table }
27
+ @current_factory = UnknownExampleFactory.new if @current_factory.nil?
28
+ @content = Table.new
29
+ end
30
+
31
+ @content.merge_with table
32
+ @current_table += 1
33
+ if @current_factory.last_table?(table)
34
+ @more_table = false
35
+ end
36
+ @content
37
+ end
38
+
39
+ def need_more_content?
40
+ return @more_table
41
+ end
42
+
43
+ def build_example
44
+ ex = @current_factory.create_example(@content)
45
+ @table_included = false
46
+ ex
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,27 @@
1
+ =begin
2
+ author: Pascal Ouellet (pas.ouellet@gmail.com)
3
+ date: March 9, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ require 'greenpepper/example/importexample'
8
+ require 'greenpepper/factory/examplefactory'
9
+
10
+ class ImportExampleFactory < ExampleFactory
11
+ def support?(table)
12
+ /^\s*import\s*$/i === table[0][0]
13
+ end
14
+
15
+ def create_example(table)
16
+ return nil unless support? table
17
+
18
+ text_regex = /\A\s*([^\s]*)\s*\Z/
19
+ example = ImportExample.new
20
+ table[1..-1].each do |row|
21
+ text_regex === row[0]
22
+ example.add $1
23
+ end
24
+ return example
25
+ end
26
+ end
27
+ end #module GreenPepper
@@ -0,0 +1,46 @@
1
+ =begin
2
+ author: Edouard Murat
3
+ Pascal Ouellet (pas.ouellet@gmail.com)
4
+ date: March 5, 2009
5
+ =end
6
+ module GreenPepper
7
+
8
+ require 'greenpepper/example/ruleforexample'
9
+ require 'greenpepper/factory/examplefactory'
10
+
11
+ class RuleForExampleFactory < ExampleFactory
12
+ def create_example(table)
13
+ return nil unless support? table
14
+
15
+ output_header_regex = /\s*(.*)\?\s*\Z/
16
+
17
+ # fixture name in cell 0,1
18
+ example = RuleForExample.new table[0][1]
19
+
20
+ # fixture argument in row 0 with symbol/value pair
21
+ args_cells_size = table[0][2..-1].size
22
+ 2.step(args_cells_size, 2) do |i|
23
+ example.add_fixture_argument table[0][i + 1]
24
+ end
25
+
26
+ # headers in row 1
27
+ table[1].each do |header|
28
+ example.add_header header
29
+ end
30
+
31
+ # data in next rows
32
+ table[2..-1].each_with_index {|row, index|
33
+ example.add_row row
34
+ if row.size != table[1].size
35
+ message = "Missing at least one cell on line #{index+1}: Header has #{table[1].size} cells while current row has #{row.size}"
36
+ raise GreenPepperMalformedTableError.new(message)
37
+ end
38
+ }
39
+ return example
40
+ end
41
+
42
+ def support?(table)
43
+ /^\s*rule\s*for\s*$/i === table[0][0]
44
+ end
45
+ end
46
+ end #module GreenPepper
@@ -0,0 +1,31 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: March 23, 2009
4
+ =end
5
+ module GreenPepper
6
+
7
+ require 'greenpepper/example/setupexample'
8
+ require 'greenpepper/factory/examplefactory'
9
+ require 'greenpepper/example/nameresolver'
10
+
11
+ class SetupExampleFactory < ExampleFactory
12
+ def create_example(table)
13
+ return nil unless support? table
14
+ example = SetupExample.new table[0][1], NameResolver
15
+
16
+ table[1].each{ |header|
17
+ example.add_header header
18
+ }
19
+
20
+ table[2..-1].each{ |values|
21
+ example.add_row values
22
+ }
23
+
24
+ example
25
+ end
26
+
27
+ def support?(table)
28
+ /^\s*setup\s*$/i === table[0][0]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: September 27, 2009
4
+ =end
5
+
6
+ module GreenPepper
7
+
8
+ require 'greenpepper/example/silentexample'
9
+ require 'greenpepper/factory/examplefactory'
10
+
11
+ class SilentExampleFactory < ExampleFactory
12
+ def create_example(table)
13
+ SilentExample.new
14
+ end
15
+
16
+ def support?(table)
17
+ /^\s*silent\s*$/i === table[0][0]
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,16 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: September 29, 2009
4
+ =end
5
+
6
+ module GreenPepper
7
+
8
+ require 'greenpepper/example/unknownexample'
9
+ require 'greenpepper/factory/examplefactory'
10
+
11
+ class UnknownExampleFactory < ExampleFactory
12
+ def create_example(table)
13
+ UnknownExample.new
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,164 @@
1
+ =begin
2
+ author: Simon Mathieu (simon.math@gmail.com)
3
+ date: September 12, 2009
4
+ =end
5
+
6
+ require 'greenpepper/exception/greenpepperexception'
7
+ require 'greenpepper/converter'
8
+
9
+ module GreenPepper
10
+ module FreeText
11
+ def self.included(base)
12
+ # In ruby 1.8.x, class variables scopes are a little too permisive.
13
+ # This prevents us from reusing the same name for for all
14
+ # actions. So we define a variable with a unique name to avoid a variable
15
+ # clash.
16
+ base.send :class_variable_set, "@@gp_actions_#{base}", []
17
+
18
+ base.class_eval {
19
+ def self.actions
20
+ self.send :class_variable_get, "@@gp_actions_#{self}"
21
+ end
22
+
23
+ def self.add_action(action)
24
+ actions << action
25
+ end
26
+
27
+ def self.GivenVanilla(regex, &block)
28
+ self.add_action GivenKeyword.new(regex, block, false)
29
+ end
30
+
31
+ def self.Given(regex, &block)
32
+ self.add_action GivenKeyword.new(regex, block, true)
33
+ end
34
+
35
+ def self.WhenVanilla(regex, &block)
36
+ self.add_action WhenKeyword.new(regex, block, false)
37
+ end
38
+
39
+ def self.When(regex, &block)
40
+ self.add_action WhenKeyword.new(regex, block, true)
41
+ end
42
+
43
+ def self.AskVanilla(regex, &block)
44
+ self.add_action AskKeyword.new(regex, block, false)
45
+ end
46
+
47
+ def self.Ask(regex, &block)
48
+ self.add_action AskKeyword.new(regex, block, true)
49
+ end
50
+
51
+ def self.CheckVanilla(regex, &block)
52
+ self.add_action CheckKeyword.new(regex, block, false)
53
+ end
54
+
55
+ def self.Check(regex, &block)
56
+ self.add_action CheckKeyword.new(regex, block, true)
57
+ end
58
+
59
+ def self.ThenVanilla(regex, &block)
60
+ self.add_action ThenKeyword.new(regex, block, false)
61
+ end
62
+
63
+ def self.Then(regex, &block)
64
+ self.add_action ThenKeyword.new(regex, block, true)
65
+ end
66
+ }
67
+ end
68
+
69
+ # Maps the specified action to the correct block of code and executes it.
70
+ def greenpepper_map_action(action)
71
+ actions = self.class.send(:class_variable_get, "@@gp_actions_#{self.class}")
72
+ actions.each{ |keyword|
73
+ if keyword.match?(action)
74
+ args = keyword.args(action)
75
+
76
+ call_method(keyword, args)
77
+ return keyword
78
+ end
79
+ }
80
+ raise GreenPepperUnknownActionError.new action
81
+ end
82
+
83
+ def call_method(keyword, args)
84
+ # Set the gp_current_method to be the block so we can call it
85
+ # as an instance method and not as a class method.
86
+ self.class.send :define_method, "gp_current_method", keyword.block
87
+ keyword.result = gp_current_method(*args)
88
+ end
89
+ end
90
+
91
+ class FreeTextKeyword
92
+ attr_reader :block, :regex
93
+ attr_accessor :result
94
+
95
+ def initialize(regex, block, convert)
96
+ raise ArgumentError.new unless regex.is_a? Regexp
97
+ raise ArgumentError.new unless block.is_a? Proc
98
+ @regex, @block, @convert = regex, block, convert
99
+ end
100
+
101
+ def match?(action)
102
+ @regex === action
103
+ end
104
+
105
+ def args(action)
106
+ args = @regex.match(action)[1..-1]
107
+
108
+ args.collect!{ |arg|
109
+ TypeConverter.instance.convert_string(arg)
110
+ } if @convert
111
+
112
+ args
113
+ end
114
+
115
+ end
116
+
117
+ class GivenKeyword < FreeTextKeyword
118
+ def get_result
119
+ GivenSuccess.new
120
+ end
121
+ end
122
+
123
+ class WhenKeyword < FreeTextKeyword
124
+ def get_result
125
+ WhenSuccess.new
126
+ end
127
+ end
128
+
129
+ class AskKeyword < FreeTextKeyword
130
+ def get_result
131
+ AskSuccess.new @result
132
+ end
133
+ end
134
+
135
+ class CheckKeyword < FreeTextKeyword
136
+ def get_result
137
+ @result == true ? CheckSuccess.new : CheckFailure.new
138
+ end
139
+ end
140
+
141
+ class ThenKeyword < FreeTextKeyword
142
+ alias_method :old_args, :args
143
+ def args(action)
144
+ args = old_args(action)
145
+ @args = args.collect{ |x| Expectation.new x }
146
+ end
147
+
148
+ def get_result
149
+ ThenResults.new @regex, @args
150
+ end
151
+ end
152
+
153
+ class Expectation
154
+ attr_reader :expected
155
+ attr_accessor :received
156
+ def initialize(expected)
157
+ @expected = expected
158
+ end
159
+
160
+ def check_result
161
+ @expected == @received
162
+ end
163
+ end
164
+ end