cuke_modeler 1.4.0 → 3.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.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +329 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +25 -18
  5. data/cuke_modeler.gemspec +15 -9
  6. data/lib/cuke_modeler/adapters/gherkin_10_adapter.rb +12 -0
  7. data/lib/cuke_modeler/adapters/gherkin_11_adapter.rb +12 -0
  8. data/lib/cuke_modeler/adapters/gherkin_12_adapter.rb +12 -0
  9. data/lib/cuke_modeler/adapters/gherkin_13_adapter.rb +12 -0
  10. data/lib/cuke_modeler/adapters/{gherkin_6_adapter.rb → gherkin_9_adapter.rb} +75 -64
  11. data/lib/cuke_modeler/containing.rb +16 -0
  12. data/lib/cuke_modeler/described.rb +1 -0
  13. data/lib/cuke_modeler/models/background.rb +1 -1
  14. data/lib/cuke_modeler/models/cell.rb +1 -1
  15. data/lib/cuke_modeler/models/comment.rb +1 -1
  16. data/lib/cuke_modeler/models/directory.rb +2 -2
  17. data/lib/cuke_modeler/models/doc_string.rb +1 -1
  18. data/lib/cuke_modeler/models/example.rb +1 -1
  19. data/lib/cuke_modeler/models/feature.rb +1 -1
  20. data/lib/cuke_modeler/models/feature_file.rb +2 -2
  21. data/lib/cuke_modeler/models/outline.rb +1 -1
  22. data/lib/cuke_modeler/models/row.rb +1 -1
  23. data/lib/cuke_modeler/models/scenario.rb +1 -1
  24. data/lib/cuke_modeler/models/step.rb +32 -3
  25. data/lib/cuke_modeler/models/table.rb +1 -1
  26. data/lib/cuke_modeler/models/tag.rb +1 -1
  27. data/lib/cuke_modeler/named.rb +1 -0
  28. data/lib/cuke_modeler/nested.rb +1 -0
  29. data/lib/cuke_modeler/parsed.rb +1 -0
  30. data/lib/cuke_modeler/parsing.rb +88 -92
  31. data/lib/cuke_modeler/sourceable.rb +1 -0
  32. data/lib/cuke_modeler/stepped.rb +1 -0
  33. data/lib/cuke_modeler/taggable.rb +1 -0
  34. data/lib/cuke_modeler/version.rb +1 -1
  35. data/testing/cucumber/features/analysis/step_comparison.feature +25 -0
  36. data/testing/cucumber/features/analysis/test_comparison.feature +1 -1
  37. metadata +55 -142
  38. data/.gitignore +0 -18
  39. data/.simplecov +0 -7
  40. data/.travis.yml +0 -54
  41. data/Gemfile +0 -36
  42. data/History.md +0 -191
  43. data/Rakefile +0 -63
  44. data/appveyor.yml +0 -43
  45. data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +0 -273
  46. data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +0 -296
  47. data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +0 -308
  48. data/testing/cucumber/step_definitions/action_steps.rb +0 -13
  49. data/testing/cucumber/step_definitions/background_steps.rb +0 -1
  50. data/testing/cucumber/step_definitions/directory_steps.rb +0 -6
  51. data/testing/cucumber/step_definitions/doc_string_steps.rb +0 -1
  52. data/testing/cucumber/step_definitions/feature_file_steps.rb +0 -16
  53. data/testing/cucumber/step_definitions/feature_steps.rb +0 -7
  54. data/testing/cucumber/step_definitions/modeling_steps.rb +0 -44
  55. data/testing/cucumber/step_definitions/setup_steps.rb +0 -32
  56. data/testing/cucumber/step_definitions/step_steps.rb +0 -3
  57. data/testing/cucumber/step_definitions/table_steps.rb +0 -1
  58. data/testing/cucumber/step_definitions/tag_steps.rb +0 -3
  59. data/testing/cucumber/step_definitions/verification_steps.rb +0 -173
  60. data/testing/cucumber/support/env.rb +0 -30
  61. data/testing/dialect_helper.rb +0 -48
  62. data/testing/file_helper.rb +0 -47
  63. data/testing/gemfiles/gherkin2.gemfile +0 -32
  64. data/testing/gemfiles/gherkin3.gemfile +0 -26
  65. data/testing/gemfiles/gherkin4.gemfile +0 -27
  66. data/testing/gemfiles/gherkin5.gemfile +0 -26
  67. data/testing/gemfiles/gherkin6.gemfile +0 -10
  68. data/testing/rspec/spec/integration/background_integration_spec.rb +0 -442
  69. data/testing/rspec/spec/integration/cell_integration_spec.rb +0 -335
  70. data/testing/rspec/spec/integration/comment_integration_spec.rb +0 -177
  71. data/testing/rspec/spec/integration/directory_integration_spec.rb +0 -218
  72. data/testing/rspec/spec/integration/doc_string_integration_spec.rb +0 -402
  73. data/testing/rspec/spec/integration/example_integration_spec.rb +0 -741
  74. data/testing/rspec/spec/integration/feature_file_integration_spec.rb +0 -272
  75. data/testing/rspec/spec/integration/feature_integration_spec.rb +0 -650
  76. data/testing/rspec/spec/integration/gherkin_2_adapter_spec.rb +0 -166
  77. data/testing/rspec/spec/integration/gherkin_3_adapter_spec.rb +0 -166
  78. data/testing/rspec/spec/integration/gherkin_4_adapter_spec.rb +0 -165
  79. data/testing/rspec/spec/integration/gherkin_6_adapter_spec.rb +0 -166
  80. data/testing/rspec/spec/integration/model_integration_spec.rb +0 -15
  81. data/testing/rspec/spec/integration/nested_integration_spec.rb +0 -91
  82. data/testing/rspec/spec/integration/outline_integration_spec.rb +0 -624
  83. data/testing/rspec/spec/integration/parsing_integration_spec.rb +0 -117
  84. data/testing/rspec/spec/integration/row_integration_spec.rb +0 -291
  85. data/testing/rspec/spec/integration/scenario_integration_spec.rb +0 -479
  86. data/testing/rspec/spec/integration/shared/models_integration_specs.rb +0 -18
  87. data/testing/rspec/spec/integration/step_integration_spec.rb +0 -475
  88. data/testing/rspec/spec/integration/table_integration_spec.rb +0 -337
  89. data/testing/rspec/spec/integration/tag_integration_spec.rb +0 -259
  90. data/testing/rspec/spec/spec_helper.rb +0 -122
  91. data/testing/rspec/spec/unit/background_unit_spec.rb +0 -83
  92. data/testing/rspec/spec/unit/cell_unit_spec.rb +0 -68
  93. data/testing/rspec/spec/unit/comment_unit_spec.rb +0 -68
  94. data/testing/rspec/spec/unit/described_unit_spec.rb +0 -23
  95. data/testing/rspec/spec/unit/directory_unit_spec.rb +0 -127
  96. data/testing/rspec/spec/unit/doc_string_unit_spec.rb +0 -100
  97. data/testing/rspec/spec/unit/example_unit_spec.rb +0 -133
  98. data/testing/rspec/spec/unit/feature_file_unit_spec.rb +0 -125
  99. data/testing/rspec/spec/unit/feature_unit_spec.rb +0 -157
  100. data/testing/rspec/spec/unit/model_unit_spec.rb +0 -15
  101. data/testing/rspec/spec/unit/named_unit_spec.rb +0 -23
  102. data/testing/rspec/spec/unit/nested_unit_spec.rb +0 -43
  103. data/testing/rspec/spec/unit/outline_unit_spec.rb +0 -117
  104. data/testing/rspec/spec/unit/parsed_unit_spec.rb +0 -27
  105. data/testing/rspec/spec/unit/parsing_unit_spec.rb +0 -54
  106. data/testing/rspec/spec/unit/row_unit_spec.rb +0 -68
  107. data/testing/rspec/spec/unit/scenario_unit_spec.rb +0 -86
  108. data/testing/rspec/spec/unit/shared/bare_bones_models_unit_specs.rb +0 -14
  109. data/testing/rspec/spec/unit/shared/containing_models_unit_specs.rb +0 -25
  110. data/testing/rspec/spec/unit/shared/described_models_unit_specs.rb +0 -38
  111. data/testing/rspec/spec/unit/shared/keyworded_models_unit_specs.rb +0 -58
  112. data/testing/rspec/spec/unit/shared/models_unit_specs.rb +0 -15
  113. data/testing/rspec/spec/unit/shared/named_models_unit_specs.rb +0 -39
  114. data/testing/rspec/spec/unit/shared/nested_models_unit_specs.rb +0 -51
  115. data/testing/rspec/spec/unit/shared/parsed_models_unit_specs.rb +0 -39
  116. data/testing/rspec/spec/unit/shared/prepopulated_models_unit_specs.rb +0 -18
  117. data/testing/rspec/spec/unit/shared/sourced_models_unit_specs.rb +0 -39
  118. data/testing/rspec/spec/unit/shared/stepped_models_unit_specs.rb +0 -46
  119. data/testing/rspec/spec/unit/shared/stringifiable_models_unit_specs.rb +0 -18
  120. data/testing/rspec/spec/unit/shared/tagged_models_unit_specs.rb +0 -72
  121. data/testing/rspec/spec/unit/sourceable_unit_spec.rb +0 -27
  122. data/testing/rspec/spec/unit/step_unit_spec.rb +0 -109
  123. data/testing/rspec/spec/unit/stepped_unit_spec.rb +0 -23
  124. data/testing/rspec/spec/unit/table_unit_spec.rb +0 -77
  125. data/testing/rspec/spec/unit/tag_unit_spec.rb +0 -68
  126. data/testing/rspec/spec/unit/taggable_unit_spec.rb +0 -69
  127. data/testing/test_languages.json +0 -45
  128. data/todo.txt +0 -24
