cuporter 0.1.0 → 0.1.1
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/README.textile +18 -1
- data/Rakefile +1 -1
- data/features/pretty_print.feature +1 -1
- data/lib/cuporter/feature_parser.rb +26 -17
- data/lib/cuporter/formatters/html.rb +15 -9
- data/lib/cuporter/formatters/text_methods.rb +3 -3
- data/lib/cuporter/node.rb +6 -1
- data/lib/cuporter/non_sorting_node.rb +16 -0
- data/lib/cuporter/tag_list_node.rb +8 -8
- data/lib/cuporter.rb +1 -0
- data/spec/cuporter/feature_parser_spec.rb +5 -5
- data/spec/cuporter/functional/scenario_outlines_spec.rb +431 -0
- data/spec/cuporter/functional/single_feature_spec.rb +0 -294
- data/spec/cuporter/tag_list_node_spec.rb +25 -25
- metadata +5 -3
data/README.textile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
h1. Cuporter
|
2
2
|
|
3
|
-
Scrapes your feature files and shows scenarios per tag, with their context. Formats Pretty Text, HTML
|
3
|
+
Scrapes your feature files and shows scenarios per tag, with their context. Formats Pretty Text, HTML and CSV.
|
4
4
|
|
5
5
|
Consider this a stop-gap until we get this functionality in a proper cucumber formatter.
|
6
6
|
|
@@ -16,11 +16,20 @@ h3. Example Output
|
|
16
16
|
Scenario: Everybody's Wired
|
17
17
|
Scenario Outline: Why is everybody so wired?
|
18
18
|
Examples: loosely wired
|
19
|
+
| arg1 | arg2 |
|
20
|
+
| foo | bar |
|
21
|
+
| shif | fish |
|
19
22
|
Examples: tightly wired
|
23
|
+
| name | value |
|
24
|
+
| foo | bar |
|
25
|
+
| frotz | knurl |
|
20
26
|
@ignore
|
21
27
|
Feature: Wired
|
22
28
|
Scenario Outline: Why is everybody so wired?
|
23
29
|
Examples: tightly wired
|
30
|
+
| name | value |
|
31
|
+
| foo | bar |
|
32
|
+
| frotz | knurl |
|
24
33
|
@wip
|
25
34
|
Feature: HTML formatter
|
26
35
|
Scenario: Everything in fixtures/self_test
|
@@ -35,6 +44,14 @@ h3. Example Output
|
|
35
44
|
|
36
45
|
---------
|
37
46
|
|
47
|
+
h3. Install
|
48
|
+
|
49
|
+
<pre>
|
50
|
+
$ gem install cuporter
|
51
|
+
</pre>
|
52
|
+
|
53
|
+
---------
|
54
|
+
|
38
55
|
h3. Command Lines
|
39
56
|
|
40
57
|
h4. help
|
data/Rakefile
CHANGED
@@ -3,5 +3,5 @@ Feature: Pretty print report on 3 features
|
|
3
3
|
@just_me
|
4
4
|
Scenario: Everything in fixtures/self_test
|
5
5
|
When I run cuporter --in fixtures/self_test
|
6
|
-
Then the output should have the same contents as "features/reports/
|
6
|
+
Then the output should have the same contents as "features/reports/pretty_with_outlines_and_examples.txt"
|
7
7
|
|
@@ -6,8 +6,9 @@ module Cuporter
|
|
6
6
|
TAG_LINE = /^\s*(@\w.+)/
|
7
7
|
SCENARIO_LINE = /^\s*(Scenario:[^#]+)$/
|
8
8
|
SCENARIO_OUTLINE_LINE = /^\s*(Scenario Outline:[^#]+)$/
|
9
|
-
|
10
|
-
|
9
|
+
SCENARIO_SET_LINE = /^\s*(Scenarios:[^#]*)$/
|
10
|
+
EXAMPLE_SET_LINE = /^\s*(Examples:[^#]*)$/
|
11
|
+
EXAMPLE_LINE = /^\s*(\|.*\|)\s*$/
|
11
12
|
|
12
13
|
def initialize
|
13
14
|
@current_tags = []
|
@@ -20,44 +21,52 @@ module Cuporter
|
|
20
21
|
def parse(feature_content)
|
21
22
|
lines = feature_content.split(/\n/)
|
22
23
|
|
23
|
-
lines.
|
24
|
+
lines.each_with_index do |line, i|
|
24
25
|
case line
|
25
26
|
when TAG_LINE
|
26
27
|
# may be more than one tag line
|
27
28
|
@current_tags |= $1.strip.split(/\s+/)
|
28
29
|
when FEATURE_LINE
|
29
|
-
@feature = TagListNode.new($1
|
30
|
+
@feature = TagListNode.new($1, @current_tags)
|
30
31
|
@current_tags = []
|
31
32
|
when SCENARIO_LINE
|
32
33
|
# How do we know when we have read all the lines from a "Scenario Outline:"?
|
33
34
|
# One way is when we encounter a "Scenario:"
|
34
|
-
|
35
|
-
@feature.merge(@scenario_outline)
|
36
|
-
@scenario_outline = nil
|
37
|
-
end
|
35
|
+
close_scenario_outline
|
38
36
|
|
39
|
-
@feature.
|
37
|
+
@feature.add_to_tag_nodes(TagListNode.new($1, @current_tags))
|
40
38
|
@current_tags = []
|
41
39
|
when SCENARIO_OUTLINE_LINE
|
42
40
|
# ... another is when we hit a subsequent "Scenario Outline:"
|
43
|
-
|
44
|
-
@feature.merge(@scenario_outline)
|
45
|
-
@scenario_outline = nil
|
46
|
-
end
|
41
|
+
close_scenario_outline
|
47
42
|
|
48
|
-
@scenario_outline = TagListNode.new($1
|
43
|
+
@scenario_outline = TagListNode.new($1, @current_tags)
|
49
44
|
@current_tags = []
|
50
|
-
when
|
51
|
-
@scenario_outline.
|
45
|
+
when EXAMPLE_SET_LINE, SCENARIO_SET_LINE
|
46
|
+
@scenario_outline.add_to_tag_nodes(@example_set) if @example_set
|
47
|
+
|
48
|
+
@example_set = NonSortingNode.new($1, @feature.tags | @current_tags)
|
52
49
|
@current_tags = []
|
50
|
+
when EXAMPLE_LINE
|
51
|
+
@example_set.add_child(Node.new($1))
|
53
52
|
end
|
54
53
|
end
|
55
54
|
|
56
55
|
# EOF is the final way that we know we are finished with a "Scenario Outline"
|
57
|
-
|
56
|
+
close_scenario_outline
|
58
57
|
return @feature
|
59
58
|
end
|
60
59
|
|
60
|
+
def close_scenario_outline
|
61
|
+
if @scenario_outline
|
62
|
+
if @example_set
|
63
|
+
@scenario_outline.add_to_tag_nodes(@example_set) if @example_set
|
64
|
+
@example_set = nil
|
65
|
+
end
|
66
|
+
@feature.merge(@scenario_outline)
|
67
|
+
@scenario_outline = nil
|
68
|
+
end
|
69
|
+
end
|
61
70
|
end
|
62
71
|
|
63
72
|
end
|
@@ -7,10 +7,10 @@ module Cuporter
|
|
7
7
|
module Formatters
|
8
8
|
class Html < Writer
|
9
9
|
|
10
|
-
NODE_CLASS = [:tag, :feature, :scenario, :
|
10
|
+
NODE_CLASS = [:tag, :feature, :scenario, :example_set]
|
11
11
|
|
12
12
|
def write_nodes
|
13
|
-
@report.children.
|
13
|
+
@report.sort.children.each do |tag_node|
|
14
14
|
write_node(tag_node, 0)
|
15
15
|
end
|
16
16
|
builder
|
@@ -21,15 +21,15 @@ module Cuporter
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def write_node(node, indent_level)
|
24
|
-
builder.li do |list_item|
|
25
|
-
list_item.span(node.name, :class => NODE_CLASS[indent_level])
|
24
|
+
builder.li(:class => NODE_CLASS[indent_level]) do |list_item|
|
25
|
+
list_item.span(node.name, :class => "#{NODE_CLASS[indent_level]}_name")
|
26
26
|
if node.has_children?
|
27
|
-
list_item.ul do |list|
|
28
|
-
node.children.
|
27
|
+
list_item.ul(:class => "#{NODE_CLASS[indent_level]}_children") do |list|
|
28
|
+
node.sort.children.each do |child|
|
29
29
|
if child.has_children?
|
30
30
|
write_node(child, indent_level + 1)
|
31
31
|
else
|
32
|
-
list.li(child.name, :class => NODE_CLASS[indent_level + 1])
|
32
|
+
list.li(child.name, :class => "#{NODE_CLASS[indent_level + 1]}_name")
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -37,6 +37,10 @@ module Cuporter
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
def inline_style
|
41
|
+
File.read("lib/cuporter/formatters/cuporter.css")
|
42
|
+
end
|
43
|
+
|
40
44
|
def get_binding
|
41
45
|
binding
|
42
46
|
end
|
@@ -54,10 +58,12 @@ module Cuporter
|
|
54
58
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
55
59
|
<head>
|
56
60
|
<title>Cucumber Tags</title>
|
57
|
-
<style type="text/css"
|
61
|
+
<style type="text/css">
|
62
|
+
<%= inline_style%>
|
63
|
+
</style>
|
58
64
|
</head>
|
59
65
|
<body>
|
60
|
-
<ul>
|
66
|
+
<ul class="tag_list">
|
61
67
|
<%= write_nodes%>
|
62
68
|
</ul>
|
63
69
|
</body>
|
@@ -4,16 +4,16 @@ module Cuporter
|
|
4
4
|
module TextMethods
|
5
5
|
|
6
6
|
def write
|
7
|
-
@report.children.
|
7
|
+
@report.sort.children.each do |tag_node|
|
8
8
|
write_node(tag_node, 0)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
def write_node(node, tab_stops)
|
13
13
|
@output.puts "#{self.class::TAB * tab_stops}#{node.name}"
|
14
|
-
node.children.
|
14
|
+
node.sort.children.each do |child|
|
15
15
|
@output.puts "#{self.class::TAB + (self.class::TAB * tab_stops)}#{child.name}"
|
16
|
-
child.children.
|
16
|
+
child.sort.children.each do |grand_child|
|
17
17
|
if grand_child.has_children?
|
18
18
|
write_node(grand_child, tab_stops + 2)
|
19
19
|
else
|
data/lib/cuporter/node.rb
CHANGED
@@ -6,7 +6,7 @@ module Cuporter
|
|
6
6
|
attr_reader :name, :children
|
7
7
|
|
8
8
|
def initialize(name)
|
9
|
-
@name = name
|
9
|
+
@name = name.strip
|
10
10
|
@children = []
|
11
11
|
end
|
12
12
|
|
@@ -42,6 +42,11 @@ module Cuporter
|
|
42
42
|
@name_without_title ||= name.split(/:\s+/).last
|
43
43
|
end
|
44
44
|
|
45
|
+
def sort
|
46
|
+
children.sort!
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
45
50
|
# sort on name or substring of name after any ':'
|
46
51
|
def <=>(other)
|
47
52
|
name_without_title <=> other.name_without_title
|
@@ -1,21 +1,21 @@
|
|
1
1
|
# Copyright 2010 ThoughtWorks, Inc. Licensed under the MIT License
|
2
2
|
module Cuporter
|
3
|
-
# a node with a list of tags that
|
3
|
+
# a node with a list of tags that can be applied to all children
|
4
4
|
class TagListNode < Node
|
5
5
|
|
6
|
-
attr_reader :
|
6
|
+
attr_reader :tags
|
7
7
|
|
8
|
-
def initialize(name,
|
8
|
+
def initialize(name, tags)
|
9
9
|
super(name)
|
10
|
-
@
|
10
|
+
@tags = tags
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
@
|
13
|
+
def has_tags?
|
14
|
+
@tags.size > 0
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
(
|
17
|
+
def add_to_tag_nodes(node)
|
18
|
+
(tags | node.tags).each do |tag|
|
19
19
|
tag_node = find_or_create_child(tag)
|
20
20
|
tag_node.add_child(node)
|
21
21
|
end
|
data/lib/cuporter.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Copyright 2010 ThoughtWorks, Inc. Licensed under the MIT License
|
2
2
|
require 'cuporter/node'
|
3
3
|
require 'cuporter/tag_list_node'
|
4
|
+
require 'cuporter/non_sorting_node'
|
4
5
|
require 'cuporter/feature_parser'
|
5
6
|
require 'cuporter/extensions/string'
|
6
7
|
require 'cuporter/cli/options'
|
@@ -2,30 +2,30 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Cuporter
|
4
4
|
describe FeatureParser do
|
5
|
-
context "#
|
5
|
+
context "#tags" do
|
6
6
|
context "one tag" do
|
7
7
|
it "returns one tag" do
|
8
8
|
feature = FeatureParser.parse("@wip\nFeature: foo")
|
9
|
-
feature.
|
9
|
+
feature.tags.should == ["@wip"]
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
13
|
context "two tags on one line" do
|
14
14
|
it "returns two tags" do
|
15
15
|
feature = FeatureParser.parse(" \n@smoke @wip\nFeature: foo")
|
16
|
-
feature.
|
16
|
+
feature.tags.sort.should == %w[@smoke @wip].sort
|
17
17
|
end
|
18
18
|
end
|
19
19
|
context "two tags on two lines" do
|
20
20
|
it "returns two tags" do
|
21
21
|
feature = FeatureParser.parse(" \n@smoke\n @wip\nFeature: foo")
|
22
|
-
feature.
|
22
|
+
feature.tags.sort.should == %w[@smoke @wip].sort
|
23
23
|
end
|
24
24
|
end
|
25
25
|
context "no tags" do
|
26
26
|
it "returns no tags" do
|
27
27
|
feature = FeatureParser.parse("\nFeature: foo")
|
28
|
-
feature.
|
28
|
+
feature.tags.should == []
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -0,0 +1,431 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Cuporter
|
4
|
+
|
5
|
+
describe "Tag Reports of Scenario Outlines in Single Features" do
|
6
|
+
|
7
|
+
context "scenario outline with 2 examples" do
|
8
|
+
context "1 example tag" do
|
9
|
+
it "returns 1 tag mapped to 1 example" do
|
10
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_example_tag.feature")
|
11
|
+
report.should == <<EOF
|
12
|
+
@smoke
|
13
|
+
Feature: foo
|
14
|
+
Scenario Outline: outline
|
15
|
+
Scenarios: bang
|
16
|
+
|foo|bar|fan|
|
17
|
+
| 1 | 2 | 3 |
|
18
|
+
| 4 | 5 | 6 |
|
19
|
+
EOF
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "1 tag per example" do
|
24
|
+
it "returns 2 examples mapped to a tag" do
|
25
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_tag_per_example.feature")
|
26
|
+
report.should == <<EOF
|
27
|
+
@smoke
|
28
|
+
Feature: foo
|
29
|
+
Scenario Outline: some
|
30
|
+
Scenarios: yet
|
31
|
+
|foo|bar|fan|
|
32
|
+
| 1 | 2 | 3 |
|
33
|
+
| 4 | 5 | 6 |
|
34
|
+
@wip
|
35
|
+
Feature: foo
|
36
|
+
Scenario Outline: some
|
37
|
+
Scenarios: another
|
38
|
+
|foo|bar|fan|
|
39
|
+
| 7 | 8 | 9 |
|
40
|
+
| 0 | 1 | 2 |
|
41
|
+
EOF
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "1 tag per example, 2 feature tags" do
|
46
|
+
it "returns 4 tags . . ." do
|
47
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_tag_per_example_2_feature_tags.feature")
|
48
|
+
report.should == <<EOF
|
49
|
+
@smoke
|
50
|
+
Feature: foo
|
51
|
+
Scenario Outline: outline
|
52
|
+
Scenarios: yet
|
53
|
+
|foo|bar|fan|
|
54
|
+
| 1 | 2 | 3 |
|
55
|
+
| 4 | 5 | 6 |
|
56
|
+
@taggy
|
57
|
+
Feature: foo
|
58
|
+
Scenario Outline: outline
|
59
|
+
Scenarios: another
|
60
|
+
|foo|bar|fan|
|
61
|
+
| 1 | 2 | 3 |
|
62
|
+
| 4 | 5 | 6 |
|
63
|
+
Scenarios: yet
|
64
|
+
|foo|bar|fan|
|
65
|
+
| 1 | 2 | 3 |
|
66
|
+
| 4 | 5 | 6 |
|
67
|
+
@waggy
|
68
|
+
Feature: foo
|
69
|
+
Scenario Outline: outline
|
70
|
+
Scenarios: another
|
71
|
+
|foo|bar|fan|
|
72
|
+
| 1 | 2 | 3 |
|
73
|
+
| 4 | 5 | 6 |
|
74
|
+
Scenarios: yet
|
75
|
+
|foo|bar|fan|
|
76
|
+
| 1 | 2 | 3 |
|
77
|
+
| 4 | 5 | 6 |
|
78
|
+
@wip
|
79
|
+
Feature: foo
|
80
|
+
Scenario Outline: outline
|
81
|
+
Scenarios: another
|
82
|
+
|foo|bar|fan|
|
83
|
+
| 1 | 2 | 3 |
|
84
|
+
| 4 | 5 | 6 |
|
85
|
+
EOF
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "1 example tag and 1 feature tag" do
|
90
|
+
it "returns 2 tags" do
|
91
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_example_tag_and_1_feature_tag.feature")
|
92
|
+
report.should == <<EOF
|
93
|
+
@f_tag
|
94
|
+
Feature: foo
|
95
|
+
Scenario Outline: outline
|
96
|
+
Scenarios: another
|
97
|
+
|foo|bar|fan|
|
98
|
+
| 1 | 2 | 3 |
|
99
|
+
| 4 | 5 | 6 |
|
100
|
+
Scenarios: yet
|
101
|
+
|foo|bar|fan|
|
102
|
+
| 1 | 2 | 3 |
|
103
|
+
| 4 | 5 | 6 |
|
104
|
+
@smoke
|
105
|
+
Feature: foo
|
106
|
+
Scenario Outline: outline
|
107
|
+
Scenarios: yet
|
108
|
+
|foo|bar|fan|
|
109
|
+
| 1 | 2 | 3 |
|
110
|
+
| 4 | 5 | 6 |
|
111
|
+
EOF
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context "1 example tag and 1 scenario outline tag" do
|
116
|
+
it "returns 1 example mapped to 1 tag" do
|
117
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_example_tag_and_1_scenario_outline_tag.feature")
|
118
|
+
report.should == <<EOF
|
119
|
+
@s_o_tag
|
120
|
+
Feature: foo
|
121
|
+
Scenario Outline: outline
|
122
|
+
Scenarios: another
|
123
|
+
|foo|bar|fan|
|
124
|
+
| 1 | 2 | 3 |
|
125
|
+
| 4 | 5 | 6 |
|
126
|
+
Scenarios: yet
|
127
|
+
|foo|bar|fan|
|
128
|
+
| 1 | 2 | 3 |
|
129
|
+
| 4 | 5 | 6 |
|
130
|
+
@smoke
|
131
|
+
Feature: foo
|
132
|
+
Scenario Outline: outline
|
133
|
+
Scenarios: yet
|
134
|
+
|foo|bar|fan|
|
135
|
+
| 1 | 2 | 3 |
|
136
|
+
| 4 | 5 | 6 |
|
137
|
+
EOF
|
138
|
+
end
|
139
|
+
end
|
140
|
+
context "1 example tag, 1 scenario outline tag, 1 feature tag" do
|
141
|
+
it "3 tags" do
|
142
|
+
report = one_feature( "fixtures/scenario_outline_with_2_examples/1_example_tag_1_scenario_outline_tag_1_feature_tag.feature")
|
143
|
+
report.should == <<EOF
|
144
|
+
@f_tag
|
145
|
+
Feature: foo
|
146
|
+
Scenario Outline: outline
|
147
|
+
Scenarios: another
|
148
|
+
|foo|bar|fan|
|
149
|
+
| 1 | 2 | 3 |
|
150
|
+
| 4 | 5 | 6 |
|
151
|
+
Scenarios: yet
|
152
|
+
|foo|bar|fan|
|
153
|
+
| 1 | 2 | 3 |
|
154
|
+
| 4 | 5 | 6 |
|
155
|
+
@s_o_tag
|
156
|
+
Feature: foo
|
157
|
+
Scenario Outline: outline
|
158
|
+
Scenarios: another
|
159
|
+
|foo|bar|fan|
|
160
|
+
| 1 | 2 | 3 |
|
161
|
+
| 4 | 5 | 6 |
|
162
|
+
Scenarios: yet
|
163
|
+
|foo|bar|fan|
|
164
|
+
| 1 | 2 | 3 |
|
165
|
+
| 4 | 5 | 6 |
|
166
|
+
@smoke
|
167
|
+
Feature: foo
|
168
|
+
Scenario Outline: outline
|
169
|
+
Scenarios: yet
|
170
|
+
|foo|bar|fan|
|
171
|
+
| 1 | 2 | 3 |
|
172
|
+
| 4 | 5 | 6 |
|
173
|
+
EOF
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context "1 scenario and 1 outline with 2 examples" do
|
179
|
+
context "1 scenario tag, 1 outline tag" do
|
180
|
+
it "returns 2 tags, 1 with a scenario, 1 with an outline" do
|
181
|
+
report = one_feature( "fixtures/1_scenario_and_1_outline_with_2_examples/1_scenario_tag_1_outline_tag.feature")
|
182
|
+
report.should == <<EOF
|
183
|
+
@s_o_tag
|
184
|
+
Feature: foo
|
185
|
+
Scenario Outline: outline
|
186
|
+
Scenarios: another
|
187
|
+
|foo|bar|fan|
|
188
|
+
| 1 | 2 | 3 |
|
189
|
+
| 4 | 5 | 6 |
|
190
|
+
Scenarios: yet
|
191
|
+
|foo|bar|fan|
|
192
|
+
| 1 | 2 | 3 |
|
193
|
+
| 4 | 5 | 6 |
|
194
|
+
@s_tag
|
195
|
+
Feature: foo
|
196
|
+
Scenario: oh
|
197
|
+
EOF
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context "1 scenario tag, 1 example tag" do
|
202
|
+
it "returns 2 tags, 1 with a scenario and 1 with an outline" do
|
203
|
+
report = one_feature( "fixtures/1_scenario_and_1_outline_with_2_examples/1_scenario_tag_1_example_tag.feature")
|
204
|
+
report.should == <<EOF
|
205
|
+
@s_o_tag
|
206
|
+
Feature: foo
|
207
|
+
Scenario Outline: outline
|
208
|
+
Scenarios: another
|
209
|
+
|foo|bar|fan|
|
210
|
+
| 1 | 2 | 3 |
|
211
|
+
| 4 | 5 | 6 |
|
212
|
+
@s_tag
|
213
|
+
Feature: foo
|
214
|
+
Scenario: oh
|
215
|
+
EOF
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context "1 feature tag, 1 example tag" do
|
220
|
+
it "returns 2 tags" do
|
221
|
+
report = one_feature( "fixtures/1_scenario_and_1_outline_with_2_examples/1_feature_tag_1_example_tag.feature")
|
222
|
+
report.should == <<EOF
|
223
|
+
@example_tag
|
224
|
+
Feature: foo
|
225
|
+
Scenario Outline: outline
|
226
|
+
Scenarios: another
|
227
|
+
|foo|bar|fan|
|
228
|
+
| 1 | 2 | 3 |
|
229
|
+
| 4 | 5 | 6 |
|
230
|
+
@f_tag
|
231
|
+
Feature: foo
|
232
|
+
Scenario: oh
|
233
|
+
Scenario Outline: outline
|
234
|
+
Scenarios: another
|
235
|
+
|foo|bar|fan|
|
236
|
+
| 1 | 2 | 3 |
|
237
|
+
| 4 | 5 | 6 |
|
238
|
+
Scenarios: yet
|
239
|
+
|foo|bar|fan|
|
240
|
+
| 1 | 2 | 3 |
|
241
|
+
| 4 | 5 | 6 |
|
242
|
+
EOF
|
243
|
+
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
context "1 feature tag, 2 scenario tags, 1 outline tag, 1 example tag" do
|
248
|
+
it "returns 5 tags" do
|
249
|
+
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")
|
250
|
+
report.should == <<EOF
|
251
|
+
@e_tag
|
252
|
+
Feature: foo
|
253
|
+
Scenario Outline: outline
|
254
|
+
Scenarios: yet
|
255
|
+
|foo|bar|fan|
|
256
|
+
| 1 | 2 | 3 |
|
257
|
+
| 4 | 5 | 6 |
|
258
|
+
@f_tag
|
259
|
+
Feature: foo
|
260
|
+
Scenario: oh
|
261
|
+
Scenario Outline: outline
|
262
|
+
Scenarios: another
|
263
|
+
|foo|bar|fan|
|
264
|
+
| 1 | 2 | 3 |
|
265
|
+
| 4 | 5 | 6 |
|
266
|
+
Scenarios: yet
|
267
|
+
|foo|bar|fan|
|
268
|
+
| 1 | 2 | 3 |
|
269
|
+
| 4 | 5 | 6 |
|
270
|
+
@o_tag
|
271
|
+
Feature: foo
|
272
|
+
Scenario Outline: outline
|
273
|
+
Scenarios: another
|
274
|
+
|foo|bar|fan|
|
275
|
+
| 1 | 2 | 3 |
|
276
|
+
| 4 | 5 | 6 |
|
277
|
+
Scenarios: yet
|
278
|
+
|foo|bar|fan|
|
279
|
+
| 1 | 2 | 3 |
|
280
|
+
| 4 | 5 | 6 |
|
281
|
+
@s_tag
|
282
|
+
Feature: foo
|
283
|
+
Scenario: oh
|
284
|
+
@wip
|
285
|
+
Feature: foo
|
286
|
+
Scenario: oh
|
287
|
+
EOF
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
end
|
292
|
+
|
293
|
+
context "2 outlines 1 scenario" do
|
294
|
+
context "2 outline tags, 1 scenario tag, 1 example tag" do
|
295
|
+
it "returns 4 tags" do
|
296
|
+
report = one_feature( "fixtures/2_outlines_1_scenario/2_outline_tags_1_scenario_tag_1_example_tag.feature")
|
297
|
+
report.should == <<EOF
|
298
|
+
@e_tag
|
299
|
+
Feature: foo
|
300
|
+
Scenario Outline: outline 2
|
301
|
+
Scenarios: yet
|
302
|
+
|foo|bar|fan|
|
303
|
+
| 1 | 2 | 3 |
|
304
|
+
| 4 | 5 | 6 |
|
305
|
+
@s_o_tag_1
|
306
|
+
Feature: foo
|
307
|
+
Scenario Outline: outline 1
|
308
|
+
Scenarios: example
|
309
|
+
|foo|bar|fan|
|
310
|
+
| 1 | 2 | 3 |
|
311
|
+
| 4 | 5 | 6 |
|
312
|
+
@s_o_tag_2
|
313
|
+
Feature: foo
|
314
|
+
Scenario Outline: outline 2
|
315
|
+
Scenarios: another
|
316
|
+
|foo|bar|fan|
|
317
|
+
| 1 | 2 | 3 |
|
318
|
+
| 4 | 5 | 6 |
|
319
|
+
Scenarios: yet
|
320
|
+
|foo|bar|fan|
|
321
|
+
| 1 | 2 | 3 |
|
322
|
+
| 4 | 5 | 6 |
|
323
|
+
@wip
|
324
|
+
Feature: foo
|
325
|
+
Scenario: oh
|
326
|
+
EOF
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
context "2 outline tags, 2 example tags, 2 empty example names" do
|
331
|
+
it "returns 4 tags" do
|
332
|
+
report = one_feature( "fixtures/2_outlines_1_scenario/empty_example_name.feature")
|
333
|
+
report.should == <<EOF
|
334
|
+
@e_tag
|
335
|
+
Feature: foo
|
336
|
+
Scenario Outline: outline 2
|
337
|
+
Examples:
|
338
|
+
|foo|bar|fan|
|
339
|
+
| 1 | 2 | 3 |
|
340
|
+
| 4 | 5 | 6 |
|
341
|
+
@nameless
|
342
|
+
Feature: foo
|
343
|
+
Scenario Outline: outline 1
|
344
|
+
Scenarios:
|
345
|
+
|foo|bar|fan|
|
346
|
+
| 1 | 2 | 3 |
|
347
|
+
| 4 | 5 | 6 |
|
348
|
+
@s_o_tag_1
|
349
|
+
Feature: foo
|
350
|
+
Scenario Outline: outline 1
|
351
|
+
Scenarios:
|
352
|
+
|foo|bar|fan|
|
353
|
+
| 1 | 2 | 3 |
|
354
|
+
| 4 | 5 | 6 |
|
355
|
+
Scenarios: example set 2
|
356
|
+
|foo|bar|fan|
|
357
|
+
| 5 | 6 | 7 |
|
358
|
+
| 8 | 9 | 0 |
|
359
|
+
@s_o_tag_2
|
360
|
+
Feature: foo
|
361
|
+
Scenario Outline: outline 2
|
362
|
+
Examples:
|
363
|
+
|foo|bar|fan|
|
364
|
+
| 1 | 2 | 3 |
|
365
|
+
| 4 | 5 | 6 |
|
366
|
+
Examples: another
|
367
|
+
|foo|bar|fan|
|
368
|
+
| 1 | 2 | 3 |
|
369
|
+
| 4 | 5 | 6 |
|
370
|
+
EOF
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
context "scenario outlines only" do
|
376
|
+
context "3 outlines" do
|
377
|
+
it "includes all outlines" do
|
378
|
+
report = one_feature( "fixtures/3_scenario_outlines.feature")
|
379
|
+
report.should == <<EOF
|
380
|
+
@blocked
|
381
|
+
Feature: foo
|
382
|
+
Scenario Outline: outline 2
|
383
|
+
Scenarios: another
|
384
|
+
|foo|bar|fan|
|
385
|
+
| 1 | 2 | 3 |
|
386
|
+
| 4 | 5 | 6 |
|
387
|
+
@e_tag
|
388
|
+
Feature: foo
|
389
|
+
Scenario Outline: outline 3
|
390
|
+
Scenarios: yet
|
391
|
+
|foo|bar|fan|
|
392
|
+
| 1 | 2 | 3 |
|
393
|
+
| 4 | 5 | 6 |
|
394
|
+
@s_o_tag_1
|
395
|
+
Feature: foo
|
396
|
+
Scenario Outline: outline 1
|
397
|
+
Scenarios: example
|
398
|
+
|foo|bar|fan|
|
399
|
+
| 1 | 2 | 3 |
|
400
|
+
| 4 | 5 | 6 |
|
401
|
+
@s_o_tag_3
|
402
|
+
Feature: foo
|
403
|
+
Scenario Outline: outline 3
|
404
|
+
Scenarios: another
|
405
|
+
|foo|bar|fan|
|
406
|
+
| 1 | 2 | 3 |
|
407
|
+
| 4 | 5 | 6 |
|
408
|
+
Scenarios: yet
|
409
|
+
|foo|bar|fan|
|
410
|
+
| 1 | 2 | 3 |
|
411
|
+
| 4 | 5 | 6 |
|
412
|
+
@wip
|
413
|
+
Feature: foo
|
414
|
+
Scenario Outline: outline 2
|
415
|
+
Scenarios: another
|
416
|
+
|foo|bar|fan|
|
417
|
+
| 1 | 2 | 3 |
|
418
|
+
| 4 | 5 | 6 |
|
419
|
+
Scenarios: yet
|
420
|
+
|foo|bar|fan|
|
421
|
+
| 1 | 2 | 3 |
|
422
|
+
| 4 | 5 | 6 |
|
423
|
+
EOF
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
end
|
428
|
+
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
@@ -49,300 +49,6 @@ EOF
|
|
49
49
|
end
|
50
50
|
end
|
51
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
52
|
end
|
347
53
|
end
|
348
54
|
|
@@ -9,12 +9,12 @@ module Cuporter
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it 'has an empty tag list' do
|
12
|
-
tag_list_node.should_not
|
12
|
+
tag_list_node.should_not have_tags
|
13
13
|
end
|
14
14
|
context 'with tags' do
|
15
15
|
it 'should have tags' do
|
16
16
|
tag_list_node = TagListNode.new("name", %w[tag_1 tag_2])
|
17
|
-
tag_list_node.should
|
17
|
+
tag_list_node.should have_tags
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -23,7 +23,7 @@ module Cuporter
|
|
23
23
|
context 'with universal tags but none of their own' do
|
24
24
|
it 'child inherits one tag from parent' do
|
25
25
|
tag_list_node = TagListNode.new("parent", ["p_tag_1"])
|
26
|
-
tag_list_node.
|
26
|
+
tag_list_node.add_to_tag_nodes(TagListNode.new("child", []))
|
27
27
|
|
28
28
|
tag_list_node.children.size.should == 1
|
29
29
|
tag_list_node.children.first.name.should == "p_tag_1"
|
@@ -34,7 +34,7 @@ module Cuporter
|
|
34
34
|
end
|
35
35
|
it 'child inherits 2 tags from parent' do
|
36
36
|
tag_list_node = TagListNode.new("parent", ["p_tag_1", "p_tag_2"])
|
37
|
-
tag_list_node.
|
37
|
+
tag_list_node.add_to_tag_nodes(TagListNode.new("child", []))
|
38
38
|
|
39
39
|
tag_list_node.children.size.should == 2
|
40
40
|
tag_list_node.children.first.name.should == "p_tag_1"
|
@@ -51,7 +51,7 @@ module Cuporter
|
|
51
51
|
context 'without universal tags but some of their own' do
|
52
52
|
let(:tag_list_node) {TagListNode.new("parent", []) }
|
53
53
|
it 'child has one tag' do
|
54
|
-
tag_list_node.
|
54
|
+
tag_list_node.add_to_tag_nodes(TagListNode.new("child", ["c_tag_1"]))
|
55
55
|
|
56
56
|
tag_list_node.children.size.should == 1
|
57
57
|
tag_list_node.children.first.name.should == "c_tag_1"
|
@@ -60,7 +60,7 @@ module Cuporter
|
|
60
60
|
tag_list_node[:c_tag_1].children.first.name.should == "child"
|
61
61
|
end
|
62
62
|
it 'child has two tags' do
|
63
|
-
tag_list_node.
|
63
|
+
tag_list_node.add_to_tag_nodes(TagListNode.new("child", ["c_tag_1", "c_tag_2"]))
|
64
64
|
|
65
65
|
tag_list_node.children.size.should == 2
|
66
66
|
tag_list_node.children.first.name.should == "c_tag_1"
|
@@ -76,7 +76,7 @@ module Cuporter
|
|
76
76
|
context 'with universal tags and their own tags' do
|
77
77
|
let(:tag_list_node) {TagListNode.new("parent",%w[p_tag_1 p_tag_2]) }
|
78
78
|
it "2 universal tags and 2 child tags" do
|
79
|
-
tag_list_node.
|
79
|
+
tag_list_node.add_to_tag_nodes(TagListNode.new("child", ["c_tag_1", "c_tag_2"]))
|
80
80
|
|
81
81
|
tag_list_node.children.size.should == 4
|
82
82
|
tag_list_node.children.collect do |c|
|
@@ -99,7 +99,7 @@ module Cuporter
|
|
99
99
|
context 'with no tags at all' do
|
100
100
|
it 'top node has no children' do
|
101
101
|
tag_list_node = TagListNode.new("parent", [])
|
102
|
-
tag_list_node.
|
102
|
+
tag_list_node.add_to_tag_nodes(TagListNode.new("child", []))
|
103
103
|
|
104
104
|
tag_list_node.should_not have_children
|
105
105
|
|
@@ -110,8 +110,8 @@ module Cuporter
|
|
110
110
|
context 'second child with preexisting tag' do
|
111
111
|
it 'top node has 1 child and 2 grandchildren' do
|
112
112
|
tag_list_node = TagListNode.new("parent", ["p_tag_1"])
|
113
|
-
tag_list_node.
|
114
|
-
tag_list_node.
|
113
|
+
tag_list_node.add_to_tag_nodes(TagListNode.new("child_1", []))
|
114
|
+
tag_list_node.add_to_tag_nodes(TagListNode.new("child_2", []))
|
115
115
|
|
116
116
|
tag_list_node.children.size.should == 1
|
117
117
|
tag_list_node.children[0].name.should == "p_tag_1"
|
@@ -123,8 +123,8 @@ module Cuporter
|
|
123
123
|
|
124
124
|
it '2 child nodes with 1 universal tag and 2 child tags' do
|
125
125
|
tag_list_node = TagListNode.new("parent", ["p_tag_1"])
|
126
|
-
tag_list_node.
|
127
|
-
tag_list_node.
|
126
|
+
tag_list_node.add_to_tag_nodes(TagListNode.new("child_1", ["c_tag_1"]))
|
127
|
+
tag_list_node.add_to_tag_nodes(TagListNode.new("child_2", ["c_tag_1", "c_tag_2"]))
|
128
128
|
|
129
129
|
tag_list_node.children.size.should == 3
|
130
130
|
tag_list_node.children[0].name.should == "p_tag_1"
|
@@ -150,16 +150,16 @@ module Cuporter
|
|
150
150
|
it 'top node has no children' do
|
151
151
|
p = TagListNode.new("parent", ["p_tag_1"])
|
152
152
|
c = TagListNode.new("child", [] )
|
153
|
-
c.
|
153
|
+
c.add_to_tag_nodes(TagListNode.new("leaf_1", []))
|
154
154
|
|
155
155
|
p.should_not have_children
|
156
156
|
end
|
157
157
|
|
158
158
|
it 'all leaf nodes are under parent universal tag' do
|
159
159
|
p = TagListNode.new("parent", ["p_tag_1"])
|
160
|
-
c = TagListNode.new("child", p.
|
161
|
-
c.
|
162
|
-
c.
|
160
|
+
c = TagListNode.new("child", p.tags)
|
161
|
+
c.add_to_tag_nodes(TagListNode.new("leaf_1", []))
|
162
|
+
c.add_to_tag_nodes(TagListNode.new("leaf_2", []))
|
163
163
|
p.merge(c)
|
164
164
|
|
165
165
|
p.children.size.should == 1
|
@@ -181,9 +181,9 @@ module Cuporter
|
|
181
181
|
context '1 universal tag on parent and 1 universal tag on child' do
|
182
182
|
it "2 tags have 2 leaf nodes" do
|
183
183
|
p = TagListNode.new("parent", ["p_tag_1"])
|
184
|
-
c = TagListNode.new("child", p.
|
185
|
-
c.
|
186
|
-
c.
|
184
|
+
c = TagListNode.new("child", p.tags | ["c_tag_1"])
|
185
|
+
c.add_to_tag_nodes(TagListNode.new("leaf_1", []))
|
186
|
+
c.add_to_tag_nodes(TagListNode.new("leaf_2", []))
|
187
187
|
p.merge(c)
|
188
188
|
|
189
189
|
p.children.size.should == 2
|
@@ -213,9 +213,9 @@ module Cuporter
|
|
213
213
|
context '1 universal tag on parent and 1 tag on 1 leaf' do
|
214
214
|
it "1 tag has 1 leaf node, the other has 2 leaf nodes" do
|
215
215
|
p = TagListNode.new("parent", ["p_tag_1"])
|
216
|
-
c = TagListNode.new("child", p.
|
217
|
-
c.
|
218
|
-
c.
|
216
|
+
c = TagListNode.new("child", p.tags )
|
217
|
+
c.add_to_tag_nodes(TagListNode.new("leaf_1", []))
|
218
|
+
c.add_to_tag_nodes(TagListNode.new("leaf_2", ["l_tag_1"]))
|
219
219
|
p.merge(c)
|
220
220
|
|
221
221
|
p.children.size.should == 2
|
@@ -243,9 +243,9 @@ module Cuporter
|
|
243
243
|
context '1 universal tag on parent 1 universal tag on child 1 tag on leaf' do
|
244
244
|
it "2 tags with 2 leaves, 1 tag with 1 leaf" do
|
245
245
|
p = TagListNode.new("parent", ["p_tag_1"])
|
246
|
-
c = TagListNode.new("child", p.
|
247
|
-
c.
|
248
|
-
c.
|
246
|
+
c = TagListNode.new("child", p.tags | ["c_tag_1"])
|
247
|
+
c.add_to_tag_nodes(TagListNode.new("leaf_1", []))
|
248
|
+
c.add_to_tag_nodes(TagListNode.new("leaf_2", ["l_tag_1"]))
|
249
249
|
p.merge(c)
|
250
250
|
|
251
251
|
p.children.size.should == 3
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Tim Camper
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-09-
|
17
|
+
date: 2010-09-05 00:00:00 -05:00
|
18
18
|
default_executable: cuporter
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -31,6 +31,7 @@ files:
|
|
31
31
|
- LICENSE
|
32
32
|
- README.textile
|
33
33
|
- Rakefile
|
34
|
+
- lib/cuporter/non_sorting_node.rb
|
34
35
|
- lib/cuporter/formatters/csv.rb
|
35
36
|
- lib/cuporter/formatters/text.rb
|
36
37
|
- lib/cuporter/formatters/html.rb
|
@@ -46,6 +47,7 @@ files:
|
|
46
47
|
- spec/cuporter/node_spec.rb
|
47
48
|
- spec/cuporter/feature_parser_spec.rb
|
48
49
|
- spec/cuporter/support/functional/cli.rb
|
50
|
+
- spec/cuporter/functional/scenario_outlines_spec.rb
|
49
51
|
- spec/cuporter/functional/single_feature_spec.rb
|
50
52
|
- spec/cuporter/tag_list_node_spec.rb
|
51
53
|
- spec/spec_helper.rb
|