cuke_modeler 0.4.1 → 1.0.0
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.
- checksums.yaml +4 -4
- data/.gitignore +17 -17
- data/.travis.yml +1 -1
- data/Gemfile +4 -0
- data/History.rdoc +71 -3
- data/LICENSE.txt +22 -22
- data/README.md +24 -10
- data/Rakefile +2 -12
- data/cuke_modeler.gemspec +1 -1
- data/features/analysis/test_comparison.feature +37 -122
- data/features/modeling/background_modeling.feature +77 -0
- data/features/modeling/background_output.feature +42 -0
- data/features/modeling/cell_modeling.feature +23 -0
- data/features/modeling/cell_output.feature +22 -0
- data/features/modeling/directory_modeling.feature +65 -0
- data/features/modeling/directory_output.feature +12 -0
- data/features/modeling/doc_string_modeling.feature +61 -0
- data/features/modeling/doc_string_output.feature +32 -0
- data/features/modeling/example_modeling.feature +125 -0
- data/features/modeling/example_output.feature +39 -0
- data/features/modeling/feature_file_modeling.feature +40 -0
- data/features/modeling/feature_file_output.feature +12 -0
- data/features/modeling/feature_modeling.feature +109 -0
- data/features/modeling/feature_output.feature +104 -0
- data/features/modeling/model_output.feature +22 -0
- data/features/modeling/model_structure.feature +48 -0
- data/features/modeling/outline_modeling.feature +144 -0
- data/features/modeling/outline_output.feature +69 -0
- data/features/modeling/row_modeling.feature +48 -0
- data/features/modeling/row_output.feature +22 -0
- data/features/modeling/scenario_modeling.feature +118 -0
- data/features/modeling/scenario_output.feature +45 -0
- data/features/modeling/step_modeling.feature +84 -0
- data/features/modeling/step_output.feature +29 -0
- data/features/modeling/table_modeling.feature +50 -0
- data/features/modeling/table_output.feature +24 -0
- data/features/modeling/tag_modeling.feature +43 -0
- data/features/modeling/tag_output.feature +22 -0
- data/features/step_definitions/action_steps.rb +11 -1
- data/features/step_definitions/background_steps.rb +1 -85
- data/features/step_definitions/directory_steps.rb +2 -48
- data/features/step_definitions/doc_string_steps.rb +1 -67
- data/features/step_definitions/feature_file_steps.rb +2 -37
- data/features/step_definitions/feature_steps.rb +4 -100
- data/features/step_definitions/modeling_steps.rb +44 -0
- data/features/step_definitions/setup_steps.rb +19 -41
- data/features/step_definitions/step_steps.rb +2 -166
- data/features/step_definitions/table_steps.rb +1 -58
- data/features/step_definitions/tag_steps.rb +2 -72
- data/features/step_definitions/verification_steps.rb +152 -4
- data/features/support/env.rb +4 -6
- data/gemfiles/{gherkin.gemfile → gherkin2.gemfile} +4 -0
- data/gemfiles/gherkin3.gemfile +4 -0
- data/gemfiles/gherkin4.gemfile +4 -0
- data/lib/cuke_modeler.rb +24 -22
- data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +103 -31
- data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +103 -40
- data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +111 -50
- data/lib/cuke_modeler/containing.rb +255 -4
- data/lib/cuke_modeler/described.rb +28 -0
- data/lib/cuke_modeler/models/background.rb +66 -0
- data/lib/cuke_modeler/models/cell.rb +48 -0
- data/lib/cuke_modeler/models/directory.rb +95 -0
- data/lib/cuke_modeler/models/doc_string.rb +59 -0
- data/lib/cuke_modeler/models/example.rb +167 -0
- data/lib/cuke_modeler/models/feature.rb +106 -0
- data/lib/cuke_modeler/models/feature_file.rb +64 -0
- data/lib/cuke_modeler/models/model.rb +32 -0
- data/lib/cuke_modeler/models/outline.rb +79 -0
- data/lib/cuke_modeler/models/row.rb +49 -0
- data/lib/cuke_modeler/models/scenario.rb +69 -0
- data/lib/cuke_modeler/models/step.rb +68 -0
- data/lib/cuke_modeler/models/table.rb +67 -0
- data/lib/cuke_modeler/models/tag.rb +46 -0
- data/lib/cuke_modeler/named.rb +19 -0
- data/lib/cuke_modeler/nested.rb +22 -15
- data/lib/cuke_modeler/parsed.rb +11 -0
- data/lib/cuke_modeler/parsing.rb +66 -83
- data/lib/cuke_modeler/sourceable.rb +3 -11
- data/lib/cuke_modeler/stepped.rb +24 -0
- data/lib/cuke_modeler/taggable.rb +6 -29
- data/lib/cuke_modeler/version.rb +2 -1
- data/spec/integration/background_integration_spec.rb +332 -7
- data/spec/integration/cell_integration_spec.rb +321 -0
- data/spec/integration/directory_integration_spec.rb +175 -9
- data/spec/integration/doc_string_integration_spec.rb +318 -7
- data/spec/integration/example_integration_spec.rb +602 -19
- data/spec/integration/feature_file_integration_spec.rb +98 -3
- data/spec/integration/feature_integration_spec.rb +445 -27
- data/spec/integration/gherkin_2_adapter_spec.rb +122 -0
- data/spec/integration/gherkin_3_adapter_spec.rb +125 -0
- data/spec/integration/gherkin_4_adapter_spec.rb +123 -0
- data/spec/integration/model_integration_spec.rb +15 -0
- data/spec/integration/nested_integration_spec.rb +91 -0
- data/spec/integration/outline_integration_spec.rb +485 -12
- data/spec/integration/parsing_integration_spec.rb +85 -0
- data/spec/integration/row_integration_spec.rb +221 -18
- data/spec/integration/scenario_integration_spec.rb +368 -14
- data/spec/integration/shared/models_integration_specs.rb +18 -0
- data/spec/integration/step_integration_spec.rb +328 -77
- data/spec/integration/table_integration_spec.rb +242 -20
- data/spec/integration/tag_integration_spec.rb +178 -13
- data/spec/spec_helper.rb +32 -18
- data/spec/unit/background_unit_spec.rb +24 -44
- data/spec/unit/cell_unit_spec.rb +73 -0
- data/spec/unit/described_unit_spec.rb +23 -0
- data/spec/unit/directory_unit_spec.rb +52 -62
- data/spec/unit/doc_string_unit_spec.rb +47 -100
- data/spec/unit/example_unit_spec.rb +50 -296
- data/spec/unit/feature_file_unit_spec.rb +53 -52
- data/spec/unit/feature_unit_spec.rb +39 -83
- data/spec/unit/model_unit_spec.rb +15 -0
- data/spec/unit/named_unit_spec.rb +23 -0
- data/spec/unit/nested_unit_spec.rb +24 -21
- data/spec/unit/outline_unit_spec.rb +46 -69
- data/spec/unit/parsed_unit_spec.rb +27 -0
- data/spec/unit/parsing_unit_spec.rb +2 -70
- data/spec/unit/row_unit_spec.rb +22 -51
- data/spec/unit/scenario_unit_spec.rb +27 -59
- data/spec/unit/{bare_bones_unit_specs.rb → shared/bare_bones_models_unit_specs.rb} +2 -2
- data/spec/unit/shared/containing_models_unit_specs.rb +18 -0
- data/spec/unit/shared/described_models_unit_specs.rb +38 -0
- data/spec/unit/shared/models_unit_specs.rb +15 -0
- data/spec/unit/shared/named_models_unit_specs.rb +39 -0
- data/spec/unit/shared/nested_models_unit_specs.rb +51 -0
- data/spec/unit/shared/parsed_models_unit_specs.rb +39 -0
- data/spec/unit/shared/prepopulated_models_unit_specs.rb +18 -0
- data/spec/unit/shared/sourced_models_unit_specs.rb +39 -0
- data/spec/unit/shared/stepped_models_unit_specs.rb +46 -0
- data/spec/unit/shared/stringifiable_models_unit_specs.rb +18 -0
- data/spec/unit/shared/tagged_models_unit_specs.rb +72 -0
- data/spec/unit/sourceable_unit_spec.rb +12 -4
- data/spec/unit/step_unit_spec.rb +40 -231
- data/spec/unit/stepped_unit_spec.rb +23 -0
- data/spec/unit/table_unit_spec.rb +27 -89
- data/spec/unit/tag_unit_spec.rb +30 -53
- data/spec/unit/taggable_unit_spec.rb +26 -42
- data/todo.txt +32 -0
- metadata +135 -217
- data/features/analysis/test_manipulation.feature +0 -37
- data/features/modeling/gherkin/background_modeling.feature +0 -65
- data/features/modeling/gherkin/background_output.feature +0 -131
- data/features/modeling/gherkin/directory_modeling.feature +0 -110
- data/features/modeling/gherkin/directory_output.feature +0 -14
- data/features/modeling/gherkin/doc_string_modeling.feature +0 -53
- data/features/modeling/gherkin/doc_string_output.feature +0 -72
- data/features/modeling/gherkin/example_modeling.feature +0 -101
- data/features/modeling/gherkin/example_output.feature +0 -193
- data/features/modeling/gherkin/feature_file_modeling.feature +0 -54
- data/features/modeling/gherkin/feature_file_output.feature +0 -14
- data/features/modeling/gherkin/feature_modeling.feature +0 -154
- data/features/modeling/gherkin/feature_output.feature +0 -245
- data/features/modeling/gherkin/outline_modeling.feature +0 -90
- data/features/modeling/gherkin/outline_output.feature +0 -198
- data/features/modeling/gherkin/row_modeling.feature +0 -68
- data/features/modeling/gherkin/row_output.feature +0 -28
- data/features/modeling/gherkin/scenario_modeling.feature +0 -79
- data/features/modeling/gherkin/scenario_output.feature +0 -148
- data/features/modeling/gherkin/step_modeling.feature +0 -75
- data/features/modeling/gherkin/step_output.feature +0 -53
- data/features/modeling/gherkin/table_modeling.feature +0 -42
- data/features/modeling/gherkin/table_output.feature +0 -43
- data/features/modeling/gherkin/table_row_modeling.feature +0 -57
- data/features/modeling/gherkin/table_row_output.feature +0 -28
- data/features/modeling/gherkin/tag_modeling.feature +0 -48
- data/features/modeling/gherkin/tag_output.feature +0 -17
- data/features/modeling/gherkin3/background_modeling.feature +0 -64
- data/features/modeling/gherkin3/background_output.feature +0 -131
- data/features/modeling/gherkin3/directory_modeling.feature +0 -110
- data/features/modeling/gherkin3/directory_output.feature +0 -14
- data/features/modeling/gherkin3/doc_string_modeling.feature +0 -53
- data/features/modeling/gherkin3/doc_string_output.feature +0 -72
- data/features/modeling/gherkin3/example_modeling.feature +0 -100
- data/features/modeling/gherkin3/example_output.feature +0 -207
- data/features/modeling/gherkin3/feature_file_modeling.feature +0 -54
- data/features/modeling/gherkin3/feature_file_output.feature +0 -14
- data/features/modeling/gherkin3/feature_modeling.feature +0 -155
- data/features/modeling/gherkin3/feature_output.feature +0 -249
- data/features/modeling/gherkin3/outline_modeling.feature +0 -89
- data/features/modeling/gherkin3/outline_output.feature +0 -255
- data/features/modeling/gherkin3/row_modeling.feature +0 -68
- data/features/modeling/gherkin3/row_output.feature +0 -28
- data/features/modeling/gherkin3/scenario_modeling.feature +0 -78
- data/features/modeling/gherkin3/scenario_output.feature +0 -148
- data/features/modeling/gherkin3/step_modeling.feature +0 -75
- data/features/modeling/gherkin3/step_output.feature +0 -53
- data/features/modeling/gherkin3/table_modeling.feature +0 -42
- data/features/modeling/gherkin3/table_output.feature +0 -43
- data/features/modeling/gherkin3/table_row_modeling.feature +0 -57
- data/features/modeling/gherkin3/table_row_output.feature +0 -28
- data/features/modeling/gherkin3/tag_modeling.feature +0 -49
- data/features/modeling/gherkin3/tag_output.feature +0 -17
- data/features/modeling/gherkin4/background_modeling.feature +0 -64
- data/features/modeling/gherkin4/background_output.feature +0 -131
- data/features/modeling/gherkin4/directory_modeling.feature +0 -110
- data/features/modeling/gherkin4/directory_output.feature +0 -14
- data/features/modeling/gherkin4/doc_string_modeling.feature +0 -53
- data/features/modeling/gherkin4/doc_string_output.feature +0 -72
- data/features/modeling/gherkin4/example_modeling.feature +0 -100
- data/features/modeling/gherkin4/example_output.feature +0 -193
- data/features/modeling/gherkin4/feature_file_modeling.feature +0 -54
- data/features/modeling/gherkin4/feature_file_output.feature +0 -14
- data/features/modeling/gherkin4/feature_modeling.feature +0 -153
- data/features/modeling/gherkin4/feature_output.feature +0 -245
- data/features/modeling/gherkin4/outline_modeling.feature +0 -89
- data/features/modeling/gherkin4/outline_output.feature +0 -198
- data/features/modeling/gherkin4/row_modeling.feature +0 -68
- data/features/modeling/gherkin4/row_output.feature +0 -28
- data/features/modeling/gherkin4/scenario_modeling.feature +0 -78
- data/features/modeling/gherkin4/scenario_output.feature +0 -148
- data/features/modeling/gherkin4/step_modeling.feature +0 -75
- data/features/modeling/gherkin4/step_output.feature +0 -53
- data/features/modeling/gherkin4/table_modeling.feature +0 -42
- data/features/modeling/gherkin4/table_output.feature +0 -43
- data/features/modeling/gherkin4/table_row_modeling.feature +0 -57
- data/features/modeling/gherkin4/table_row_output.feature +0 -28
- data/features/modeling/gherkin4/tag_modeling.feature +0 -48
- data/features/modeling/gherkin4/tag_output.feature +0 -17
- data/features/step_definitions/outline_steps.rb +0 -258
- data/features/step_definitions/test_steps.rb +0 -123
- data/lib/cuke_modeler/background.rb +0 -38
- data/lib/cuke_modeler/directory.rb +0 -83
- data/lib/cuke_modeler/doc_string.rb +0 -87
- data/lib/cuke_modeler/example.rb +0 -195
- data/lib/cuke_modeler/feature.rb +0 -147
- data/lib/cuke_modeler/feature_element.rb +0 -73
- data/lib/cuke_modeler/feature_file.rb +0 -77
- data/lib/cuke_modeler/outline.rb +0 -68
- data/lib/cuke_modeler/raw.rb +0 -20
- data/lib/cuke_modeler/row.rb +0 -64
- data/lib/cuke_modeler/scenario.rb +0 -45
- data/lib/cuke_modeler/step.rb +0 -216
- data/lib/cuke_modeler/table.rb +0 -90
- data/lib/cuke_modeler/table_row.rb +0 -64
- data/lib/cuke_modeler/tag.rb +0 -62
- data/lib/cuke_modeler/test_element.rb +0 -79
- data/lib/cuke_modeler/world.rb +0 -113
- data/spec/integration/table_row_integration_spec.rb +0 -76
- data/spec/integration/world_integration_spec.rb +0 -14
- data/spec/unit/containing_element_unit_specs.rb +0 -18
- data/spec/unit/feature_element_unit_spec.rb +0 -19
- data/spec/unit/feature_element_unit_specs.rb +0 -52
- data/spec/unit/nested_element_unit_specs.rb +0 -39
- data/spec/unit/prepopulated_unit_specs.rb +0 -14
- data/spec/unit/raw_element_unit_specs.rb +0 -27
- data/spec/unit/raw_unit_spec.rb +0 -28
- data/spec/unit/sourced_element_unit_specs.rb +0 -18
- data/spec/unit/table_row_unit_spec.rb +0 -102
- data/spec/unit/tagged_element_unit_specs.rb +0 -67
- data/spec/unit/test_element_unit_spec.rb +0 -54
- data/spec/unit/test_element_unit_specs.rb +0 -34
- data/spec/unit/world_unit_spec.rb +0 -140
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A class modeling a feature in a Cucumber suite.
|
|
4
|
+
|
|
5
|
+
class Feature < Model
|
|
6
|
+
|
|
7
|
+
include Parsed
|
|
8
|
+
include Named
|
|
9
|
+
include Described
|
|
10
|
+
include Taggable
|
|
11
|
+
include Sourceable
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# The Background object contained by the Feature
|
|
15
|
+
attr_accessor :background
|
|
16
|
+
|
|
17
|
+
# The Scenario and Outline objects contained by the Feature
|
|
18
|
+
attr_accessor :tests
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Creates a new Feature object and, if *source_text* is provided, populates the
|
|
22
|
+
# object.
|
|
23
|
+
def initialize(source_text = nil)
|
|
24
|
+
@tags = []
|
|
25
|
+
@tests = []
|
|
26
|
+
|
|
27
|
+
super(source_text)
|
|
28
|
+
|
|
29
|
+
if source_text
|
|
30
|
+
parsed_feature_data = parse_source(source_text)
|
|
31
|
+
populate_feature(self, parsed_feature_data)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Returns *true* if the feature contains a background, *false* otherwise.
|
|
36
|
+
def has_background?
|
|
37
|
+
!@background.nil?
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Returns the scenario models contained in the feature.
|
|
41
|
+
def scenarios
|
|
42
|
+
@tests.select { |test| test.is_a? Scenario }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Returns the outline models contained in the feature.
|
|
46
|
+
def outlines
|
|
47
|
+
@tests.select { |test| test.is_a? Outline }
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Returns the number of test cases contained in the feature. A test case is a
|
|
51
|
+
# single set of test values, such as an individual scenario or one example row
|
|
52
|
+
# of an outline.
|
|
53
|
+
def test_case_count
|
|
54
|
+
scenarios.count + outlines.reduce(0) { |outline_sum, outline|
|
|
55
|
+
outline_sum += outline.examples.reduce(0) { |example_sum, example|
|
|
56
|
+
example_sum += example.argument_rows.count
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Returns the model objects that belong to this model.
|
|
62
|
+
def children
|
|
63
|
+
models = tests + tags
|
|
64
|
+
models << background if background
|
|
65
|
+
|
|
66
|
+
models
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Returns a string representation of this model. For a feature model,
|
|
70
|
+
# this will be Gherkin text that is equivalent to the feature being modeled.
|
|
71
|
+
def to_s
|
|
72
|
+
text = ''
|
|
73
|
+
|
|
74
|
+
text << tag_output_string + "\n" unless tags.empty?
|
|
75
|
+
text << "Feature:#{name_output_string}"
|
|
76
|
+
text << "\n" + description_output_string unless (description.nil? || description.empty?)
|
|
77
|
+
text << "\n\n" + background_output_string if background
|
|
78
|
+
text << "\n\n" + tests_output_string unless tests.empty?
|
|
79
|
+
|
|
80
|
+
text
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def parse_source(source_text)
|
|
88
|
+
parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_feature.feature')
|
|
89
|
+
|
|
90
|
+
parsed_file.first
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def background_output_string
|
|
94
|
+
test_output_string(background)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def tests_output_string
|
|
98
|
+
tests.collect { |test| test_output_string(test) }.join("\n\n")
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_output_string(model)
|
|
102
|
+
model.to_s.split("\n").collect { |line| line.empty? ? '' : " #{line}" }.join("\n")
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A class modeling a feature file in a Cucumber suite.
|
|
4
|
+
|
|
5
|
+
class FeatureFile < Model
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# The feature model contained by the modeled feature file
|
|
9
|
+
attr_accessor :feature
|
|
10
|
+
|
|
11
|
+
# The file path of the modeled feature file
|
|
12
|
+
attr_accessor :path
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Creates a new FeatureFile object and, if *file_path* is provided,
|
|
16
|
+
# populates the object.
|
|
17
|
+
def initialize(file_path = nil)
|
|
18
|
+
@path = file_path
|
|
19
|
+
|
|
20
|
+
super(file_path)
|
|
21
|
+
|
|
22
|
+
if file_path
|
|
23
|
+
raise(ArgumentError, "Unknown file: #{file_path.inspect}") unless File.exists?(file_path)
|
|
24
|
+
|
|
25
|
+
processed_feature_file_data = process_feature_file(file_path)
|
|
26
|
+
populate_featurefile(self, processed_feature_file_data)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Returns the name of the modeled feature file.
|
|
32
|
+
def name
|
|
33
|
+
File.basename(@path.gsub('\\', '/')) if @path
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Returns the model objects that belong to this model.
|
|
37
|
+
def children
|
|
38
|
+
[@feature]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Returns a string representation of this model. For a feature file
|
|
42
|
+
# model, this will be the path of the modeled feature file.
|
|
43
|
+
def to_s
|
|
44
|
+
path.to_s
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def process_feature_file(file_path)
|
|
52
|
+
feature_file_data = {'path' => file_path}
|
|
53
|
+
|
|
54
|
+
source_text = IO.read(file_path)
|
|
55
|
+
feature = Parsing::parse_text(source_text, file_path).first
|
|
56
|
+
|
|
57
|
+
feature_file_data['feature'] = feature
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
feature_file_data
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A class modeling an element of a Cucumber suite.
|
|
4
|
+
|
|
5
|
+
class Model
|
|
6
|
+
|
|
7
|
+
include Nested
|
|
8
|
+
include Containing
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# Creates a new Model object and, if *source_text* is provided,
|
|
12
|
+
# populates the object.
|
|
13
|
+
def initialize(source_text = nil)
|
|
14
|
+
raise(ArgumentError, "Can only create models from Strings but was given a #{source_text.class}.") if source_text && !source_text.is_a?(String)
|
|
15
|
+
|
|
16
|
+
# This should be overridden by a child class
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Returns a string representation of this model.
|
|
20
|
+
def to_s
|
|
21
|
+
# This should be overridden by a child class
|
|
22
|
+
super
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Returns the model objects that belong to this model.
|
|
26
|
+
def children
|
|
27
|
+
# This should be overridden by a child class
|
|
28
|
+
[]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A class modeling an individual outline in a Cucumber suite.
|
|
4
|
+
|
|
5
|
+
class Outline < Model
|
|
6
|
+
|
|
7
|
+
include Parsed
|
|
8
|
+
include Named
|
|
9
|
+
include Described
|
|
10
|
+
include Stepped
|
|
11
|
+
include Sourceable
|
|
12
|
+
include Taggable
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# The Example objects contained by the Outline
|
|
16
|
+
attr_accessor :examples
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Creates a new Outline object and, if *source_text* is provided, populates the
|
|
20
|
+
# object.
|
|
21
|
+
def initialize(source_text = nil)
|
|
22
|
+
@steps = []
|
|
23
|
+
@tags = []
|
|
24
|
+
@examples = []
|
|
25
|
+
|
|
26
|
+
super(source_text)
|
|
27
|
+
|
|
28
|
+
if source_text
|
|
29
|
+
parsed_outline_data = parse_source(source_text)
|
|
30
|
+
populate_outline(self, parsed_outline_data)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Returns *true* if the two models have equivalent steps and *false* otherwise.
|
|
35
|
+
def ==(other_model)
|
|
36
|
+
return false unless other_model.respond_to?(:steps)
|
|
37
|
+
|
|
38
|
+
steps == other_model.steps
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Returns the model objects that belong to this model.
|
|
42
|
+
def children
|
|
43
|
+
examples + steps + tags
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Returns a string representation of this model. For an outline model,
|
|
47
|
+
# this will be Gherkin text that is equivalent to the outline being modeled.
|
|
48
|
+
def to_s
|
|
49
|
+
text = ''
|
|
50
|
+
|
|
51
|
+
text << tag_output_string + "\n" unless tags.empty?
|
|
52
|
+
text << "Scenario Outline:#{name_output_string}"
|
|
53
|
+
text << "\n" + description_output_string unless (description.nil? || description.empty?)
|
|
54
|
+
text << "\n" unless (steps.empty? || description.nil? || description.empty?)
|
|
55
|
+
text << "\n" + steps_output_string unless steps.empty?
|
|
56
|
+
text << "\n\n" + examples_output_string unless examples.empty?
|
|
57
|
+
|
|
58
|
+
text
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def parse_source(source_text)
|
|
66
|
+
base_file_string = "Feature: Fake feature to parse\n"
|
|
67
|
+
source_text = base_file_string + source_text
|
|
68
|
+
|
|
69
|
+
parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_outline.feature')
|
|
70
|
+
|
|
71
|
+
parsed_file.first['elements'].first
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def examples_output_string
|
|
75
|
+
examples.empty? ? '' : examples.collect { |example| example.to_s }.join("\n\n")
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A class modeling a single row of a step table or example table.
|
|
4
|
+
|
|
5
|
+
class Row < Model
|
|
6
|
+
|
|
7
|
+
include Sourceable
|
|
8
|
+
include Parsed
|
|
9
|
+
|
|
10
|
+
# The cell models that make up the row
|
|
11
|
+
attr_accessor :cells
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# Creates a new Row object and, if *source_text* is provided, populates
|
|
15
|
+
# the object.
|
|
16
|
+
def initialize(source_text = nil)
|
|
17
|
+
@cells = []
|
|
18
|
+
|
|
19
|
+
super(source_text)
|
|
20
|
+
|
|
21
|
+
if source_text
|
|
22
|
+
parsed_row_data = parse_source(source_text)
|
|
23
|
+
populate_row(self, parsed_row_data)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Returns a string representation of this model. For a row model,
|
|
28
|
+
# this will be Gherkin text that is equivalent to the row being modeled.
|
|
29
|
+
def to_s
|
|
30
|
+
text_cells = cells.collect { |cell| cell.to_s }
|
|
31
|
+
|
|
32
|
+
"| #{text_cells.join(' | ')} |"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def parse_source(source_text)
|
|
40
|
+
base_file_string = "Feature: Fake feature to parse\nScenario:\n* fake step\n"
|
|
41
|
+
source_text = base_file_string + source_text
|
|
42
|
+
|
|
43
|
+
parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_row.feature')
|
|
44
|
+
|
|
45
|
+
parsed_file.first['elements'].first['steps'].first['table']['rows'].first
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A class modeling an individual scenario of a Cucumber suite.
|
|
4
|
+
|
|
5
|
+
class Scenario < Model
|
|
6
|
+
|
|
7
|
+
include Parsed
|
|
8
|
+
include Named
|
|
9
|
+
include Described
|
|
10
|
+
include Stepped
|
|
11
|
+
include Sourceable
|
|
12
|
+
include Taggable
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Creates a new Scenario object and, if *source_text* is provided, populates the
|
|
16
|
+
# object.
|
|
17
|
+
def initialize(source_text = nil)
|
|
18
|
+
@steps = []
|
|
19
|
+
@tags = []
|
|
20
|
+
|
|
21
|
+
super(source_text)
|
|
22
|
+
|
|
23
|
+
if source_text
|
|
24
|
+
parsed_scenario_data = parse_source(source_text)
|
|
25
|
+
populate_scenario(self, parsed_scenario_data)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Returns *true* if the two models have equivalent steps and *false* otherwise.
|
|
30
|
+
def ==(other_model)
|
|
31
|
+
return false unless other_model.respond_to?(:steps)
|
|
32
|
+
|
|
33
|
+
steps == other_model.steps
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Returns the model objects that belong to this model.
|
|
37
|
+
def children
|
|
38
|
+
steps + tags
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Returns a string representation of this model. For a scenario model,
|
|
42
|
+
# this will be Gherkin text that is equivalent to the scenario being modeled.
|
|
43
|
+
def to_s
|
|
44
|
+
text = ''
|
|
45
|
+
|
|
46
|
+
text << tag_output_string + "\n" unless tags.empty?
|
|
47
|
+
text << "Scenario:#{name_output_string}"
|
|
48
|
+
text << "\n" + description_output_string unless (description.nil? || description.empty?)
|
|
49
|
+
text << "\n" unless (steps.empty? || description.nil? || description.empty?)
|
|
50
|
+
text << "\n" + steps_output_string unless steps.empty?
|
|
51
|
+
|
|
52
|
+
text
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def parse_source(source_text)
|
|
60
|
+
base_file_string = "Feature: Fake feature to parse\n"
|
|
61
|
+
source_text = base_file_string + source_text
|
|
62
|
+
|
|
63
|
+
parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_scenario.feature')
|
|
64
|
+
|
|
65
|
+
parsed_file.first['elements'].first
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A class modeling a single step of a background, scenario, or outline.
|
|
4
|
+
|
|
5
|
+
class Step < Model
|
|
6
|
+
|
|
7
|
+
include Sourceable
|
|
8
|
+
include Parsed
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# The step's keyword
|
|
12
|
+
attr_accessor :keyword
|
|
13
|
+
|
|
14
|
+
# The base text of the step
|
|
15
|
+
attr_accessor :text
|
|
16
|
+
|
|
17
|
+
# The step's passed block
|
|
18
|
+
attr_accessor :block
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Creates a new Step object and, if *source_text* is provided, populates the
|
|
22
|
+
# object.
|
|
23
|
+
def initialize(source_text = nil)
|
|
24
|
+
super(source_text)
|
|
25
|
+
|
|
26
|
+
if source_text
|
|
27
|
+
parsed_step_data = parse_source(source_text)
|
|
28
|
+
populate_step(self, parsed_step_data)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Returns *true* if the two steps have the same base text (i.e. minus any keyword,
|
|
33
|
+
# table, or doc string and *false* otherwise.
|
|
34
|
+
def ==(other_step)
|
|
35
|
+
return false unless other_step.respond_to?(:text)
|
|
36
|
+
|
|
37
|
+
text == other_step.text
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Returns the model objects that belong to this model.
|
|
41
|
+
def children
|
|
42
|
+
[block]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Returns a string representation of this model. For a step model,
|
|
46
|
+
# this will be Gherkin text that is equivalent to the step being modeled.
|
|
47
|
+
def to_s
|
|
48
|
+
text = "#{keyword} #{self.text}"
|
|
49
|
+
text << "\n" + block.to_s.split("\n").collect { |line| " #{line}" }.join("\n") if block
|
|
50
|
+
|
|
51
|
+
text
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def parse_source(source_text)
|
|
59
|
+
base_file_string = "Feature: Fake feature to parse\nScenario:\n"
|
|
60
|
+
source_text = base_file_string + source_text
|
|
61
|
+
|
|
62
|
+
parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_step.feature')
|
|
63
|
+
|
|
64
|
+
parsed_file.first['elements'].first['steps'].first
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|