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.
- data/bin/greenpepperize +71 -0
- data/bin/greenpepperrails +33 -0
- data/bin/greenpepperruby +15 -0
- data/data/greenpepper.rake +37 -0
- data/data/helper.rb +32 -0
- data/data/tags +6 -0
- data/lib/greenpepper/argumentparser.rb +161 -0
- data/lib/greenpepper/common/loadpath.rb +7 -0
- data/lib/greenpepper/context/htmlcontext.rb +26 -0
- data/lib/greenpepper/converter.rb +347 -0
- data/lib/greenpepper/core.rb +152 -0
- data/lib/greenpepper/example/collectionexample.rb +305 -0
- data/lib/greenpepper/example/dowithexample.rb +192 -0
- data/lib/greenpepper/example/exampleheader.rb +41 -0
- data/lib/greenpepper/example/examplewithfixture.rb +73 -0
- data/lib/greenpepper/example/executionresults.rb +160 -0
- data/lib/greenpepper/example/fieldaccessor.rb +36 -0
- data/lib/greenpepper/example/freetextexample.rb +51 -0
- data/lib/greenpepper/example/importexample.rb +39 -0
- data/lib/greenpepper/example/nameresolver.rb +69 -0
- data/lib/greenpepper/example/ruleforexample.rb +117 -0
- data/lib/greenpepper/example/setupexample.rb +79 -0
- data/lib/greenpepper/example/silentexample.rb +14 -0
- data/lib/greenpepper/example/unknownexample.rb +17 -0
- data/lib/greenpepper/exception/greenpepperexception.rb +57 -0
- data/lib/greenpepper/executionunit.rb +39 -0
- data/lib/greenpepper/factory/collectionexamplefactory.rb +59 -0
- data/lib/greenpepper/factory/dowithexamplefactory.rb +71 -0
- data/lib/greenpepper/factory/examplefactory.rb +14 -0
- data/lib/greenpepper/factory/freetextexamplefactory.rb +29 -0
- data/lib/greenpepper/factory/htmlexamplefactory.rb +49 -0
- data/lib/greenpepper/factory/importexamplefactory.rb +27 -0
- data/lib/greenpepper/factory/ruleforexamplefactory.rb +46 -0
- data/lib/greenpepper/factory/setupexamplefactory.rb +31 -0
- data/lib/greenpepper/factory/silentexamplefactory.rb +21 -0
- data/lib/greenpepper/factory/unknownexamplefactory.rb +16 -0
- data/lib/greenpepper/freetext.rb +164 -0
- data/lib/greenpepper/grammar/array.treetop +51 -0
- data/lib/greenpepper/grammar/arrayparser.rb +14 -0
- data/lib/greenpepper/greenpepperconfig.rb +19 -0
- data/lib/greenpepper/greenpeppertask.rb +60 -0
- data/lib/greenpepper/logger.rb +45 -0
- data/lib/greenpepper/parser/freetextparser.rb +96 -0
- data/lib/greenpepper/parser/htmlparser.rb +70 -0
- data/lib/greenpepper/parser/scenario.rb +25 -0
- data/lib/greenpepper/parser/table.rb +37 -0
- data/lib/greenpepper/parser/wikiparser.rb +26 -0
- data/lib/greenpepper/pass/freetextpass.rb +24 -0
- data/lib/greenpepper/pass/greenpepperpass.rb +92 -0
- data/lib/greenpepper/pass/tablepass.rb +38 -0
- data/lib/greenpepper/railsargumentparser.rb +46 -0
- data/lib/greenpepper/redpeppertask.rb +89 -0
- data/lib/greenpepper/repository/atlassianrepository.rb +100 -0
- data/lib/greenpepper/writer/consolewriter.rb +21 -0
- data/lib/greenpepper/writer/freetextresult.rb +233 -0
- data/lib/greenpepper/writer/freetextwriter.rb +44 -0
- data/lib/greenpepper/writer/html.rb +14 -0
- data/lib/greenpepper/writer/htmldocwriter.rb +82 -0
- data/lib/greenpepper/writer/htmlresult.rb +192 -0
- data/lib/greenpepper/writer/htmlwriter.rb +112 -0
- data/lib/greenpepper/writer/output.rb +26 -0
- data/lib/greenpepper/writer/result.rb +35 -0
- data/lib/greenpepper/writer/xmlwriter.rb +32 -0
- data/test/coreseedstest.rb +39 -0
- data/test/greenpepper/argumentparsertest.rb +162 -0
- data/test/greenpepper/common/loadpathtest.rb +24 -0
- data/test/greenpepper/common/stattest.rb +186 -0
- data/test/greenpepper/convertertest.rb +371 -0
- data/test/greenpepper/coretest.rb +159 -0
- data/test/greenpepper/example/collectionexampletest.rb +484 -0
- data/test/greenpepper/example/dowithexampletest.rb +148 -0
- data/test/greenpepper/example/exampletest.rb +28 -0
- data/test/greenpepper/example/freetextexampletest.rb +151 -0
- data/test/greenpepper/example/importexampletest.rb +79 -0
- data/test/greenpepper/example/nameresolvertest.rb +56 -0
- data/test/greenpepper/example/ruleforexampletest.rb +225 -0
- data/test/greenpepper/example/setupexampletest.rb +140 -0
- data/test/greenpepper/example/silentexampletest.rb +17 -0
- data/test/greenpepper/example/unknownexampletest.rb +17 -0
- data/test/greenpepper/factory/collectionexamplefactorytest.rb +51 -0
- data/test/greenpepper/factory/dowithexamplefactorytest.rb +48 -0
- data/test/greenpepper/factory/examplefactorytest.rb +88 -0
- data/test/greenpepper/factory/freetextexamplefactorytest.rb +54 -0
- data/test/greenpepper/factory/importexamplefactorytest.rb +40 -0
- data/test/greenpepper/factory/ruleforexamplefactorytest.rb +55 -0
- data/test/greenpepper/factory/setupexamplefactorytest.rb +29 -0
- data/test/greenpepper/factory/silentexamplefactorytest.rb +38 -0
- data/test/greenpepper/freetexttest.rb +222 -0
- data/test/greenpepper/grammar/arrayparsertest.rb +45 -0
- data/test/greenpepper/loggertest.rb +26 -0
- data/test/greenpepper/parser/freetextparsertest.rb +124 -0
- data/test/greenpepper/parser/htmlparsertest.rb +77 -0
- data/test/greenpepper/parser/wikiparsertest.rb +21 -0
- data/test/greenpepper/pass/freetextpasstest.rb +54 -0
- data/test/greenpepper/pass/greenpepperpasstest.rb +47 -0
- data/test/greenpepper/pass/tablepasstest.rb +23 -0
- data/test/greenpepper/repository/atlassionrepositorytest.rb +85 -0
- data/test/greenpepper/writer/freetextwritertest.rb +301 -0
- data/test/greenpepper/writer/htmlcollectionwritertest.rb +145 -0
- data/test/greenpepper/writer/htmldowithwritertest.rb +87 -0
- data/test/greenpepper/writer/htmlruleforwritertest.rb +147 -0
- data/test/greenpepper/writer/htmlsetupwritertest.rb +107 -0
- data/test/greenpepper/writer/htmlstatresulttest.rb +118 -0
- data/test/greenpepper/writer/htmlwriterpositiontest.rb +53 -0
- data/test/greenpepper/writer/writertest.rb +33 -0
- data/test/greenpepper/writer/xmlwritertest.rb +34 -0
- data/test/integration/collectionexampleintegrationtest.rb +64 -0
- data/test/integration/errorhandlingintegrationtest.rb +68 -0
- data/test/integration/freetextexampleintegrationtest.rb +75 -0
- data/test/integration/greenpepperexecutableintegrationtest.rb +22 -0
- data/test/integration/importexampleintegrationtest.rb +41 -0
- data/test/integration/interpretationordertest.rb +48 -0
- data/test/integration/ruleforexampleintegrationtest.rb +102 -0
- data/test/integration/securityintegrationtest.rb +30 -0
- data/test/integration/setupexampleintegrationtest.rb +31 -0
- data/test/integration/silentexampleintegrationtest.rb +29 -0
- data/test/task/greenpeppertasktest.rb +96 -0
- data/test/task/redpeppertasktest.rb +120 -0
- data/vendor/accents.rb +85 -0
- 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,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
|