cuporter 0.1.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.
- data/LICENSE +22 -0
- data/README.textile +72 -0
- data/Rakefile +86 -0
- data/bin/cuporter +9 -0
- data/features/pretty_print.feature +7 -0
- data/features/step_definitions/cuporter_steps.rb +8 -0
- data/features/support/env.rb +2 -0
- data/lib/cuporter/cli/options.rb +46 -0
- data/lib/cuporter/extensions/string.rb +10 -0
- data/lib/cuporter/feature_parser.rb +63 -0
- data/lib/cuporter/formatters/csv.rb +11 -0
- data/lib/cuporter/formatters/html.rb +70 -0
- data/lib/cuporter/formatters/text.rb +11 -0
- data/lib/cuporter/formatters/text_methods.rb +28 -0
- data/lib/cuporter/formatters/writer.rb +17 -0
- data/lib/cuporter/node.rb +72 -0
- data/lib/cuporter/tag_list_node.rb +25 -0
- data/lib/cuporter/tag_report.rb +23 -0
- data/lib/cuporter.rb +12 -0
- data/spec/cuporter/feature_parser_spec.rb +53 -0
- data/spec/cuporter/functional/single_feature_spec.rb +348 -0
- data/spec/cuporter/node_spec.rb +55 -0
- data/spec/cuporter/support/functional/cli.rb +10 -0
- data/spec/cuporter/tag_list_node_spec.rb +289 -0
- data/spec/spec_helper.rb +8 -0
- metadata +96 -0
@@ -0,0 +1,348 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Cuporter
|
4
|
+
|
5
|
+
describe "Single Feature Tag Reports" do
|
6
|
+
|
7
|
+
context "empty feature file" do
|
8
|
+
it "returns empty string and should not raise an error" do
|
9
|
+
expect do
|
10
|
+
@report = one_feature( "fixtures/empty_file.feature")
|
11
|
+
end.to_not raise_error()
|
12
|
+
@report.should be_empty
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "one scenario one tag" do
|
17
|
+
it "returns one tag mapped to one scenario name" do
|
18
|
+
report = one_feature( "fixtures/one_scenario_one_tag.feature")
|
19
|
+
report.should == <<EOF
|
20
|
+
@wip
|
21
|
+
Feature: foo
|
22
|
+
Scenario: bar the great foo
|
23
|
+
EOF
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "one scenario two tags" do
|
28
|
+
it "returns two tags mapped to the same scenario" do
|
29
|
+
report = one_feature( "fixtures/one_scenario_two_tags.feature")
|
30
|
+
report.should == <<EOF
|
31
|
+
@smoke
|
32
|
+
Feature: foo
|
33
|
+
Scenario: some test of something
|
34
|
+
@wip
|
35
|
+
Feature: foo
|
36
|
+
Scenario: some test of something
|
37
|
+
EOF
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "two scenarios one tag" do
|
42
|
+
it "returns one tag mapped to one scenario" do
|
43
|
+
report = one_feature( "fixtures/two_scenarios_one_tag.feature")
|
44
|
+
report.should == <<EOF
|
45
|
+
@smoke
|
46
|
+
Feature: foo
|
47
|
+
Scenario: another test
|
48
|
+
EOF
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "one scenario tag one feature tag" do
|
53
|
+
it "returns two tags, one mapped to one scenario, the other mapped to two" do
|
54
|
+
report = one_feature( "fixtures/one_scenario_tag_one_feature_tag.feature")
|
55
|
+
report.should == <<EOF
|
56
|
+
@customer_module
|
57
|
+
Feature: foo
|
58
|
+
Scenario: another test
|
59
|
+
Scenario: some test of something
|
60
|
+
@smoke
|
61
|
+
Feature: foo
|
62
|
+
Scenario: another test
|
63
|
+
EOF
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
context "scenario outline with 2 examples" do
|
69
|
+
context "1 example tag" do
|
70
|
+
it "returns 1 tag mapped to 1 example" do
|
71
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_example_tag.feature")
|
72
|
+
report.should == <<EOF
|
73
|
+
@smoke
|
74
|
+
Feature: foo
|
75
|
+
Scenario Outline: outline
|
76
|
+
Scenarios: bang
|
77
|
+
EOF
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "1 tag per example" do
|
82
|
+
it "returns 2 examples mapped to a tag" do
|
83
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_tag_per_example.feature")
|
84
|
+
report.should == <<EOF
|
85
|
+
@smoke
|
86
|
+
Feature: foo
|
87
|
+
Scenario Outline: some
|
88
|
+
Scenarios: yet
|
89
|
+
@wip
|
90
|
+
Feature: foo
|
91
|
+
Scenario Outline: some
|
92
|
+
Scenarios: another
|
93
|
+
EOF
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "1 tag per example, 2 feature tags" do
|
98
|
+
it "returns 4 tags . . ." do
|
99
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_tag_per_example_2_feature_tags.feature")
|
100
|
+
report.should == <<EOF
|
101
|
+
@smoke
|
102
|
+
Feature: foo
|
103
|
+
Scenario Outline: outline
|
104
|
+
Scenarios: yet
|
105
|
+
@taggy
|
106
|
+
Feature: foo
|
107
|
+
Scenario Outline: outline
|
108
|
+
Scenarios: another
|
109
|
+
Scenarios: yet
|
110
|
+
@waggy
|
111
|
+
Feature: foo
|
112
|
+
Scenario Outline: outline
|
113
|
+
Scenarios: another
|
114
|
+
Scenarios: yet
|
115
|
+
@wip
|
116
|
+
Feature: foo
|
117
|
+
Scenario Outline: outline
|
118
|
+
Scenarios: another
|
119
|
+
EOF
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "1 example tag and 1 feature tag" do
|
124
|
+
it "returns 2 tags" do
|
125
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_example_tag_and_1_feature_tag.feature")
|
126
|
+
report.should == <<EOF
|
127
|
+
@f_tag
|
128
|
+
Feature: foo
|
129
|
+
Scenario Outline: outline
|
130
|
+
Scenarios: another
|
131
|
+
Scenarios: yet
|
132
|
+
@smoke
|
133
|
+
Feature: foo
|
134
|
+
Scenario Outline: outline
|
135
|
+
Scenarios: yet
|
136
|
+
EOF
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "1 example tag and 1 scenario outline tag" do
|
141
|
+
it "returns 1 example mapped to 1 tag" do
|
142
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_example_tag_and_1_scenario_outline_tag.feature")
|
143
|
+
report.should == <<EOF
|
144
|
+
@s_o_tag
|
145
|
+
Feature: foo
|
146
|
+
Scenario Outline: outline
|
147
|
+
Scenarios: another
|
148
|
+
Scenarios: yet
|
149
|
+
@smoke
|
150
|
+
Feature: foo
|
151
|
+
Scenario Outline: outline
|
152
|
+
Scenarios: yet
|
153
|
+
EOF
|
154
|
+
end
|
155
|
+
end
|
156
|
+
context "1 example tag, 1 scenario outline tag, 1 feature tag" do
|
157
|
+
it "3 tags" do
|
158
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_example_tag_1_scenario_outline_tag_1_feature_tag.feature")
|
159
|
+
report.should == <<EOF
|
160
|
+
@f_tag
|
161
|
+
Feature: foo
|
162
|
+
Scenario Outline: outline
|
163
|
+
Scenarios: another
|
164
|
+
Scenarios: yet
|
165
|
+
@s_o_tag
|
166
|
+
Feature: foo
|
167
|
+
Scenario Outline: outline
|
168
|
+
Scenarios: another
|
169
|
+
Scenarios: yet
|
170
|
+
@smoke
|
171
|
+
Feature: foo
|
172
|
+
Scenario Outline: outline
|
173
|
+
Scenarios: yet
|
174
|
+
EOF
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context "1 scenario and 1 outline with 2 examples" do
|
180
|
+
context "1 scenario tag, 1 outline tag" do
|
181
|
+
it "returns 2 tags, 1 with a scenario, 1 with an outline" do
|
182
|
+
report = one_feature( "fixtures/1_scenario_and_1_outline_with_2_examples/1_scenario_tag_1_outline_tag.feature")
|
183
|
+
report.should == <<EOF
|
184
|
+
@s_o_tag
|
185
|
+
Feature: foo
|
186
|
+
Scenario Outline: outline
|
187
|
+
Scenarios: another
|
188
|
+
Scenarios: yet
|
189
|
+
@s_tag
|
190
|
+
Feature: foo
|
191
|
+
Scenario: oh
|
192
|
+
EOF
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
context "1 scenario tag, 1 example tag" do
|
197
|
+
it "returns 2 tags, 1 with a scenario and 1 with an outline" do
|
198
|
+
report = one_feature( "fixtures/1_scenario_and_1_outline_with_2_examples/1_scenario_tag_1_example_tag.feature")
|
199
|
+
report.should == <<EOF
|
200
|
+
@s_o_tag
|
201
|
+
Feature: foo
|
202
|
+
Scenario Outline: outline
|
203
|
+
Scenarios: another
|
204
|
+
@s_tag
|
205
|
+
Feature: foo
|
206
|
+
Scenario: oh
|
207
|
+
EOF
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
context "1 feature tag, 1 example tag" do
|
212
|
+
it "returns 2 tags" do
|
213
|
+
report = one_feature( "fixtures/1_scenario_and_1_outline_with_2_examples/1_feature_tag_1_example_tag.feature")
|
214
|
+
report.should == <<EOF
|
215
|
+
@example_tag
|
216
|
+
Feature: foo
|
217
|
+
Scenario Outline: outline
|
218
|
+
Scenarios: another
|
219
|
+
@f_tag
|
220
|
+
Feature: foo
|
221
|
+
Scenario: oh
|
222
|
+
Scenario Outline: outline
|
223
|
+
Scenarios: another
|
224
|
+
Scenarios: yet
|
225
|
+
EOF
|
226
|
+
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
context "1 feature tag, 2 scenario tags, 1 outline tag, 1 example tag" do
|
231
|
+
it "returns 5 tags" do
|
232
|
+
report = one_feature( "fixtures/1_scenario_and_1_outline_with_2_examples/1_feature_tag_2_scenario_tags_1_outline_tag_1_example_tag.feature")
|
233
|
+
report.should == <<EOF
|
234
|
+
@e_tag
|
235
|
+
Feature: foo
|
236
|
+
Scenario Outline: outline
|
237
|
+
Scenarios: yet
|
238
|
+
@f_tag
|
239
|
+
Feature: foo
|
240
|
+
Scenario: oh
|
241
|
+
Scenario Outline: outline
|
242
|
+
Scenarios: another
|
243
|
+
Scenarios: yet
|
244
|
+
@o_tag
|
245
|
+
Feature: foo
|
246
|
+
Scenario Outline: outline
|
247
|
+
Scenarios: another
|
248
|
+
Scenarios: yet
|
249
|
+
@s_tag
|
250
|
+
Feature: foo
|
251
|
+
Scenario: oh
|
252
|
+
@wip
|
253
|
+
Feature: foo
|
254
|
+
Scenario: oh
|
255
|
+
EOF
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
260
|
+
|
261
|
+
context "2 outlines 1 scenario" do
|
262
|
+
context "2 outline tags, 1 scenario tag, 1 example tag" do
|
263
|
+
it "returns 4 tags" do
|
264
|
+
report = one_feature( "fixtures/2_outlines_1_scenario/2_outline_tags_1_scenario_tag_1_example_tag.feature")
|
265
|
+
report.should == <<EOF
|
266
|
+
@e_tag
|
267
|
+
Feature: foo
|
268
|
+
Scenario Outline: outline 2
|
269
|
+
Scenarios: yet
|
270
|
+
@s_o_tag_1
|
271
|
+
Feature: foo
|
272
|
+
Scenario Outline: outline 1
|
273
|
+
Scenarios: example
|
274
|
+
@s_o_tag_2
|
275
|
+
Feature: foo
|
276
|
+
Scenario Outline: outline 2
|
277
|
+
Scenarios: another
|
278
|
+
Scenarios: yet
|
279
|
+
@wip
|
280
|
+
Feature: foo
|
281
|
+
Scenario: oh
|
282
|
+
EOF
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
context "2 outline tags, 2 example tag, 2 empty example names" do
|
287
|
+
it "returns 4 tags" do
|
288
|
+
report = one_feature( "fixtures/2_outlines_1_scenario/empty_example_name.feature")
|
289
|
+
report.should == <<EOF
|
290
|
+
@e_tag
|
291
|
+
Feature: foo
|
292
|
+
Scenario Outline: outline 2
|
293
|
+
Examples:
|
294
|
+
@nameless
|
295
|
+
Feature: foo
|
296
|
+
Scenario Outline: outline 1
|
297
|
+
Scenarios:
|
298
|
+
@s_o_tag_1
|
299
|
+
Feature: foo
|
300
|
+
Scenario Outline: outline 1
|
301
|
+
Scenarios:
|
302
|
+
Scenarios: example set 2
|
303
|
+
@s_o_tag_2
|
304
|
+
Feature: foo
|
305
|
+
Scenario Outline: outline 2
|
306
|
+
Examples:
|
307
|
+
Examples: another
|
308
|
+
EOF
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
context "scenario outlines only" do
|
314
|
+
context "3 outlines" do
|
315
|
+
it "includes all outlines" do
|
316
|
+
report = one_feature( "fixtures/3_scenario_outlines.feature")
|
317
|
+
report.should == <<EOF
|
318
|
+
@blocked
|
319
|
+
Feature: foo
|
320
|
+
Scenario Outline: outline 2
|
321
|
+
Scenarios: another
|
322
|
+
@e_tag
|
323
|
+
Feature: foo
|
324
|
+
Scenario Outline: outline 3
|
325
|
+
Scenarios: yet
|
326
|
+
@s_o_tag_1
|
327
|
+
Feature: foo
|
328
|
+
Scenario Outline: outline 1
|
329
|
+
Scenarios: example
|
330
|
+
@s_o_tag_3
|
331
|
+
Feature: foo
|
332
|
+
Scenario Outline: outline 3
|
333
|
+
Scenarios: another
|
334
|
+
Scenarios: yet
|
335
|
+
@wip
|
336
|
+
Feature: foo
|
337
|
+
Scenario Outline: outline 2
|
338
|
+
Scenarios: another
|
339
|
+
Scenarios: yet
|
340
|
+
EOF
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
end
|
345
|
+
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Cuporter
|
4
|
+
describe Node do
|
5
|
+
context 'new node' do
|
6
|
+
let(:node) {Node.new("name")}
|
7
|
+
it 'has a name' do
|
8
|
+
node.name.should == "name"
|
9
|
+
end
|
10
|
+
it 'has an empty list of children' do
|
11
|
+
node.should_not have_children
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'children' do
|
16
|
+
let(:node) {Node.new("parent")}
|
17
|
+
it 'can add a child' do
|
18
|
+
child = Node.new("child")
|
19
|
+
node.add_child(child)
|
20
|
+
node.should have_children
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'does not check child type' do
|
24
|
+
expect {
|
25
|
+
node.add_child(:foo)
|
26
|
+
}.to_not raise_error()
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'does not add duplicate' do
|
30
|
+
child = Node.new('child')
|
31
|
+
child.add_child Node.new('grandchild')
|
32
|
+
twin = child.dup
|
33
|
+
|
34
|
+
child.should == twin
|
35
|
+
child.object_id.should_not == twin.object_id
|
36
|
+
|
37
|
+
node.add_child child
|
38
|
+
node.children.size.should == 1
|
39
|
+
|
40
|
+
node.add_child twin
|
41
|
+
node.children.size.should == 1
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'equivalence' do
|
46
|
+
it '== means value equivalence' do
|
47
|
+
n1 = Node.new('herbert')
|
48
|
+
n2 = Node.new('herbert')
|
49
|
+
n1.add_child(Node.new('lou'))
|
50
|
+
n2.add_child(Node.new('lou'))
|
51
|
+
n1.should == n2
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,289 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Cuporter
|
4
|
+
describe TagListNode do
|
5
|
+
context 'new tag list node' do
|
6
|
+
let(:tag_list_node) {TagListNode.new("name", []) }
|
7
|
+
it 'is a node' do
|
8
|
+
tag_list_node.should be_a Node
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'has an empty tag list' do
|
12
|
+
tag_list_node.should_not have_universal_tags
|
13
|
+
end
|
14
|
+
context 'with tags' do
|
15
|
+
it 'should have tags' do
|
16
|
+
tag_list_node = TagListNode.new("name", %w[tag_1 tag_2])
|
17
|
+
tag_list_node.should have_universal_tags
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'children' do
|
23
|
+
context 'with universal tags but none of their own' do
|
24
|
+
it 'child inherits one tag from parent' do
|
25
|
+
tag_list_node = TagListNode.new("parent", ["p_tag_1"])
|
26
|
+
tag_list_node.add_to_tag_node(Node.new("child"))
|
27
|
+
|
28
|
+
tag_list_node.children.size.should == 1
|
29
|
+
tag_list_node.children.first.name.should == "p_tag_1"
|
30
|
+
|
31
|
+
tag_list_node[:p_tag_1].children.size.should == 1
|
32
|
+
tag_list_node[:p_tag_1].children.first.name.should == "child"
|
33
|
+
|
34
|
+
end
|
35
|
+
it 'child inherits 2 tags from parent' do
|
36
|
+
tag_list_node = TagListNode.new("parent", ["p_tag_1", "p_tag_2"])
|
37
|
+
tag_list_node.add_to_tag_node(Node.new("child"))
|
38
|
+
|
39
|
+
tag_list_node.children.size.should == 2
|
40
|
+
tag_list_node.children.first.name.should == "p_tag_1"
|
41
|
+
tag_list_node.children.last.name.should == "p_tag_2"
|
42
|
+
|
43
|
+
tag_list_node[:p_tag_1].children.size.should == 1
|
44
|
+
tag_list_node[:p_tag_1].children.first.name.should == "child"
|
45
|
+
|
46
|
+
tag_list_node[:p_tag_2].children.size.should == 1
|
47
|
+
tag_list_node[:p_tag_2].children.first.name.should == "child"
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
context 'without universal tags but some of their own' do
|
52
|
+
let(:tag_list_node) {TagListNode.new("parent", []) }
|
53
|
+
it 'child has one tag' do
|
54
|
+
tag_list_node.add_to_tag_node(Node.new("child"), ["c_tag_1"])
|
55
|
+
|
56
|
+
tag_list_node.children.size.should == 1
|
57
|
+
tag_list_node.children.first.name.should == "c_tag_1"
|
58
|
+
|
59
|
+
tag_list_node[:c_tag_1].children.size.should == 1
|
60
|
+
tag_list_node[:c_tag_1].children.first.name.should == "child"
|
61
|
+
end
|
62
|
+
it 'child has two tags' do
|
63
|
+
tag_list_node.add_to_tag_node(Node.new("child"), ["c_tag_1", "c_tag_2"])
|
64
|
+
|
65
|
+
tag_list_node.children.size.should == 2
|
66
|
+
tag_list_node.children.first.name.should == "c_tag_1"
|
67
|
+
tag_list_node.children.last.name.should == "c_tag_2"
|
68
|
+
|
69
|
+
tag_list_node[:c_tag_1].children.size.should == 1
|
70
|
+
tag_list_node[:c_tag_1].children.first.name.should == "child"
|
71
|
+
|
72
|
+
tag_list_node[:c_tag_2].children.size.should == 1
|
73
|
+
tag_list_node[:c_tag_2].children.first.name.should == "child"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
context 'with universal tags and their own tags' do
|
77
|
+
let(:tag_list_node) {TagListNode.new("parent",%w[p_tag_1 p_tag_2]) }
|
78
|
+
it "2 universal tags and 2 child tags" do
|
79
|
+
tag_list_node.add_to_tag_node(Node.new("child"), ["c_tag_1", "c_tag_2"])
|
80
|
+
|
81
|
+
tag_list_node.children.size.should == 4
|
82
|
+
tag_list_node.children.collect do |c|
|
83
|
+
c.name
|
84
|
+
end.should == %w[p_tag_1 p_tag_2 c_tag_1 c_tag_2]
|
85
|
+
|
86
|
+
tag_list_node[:p_tag_1].children.size.should == 1
|
87
|
+
tag_list_node[:p_tag_1].children.first.name.should == "child"
|
88
|
+
|
89
|
+
tag_list_node[:p_tag_2].children.size.should == 1
|
90
|
+
tag_list_node[:p_tag_2].children.first.name.should == "child"
|
91
|
+
|
92
|
+
tag_list_node[:c_tag_1].children.size.should == 1
|
93
|
+
tag_list_node[:c_tag_1].children.first.name.should == "child"
|
94
|
+
|
95
|
+
tag_list_node[:c_tag_2].children.size.should == 1
|
96
|
+
tag_list_node[:c_tag_2].children.first.name.should == "child"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
context 'with no tags at all' do
|
100
|
+
it 'top node has no children' do
|
101
|
+
tag_list_node = TagListNode.new("parent", [])
|
102
|
+
tag_list_node.add_to_tag_node(Node.new("child"))
|
103
|
+
|
104
|
+
tag_list_node.should_not have_children
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'second child with preexisting tag' do
|
111
|
+
it 'top node has 1 child and 2 grandchildren' do
|
112
|
+
tag_list_node = TagListNode.new("parent", ["p_tag_1"])
|
113
|
+
tag_list_node.add_to_tag_node(Node.new("child_1"))
|
114
|
+
tag_list_node.add_to_tag_node(Node.new("child_2"))
|
115
|
+
|
116
|
+
tag_list_node.children.size.should == 1
|
117
|
+
tag_list_node.children[0].name.should == "p_tag_1"
|
118
|
+
|
119
|
+
tag_list_node[:p_tag_1].children.size.should == 2
|
120
|
+
tag_list_node[:p_tag_1].children[0].name.should == "child_1"
|
121
|
+
tag_list_node[:p_tag_1].children[1].name.should == "child_2"
|
122
|
+
end
|
123
|
+
|
124
|
+
it '2 child nodes with 1 universal tag and 2 child tags' do
|
125
|
+
tag_list_node = TagListNode.new("parent", ["p_tag_1"])
|
126
|
+
tag_list_node.add_to_tag_node(Node.new("child_1"), ["c_tag_1"])
|
127
|
+
tag_list_node.add_to_tag_node(Node.new("child_2"), ["c_tag_1", "c_tag_2"])
|
128
|
+
|
129
|
+
tag_list_node.children.size.should == 3
|
130
|
+
tag_list_node.children[0].name.should == "p_tag_1"
|
131
|
+
tag_list_node.children[1].name.should == "c_tag_1"
|
132
|
+
tag_list_node.children[2].name.should == "c_tag_2"
|
133
|
+
|
134
|
+
tag_list_node[:p_tag_1].children.size.should == 2
|
135
|
+
tag_list_node[:p_tag_1].children[0].name.should == "child_1"
|
136
|
+
tag_list_node[:p_tag_1].children[1].name.should == "child_2"
|
137
|
+
|
138
|
+
tag_list_node[:c_tag_1].children.size.should == 2
|
139
|
+
tag_list_node[:c_tag_1].children[0].name.should == "child_1"
|
140
|
+
tag_list_node[:c_tag_1].children[1].name.should == "child_2"
|
141
|
+
|
142
|
+
tag_list_node[:c_tag_2].children.size.should == 1
|
143
|
+
tag_list_node[:c_tag_2].children[0].name.should == "child_2"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
context 'child is tag list node' do
|
148
|
+
context '1 universal tag on parent and no universal tags on child' do
|
149
|
+
context "child must be initialized with parent's universal tags" do
|
150
|
+
it 'top node has no children' do
|
151
|
+
p = TagListNode.new("parent", ["p_tag_1"])
|
152
|
+
c = TagListNode.new("child", [] )
|
153
|
+
c.add_to_tag_node(Node.new("leaf_1"))
|
154
|
+
|
155
|
+
p.should_not have_children
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'all leaf nodes are under parent universal tag' do
|
159
|
+
p = TagListNode.new("parent", ["p_tag_1"])
|
160
|
+
c = TagListNode.new("child", p.universal_tags)
|
161
|
+
c.add_to_tag_node(Node.new("leaf_1"))
|
162
|
+
c.add_to_tag_node(Node.new("leaf_2"))
|
163
|
+
p.merge(c)
|
164
|
+
|
165
|
+
p.children.size.should == 1
|
166
|
+
p.children[0].name.should == "p_tag_1"
|
167
|
+
|
168
|
+
p[:p_tag_1].children.size.should == 1
|
169
|
+
p[:p_tag_1].children[0].name.should == "child"
|
170
|
+
|
171
|
+
p[:p_tag_1][:child].children.size.should == 2
|
172
|
+
p[:p_tag_1][:child].children[0].name.should == "leaf_1"
|
173
|
+
p[:p_tag_1][:child].children[1].name.should == "leaf_2"
|
174
|
+
|
175
|
+
p[:p_tag_1][:child][:leaf_1].should_not have_children
|
176
|
+
p[:p_tag_1][:child][:leaf_2].should_not have_children
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context '1 universal tag on parent and 1 universal tag on child' do
|
182
|
+
it "2 tags have 2 leaf nodes" do
|
183
|
+
p = TagListNode.new("parent", ["p_tag_1"])
|
184
|
+
c = TagListNode.new("child", p.universal_tags | ["c_tag_1"])
|
185
|
+
c.add_to_tag_node(Node.new("leaf_1"))
|
186
|
+
c.add_to_tag_node(Node.new("leaf_2"))
|
187
|
+
p.merge(c)
|
188
|
+
|
189
|
+
p.children.size.should == 2
|
190
|
+
p.children[0].name.should == "p_tag_1"
|
191
|
+
p.children[1].name.should == "c_tag_1"
|
192
|
+
p[:p_tag_1].children.size.should == 1
|
193
|
+
p[:p_tag_1].children[0].name.should == "child"
|
194
|
+
p[:c_tag_1].children.size.should == 1
|
195
|
+
p[:c_tag_1].children[0].name.should == "child"
|
196
|
+
|
197
|
+
p[:p_tag_1][:child].children.size.should == 2
|
198
|
+
p[:p_tag_1][:child].children[0].name.should == "leaf_1"
|
199
|
+
p[:p_tag_1][:child].children[1].name.should == "leaf_2"
|
200
|
+
|
201
|
+
p[:c_tag_1][:child].children.size.should == 2
|
202
|
+
p[:c_tag_1][:child].children[0].name.should == "leaf_1"
|
203
|
+
p[:c_tag_1][:child].children[1].name.should == "leaf_2"
|
204
|
+
|
205
|
+
p[:p_tag_1][:child][:leaf_1].should_not have_children
|
206
|
+
p[:p_tag_1][:child][:leaf_2].should_not have_children
|
207
|
+
|
208
|
+
p[:c_tag_1][:child][:leaf_1].should_not have_children
|
209
|
+
p[:c_tag_1][:child][:leaf_2].should_not have_children
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
context '1 universal tag on parent and 1 tag on 1 leaf' do
|
214
|
+
it "1 tag has 1 leaf node, the other has 2 leaf nodes" do
|
215
|
+
p = TagListNode.new("parent", ["p_tag_1"])
|
216
|
+
c = TagListNode.new("child", p.universal_tags )
|
217
|
+
c.add_to_tag_node(Node.new("leaf_1"))
|
218
|
+
c.add_to_tag_node(Node.new("leaf_2"), ["l_tag_1"])
|
219
|
+
p.merge(c)
|
220
|
+
|
221
|
+
p.children.size.should == 2
|
222
|
+
p.children[0].name.should == "p_tag_1"
|
223
|
+
p.children[1].name.should == "l_tag_1"
|
224
|
+
p[:p_tag_1].children.size.should == 1
|
225
|
+
p[:p_tag_1].children[0].name.should == "child"
|
226
|
+
p[:l_tag_1].children.size.should == 1
|
227
|
+
p[:l_tag_1].children[0].name.should == "child"
|
228
|
+
|
229
|
+
p[:p_tag_1][:child].children.size.should == 2
|
230
|
+
p[:p_tag_1][:child].children[0].name.should == "leaf_1"
|
231
|
+
p[:p_tag_1][:child].children[1].name.should == "leaf_2"
|
232
|
+
|
233
|
+
p[:l_tag_1][:child].children.size.should == 1
|
234
|
+
p[:l_tag_1][:child].children[0].name.should == "leaf_2"
|
235
|
+
|
236
|
+
p[:p_tag_1][:child][:leaf_1].should_not have_children
|
237
|
+
p[:p_tag_1][:child][:leaf_2].should_not have_children
|
238
|
+
|
239
|
+
p[:l_tag_1][:child][:leaf_2].should_not have_children
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
context '1 universal tag on parent 1 universal tag on child 1 tag on leaf' do
|
244
|
+
it "2 tags with 2 leaves, 1 tag with 1 leaf" do
|
245
|
+
p = TagListNode.new("parent", ["p_tag_1"])
|
246
|
+
c = TagListNode.new("child", p.universal_tags | ["c_tag_1"])
|
247
|
+
c.add_to_tag_node(Node.new("leaf_1"))
|
248
|
+
c.add_to_tag_node(Node.new("leaf_2"), ["l_tag_1"])
|
249
|
+
p.merge(c)
|
250
|
+
|
251
|
+
p.children.size.should == 3
|
252
|
+
p.children[0].name.should == "p_tag_1"
|
253
|
+
p.children[1].name.should == "c_tag_1"
|
254
|
+
p.children[2].name.should == "l_tag_1"
|
255
|
+
|
256
|
+
p[:p_tag_1].children.size.should == 1
|
257
|
+
p[:p_tag_1].children[0].name.should == "child"
|
258
|
+
|
259
|
+
p[:c_tag_1].children.size.should == 1
|
260
|
+
p[:c_tag_1].children[0].name.should == "child"
|
261
|
+
|
262
|
+
p[:l_tag_1].children.size.should == 1
|
263
|
+
p[:l_tag_1].children[0].name.should == "child"
|
264
|
+
|
265
|
+
p[:p_tag_1][:child].children.size.should == 2
|
266
|
+
p[:p_tag_1][:child].children[0].name.should == "leaf_1"
|
267
|
+
p[:p_tag_1][:child].children[1].name.should == "leaf_2"
|
268
|
+
|
269
|
+
p[:c_tag_1][:child].children.size.should == 2
|
270
|
+
p[:c_tag_1][:child].children[0].name.should == "leaf_1"
|
271
|
+
p[:c_tag_1][:child].children[1].name.should == "leaf_2"
|
272
|
+
|
273
|
+
p[:l_tag_1][:child].children.size.should == 1
|
274
|
+
p[:l_tag_1][:child].children[0].name.should == "leaf_2"
|
275
|
+
|
276
|
+
p[:p_tag_1][:child][:leaf_1].should_not have_children
|
277
|
+
p[:p_tag_1][:child][:leaf_2].should_not have_children
|
278
|
+
|
279
|
+
p[:c_tag_1][:child][:leaf_1].should_not have_children
|
280
|
+
p[:c_tag_1][:child][:leaf_2].should_not have_children
|
281
|
+
|
282
|
+
p[:l_tag_1][:child][:leaf_2].should_not have_children
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
end
|
289
|
+
end
|