cuke_modeler 1.4.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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