cuke_modeler 1.5.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +341 -0
- data/LICENSE.txt +1 -1
- data/README.md +22 -15
- data/cuke_modeler.gemspec +15 -9
- data/lib/cuke_modeler/adapters/gherkin_10_adapter.rb +12 -0
- data/lib/cuke_modeler/adapters/gherkin_11_adapter.rb +12 -0
- data/lib/cuke_modeler/adapters/gherkin_12_adapter.rb +12 -0
- data/lib/cuke_modeler/adapters/gherkin_13_adapter.rb +12 -0
- data/lib/cuke_modeler/adapters/gherkin_14_adapter.rb +12 -0
- data/lib/cuke_modeler/adapters/{gherkin_6_adapter.rb → gherkin_9_adapter.rb} +75 -64
- data/lib/cuke_modeler/containing.rb +3 -0
- data/lib/cuke_modeler/described.rb +1 -0
- data/lib/cuke_modeler/models/background.rb +1 -1
- data/lib/cuke_modeler/models/cell.rb +1 -1
- data/lib/cuke_modeler/models/comment.rb +1 -1
- data/lib/cuke_modeler/models/directory.rb +2 -2
- data/lib/cuke_modeler/models/doc_string.rb +1 -1
- data/lib/cuke_modeler/models/example.rb +1 -1
- data/lib/cuke_modeler/models/feature.rb +1 -1
- data/lib/cuke_modeler/models/feature_file.rb +2 -2
- data/lib/cuke_modeler/models/outline.rb +1 -1
- data/lib/cuke_modeler/models/row.rb +1 -1
- data/lib/cuke_modeler/models/scenario.rb +1 -1
- data/lib/cuke_modeler/models/step.rb +32 -3
- data/lib/cuke_modeler/models/table.rb +1 -1
- data/lib/cuke_modeler/models/tag.rb +1 -1
- data/lib/cuke_modeler/named.rb +1 -0
- data/lib/cuke_modeler/nested.rb +1 -0
- data/lib/cuke_modeler/parsed.rb +1 -0
- data/lib/cuke_modeler/parsing.rb +89 -94
- data/lib/cuke_modeler/sourceable.rb +1 -0
- data/lib/cuke_modeler/stepped.rb +1 -0
- data/lib/cuke_modeler/taggable.rb +1 -0
- data/lib/cuke_modeler/version.rb +1 -1
- data/testing/cucumber/features/analysis/step_comparison.feature +25 -0
- data/testing/cucumber/features/analysis/test_comparison.feature +1 -1
- metadata +56 -142
- data/.gitignore +0 -18
- data/.simplecov +0 -7
- data/.travis.yml +0 -60
- data/Gemfile +0 -36
- data/History.md +0 -196
- data/Rakefile +0 -63
- data/appveyor.yml +0 -61
- data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +0 -273
- data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +0 -296
- data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +0 -308
- data/testing/cucumber/step_definitions/action_steps.rb +0 -13
- data/testing/cucumber/step_definitions/background_steps.rb +0 -1
- data/testing/cucumber/step_definitions/directory_steps.rb +0 -6
- data/testing/cucumber/step_definitions/doc_string_steps.rb +0 -1
- data/testing/cucumber/step_definitions/feature_file_steps.rb +0 -16
- data/testing/cucumber/step_definitions/feature_steps.rb +0 -7
- data/testing/cucumber/step_definitions/modeling_steps.rb +0 -44
- data/testing/cucumber/step_definitions/setup_steps.rb +0 -32
- data/testing/cucumber/step_definitions/step_steps.rb +0 -3
- data/testing/cucumber/step_definitions/table_steps.rb +0 -1
- data/testing/cucumber/step_definitions/tag_steps.rb +0 -3
- data/testing/cucumber/step_definitions/verification_steps.rb +0 -173
- data/testing/cucumber/support/env.rb +0 -30
- data/testing/dialect_helper.rb +0 -48
- data/testing/file_helper.rb +0 -47
- data/testing/gemfiles/gherkin2.gemfile +0 -32
- data/testing/gemfiles/gherkin3.gemfile +0 -26
- data/testing/gemfiles/gherkin4.gemfile +0 -27
- data/testing/gemfiles/gherkin5.gemfile +0 -27
- data/testing/gemfiles/gherkin6.gemfile +0 -10
- data/testing/rspec/spec/integration/background_integration_spec.rb +0 -442
- data/testing/rspec/spec/integration/cell_integration_spec.rb +0 -335
- data/testing/rspec/spec/integration/comment_integration_spec.rb +0 -177
- data/testing/rspec/spec/integration/directory_integration_spec.rb +0 -218
- data/testing/rspec/spec/integration/doc_string_integration_spec.rb +0 -402
- data/testing/rspec/spec/integration/example_integration_spec.rb +0 -741
- data/testing/rspec/spec/integration/feature_file_integration_spec.rb +0 -272
- data/testing/rspec/spec/integration/feature_integration_spec.rb +0 -650
- data/testing/rspec/spec/integration/gherkin_2_adapter_spec.rb +0 -166
- data/testing/rspec/spec/integration/gherkin_3_adapter_spec.rb +0 -166
- data/testing/rspec/spec/integration/gherkin_4_adapter_spec.rb +0 -165
- data/testing/rspec/spec/integration/gherkin_6_adapter_spec.rb +0 -166
- data/testing/rspec/spec/integration/model_integration_spec.rb +0 -15
- data/testing/rspec/spec/integration/nested_integration_spec.rb +0 -91
- data/testing/rspec/spec/integration/outline_integration_spec.rb +0 -624
- data/testing/rspec/spec/integration/parsing_integration_spec.rb +0 -122
- data/testing/rspec/spec/integration/row_integration_spec.rb +0 -291
- data/testing/rspec/spec/integration/scenario_integration_spec.rb +0 -479
- data/testing/rspec/spec/integration/shared/models_integration_specs.rb +0 -18
- data/testing/rspec/spec/integration/step_integration_spec.rb +0 -475
- data/testing/rspec/spec/integration/table_integration_spec.rb +0 -337
- data/testing/rspec/spec/integration/tag_integration_spec.rb +0 -259
- data/testing/rspec/spec/spec_helper.rb +0 -122
- data/testing/rspec/spec/unit/background_unit_spec.rb +0 -83
- data/testing/rspec/spec/unit/cell_unit_spec.rb +0 -68
- data/testing/rspec/spec/unit/comment_unit_spec.rb +0 -68
- data/testing/rspec/spec/unit/described_unit_spec.rb +0 -23
- data/testing/rspec/spec/unit/directory_unit_spec.rb +0 -127
- data/testing/rspec/spec/unit/doc_string_unit_spec.rb +0 -100
- data/testing/rspec/spec/unit/example_unit_spec.rb +0 -133
- data/testing/rspec/spec/unit/feature_file_unit_spec.rb +0 -125
- data/testing/rspec/spec/unit/feature_unit_spec.rb +0 -157
- data/testing/rspec/spec/unit/model_unit_spec.rb +0 -15
- data/testing/rspec/spec/unit/named_unit_spec.rb +0 -23
- data/testing/rspec/spec/unit/nested_unit_spec.rb +0 -43
- data/testing/rspec/spec/unit/outline_unit_spec.rb +0 -117
- data/testing/rspec/spec/unit/parsed_unit_spec.rb +0 -27
- data/testing/rspec/spec/unit/parsing_unit_spec.rb +0 -54
- data/testing/rspec/spec/unit/row_unit_spec.rb +0 -68
- data/testing/rspec/spec/unit/scenario_unit_spec.rb +0 -86
- data/testing/rspec/spec/unit/shared/bare_bones_models_unit_specs.rb +0 -14
- data/testing/rspec/spec/unit/shared/containing_models_unit_specs.rb +0 -127
- data/testing/rspec/spec/unit/shared/described_models_unit_specs.rb +0 -38
- data/testing/rspec/spec/unit/shared/keyworded_models_unit_specs.rb +0 -58
- data/testing/rspec/spec/unit/shared/models_unit_specs.rb +0 -15
- data/testing/rspec/spec/unit/shared/named_models_unit_specs.rb +0 -39
- data/testing/rspec/spec/unit/shared/nested_models_unit_specs.rb +0 -51
- data/testing/rspec/spec/unit/shared/parsed_models_unit_specs.rb +0 -39
- data/testing/rspec/spec/unit/shared/prepopulated_models_unit_specs.rb +0 -18
- data/testing/rspec/spec/unit/shared/sourced_models_unit_specs.rb +0 -39
- data/testing/rspec/spec/unit/shared/stepped_models_unit_specs.rb +0 -46
- data/testing/rspec/spec/unit/shared/stringifiable_models_unit_specs.rb +0 -18
- data/testing/rspec/spec/unit/shared/tagged_models_unit_specs.rb +0 -72
- data/testing/rspec/spec/unit/sourceable_unit_spec.rb +0 -27
- data/testing/rspec/spec/unit/step_unit_spec.rb +0 -109
- data/testing/rspec/spec/unit/stepped_unit_spec.rb +0 -23
- data/testing/rspec/spec/unit/table_unit_spec.rb +0 -77
- data/testing/rspec/spec/unit/tag_unit_spec.rb +0 -68
- data/testing/rspec/spec/unit/taggable_unit_spec.rb +0 -69
- data/testing/test_languages.json +0 -45
- data/todo.txt +0 -24
@@ -57,8 +57,8 @@ module CukeModeler
|
|
57
57
|
def process_feature_file(file_path)
|
58
58
|
source_text = IO.read(file_path)
|
59
59
|
|
60
|
-
feature_file_data = Parsing::parse_text(source_text, file_path)
|
61
|
-
feature_file_data = feature_file_data.merge({'path' => file_path})
|
60
|
+
feature_file_data = Parsing::parse_text(source_text, file_path)
|
61
|
+
feature_file_data = feature_file_data.merge({ 'path' => file_path })
|
62
62
|
|
63
63
|
feature_file_data
|
64
64
|
end
|
@@ -43,7 +43,7 @@ module CukeModeler
|
|
43
43
|
|
44
44
|
parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_row.feature')
|
45
45
|
|
46
|
-
parsed_file
|
46
|
+
parsed_file['feature']['elements'].first['steps'].first['table']['rows'].first
|
47
47
|
end
|
48
48
|
|
49
49
|
end
|
@@ -33,9 +33,11 @@ module CukeModeler
|
|
33
33
|
# Returns *true* if the two steps have the same base text (i.e. minus any keyword,
|
34
34
|
# table, or doc string and *false* otherwise.
|
35
35
|
def ==(other_step)
|
36
|
-
return false unless other_step.
|
36
|
+
return false unless other_step.is_a?(CukeModeler::Step)
|
37
37
|
|
38
|
-
|
38
|
+
text_matches?(other_step) &&
|
39
|
+
table_matches?(other_step) &&
|
40
|
+
doc_string_matches?(other_step)
|
39
41
|
end
|
40
42
|
|
41
43
|
# Returns the model objects that belong to this model.
|
@@ -62,7 +64,34 @@ module CukeModeler
|
|
62
64
|
|
63
65
|
parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_step.feature')
|
64
66
|
|
65
|
-
parsed_file
|
67
|
+
parsed_file['feature']['elements'].first['steps'].first
|
68
|
+
end
|
69
|
+
|
70
|
+
def text_matches?(other_step)
|
71
|
+
text == other_step.text
|
72
|
+
end
|
73
|
+
|
74
|
+
def table_matches?(other_step)
|
75
|
+
return false if (!block.is_a?(CukeModeler::Table) || !other_step.block.is_a?(CukeModeler::Table)) && (block.is_a?(CukeModeler::Table) || other_step.block.is_a?(CukeModeler::Table))
|
76
|
+
return true unless block.is_a?(CukeModeler::Table) && other_step.block.is_a?(CukeModeler::Table)
|
77
|
+
|
78
|
+
first_step_values = block.rows.collect { |table_row| table_row.cells.map(&:value) }
|
79
|
+
second_step_values = other_step.block.rows.collect { |table_row| table_row.cells.map(&:value) }
|
80
|
+
|
81
|
+
first_step_values == second_step_values
|
82
|
+
end
|
83
|
+
|
84
|
+
def doc_string_matches?(other_step)
|
85
|
+
return false if (!block.is_a?(CukeModeler::DocString) || !other_step.block.is_a?(CukeModeler::DocString)) && (block.is_a?(CukeModeler::DocString) || other_step.block.is_a?(CukeModeler::DocString))
|
86
|
+
return true unless block.is_a?(CukeModeler::DocString) && other_step.block.is_a?(CukeModeler::DocString)
|
87
|
+
|
88
|
+
first_content = block.content
|
89
|
+
first_content_type = block.content_type
|
90
|
+
second_content = other_step.block.content
|
91
|
+
second_content_type = other_step.block.content_type
|
92
|
+
|
93
|
+
(first_content == second_content) &&
|
94
|
+
(first_content_type == second_content_type)
|
66
95
|
end
|
67
96
|
|
68
97
|
end
|
@@ -47,7 +47,7 @@ module CukeModeler
|
|
47
47
|
|
48
48
|
parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_table.feature')
|
49
49
|
|
50
|
-
parsed_file
|
50
|
+
parsed_file['feature']['elements'].first['steps'].first['table']
|
51
51
|
end
|
52
52
|
|
53
53
|
def row_output_string(row)
|
data/lib/cuke_modeler/named.rb
CHANGED
data/lib/cuke_modeler/nested.rb
CHANGED
data/lib/cuke_modeler/parsed.rb
CHANGED
data/lib/cuke_modeler/parsing.rb
CHANGED
@@ -1,99 +1,36 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
begin
|
12
|
-
require 'gherkin'
|
13
|
-
rescue LoadError
|
14
|
-
begin
|
15
|
-
require 'gherkin/parser'
|
16
|
-
rescue LoadError
|
17
|
-
# Gherkin 6.x
|
18
|
-
require 'gherkin/gherkin'
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
|
23
|
-
# The *gherkin* gem loads differently and has different grammar rules across major versions. Parsing
|
24
|
-
# will be done with an 'adapter' appropriate to the version of the *gherkin* gem that has been activated.
|
25
|
-
|
26
|
-
gherkin_version = Gem.loaded_specs['gherkin'].version.version
|
27
|
-
|
28
|
-
case gherkin_version
|
29
|
-
when /^6\./
|
30
|
-
require 'gherkin/gherkin'
|
31
|
-
require 'cuke_modeler/adapters/gherkin_6_adapter'
|
32
|
-
|
33
|
-
def self.parsing_method(source_text, filename)
|
34
|
-
messages = Gherkin::Gherkin.from_source(filename, source_text, {:default_dialect => CukeModeler::Parsing.dialect}).to_a
|
35
|
-
|
36
|
-
messages.map(&:to_hash).find { |message| message[:gherkinDocument] }[:gherkinDocument]
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.adapter_class
|
40
|
-
CukeModeler::Gherkin6Adapter
|
41
|
-
end
|
42
|
-
|
43
|
-
when /^[54]\./
|
44
|
-
require 'gherkin/parser'
|
45
|
-
require 'cuke_modeler/adapters/gherkin_4_adapter'
|
1
|
+
# Have to at least load some version of the gem before which version of the gem has been loaded can
|
2
|
+
# be determined and the rest of the needed files can be loaded. The entry points vary across versions,
|
3
|
+
# so try them all until one of them works.
|
4
|
+
begin
|
5
|
+
# Gherkin 9.x
|
6
|
+
require 'gherkin'
|
7
|
+
rescue LoadError => e
|
8
|
+
# Add other entry points again if things change again
|
9
|
+
raise e
|
10
|
+
end
|
46
11
|
|
47
12
|
|
48
|
-
|
49
|
-
|
50
|
-
def self.parsing_method(source_text, _filename)
|
51
|
-
Gherkin::Parser.new.parse(source_text)
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.adapter_class
|
55
|
-
CukeModeler::Gherkin4Adapter
|
56
|
-
end
|
13
|
+
# The *cucumber-gherkin* gem loads differently and has different grammar rules across major versions. Parsing
|
14
|
+
# will be done with an 'adapter' appropriate to the version of the *cucumber-gherkin* gem that has been activated.
|
57
15
|
|
58
|
-
|
59
|
-
|
60
|
-
require 'cuke_modeler/adapters/gherkin_3_adapter'
|
16
|
+
gherkin_version = Gem.loaded_specs['cucumber-gherkin'].version.version
|
17
|
+
gherkin_major_version = gherkin_version.match(/^(\d+)\./)[1].to_i
|
61
18
|
|
19
|
+
case gherkin_major_version
|
20
|
+
when 9, 10, 11, 12, 13, 14
|
21
|
+
# Currently nothing else to load beyond the entry point to the gem
|
22
|
+
else
|
23
|
+
raise("Unknown Gherkin version: '#{gherkin_version}'")
|
24
|
+
end
|
62
25
|
|
63
|
-
|
64
|
-
def self.parsing_method(source_text, _filename)
|
65
|
-
Gherkin::Parser.new.parse(source_text)
|
66
|
-
end
|
26
|
+
require "cuke_modeler/adapters/gherkin_#{gherkin_major_version}_adapter"
|
67
27
|
|
68
|
-
def self.adapter_class
|
69
|
-
CukeModeler::Gherkin3Adapter
|
70
|
-
end
|
71
|
-
when /^2\./
|
72
|
-
require 'stringio'
|
73
|
-
require 'gherkin/formatter/json_formatter'
|
74
|
-
require 'gherkin'
|
75
|
-
require 'json'
|
76
|
-
require 'multi_json'
|
77
|
-
require 'cuke_modeler/adapters/gherkin_2_adapter'
|
78
|
-
|
79
|
-
|
80
|
-
def self.parsing_method(source_text, filename)
|
81
|
-
io = StringIO.new
|
82
|
-
formatter = Gherkin::Formatter::JSONFormatter.new(io)
|
83
|
-
parser = Gherkin::Parser::Parser.new(formatter)
|
84
|
-
parser.parse(source_text, filename, 0)
|
85
|
-
formatter.done
|
86
|
-
MultiJson.load(io.string)
|
87
|
-
end
|
88
28
|
|
89
|
-
|
90
|
-
CukeModeler::Gherkin2Adapter
|
91
|
-
end
|
29
|
+
module CukeModeler
|
92
30
|
|
93
|
-
|
94
|
-
raise("Unknown Gherkin version: '#{gherkin_version}'")
|
95
|
-
end
|
31
|
+
# A module providing source text parsing functionality.
|
96
32
|
|
33
|
+
module Parsing
|
97
34
|
|
98
35
|
class << self
|
99
36
|
|
@@ -109,28 +46,86 @@ module CukeModeler
|
|
109
46
|
# The dialects currently known by the gherkin gem
|
110
47
|
def dialects
|
111
48
|
unless @dialects
|
112
|
-
@dialects =
|
49
|
+
@dialects = Gherkin::DIALECTS
|
113
50
|
end
|
114
51
|
|
115
52
|
@dialects
|
116
53
|
end
|
117
54
|
|
118
|
-
# Parses the Cucumber feature given in *source_text* and returns
|
119
|
-
#
|
55
|
+
# Parses the Cucumber feature given in *source_text* and returns a hash representation of
|
56
|
+
# its logical structure. This is a standardized AST that should remain consistent across
|
57
|
+
# different versions of `cucumber-gherkin`
|
120
58
|
def parse_text(source_text, filename = 'cuke_modeler_fake_file.feature')
|
121
59
|
raise(ArgumentError, "Text to parse must be a String but got #{source_text.class}") unless source_text.is_a?(String)
|
122
60
|
|
123
|
-
|
124
61
|
begin
|
125
|
-
parsed_result = parsing_method(source_text, filename)
|
62
|
+
parsed_result = parsing_method(source_text.encode('UTF-8'), filename)
|
126
63
|
rescue => e
|
127
64
|
raise(ArgumentError, "Error encountered while parsing '#{filename}'\n#{e.class} - #{e.message}")
|
128
65
|
end
|
129
66
|
|
130
|
-
|
67
|
+
adapter_class.new.adapt(parsed_result)
|
68
|
+
end
|
69
|
+
|
131
70
|
|
71
|
+
gherkin_version = Gem.loaded_specs['cucumber-gherkin'].version.version
|
72
|
+
gherkin_major_version = gherkin_version.match(/^(\d+)\./)[1].to_i
|
73
|
+
|
74
|
+
case gherkin_major_version
|
75
|
+
when 13, 14
|
76
|
+
# todo - make these methods private?
|
77
|
+
# NOT A PART OF THE PUBLIC API
|
78
|
+
# The method to use for parsing Gherkin text
|
79
|
+
def parsing_method(source_text, filename)
|
80
|
+
messages = Gherkin.from_source(filename, source_text, { :include_gherkin_document => true }).to_a.map(&:to_hash)
|
81
|
+
|
82
|
+
error_message = messages.find { |message| message[:parse_error] }
|
83
|
+
gherkin_ast_message = messages.find { |message| message[:gherkin_document] }
|
84
|
+
|
85
|
+
raise error_message[:parse_error][:message] if error_message
|
86
|
+
|
87
|
+
gherkin_ast_message[:gherkin_document]
|
88
|
+
end
|
89
|
+
when 12
|
90
|
+
# todo - make these methods private?
|
91
|
+
# NOT A PART OF THE PUBLIC API
|
92
|
+
# The method to use for parsing Gherkin text
|
93
|
+
def parsing_method(source_text, filename)
|
94
|
+
messages = Gherkin.from_source(filename, source_text, { :include_gherkin_document => true }).to_a.map(&:to_hash)
|
95
|
+
|
96
|
+
potential_error_message = messages.find { |message| message[:attachment] }
|
97
|
+
gherkin_ast_message = messages.find { |message| message[:gherkin_document] }
|
98
|
+
|
99
|
+
if potential_error_message
|
100
|
+
raise potential_error_message[:attachment][:body] if potential_error_message[:attachment][:body] =~ /expected.*got/
|
101
|
+
end
|
102
|
+
|
103
|
+
gherkin_ast_message[:gherkin_document]
|
104
|
+
end
|
105
|
+
when 9, 10, 11
|
106
|
+
# todo - make these methods private?
|
107
|
+
# NOT A PART OF THE PUBLIC API
|
108
|
+
# The method to use for parsing Gherkin text
|
109
|
+
def parsing_method(source_text, filename)
|
110
|
+
messages = Gherkin.from_source(filename, source_text, { :include_gherkin_document => true }).to_a.map(&:to_hash)
|
111
|
+
|
112
|
+
potential_error_message = messages.find { |message| message[:attachment] }
|
113
|
+
gherkin_ast_message = messages.find { |message| message[:gherkin_document] }
|
114
|
+
|
115
|
+
if potential_error_message
|
116
|
+
raise potential_error_message[:attachment][:text] if potential_error_message[:attachment][:text] =~ /expected.*got/
|
117
|
+
end
|
118
|
+
|
119
|
+
gherkin_ast_message[:gherkin_document]
|
120
|
+
end
|
121
|
+
else
|
122
|
+
raise("Unknown Gherkin version: '#{gherkin_version}'")
|
123
|
+
end
|
132
124
|
|
133
|
-
|
125
|
+
# NOT A PART OF THE PUBLIC API
|
126
|
+
# The adapter to use when converting an AST to a standard internal shape
|
127
|
+
define_method('adapter_class') do
|
128
|
+
CukeModeler.const_get("Gherkin#{gherkin_major_version}Adapter")
|
134
129
|
end
|
135
130
|
|
136
131
|
end
|
data/lib/cuke_modeler/stepped.rb
CHANGED
data/lib/cuke_modeler/version.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
Feature: Step comparison
|
2
|
+
|
3
|
+
Step comparison using `==` is done based on 'significant' properties. Keywords, being completely interchangeable, do not affect step equality.
|
4
|
+
|
5
|
+
|
6
|
+
Scenario: Comparison of steps
|
7
|
+
Given a model for the following step:
|
8
|
+
"""
|
9
|
+
Given a step
|
10
|
+
"""
|
11
|
+
And a model for the following step:
|
12
|
+
"""
|
13
|
+
When a step
|
14
|
+
"""
|
15
|
+
And a model for the following step:
|
16
|
+
"""
|
17
|
+
Then a step
|
18
|
+
"""
|
19
|
+
When the models are compared
|
20
|
+
Then all of them are equivalent
|
21
|
+
But none of the models are equivalent with a model for the following step:
|
22
|
+
"""
|
23
|
+
And a step
|
24
|
+
| plus this table |
|
25
|
+
"""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Feature: Test comparison
|
2
2
|
|
3
|
-
Gherkin elements that contain steps (i.e. backgrounds, scenarios, and outlines) can be compared with one another in order to determine equality. Elements are considered equal if
|
3
|
+
Gherkin elements that contain steps (i.e. backgrounds, scenarios, and outlines) can be compared with one another in order to determine equality. Elements are considered equal if their steps match (see step comparison). Properties that do not affect what a test *does* (e.g. name, description, tags) are ignored for the purposes of comparison.
|
4
4
|
|
5
5
|
|
6
6
|
Scenario: Comparing tests
|
metadata
CHANGED
@@ -1,77 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cuke_modeler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Kessler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: gherkin
|
14
|
+
name: cucumber-gherkin
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "<"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '15.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "<"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '15.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.0'
|
34
31
|
- - "<"
|
35
32
|
- !ruby/object:Gem::Version
|
36
33
|
version: '3.0'
|
37
|
-
type: :
|
34
|
+
type: :development
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
|
-
- - ">="
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '1.0'
|
44
38
|
- - "<"
|
45
39
|
- !ruby/object:Gem::Version
|
46
40
|
version: '3.0'
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: multi_json
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - "~>"
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '1.0'
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
requirements:
|
58
|
-
- - "~>"
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: '1.0'
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
name: bundler
|
63
|
-
requirement: !ruby/object:Gem::Requirement
|
64
|
-
requirements:
|
65
|
-
- - ">="
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: '0'
|
68
|
-
type: :development
|
69
|
-
prerelease: false
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
71
|
-
requirements:
|
72
|
-
- - ">="
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: '0'
|
75
41
|
- !ruby/object:Gem::Dependency
|
76
42
|
name: rake
|
77
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -118,16 +84,16 @@ dependencies:
|
|
118
84
|
name: simplecov
|
119
85
|
requirement: !ruby/object:Gem::Requirement
|
120
86
|
requirements:
|
121
|
-
- - "
|
87
|
+
- - "<="
|
122
88
|
- !ruby/object:Gem::Version
|
123
|
-
version:
|
89
|
+
version: 0.16.1
|
124
90
|
type: :development
|
125
91
|
prerelease: false
|
126
92
|
version_requirements: !ruby/object:Gem::Requirement
|
127
93
|
requirements:
|
128
|
-
- - "
|
94
|
+
- - "<="
|
129
95
|
- !ruby/object:Gem::Version
|
130
|
-
version:
|
96
|
+
version: 0.16.1
|
131
97
|
- !ruby/object:Gem::Dependency
|
132
98
|
name: racatt
|
133
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,33 +122,58 @@ dependencies:
|
|
156
122
|
- - "<"
|
157
123
|
- !ruby/object:Gem::Version
|
158
124
|
version: 1.0.0
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rainbow
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "<"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 4.0.0
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "<"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 4.0.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: test-unit
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "<"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 4.0.0
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "<"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 4.0.0
|
159
153
|
description: This gem facilitates modeling a test suite that is written in Gherkin
|
160
154
|
(e.g. Cucumber, SpecFlow, Lettuce, etc.). It does this by providing an abstraction
|
161
|
-
layer on top of the Abstract Syntax Tree that the 'gherkin' gem generates
|
162
|
-
features, as well as providing models for feature files and directories
|
163
|
-
to be able to have a fully traversable model tree of a test suite's structure.
|
164
|
-
models can then be analyzed or manipulated more easily than the underlying
|
155
|
+
layer on top of the Abstract Syntax Tree that the 'cucumber-gherkin' gem generates
|
156
|
+
when parsing features, as well as providing models for feature files and directories
|
157
|
+
in order to be able to have a fully traversable model tree of a test suite's structure.
|
158
|
+
These models can then be analyzed or manipulated more easily than the underlying
|
159
|
+
AST layer.
|
165
160
|
email:
|
166
161
|
- morrow748@gmail.com
|
167
162
|
executables: []
|
168
163
|
extensions: []
|
169
164
|
extra_rdoc_files: []
|
170
165
|
files:
|
171
|
-
-
|
172
|
-
- ".simplecov"
|
173
|
-
- ".travis.yml"
|
174
|
-
- Gemfile
|
175
|
-
- History.md
|
166
|
+
- CHANGELOG.md
|
176
167
|
- LICENSE.txt
|
177
168
|
- README.md
|
178
|
-
- Rakefile
|
179
|
-
- appveyor.yml
|
180
169
|
- cuke_modeler.gemspec
|
181
170
|
- lib/cuke_modeler.rb
|
182
|
-
- lib/cuke_modeler/adapters/
|
183
|
-
- lib/cuke_modeler/adapters/
|
184
|
-
- lib/cuke_modeler/adapters/
|
185
|
-
- lib/cuke_modeler/adapters/
|
171
|
+
- lib/cuke_modeler/adapters/gherkin_10_adapter.rb
|
172
|
+
- lib/cuke_modeler/adapters/gherkin_11_adapter.rb
|
173
|
+
- lib/cuke_modeler/adapters/gherkin_12_adapter.rb
|
174
|
+
- lib/cuke_modeler/adapters/gherkin_13_adapter.rb
|
175
|
+
- lib/cuke_modeler/adapters/gherkin_14_adapter.rb
|
176
|
+
- lib/cuke_modeler/adapters/gherkin_9_adapter.rb
|
186
177
|
- lib/cuke_modeler/containing.rb
|
187
178
|
- lib/cuke_modeler/described.rb
|
188
179
|
- lib/cuke_modeler/models/background.rb
|
@@ -208,6 +199,7 @@ files:
|
|
208
199
|
- lib/cuke_modeler/stepped.rb
|
209
200
|
- lib/cuke_modeler/taggable.rb
|
210
201
|
- lib/cuke_modeler/version.rb
|
202
|
+
- testing/cucumber/features/analysis/step_comparison.feature
|
211
203
|
- testing/cucumber/features/analysis/test_comparison.feature
|
212
204
|
- testing/cucumber/features/modeling/background_modeling.feature
|
213
205
|
- testing/cucumber/features/modeling/background_output.feature
|
@@ -239,87 +231,6 @@ files:
|
|
239
231
|
- testing/cucumber/features/modeling/table_output.feature
|
240
232
|
- testing/cucumber/features/modeling/tag_modeling.feature
|
241
233
|
- testing/cucumber/features/modeling/tag_output.feature
|
242
|
-
- testing/cucumber/step_definitions/action_steps.rb
|
243
|
-
- testing/cucumber/step_definitions/background_steps.rb
|
244
|
-
- testing/cucumber/step_definitions/directory_steps.rb
|
245
|
-
- testing/cucumber/step_definitions/doc_string_steps.rb
|
246
|
-
- testing/cucumber/step_definitions/feature_file_steps.rb
|
247
|
-
- testing/cucumber/step_definitions/feature_steps.rb
|
248
|
-
- testing/cucumber/step_definitions/modeling_steps.rb
|
249
|
-
- testing/cucumber/step_definitions/setup_steps.rb
|
250
|
-
- testing/cucumber/step_definitions/step_steps.rb
|
251
|
-
- testing/cucumber/step_definitions/table_steps.rb
|
252
|
-
- testing/cucumber/step_definitions/tag_steps.rb
|
253
|
-
- testing/cucumber/step_definitions/verification_steps.rb
|
254
|
-
- testing/cucumber/support/env.rb
|
255
|
-
- testing/dialect_helper.rb
|
256
|
-
- testing/file_helper.rb
|
257
|
-
- testing/gemfiles/gherkin2.gemfile
|
258
|
-
- testing/gemfiles/gherkin3.gemfile
|
259
|
-
- testing/gemfiles/gherkin4.gemfile
|
260
|
-
- testing/gemfiles/gherkin5.gemfile
|
261
|
-
- testing/gemfiles/gherkin6.gemfile
|
262
|
-
- testing/rspec/spec/integration/background_integration_spec.rb
|
263
|
-
- testing/rspec/spec/integration/cell_integration_spec.rb
|
264
|
-
- testing/rspec/spec/integration/comment_integration_spec.rb
|
265
|
-
- testing/rspec/spec/integration/directory_integration_spec.rb
|
266
|
-
- testing/rspec/spec/integration/doc_string_integration_spec.rb
|
267
|
-
- testing/rspec/spec/integration/example_integration_spec.rb
|
268
|
-
- testing/rspec/spec/integration/feature_file_integration_spec.rb
|
269
|
-
- testing/rspec/spec/integration/feature_integration_spec.rb
|
270
|
-
- testing/rspec/spec/integration/gherkin_2_adapter_spec.rb
|
271
|
-
- testing/rspec/spec/integration/gherkin_3_adapter_spec.rb
|
272
|
-
- testing/rspec/spec/integration/gherkin_4_adapter_spec.rb
|
273
|
-
- testing/rspec/spec/integration/gherkin_6_adapter_spec.rb
|
274
|
-
- testing/rspec/spec/integration/model_integration_spec.rb
|
275
|
-
- testing/rspec/spec/integration/nested_integration_spec.rb
|
276
|
-
- testing/rspec/spec/integration/outline_integration_spec.rb
|
277
|
-
- testing/rspec/spec/integration/parsing_integration_spec.rb
|
278
|
-
- testing/rspec/spec/integration/row_integration_spec.rb
|
279
|
-
- testing/rspec/spec/integration/scenario_integration_spec.rb
|
280
|
-
- testing/rspec/spec/integration/shared/models_integration_specs.rb
|
281
|
-
- testing/rspec/spec/integration/step_integration_spec.rb
|
282
|
-
- testing/rspec/spec/integration/table_integration_spec.rb
|
283
|
-
- testing/rspec/spec/integration/tag_integration_spec.rb
|
284
|
-
- testing/rspec/spec/spec_helper.rb
|
285
|
-
- testing/rspec/spec/unit/background_unit_spec.rb
|
286
|
-
- testing/rspec/spec/unit/cell_unit_spec.rb
|
287
|
-
- testing/rspec/spec/unit/comment_unit_spec.rb
|
288
|
-
- testing/rspec/spec/unit/described_unit_spec.rb
|
289
|
-
- testing/rspec/spec/unit/directory_unit_spec.rb
|
290
|
-
- testing/rspec/spec/unit/doc_string_unit_spec.rb
|
291
|
-
- testing/rspec/spec/unit/example_unit_spec.rb
|
292
|
-
- testing/rspec/spec/unit/feature_file_unit_spec.rb
|
293
|
-
- testing/rspec/spec/unit/feature_unit_spec.rb
|
294
|
-
- testing/rspec/spec/unit/model_unit_spec.rb
|
295
|
-
- testing/rspec/spec/unit/named_unit_spec.rb
|
296
|
-
- testing/rspec/spec/unit/nested_unit_spec.rb
|
297
|
-
- testing/rspec/spec/unit/outline_unit_spec.rb
|
298
|
-
- testing/rspec/spec/unit/parsed_unit_spec.rb
|
299
|
-
- testing/rspec/spec/unit/parsing_unit_spec.rb
|
300
|
-
- testing/rspec/spec/unit/row_unit_spec.rb
|
301
|
-
- testing/rspec/spec/unit/scenario_unit_spec.rb
|
302
|
-
- testing/rspec/spec/unit/shared/bare_bones_models_unit_specs.rb
|
303
|
-
- testing/rspec/spec/unit/shared/containing_models_unit_specs.rb
|
304
|
-
- testing/rspec/spec/unit/shared/described_models_unit_specs.rb
|
305
|
-
- testing/rspec/spec/unit/shared/keyworded_models_unit_specs.rb
|
306
|
-
- testing/rspec/spec/unit/shared/models_unit_specs.rb
|
307
|
-
- testing/rspec/spec/unit/shared/named_models_unit_specs.rb
|
308
|
-
- testing/rspec/spec/unit/shared/nested_models_unit_specs.rb
|
309
|
-
- testing/rspec/spec/unit/shared/parsed_models_unit_specs.rb
|
310
|
-
- testing/rspec/spec/unit/shared/prepopulated_models_unit_specs.rb
|
311
|
-
- testing/rspec/spec/unit/shared/sourced_models_unit_specs.rb
|
312
|
-
- testing/rspec/spec/unit/shared/stepped_models_unit_specs.rb
|
313
|
-
- testing/rspec/spec/unit/shared/stringifiable_models_unit_specs.rb
|
314
|
-
- testing/rspec/spec/unit/shared/tagged_models_unit_specs.rb
|
315
|
-
- testing/rspec/spec/unit/sourceable_unit_spec.rb
|
316
|
-
- testing/rspec/spec/unit/step_unit_spec.rb
|
317
|
-
- testing/rspec/spec/unit/stepped_unit_spec.rb
|
318
|
-
- testing/rspec/spec/unit/table_unit_spec.rb
|
319
|
-
- testing/rspec/spec/unit/tag_unit_spec.rb
|
320
|
-
- testing/rspec/spec/unit/taggable_unit_spec.rb
|
321
|
-
- testing/test_languages.json
|
322
|
-
- todo.txt
|
323
234
|
homepage: https://github.com/enkessler/cuke_modeler
|
324
235
|
licenses:
|
325
236
|
- MIT
|
@@ -332,7 +243,10 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
332
243
|
requirements:
|
333
244
|
- - ">="
|
334
245
|
- !ruby/object:Gem::Version
|
335
|
-
version: '
|
246
|
+
version: '2.3'
|
247
|
+
- - "<"
|
248
|
+
- !ruby/object:Gem::Version
|
249
|
+
version: '3.0'
|
336
250
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
337
251
|
requirements:
|
338
252
|
- - ">="
|