@@ -1,166 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
2
-
3
-
4
- describe 'Gherkin6Adapter, Integration', :gherkin6 => true do
5
-
6
- let(:clazz) { CukeModeler::Gherkin6Adapter }
7
- let(:adapter) { clazz.new }
8
- let(:source_text) { "# feature comment
9
- @tag1 @tag2 @tag3
10
- #{FEATURE_KEYWORD}: A feature with everything it could have
11
-
12
- Including a description
13
- and then some.
14
-
15
- # background comment
16
- #{BACKGROUND_KEYWORD}:
17
-
18
- Background
19
- description
20
-
21
- #{STEP_KEYWORD} a step
22
- # table comment
23
- | value1 |
24
- # table row comment
25
- | value2 |
26
- #{STEP_KEYWORD} another step
27
-
28
- # scenario comment
29
- @scenario_tag
30
- #{SCENARIO_KEYWORD}:
31
-
32
- Scenario
33
- description
34
-
35
- #{STEP_KEYWORD} a step
36
- #{STEP_KEYWORD} another step
37
- \"\"\"
38
- some text
39
- \"\"\"
40
-
41
- # outline comment
42
- @outline_tag
43
- #{OUTLINE_KEYWORD}:
44
-
45
- Outline
46
- description
47
-
48
- # step comment
49
- #{STEP_KEYWORD} a step
50
- # table comment
51
- | value2 |
52
- # step comment
53
- #{STEP_KEYWORD} another step
54
- # doc string comment
55
- \"\"\"
56
- some text
57
- \"\"\"
58
-
59
- # example comment
60
- @example_tag
61
- #{EXAMPLE_KEYWORD}:
62
-
63
- Example
64
- description
65
-
66
- # row comment
67
- | param |
68
- | value |
69
- # final comment" }
70
- let(:feature_file_model) { test_file_path = CukeModeler::FileHelper.create_feature_file(:text => source_text, :name => 'adapter_test_file')
71
- CukeModeler::FeatureFile.new(test_file_path) }
72
- let(:feature_model) { feature_file_model.feature }
73
-
74
-
75
- it "does not store parsing data for a feature file's children" do
76
- model = feature_file_model
77
-
78
- expect(model.parsing_data[:comments]).to be_nil
79
- expect(model.parsing_data[:feature]).to be_nil
80
- end
81
-
82
- it "does not store parsing data for a feature's children" do
83
- model = feature_model
84
-
85
- expect(model.parsing_data[:tags]).to be_nil
86
- expect(model.parsing_data[:children]).to be_nil
87
- end
88
-
89
- it "does not store parsing data for a background's children" do
90
- model = feature_model.background
91
-
92
- expect(model.parsing_data[:background][:steps]).to be_nil
93
- end
94
-
95
- it "does not store parsing data for a scenario's children" do
96
- model = feature_model.scenarios.first
97
-
98
- expect(model.parsing_data[:scenario][:tags]).to be_nil
99
- expect(model.parsing_data[:scenario][:steps]).to be_nil
100
- end
101
-
102
- it "does not store parsing data for an outline's children" do
103
- model = feature_model.outlines.first
104
-
105
- expect(model.parsing_data[:scenario][:tags]).to be_nil
106
- expect(model.parsing_data[:scenario][:steps]).to be_nil
107
- expect(model.parsing_data[:scenario][:examples]).to be_nil
108
- end
109
-
110
- it "does not store parsing data for an example's children" do
111
- model = feature_model.outlines.first.examples.first
112
-
113
- expect(model.parsing_data[:tags]).to be_nil
114
- expect(model.parsing_data[:table_header]).to be_nil
115
- expect(model.parsing_data[:table_body]).to be_nil
116
- end
117
-
118
- it "does not store parsing data for an example row's children" do
119
- model = feature_model.outlines.first.examples.first.rows.first
120
-
121
- expect(model.parsing_data[:cells]).to be_nil
122
- end
123
-
124
- it "does not store parsing data for a step's children, table" do
125
- model = feature_model.outlines.first.steps.first
126
-
127
- expect(model.parsing_data[:data_table]).to be_nil
128
- end
129
-
130
- it "does not store parsing data for a step's children, doc string" do
131
- model = feature_model.outlines.first.steps.last
132
-
133
- expect(model.parsing_data[:doc_string]).to be_nil
134
- end
135
-
136
- it "does not store parsing data for a table's children" do
137
- model = feature_model.outlines.first.steps.first.block
138
-
139
- expect(model.parsing_data[:rows]).to be_nil
140
- end
141
-
142
- it "does not store parsing data for a table row's children" do
143
- model = feature_model.outlines.first.steps.first.block.rows.first
144
-
145
- expect(model.parsing_data[:cells]).to be_nil
146
- end
147
-
148
-
149
- describe 'stuff that is in no way part of the public API and entirely subject to change' do
150
-
151
- it 'provides a useful explosion message if it encounters an entirely new type of test' do
152
- partial_feature_ast = {:type => :Feature, :location => {:line => 1, :column => 1}, :children => [{:some_unknown_type => {}}]}
153
-
154
- expect { adapter.adapt_feature!(partial_feature_ast) }.to raise_error(ArgumentError, /Unknown.*some_unknown_type/)
155
- end
156
-
157
- # TODO: no longer possible in G6?
158
- # it 'provides a useful explosion message if it encounters an entirely new type of step block' do
159
- # partial_feature_ast = {:type => :Feature, :location => {:line => 1, :column => 1}, :children => [{:type => :Scenario, :tags => [], :location => {:line => 1, :column => 1}, :steps => [{:type => :Step, :location => {:line => 1, :column => 1}, :argument => {:type => :some_unknown_type, :location => {:line => 1, :column => 1}, :content => ""}}]}]}
160
- #
161
- # expect { adapter.adapt_feature!(partial_feature_ast) }.to raise_error(ArgumentError, /Unknown.*some_unknown_type/)
162
- # end
163
-
164
- end
165
-
166
- end
@@ -1,15 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
2
-
3
-
4
- describe 'Model, Integration' do
5
-
6
- let(:clazz) { CukeModeler::Model }
7
-
8
-
9
- describe 'common behavior' do
10
-
11
- it_should_behave_like 'a model, integration'
12
-
13
- end
14
-
15
- end
@@ -1,91 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
2
-
3
-
4
- describe 'Nested, Integration' do
5
-
6
- let(:nodule) { CukeModeler::Nested }
7
- let(:nested_model) { Object.new.extend(nodule) }
8
-
9
-
10
- describe 'unique behavior' do
11
-
12
- describe 'an object including the module' do
13
-
14
- describe 'getting ancestors' do
15
-
16
- context 'with a background ancestor' do
17
-
18
- let(:background) { CukeModeler::Background.new }
19
-
20
- before(:each) do
21
- nested_model.parent_model = background
22
- end
23
-
24
-
25
- it "will find its background as a 'test' ancestor" do
26
- ancestor = nested_model.get_ancestor(:test)
27
-
28
- expect(ancestor).to equal(background)
29
- end
30
-
31
- it "will find its background as a 'background' ancestor" do
32
- ancestor = nested_model.get_ancestor(:background)
33
-
34
- expect(ancestor).to equal(background)
35
- end
36
-
37
- end
38
-
39
- context 'with a scenario ancestor' do
40
-
41
- let(:scenario) { CukeModeler::Scenario.new }
42
-
43
- before(:each) do
44
- nested_model.parent_model = scenario
45
- end
46
-
47
-
48
- it "will find its scenario as a 'test' ancestor" do
49
- ancestor = nested_model.get_ancestor(:test)
50
-
51
- expect(ancestor).to equal(scenario)
52
- end
53
-
54
- it "will find its scenario as a 'scenario' ancestor" do
55
- ancestor = nested_model.get_ancestor(:scenario)
56
-
57
- expect(ancestor).to equal(scenario)
58
- end
59
-
60
- end
61
-
62
- context 'with an outline ancestor' do
63
-
64
- let(:outline) { CukeModeler::Outline.new }
65
-
66
- before(:each) do
67
- nested_model.parent_model = outline
68
- end
69
-
70
-
71
- it "will find its outline as a 'test' ancestor" do
72
- ancestor = nested_model.get_ancestor(:test)
73
-
74
- expect(ancestor).to equal(outline)
75
- end
76
-
77
- it "will find its outline as a 'outline' ancestor" do
78
- ancestor = nested_model.get_ancestor(:outline)
79
-
80
- expect(ancestor).to equal(outline)
81
- end
82
-
83
- end
84
-
85
- end
86
-
87
- end
88
-
89
- end
90
-
91
- end
@@ -1,624 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
2
-
3
-
4
- describe 'Outline, Integration' do
5
-
6
- let(:clazz) { CukeModeler::Outline }
7
-
8
-
9
- describe 'common behavior' do
10
-
11
- it_should_behave_like 'a model, integration'
12
-
13
- end
14
-
15
- describe 'unique behavior' do
16
-
17
- it 'can be instantiated with the minimum viable Gherkin', :gherkin6 => true do
18
- source = "#{OUTLINE_KEYWORD}:"
19
-
20
- expect { clazz.new(source) }.to_not raise_error
21
- end
22
-
23
- it 'can be instantiated with the minimum viable Gherkin', :gherkin4_5 => true do
24
- source = "#{OUTLINE_KEYWORD}:"
25
-
26
- expect { clazz.new(source) }.to_not raise_error
27
- end
28
-
29
- it 'can be instantiated with the minimum viable Gherkin', :gherkin2 => true do
30
- source = "#{OUTLINE_KEYWORD}:"
31
-
32
- expect { clazz.new(source) }.to_not raise_error
33
- end
34
-
35
- # gherkin 3.x does not accept incomplete outlines
36
- it 'can be instantiated with the minimum viable Gherkin', :gherkin3 => true do
37
- source = "#{OUTLINE_KEYWORD}:
38
- #{EXAMPLE_KEYWORD}:
39
- | param |
40
- | value |"
41
-
42
- expect { clazz.new(source) }.to_not raise_error
43
- end
44
-
45
- it 'can parse text that uses a non-default dialect' do
46
- original_dialect = CukeModeler::Parsing.dialect
47
- CukeModeler::Parsing.dialect = 'en-au'
48
-
49
- begin
50
- source_text = "Reckon it's like: Outline name
51
- Yeah nah zen
52
- You'll wanna:
53
- | param |
54
- | value |"
55
-
56
- expect { @model = clazz.new(source_text) }.to_not raise_error
57
-
58
- # Sanity check in case modeling failed in a non-explosive manner
59
- expect(@model.name).to eq('Outline name')
60
- ensure
61
- # Making sure that our changes don't escape a test and ruin the rest of the suite
62
- CukeModeler::Parsing.dialect = original_dialect
63
- end
64
- end
65
-
66
- it 'stores the original data generated by the parsing adapter', :gherkin6 => true do
67
- outline = clazz.new("@tag\n#{OUTLINE_KEYWORD}: test outline\ndescription\n#{STEP_KEYWORD} a step\n#{EXAMPLE_KEYWORD}:\n|param|\n|value|")
68
- data = outline.parsing_data
69
-
70
- expect(data.keys).to match_array([:background, :rule, :scenario])
71
- expect(data[:scenario][:name]).to eq('test outline')
72
- end
73
-
74
- it 'stores the original data generated by the parsing adapter', :gherkin4_5 => true do
75
- outline = clazz.new("@tag\n#{OUTLINE_KEYWORD}: test outline\ndescription\n#{STEP_KEYWORD} a step\n#{EXAMPLE_KEYWORD}:\n|param|\n|value|")
76
- data = outline.parsing_data
77
-
78
- expect(data.keys).to match_array([:type, :tags, :location, :keyword, :name, :steps, :examples, :description])
79
- expect(data[:type]).to eq(:ScenarioOutline)
80
- end
81
-
82
- it 'stores the original data generated by the parsing adapter', :gherkin3 => true do
83
- outline = clazz.new("@tag\n#{OUTLINE_KEYWORD}: test outline\ndescription\n#{STEP_KEYWORD} a step\n#{EXAMPLE_KEYWORD}:\n|param|\n|value|")
84
- data = outline.parsing_data
85
-
86
- expect(data.keys).to match_array([:type, :tags, :location, :keyword, :name, :steps, :examples, :description])
87
- expect(data[:type]).to eq(:ScenarioOutline)
88
- end
89
-
90
- it 'stores the original data generated by the parsing adapter', :gherkin2 => true do
91
- outline = clazz.new("@tag\n#{OUTLINE_KEYWORD}: test outline\ndescription\n#{STEP_KEYWORD} a step\n#{EXAMPLE_KEYWORD}:\n|param|\n|value|")
92
- data = outline.parsing_data
93
-
94
- expect(data.keys).to match_array(['keyword', 'name', 'line', 'description', 'id', 'type', 'examples', 'steps', 'tags'])
95
- expect(data['keyword']).to eq('Scenario Outline')
96
- end
97
-
98
- it 'provides a descriptive filename when being parsed from stand alone text' do
99
- source = "bad outline text \n #{OUTLINE_KEYWORD}:\n #{STEP_KEYWORD} a step\n @foo "
100
-
101
- expect { clazz.new(source) }.to raise_error(/'cuke_modeler_stand_alone_outline\.feature'/)
102
- end
103
-
104
- it 'properly sets its child models' do
105
- source = "@a_tag
106
- #{OUTLINE_KEYWORD}:
107
- #{STEP_KEYWORD} a step
108
- #{EXAMPLE_KEYWORD}:
109
- | param |
110
- | value |"
111
-
112
- outline = clazz.new(source)
113
- example = outline.examples.first
114
- step = outline.steps.first
115
- tag = outline.tags.first
116
-
117
- expect(example.parent_model).to equal(outline)
118
- expect(step.parent_model).to equal(outline)
119
- expect(tag.parent_model).to equal(outline)
120
- end
121
-
122
- describe 'getting ancestors' do
123
-
124
- before(:each) do
125
- CukeModeler::FileHelper.create_feature_file(:text => source_gherkin, :name => 'outline_test_file', :directory => test_directory)
126
- end
127
-
128
-
129
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
130
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature
131
-
132
- #{OUTLINE_KEYWORD}: Test test
133
- #{STEP_KEYWORD} a step
134
- #{EXAMPLE_KEYWORD}: Test example
135
- | a param |
136
- | a value |"
137
- }
138
-
139
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
140
- let(:outline_model) { directory_model.feature_files.first.feature.tests.first }
141
-
142
-
143
- it 'can get its directory' do
144
- ancestor = outline_model.get_ancestor(:directory)
145
-
146
- expect(ancestor).to equal(directory_model)
147
- end
148
-
149
- it 'can get its feature file' do
150
- ancestor = outline_model.get_ancestor(:feature_file)
151
-
152
- expect(ancestor).to equal(directory_model.feature_files.first)
153
- end
154
-
155
- it 'can get its feature' do
156
- ancestor = outline_model.get_ancestor(:feature)
157
-
158
- expect(ancestor).to equal(directory_model.feature_files.first.feature)
159
- end
160
-
161
- it 'returns nil if it does not have the requested type of ancestor' do
162
- ancestor = outline_model.get_ancestor(:test)
163
-
164
- expect(ancestor).to be_nil
165
- end
166
-
167
- end
168
-
169
-
170
- describe 'model population' do
171
-
172
- context 'from source text' do
173
-
174
- let(:source_text) { "#{OUTLINE_KEYWORD}:" }
175
- let(:outline) { clazz.new(source_text) }
176
-
177
-
178
- # gherkin 3.x does not accept incomplete outlines
179
- it "models the outline's keyword", :gherkin3 => false do
180
- expect(outline.keyword).to eq("#{OUTLINE_KEYWORD}")
181
- end
182
-
183
- it "models the outline's source line" do
184
- source_text = "#{FEATURE_KEYWORD}:
185
-
186
- #{OUTLINE_KEYWORD}: foo
187
- #{STEP_KEYWORD} step
188
- #{EXAMPLE_KEYWORD}:
189
- | param |
190
- | value |"
191
- outline = CukeModeler::Feature.new(source_text).tests.first
192
-
193
- expect(outline.source_line).to eq(3)
194
- end
195
-
196
-
197
- context 'a filled outline' do
198
-
199
- let(:source_text) { "@tag1 @tag2 @tag3
200
- #{OUTLINE_KEYWORD}: Foo
201
- Scenario description.
202
-
203
- Some more.
204
- Even more.
205
-
206
- #{STEP_KEYWORD} a <setup> step
207
- #{STEP_KEYWORD} an action step
208
- #{STEP_KEYWORD} a <verification> step
209
-
210
- #{EXAMPLE_KEYWORD}: example 1
211
- | setup | verification |
212
- | x | y |
213
- #{EXAMPLE_KEYWORD}: example 2
214
- | setup | verification |
215
- | a | b |" }
216
- let(:outline) { clazz.new(source_text) }
217
-
218
-
219
- it "models the outline's name" do
220
- expect(outline.name).to eq('Foo')
221
- end
222
-
223
- it "models the outline's description" do
224
- description = outline.description.split("\n", -1)
225
-
226
- expect(description).to eq([' Scenario description.',
227
- '',
228
- 'Some more.',
229
- ' Even more.'])
230
- end
231
-
232
- it "models the outline's steps" do
233
- step_names = outline.steps.collect { |step| step.text }
234
-
235
- expect(step_names).to eq(['a <setup> step', 'an action step', 'a <verification> step'])
236
- end
237
-
238
- it "models the outline's tags" do
239
- tag_names = outline.tags.collect { |tag| tag.name }
240
-
241
- expect(tag_names).to eq(['@tag1', '@tag2', '@tag3'])
242
- end
243
-
244
- it "models the outline's examples" do
245
- example_names = outline.examples.collect { |example| example.name }
246
-
247
- expect(example_names).to eq(['example 1', 'example 2'])
248
- end
249
-
250
- end
251
-
252
-
253
- # gherkin 3.x does not accept incomplete outlines
254
- context 'an empty outline', :gherkin3 => false do
255
-
256
- let(:source_text) { "#{OUTLINE_KEYWORD}:" }
257
- let(:outline) { clazz.new(source_text) }
258
-
259
-
260
- it "models the outline's name" do
261
- expect(outline.name).to eq('')
262
- end
263
-
264
- it "models the outline's description" do
265
- expect(outline.description).to eq('')
266
- end
267
-
268
- it "models the outline's steps" do
269
- expect(outline.steps).to eq([])
270
- end
271
-
272
- it "models the outline's tags" do
273
- expect(outline.tags).to eq([])
274
- end
275
-
276
- it "models the outline's examples" do
277
- expect(outline.examples).to eq([])
278
- end
279
-
280
- end
281
-
282
- end
283
-
284
- end
285
-
286
- it 'trims whitespace from its source description' do
287
- source = ["#{OUTLINE_KEYWORD}:",
288
- ' ',
289
- ' description line 1',
290
- '',
291
- ' description line 2',
292
- ' description line 3 ',
293
- '',
294
- '',
295
- '',
296
- " #{STEP_KEYWORD} a step",
297
- '',
298
- "#{EXAMPLE_KEYWORD}:",
299
- '|param|',
300
- '|value|']
301
- source = source.join("\n")
302
-
303
- outline = clazz.new(source)
304
- description = outline.description.split("\n", -1)
305
-
306
- expect(description).to eq([' description line 1',
307
- '',
308
- 'description line 2',
309
- ' description line 3'])
310
- end
311
-
312
-
313
- describe 'comparison' do
314
-
315
- it 'is equal to a background with the same steps' do
316
- source = "#{OUTLINE_KEYWORD}:
317
- #{STEP_KEYWORD} step 1
318
- #{STEP_KEYWORD} step 2
319
- #{EXAMPLE_KEYWORD}:
320
- | param |
321
- | value |"
322
- outline = clazz.new(source)
323
-
324
- source = "#{BACKGROUND_KEYWORD}:
325
- #{STEP_KEYWORD} step 1
326
- #{STEP_KEYWORD} step 2"
327
- background_1 = CukeModeler::Background.new(source)
328
-
329
- source = "#{BACKGROUND_KEYWORD}:
330
- #{STEP_KEYWORD} step 2
331
- #{STEP_KEYWORD} step 1"
332
- background_2 = CukeModeler::Background.new(source)
333
-
334
-
335
- expect(outline).to eq(background_1)
336
- expect(outline).to_not eq(background_2)
337
- end
338
-
339
- it 'is equal to a scenario with the same steps' do
340
- source = "#{OUTLINE_KEYWORD}:
341
- #{STEP_KEYWORD} step 1
342
- #{STEP_KEYWORD} step 2
343
- #{EXAMPLE_KEYWORD}:
344
- | param |
345
- | value |"
346
- outline = clazz.new(source)
347
-
348
- source = "#{SCENARIO_KEYWORD}:
349
- #{STEP_KEYWORD} step 1
350
- #{STEP_KEYWORD} step 2"
351
- scenario_1 = CukeModeler::Scenario.new(source)
352
-
353
- source = "#{SCENARIO_KEYWORD}:
354
- #{STEP_KEYWORD} step 2
355
- #{STEP_KEYWORD} step 1"
356
- scenario_2 = CukeModeler::Scenario.new(source)
357
-
358
-
359
- expect(outline).to eq(scenario_1)
360
- expect(outline).to_not eq(scenario_2)
361
- end
362
-
363
- it 'is equal to an outline with the same steps' do
364
- source = "#{OUTLINE_KEYWORD}:
365
- #{STEP_KEYWORD} step 1
366
- #{STEP_KEYWORD} step 2
367
- #{EXAMPLE_KEYWORD}:
368
- | param |
369
- | value |"
370
- outline_1 = clazz.new(source)
371
-
372
- source = "#{OUTLINE_KEYWORD}:
373
- #{STEP_KEYWORD} step 1
374
- #{STEP_KEYWORD} step 2
375
- #{EXAMPLE_KEYWORD}:
376
- | param |
377
- | value |"
378
- outline_2 = clazz.new(source)
379
-
380
- source = "#{OUTLINE_KEYWORD}:
381
- #{STEP_KEYWORD} step 2
382
- #{STEP_KEYWORD} step 1
383
- #{EXAMPLE_KEYWORD}:
384
- | param |
385
- | value |"
386
- outline_3 = clazz.new(source)
387
-
388
-
389
- expect(outline_1).to eq(outline_2)
390
- expect(outline_1).to_not eq(outline_3)
391
- end
392
-
393
- end
394
-
395
-
396
- describe 'outline output' do
397
-
398
- it 'can be remade from its own output' do
399
- source = "@tag1 @tag2 @tag3
400
- #{OUTLINE_KEYWORD}: An outline with everything it could have
401
-
402
- Some description.
403
- Some more description.
404
-
405
- #{STEP_KEYWORD} a step
406
- | value |
407
- #{STEP_KEYWORD} a <value> step
408
- \"\"\"
409
- some string
410
- \"\"\"
411
-
412
- #{EXAMPLE_KEYWORD}:
413
-
414
- Some description.
415
- Some more description.
416
-
417
- | value |
418
- | x |
419
-
420
- @example_tag
421
- #{EXAMPLE_KEYWORD}:
422
- | value |
423
- | y |"
424
- outline = clazz.new(source)
425
-
426
- outline_output = outline.to_s
427
- remade_outline_output = clazz.new(outline_output).to_s
428
-
429
- expect(remade_outline_output).to eq(outline_output)
430
- end
431
-
432
-
433
- context 'from source text' do
434
-
435
- # gherkin 3.x does not accept incomplete outlines
436
- it 'can output an empty outline', :gherkin3 => false do
437
- source = ["#{OUTLINE_KEYWORD}:"]
438
- source = source.join("\n")
439
- outline = clazz.new(source)
440
-
441
- outline_output = outline.to_s.split("\n", -1)
442
-
443
- expect(outline_output).to eq(["#{OUTLINE_KEYWORD}:"])
444
- end
445
-
446
- # gherkin 3.x does not accept incomplete outlines
447
- it 'can output a outline that has a name', :gherkin3 => false do
448
- source = ["#{OUTLINE_KEYWORD}: test outline"]
449
- source = source.join("\n")
450
- outline = clazz.new(source)
451
-
452
- outline_output = outline.to_s.split("\n", -1)
453
-
454
- expect(outline_output).to eq(["#{OUTLINE_KEYWORD}: test outline"])
455
- end
456
-
457
- # gherkin 3.x does not accept incomplete outlines
458
- it 'can output a outline that has a description', :gherkin3 => false do
459
- source = ["#{OUTLINE_KEYWORD}:",
460
- 'Some description.',
461
- 'Some more description.']
462
- source = source.join("\n")
463
- outline = clazz.new(source)
464
-
465
- outline_output = outline.to_s.split("\n", -1)
466
-
467
- expect(outline_output).to eq(["#{OUTLINE_KEYWORD}:",
468
- '',
469
- 'Some description.',
470
- 'Some more description.'])
471
- end
472
-
473
- # gherkin 3.x does not accept incomplete outlines
474
- it 'can output a outline that has steps', :gherkin3 => false do
475
- source = ["#{OUTLINE_KEYWORD}:",
476
- " #{STEP_KEYWORD} a step",
477
- ' | value |',
478
- " #{STEP_KEYWORD} another step",
479
- ' """',
480
- ' some string',
481
- ' """']
482
- source = source.join("\n")
483
- outline = clazz.new(source)
484
-
485
- outline_output = outline.to_s.split("\n", -1)
486
-
487
- expect(outline_output).to eq(["#{OUTLINE_KEYWORD}:",
488
- " #{STEP_KEYWORD} a step",
489
- ' | value |',
490
- " #{STEP_KEYWORD} another step",
491
- ' """',
492
- ' some string',
493
- ' """'])
494
- end
495
-
496
- # gherkin 3.x does not accept incomplete outlines
497
- it 'can output a outline that has tags', :gherkin3 => false do
498
- source = ['@tag1 @tag2',
499
- '@tag3',
500
- "#{OUTLINE_KEYWORD}:"]
501
- source = source.join("\n")
502
- outline = clazz.new(source)
503
-
504
- outline_output = outline.to_s.split("\n", -1)
505
-
506
- expect(outline_output).to eq(['@tag1 @tag2 @tag3',
507
- "#{OUTLINE_KEYWORD}:"])
508
- end
509
-
510
- it 'can output a outline that has examples' do
511
- source = ["#{OUTLINE_KEYWORD}:",
512
- "#{STEP_KEYWORD} a step",
513
- "#{EXAMPLE_KEYWORD}:",
514
- '| value |',
515
- '| x |',
516
- "#{EXAMPLE_KEYWORD}:",
517
- '| value |',
518
- '| y |']
519
- source = source.join("\n")
520
- outline = clazz.new(source)
521
-
522
- outline_output = outline.to_s.split("\n", -1)
523
-
524
- expect(outline_output).to eq(["#{OUTLINE_KEYWORD}:",
525
- " #{STEP_KEYWORD} a step",
526
- '',
527
- "#{EXAMPLE_KEYWORD}:",
528
- ' | value |',
529
- ' | x |',
530
- '',
531
- "#{EXAMPLE_KEYWORD}:",
532
- ' | value |',
533
- ' | y |'])
534
- end
535
-
536
- it 'can output a outline that has everything' do
537
- source = ['@tag1 @tag2 @tag3',
538
- "#{OUTLINE_KEYWORD}: A outline with everything it could have",
539
- 'Including a description',
540
- 'and then some.',
541
- "#{STEP_KEYWORD} a step",
542
- '|value|',
543
- "#{STEP_KEYWORD} another step",
544
- '"""',
545
- 'some string',
546
- '"""',
547
- '',
548
- "#{EXAMPLE_KEYWORD}:",
549
- '',
550
- 'Some description.',
551
- 'Some more description.',
552
- '',
553
- '| value |',
554
- '| x |',
555
- '',
556
- '@example_tag',
557
- "#{EXAMPLE_KEYWORD}:",
558
- '| value |',
559
- '| y |']
560
- source = source.join("\n")
561
- outline = clazz.new(source)
562
-
563
- outline_output = outline.to_s.split("\n", -1)
564
-
565
- expect(outline_output).to eq(['@tag1 @tag2 @tag3',
566
- "#{OUTLINE_KEYWORD}: A outline with everything it could have",
567
- '',
568
- 'Including a description',
569
- 'and then some.',
570
- '',
571
- " #{STEP_KEYWORD} a step",
572
- ' | value |',
573
- " #{STEP_KEYWORD} another step",
574
- ' """',
575
- ' some string',
576
- ' """',
577
- '',
578
- "#{EXAMPLE_KEYWORD}:",
579
- '',
580
- 'Some description.',
581
- 'Some more description.',
582
- '',
583
- ' | value |',
584
- ' | x |',
585
- '',
586
- '@example_tag',
587
- "#{EXAMPLE_KEYWORD}:",
588
- ' | value |',
589
- ' | y |'])
590
- end
591
-
592
- end
593
-
594
-
595
- context 'from abstract instantiation' do
596
-
597
- let(:outline) { clazz.new }
598
-
599
-
600
- it 'can output an outline that has only tags' do
601
- outline.tags = [CukeModeler::Tag.new]
602
-
603
- expect { outline.to_s }.to_not raise_error
604
- end
605
-
606
- it 'can output an outline that has only steps' do
607
- outline.steps = [CukeModeler::Step.new]
608
-
609
- expect { outline.to_s }.to_not raise_error
610
- end
611
-
612
- it 'can output an outline that has only examples' do
613
- outline.examples = [CukeModeler::Example.new]
614
-
615
- expect { outline.to_s }.to_not raise_error
616
- end
617
-
618
- end
619
-
620
- end
621
-
622
- end
623
-
624
- end