macros4cuke 0.3.20 → 0.3.21
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/.rubocop.yml +0 -3
- data/CHANGELOG.md +4 -0
- data/examples/i18n/fr/features/step_definitions/use_macro_steps.rb +1 -1
- data/features/step_definitions/demo_steps.rb +1 -1
- data/lib/macros4cuke/constants.rb +2 -2
- data/lib/macros4cuke/macro-collection.rb +1 -1
- data/lib/macros4cuke/macro-step-support.rb +2 -2
- data/lib/macros4cuke/templating/engine.rb +5 -5
- data/spec/macros4cuke/macro-collection_spec.rb +5 -5
- data/spec/macros4cuke/macro-step-support_spec.rb +11 -11
- data/spec/macros4cuke/macro-step_spec.rb +17 -17
- data/spec/macros4cuke/templating/engine_spec.rb +39 -39
- data/spec/macros4cuke/templating/placeholder_spec.rb +7 -7
- data/spec/macros4cuke/templating/section_spec.rb +27 -27
- metadata +2 -2
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
## 0.3.20 / 2013-05-23
|
2
|
+
* [CHANGE] File `.rubocop.yml`: StringLiterals cop is now enabled.
|
3
|
+
* [CHANGE] Many file: replaced double quotes by single quotes in order to pass the StringLiterals Robocop rule.
|
4
|
+
|
1
5
|
## 0.3.20 / 2013-05-23
|
2
6
|
* [CHANGE] File `.travis.yml`: Added more CI environments: ruby-head and jruby-head.
|
3
7
|
* [CHANGE] File `Rakefile`: Added task to push gem to Rubygems.
|
@@ -17,7 +17,7 @@ end
|
|
17
17
|
Quand(/^j(?:e |')\[([^\]]+)\]:$/) do |macro_phrase, table_argument|
|
18
18
|
# Ensure that the second argument is of the correct type
|
19
19
|
unless table_argument.kind_of?(Cucumber::Ast::Table)
|
20
|
-
error_message =
|
20
|
+
error_message = 'This step must have a data table as an argument.'
|
21
21
|
raise Macros4Cuke::DataTableNotFound, error_message
|
22
22
|
end
|
23
23
|
|
@@ -32,7 +32,7 @@ SNIPPET
|
|
32
32
|
begin
|
33
33
|
steps(wrong)
|
34
34
|
rescue Macros4Cuke::DataTableNotFound => exc
|
35
|
-
msg =
|
35
|
+
msg = 'The step with phrase [fill in the form with]: requires a data table.'
|
36
36
|
exc.message.should == msg
|
37
37
|
end
|
38
38
|
end
|
@@ -4,10 +4,10 @@
|
|
4
4
|
|
5
5
|
module Macros4Cuke # Module used as a namespace
|
6
6
|
# The version number of the gem.
|
7
|
-
Version = '0.3.
|
7
|
+
Version = '0.3.21'
|
8
8
|
|
9
9
|
# Brief description of the gem.
|
10
|
-
Description =
|
10
|
+
Description = 'Macros for Cucumber'
|
11
11
|
|
12
12
|
# Constant Macros4Cuke::RootDir contains the absolute path of Rodent's
|
13
13
|
# root directory. Note: it also ends with a slash character.
|
@@ -102,7 +102,7 @@ public
|
|
102
102
|
|
103
103
|
when Array
|
104
104
|
# TODO: Move away from hard-coded separator.
|
105
|
-
actual_value.join(
|
105
|
+
actual_value.join('<br/>')
|
106
106
|
|
107
107
|
when String
|
108
108
|
actual_value
|
@@ -232,7 +232,7 @@ class Engine
|
|
232
232
|
forbidden = ' !"#' + "$%&'()*+,-./:;<=>?[\\]^`{|}~"
|
233
233
|
all_escaped = []
|
234
234
|
forbidden.each_char() { |ch| all_escaped << Regexp.escape(ch) }
|
235
|
-
pattern = all_escaped.join(
|
235
|
+
pattern = all_escaped.join('|')
|
236
236
|
Regexp.new(pattern)
|
237
237
|
end
|
238
238
|
|
@@ -324,10 +324,10 @@ private
|
|
324
324
|
# Unsuccessful scanning: we typically have improperly balanced chevrons.
|
325
325
|
# We will analyze the opening and closing chevrons...
|
326
326
|
# First: replace escaped chevron(s)
|
327
|
-
no_escaped = aTextLine.gsub(/\\[<>]/,
|
328
|
-
|
327
|
+
no_escaped = aTextLine.gsub(/\\[<>]/, '--')
|
328
|
+
|
329
329
|
# var. equals count_of(<) - count_of(>): can only be 0 or temporarily 1
|
330
|
-
unbalance = 0
|
330
|
+
unbalance = 0
|
331
331
|
|
332
332
|
no_escaped.each_char do |ch|
|
333
333
|
case ch
|
@@ -12,14 +12,14 @@ describe MacroCollection do
|
|
12
12
|
|
13
13
|
let(:singleton) { MacroCollection.instance() }
|
14
14
|
|
15
|
-
context
|
16
|
-
it
|
15
|
+
context 'Initialization:' do
|
16
|
+
it 'should be empty' do
|
17
17
|
singleton.macro_steps.should be_empty
|
18
18
|
end
|
19
19
|
|
20
20
|
end
|
21
21
|
|
22
|
-
context
|
22
|
+
context 'Provided services:' do
|
23
23
|
let(:sample_substeps) do
|
24
24
|
snippet = <<-SNIPPET
|
25
25
|
Given I landed in the homepage
|
@@ -32,8 +32,8 @@ SNIPPET
|
|
32
32
|
snippet
|
33
33
|
end
|
34
34
|
|
35
|
-
it
|
36
|
-
phrase =
|
35
|
+
it 'should accept the addition of a new macro-step' do
|
36
|
+
phrase = '[enter my credentials]'
|
37
37
|
args = [phrase, sample_substeps, true]
|
38
38
|
->() { singleton.add_macro(*args)}.should_not raise_error
|
39
39
|
singleton.should have(1).macro_steps
|
@@ -29,7 +29,7 @@ describe MacroStepSupport do
|
|
29
29
|
# Rule to build a custom world object
|
30
30
|
let(:world) { MyWorld.new }
|
31
31
|
|
32
|
-
let(:m1_phrase) {
|
32
|
+
let(:m1_phrase) { 'enter the credentials' }
|
33
33
|
|
34
34
|
let(:m1_substeps) do
|
35
35
|
ssteps = <<-SNIPPET
|
@@ -42,32 +42,32 @@ SNIPPET
|
|
42
42
|
ssteps
|
43
43
|
end
|
44
44
|
|
45
|
-
context
|
46
|
-
it
|
45
|
+
context 'Defining macro(s):' do
|
46
|
+
it 'should add valid new macro' do
|
47
47
|
->(){ world.add_macro(m1_phrase, m1_substeps, true) }.should_not raise_error
|
48
48
|
end
|
49
49
|
|
50
|
-
it
|
50
|
+
it 'should complain when entering the same macro again' do
|
51
51
|
# Error case: trying to register another macro with same key/phrase.
|
52
52
|
msg = "A macro-step with phrase 'enter the credentials' already exist."
|
53
53
|
-> { world.add_macro(m1_phrase, m1_substeps, true) }.should raise_error(
|
54
54
|
Macros4Cuke::DuplicateMacroError, msg)
|
55
55
|
end
|
56
56
|
|
57
|
-
it
|
57
|
+
it 'should complain macro uses no table and phrase is parameterless' do
|
58
58
|
# Error case: substeps have arguments,
|
59
59
|
# but the macro has no mechanism to pass the needed data.
|
60
|
-
phrase =
|
60
|
+
phrase = 'fill in the credentials'
|
61
61
|
msg = "The sub-step argument 'userid' does not appear in the phrase."
|
62
62
|
->(){ world.add_macro(phrase, m1_substeps, false) }.should raise_error(
|
63
63
|
Macros4Cuke::UnreachableSubstepArgument, msg)
|
64
64
|
end
|
65
65
|
end # context
|
66
66
|
|
67
|
-
context
|
67
|
+
context 'Invoking macro(s):' do
|
68
68
|
|
69
|
-
it
|
70
|
-
phrase_unknown =
|
69
|
+
it 'should complain when invoking an unknown macro-step' do
|
70
|
+
phrase_unknown = 'dream of a perfect world'
|
71
71
|
msg = "Unknown macro-step with phrase: 'dream of a perfect world'."
|
72
72
|
->(){ world.invoke_macro(phrase_unknown) }.should raise_error(
|
73
73
|
Macros4Cuke::UnknownMacroError, msg)
|
@@ -75,9 +75,9 @@ SNIPPET
|
|
75
75
|
|
76
76
|
end # context
|
77
77
|
|
78
|
-
context
|
78
|
+
context 'Clearing macro(s):' do
|
79
79
|
|
80
|
-
it
|
80
|
+
it 'should clear all macros' do
|
81
81
|
->(){ world.clear_macros() }.should_not raise_error
|
82
82
|
|
83
83
|
# Control the post-condition
|
@@ -10,7 +10,7 @@ require_relative '../../lib/macros4cuke/macro-step' # The class under test
|
|
10
10
|
module Macros4Cuke # Open the module to avoid lengthy qualified names
|
11
11
|
|
12
12
|
describe MacroStep do
|
13
|
-
let(:sample_phrase) {
|
13
|
+
let(:sample_phrase) { 'enter my credentials as <userid>' }
|
14
14
|
|
15
15
|
let(:sample_template) do
|
16
16
|
snippet = <<-SNIPPET
|
@@ -28,47 +28,47 @@ end
|
|
28
28
|
subject { MacroStep.new(sample_phrase, sample_template, true) }
|
29
29
|
|
30
30
|
|
31
|
-
context
|
32
|
-
it
|
31
|
+
context 'Creation & initialization:' do
|
32
|
+
it 'should be created with a phrase, substeps and a table use indicator' do
|
33
33
|
->(){ MacroStep.new(sample_phrase, sample_template, true) }.should_not raise_error
|
34
34
|
end
|
35
35
|
|
36
36
|
|
37
|
-
it
|
37
|
+
it 'should complain when a sub-step argument can never be assigned a value via the phrase' do
|
38
38
|
msg = "The sub-step argument 'password' does not appear in the phrase."
|
39
39
|
->(){ MacroStep.new(sample_phrase, sample_template, false) }.should raise_error(
|
40
40
|
Macros4Cuke::UnreachableSubstepArgument, msg)
|
41
41
|
end
|
42
42
|
|
43
43
|
|
44
|
-
it
|
45
|
-
phrase =
|
44
|
+
it 'should complain when an argument in phrase never occurs in substeps' do
|
45
|
+
phrase = 'enter my credentials as <foobar>'
|
46
46
|
msg = "The phrase argument 'foobar' does not appear in a sub-step."
|
47
47
|
->(){ MacroStep.new(phrase, sample_template, true) }.should raise_error(
|
48
48
|
Macros4Cuke::UselessPhraseArgument, msg)
|
49
49
|
end
|
50
50
|
|
51
51
|
|
52
|
-
it
|
53
|
-
subject.key.should ==
|
52
|
+
it 'should know its key' do
|
53
|
+
subject.key.should == 'enter_my_credentials_as_X_T'
|
54
54
|
end
|
55
55
|
|
56
|
-
it
|
56
|
+
it 'should know the tags(placeholders) from its phrase' do
|
57
57
|
subject.phrase_args.should == %w[userid]
|
58
58
|
end
|
59
59
|
|
60
|
-
it
|
60
|
+
it 'should know the tags(placeholders) from its phrase and template' do
|
61
61
|
subject.args.should == %w[userid password]
|
62
62
|
end
|
63
63
|
|
64
64
|
end # context
|
65
65
|
|
66
66
|
|
67
|
-
context
|
67
|
+
context 'Provided services:' do
|
68
68
|
|
69
69
|
let(:phrase_instance) { %Q|enter my credentials as "nobody"| }
|
70
70
|
|
71
|
-
it
|
71
|
+
it 'should render the substeps' do
|
72
72
|
text = subject.expand(phrase_instance, [ %w(password no-secret) ])
|
73
73
|
expectation = <<-SNIPPET
|
74
74
|
Given I landed in the homepage
|
@@ -81,7 +81,7 @@ SNIPPET
|
|
81
81
|
text.should == expectation
|
82
82
|
end
|
83
83
|
|
84
|
-
it
|
84
|
+
it 'should render steps even when one argument has no actual value' do
|
85
85
|
# Special case: password has no value...
|
86
86
|
text = subject.expand(phrase_instance, [ ])
|
87
87
|
expectation = <<-SNIPPET
|
@@ -95,7 +95,7 @@ SNIPPET
|
|
95
95
|
text.should == expectation
|
96
96
|
end
|
97
97
|
|
98
|
-
it
|
98
|
+
it 'should un-escape the double-quotes for phrase arguments' do
|
99
99
|
specific_phrase = %q|enter my credentials as "quotable\""|
|
100
100
|
text = subject.expand(specific_phrase, [ %w(password no-secret) ])
|
101
101
|
expectation = <<-SNIPPET
|
@@ -110,7 +110,7 @@ SNIPPET
|
|
110
110
|
end
|
111
111
|
|
112
112
|
|
113
|
-
it
|
113
|
+
it 'should complain when an unknown variable is used' do
|
114
114
|
# Error case: there is no macro argument called <unknown>
|
115
115
|
error_message = "Unknown macro-step argument 'unknown'."
|
116
116
|
args = [ %w(unknown anything) ]
|
@@ -119,8 +119,8 @@ SNIPPET
|
|
119
119
|
end
|
120
120
|
|
121
121
|
|
122
|
-
it
|
123
|
-
phrase =
|
122
|
+
it 'should expand built-in variables' do
|
123
|
+
phrase = 'do nothing useful'
|
124
124
|
substeps = <<-SNIPPET
|
125
125
|
Given I travel through:
|
126
126
|
<quotes>
|
@@ -48,19 +48,19 @@ SNIPPET
|
|
48
48
|
subject { Engine.new sample_template }
|
49
49
|
|
50
50
|
|
51
|
-
context
|
51
|
+
context 'Class services:' do
|
52
52
|
# Helper method.
|
53
53
|
# Remove enclosing chevrons <..> (if any)
|
54
54
|
def strip_chevrons(aText)
|
55
55
|
return aText.gsub(/^<|>$/, '')
|
56
56
|
end
|
57
57
|
|
58
|
-
it
|
58
|
+
it 'should parse an empty text line' do
|
59
59
|
# Expectation: result should be an empty array.
|
60
60
|
Engine.parse('').should be_empty
|
61
61
|
end
|
62
62
|
|
63
|
-
it
|
63
|
+
it 'should parse a text line without tag' do
|
64
64
|
sample_text = 'Mary has a little lamb'
|
65
65
|
result = Engine.parse(sample_text)
|
66
66
|
|
@@ -70,7 +70,7 @@ SNIPPET
|
|
70
70
|
result[0].should == [:static, sample_text]
|
71
71
|
end
|
72
72
|
|
73
|
-
it
|
73
|
+
it 'should parse a text line that consists of just a tag' do
|
74
74
|
sample_text = '<some_tag>'
|
75
75
|
result = Engine.parse(sample_text)
|
76
76
|
|
@@ -80,7 +80,7 @@ SNIPPET
|
|
80
80
|
result[0].should == [:dynamic, strip_chevrons(sample_text)]
|
81
81
|
end
|
82
82
|
|
83
|
-
it
|
83
|
+
it 'should parse a text line with a tag at the start' do
|
84
84
|
sample_text = '<some_tag>some text'
|
85
85
|
result = Engine.parse(sample_text)
|
86
86
|
|
@@ -91,7 +91,7 @@ SNIPPET
|
|
91
91
|
result[1].should == [:static, 'some text']
|
92
92
|
end
|
93
93
|
|
94
|
-
it
|
94
|
+
it 'should parse a text line with a tag at the end' do
|
95
95
|
sample_text = 'some text<some_tag>'
|
96
96
|
result = Engine.parse(sample_text)
|
97
97
|
|
@@ -102,7 +102,7 @@ SNIPPET
|
|
102
102
|
result[1].should == [:dynamic, 'some_tag']
|
103
103
|
end
|
104
104
|
|
105
|
-
it
|
105
|
+
it 'should parse a text line with a tag in the middle' do
|
106
106
|
sample_text = 'begin <some_tag> end'
|
107
107
|
result = Engine.parse(sample_text)
|
108
108
|
|
@@ -113,7 +113,7 @@ SNIPPET
|
|
113
113
|
result[2].should == [:static, ' end']
|
114
114
|
end
|
115
115
|
|
116
|
-
it
|
116
|
+
it 'should parse a text line with two tags in the middle' do
|
117
117
|
sample_text = 'begin <some_tag>middle<another_tag> end'
|
118
118
|
result = Engine.parse(sample_text)
|
119
119
|
|
@@ -137,7 +137,7 @@ SNIPPET
|
|
137
137
|
result[3].should == [:static, ' end']
|
138
138
|
end
|
139
139
|
|
140
|
-
it
|
140
|
+
it 'should parse a text line with escaped chevrons' do
|
141
141
|
sample_text = 'Mary has a \<little\> lamb'
|
142
142
|
result = Engine.parse(sample_text)
|
143
143
|
|
@@ -146,7 +146,7 @@ SNIPPET
|
|
146
146
|
result[0].should == [:static, sample_text]
|
147
147
|
end
|
148
148
|
|
149
|
-
it
|
149
|
+
it 'should parse a text line with escaped chevrons in a tag' do
|
150
150
|
sample_text = 'begin <some_\<\\>weird\>_tag> end'
|
151
151
|
result = Engine.parse(sample_text)
|
152
152
|
|
@@ -157,21 +157,21 @@ SNIPPET
|
|
157
157
|
result[2].should == [:static, ' end']
|
158
158
|
end
|
159
159
|
|
160
|
-
it
|
160
|
+
it 'should complain if a tag misses an closing chevron' do
|
161
161
|
sample_text = 'begin <some_tag\> end'
|
162
162
|
error_message = "Missing closing chevron '>'."
|
163
163
|
->(){ Engine.parse(sample_text) }.should raise_error(
|
164
164
|
StandardError, error_message)
|
165
165
|
end
|
166
166
|
|
167
|
-
it
|
167
|
+
it 'should complain if a text misses an opening chevron' do
|
168
168
|
sample_text = 'begin <some_tag> > end'
|
169
169
|
error_message = "Missing opening chevron '<'."
|
170
170
|
->(){ Engine.parse(sample_text) }.should raise_error(
|
171
171
|
StandardError, error_message)
|
172
172
|
end
|
173
173
|
|
174
|
-
it
|
174
|
+
it 'should complain if a text has nested opening chevrons' do
|
175
175
|
sample_text = 'begin <<some_tag> > end'
|
176
176
|
error_message = "Nested opening chevron '<'."
|
177
177
|
->(){ Engine.parse(sample_text) }.should raise_error(
|
@@ -180,17 +180,17 @@ SNIPPET
|
|
180
180
|
|
181
181
|
end # context
|
182
182
|
|
183
|
-
context
|
183
|
+
context 'Creation and initialization:' do
|
184
184
|
|
185
|
-
it
|
185
|
+
it 'should accept an empty template text' do
|
186
186
|
->(){ Engine.new '' }.should_not raise_error
|
187
187
|
end
|
188
188
|
|
189
|
-
it
|
189
|
+
it 'should be created with a template text' do
|
190
190
|
->(){ Engine.new sample_template }.should_not raise_error
|
191
191
|
end
|
192
192
|
|
193
|
-
it
|
193
|
+
it 'should know the source text' do
|
194
194
|
subject.source.should == sample_template
|
195
195
|
|
196
196
|
# Case of an empty template
|
@@ -198,7 +198,7 @@ SNIPPET
|
|
198
198
|
instance.source.should be_empty
|
199
199
|
end
|
200
200
|
|
201
|
-
it
|
201
|
+
it 'should accept conditional section' do
|
202
202
|
->(){ Engine.new sophisticated_template }.should_not raise_error
|
203
203
|
instance = Engine.new sophisticated_template
|
204
204
|
elements = instance.instance_variable_get(:@representation)
|
@@ -207,30 +207,30 @@ SNIPPET
|
|
207
207
|
names.should == %w(<?address> <?birthdate> <?dummy>)
|
208
208
|
end
|
209
209
|
|
210
|
-
it
|
210
|
+
it 'should complain when a placeholder is empty or blank' do
|
211
211
|
text_w_empty_arg = sample_template.sub(/userid/, '')
|
212
212
|
msg = %q(An empty or blank argument occurred in 'And I fill in "Username" with "<>"'.)
|
213
213
|
->(){ Engine.new text_w_empty_arg }.should raise_error(
|
214
214
|
Macros4Cuke::EmptyArgumentError, msg)
|
215
215
|
end
|
216
216
|
|
217
|
-
it
|
217
|
+
it 'should complain when a placeholder contains an invalid character' do
|
218
218
|
text_w_empty_arg = sample_template.sub(/userid/, 'user%id')
|
219
219
|
msg = "The invalid sign '%' occurs in the argument 'user%id'."
|
220
220
|
->(){ Engine.new text_w_empty_arg }.should raise_error(
|
221
221
|
Macros4Cuke::InvalidCharError, msg)
|
222
222
|
end
|
223
223
|
|
224
|
-
it
|
224
|
+
it 'should complain when a section has no closing tag' do
|
225
225
|
# Removing an end of section tag...
|
226
226
|
text_w_open_section = sophisticated_template.sub(/<\/address>/, '')
|
227
227
|
|
228
|
-
error_message =
|
228
|
+
error_message = 'Unterminated section <?address>.'
|
229
229
|
->(){ Engine.new text_w_open_section}.should raise_error(
|
230
230
|
StandardError, error_message)
|
231
231
|
end
|
232
232
|
|
233
|
-
it
|
233
|
+
it 'should complain when a closing tag has no corresponding opening tag' do
|
234
234
|
# Replacing an end of section tag by another...
|
235
235
|
text_w_wrong_end = sophisticated_template.sub(/<\/address>/, '</foobar>')
|
236
236
|
|
@@ -239,18 +239,18 @@ SNIPPET
|
|
239
239
|
StandardError, msg)
|
240
240
|
end
|
241
241
|
|
242
|
-
it
|
242
|
+
it 'should complain when a closing tag is found without opening tag' do
|
243
243
|
# Replacing an end of section tag by another...
|
244
244
|
wrong_end = sophisticated_template.sub(/<\?birthdate>/, '</foobar>')
|
245
|
-
msg =
|
245
|
+
msg = 'End of section</foobar> found while no corresponding section is open.'
|
246
246
|
->(){ Engine.new wrong_end }.should raise_error(StandardError, msg)
|
247
247
|
end
|
248
248
|
|
249
249
|
end # context
|
250
250
|
|
251
|
-
context
|
251
|
+
context 'Provided services:' do
|
252
252
|
|
253
|
-
it
|
253
|
+
it 'should know the variable(s) it contains' do
|
254
254
|
# Case using the sample template
|
255
255
|
subject.variables == [:userid, :password]
|
256
256
|
|
@@ -260,7 +260,7 @@ SNIPPET
|
|
260
260
|
end
|
261
261
|
|
262
262
|
|
263
|
-
it
|
263
|
+
it 'should ignore variables/placeholders in comments' do
|
264
264
|
substeps = " # Comment 1 <miscellaneous>\n" + sample_template
|
265
265
|
substeps += " #\n Comment 2 <haphazard>"
|
266
266
|
instance = Engine.new substeps
|
@@ -268,8 +268,8 @@ SNIPPET
|
|
268
268
|
end
|
269
269
|
|
270
270
|
|
271
|
-
it
|
272
|
-
locals = { 'userid' =>
|
271
|
+
it 'should render the text given the actuals' do
|
272
|
+
locals = { 'userid' => 'johndoe' }
|
273
273
|
|
274
274
|
rendered_text = subject.render(Object.new, locals)
|
275
275
|
expected = <<-SNIPPET
|
@@ -283,7 +283,7 @@ SNIPPET
|
|
283
283
|
rendered_text.should == expected
|
284
284
|
|
285
285
|
# Case of an actual that's not a String
|
286
|
-
locals = { 'userid' =>
|
286
|
+
locals = { 'userid' => 'johndoe', 'password' => 12345 }
|
287
287
|
rendered_text = subject.render(Object.new, locals)
|
288
288
|
expected = <<-SNIPPET
|
289
289
|
Given I landed in the homepage
|
@@ -298,7 +298,7 @@ SNIPPET
|
|
298
298
|
|
299
299
|
# Place actual value in context object
|
300
300
|
Context = Struct.new(:userid, :password)
|
301
|
-
context = Context.new(
|
301
|
+
context = Context.new('sherlock', 'holmes')
|
302
302
|
rendered_text = subject.render(context, { 'userid' => 'susan' })
|
303
303
|
expected = <<-SNIPPET
|
304
304
|
Given I landed in the homepage
|
@@ -317,12 +317,12 @@ SNIPPET
|
|
317
317
|
end
|
318
318
|
|
319
319
|
|
320
|
-
it
|
320
|
+
it 'should render conditional sections' do
|
321
321
|
instance = Engine.new(sophisticated_template)
|
322
322
|
|
323
|
-
locals = { 'firstname' =>
|
324
|
-
|
325
|
-
|
323
|
+
locals = { 'firstname' => 'Anon',
|
324
|
+
'lastname' => 'Eemoos' ,
|
325
|
+
'birthdate' => '1976-04-21'
|
326
326
|
}
|
327
327
|
rendered_text = instance.render(Object.new, locals)
|
328
328
|
expected = <<-SNIPPET
|
@@ -335,8 +335,8 @@ SNIPPET
|
|
335
335
|
rendered_text.should == expected
|
336
336
|
|
337
337
|
# Redo with another context
|
338
|
-
locals[
|
339
|
-
locals[
|
338
|
+
locals['birthdate'] = nil
|
339
|
+
locals['address'] = '122, Mercer Street'
|
340
340
|
|
341
341
|
rendered_text = instance.render(Object.new, locals)
|
342
342
|
expected = <<-SNIPPET
|
@@ -350,7 +350,7 @@ SNIPPET
|
|
350
350
|
end
|
351
351
|
|
352
352
|
|
353
|
-
it
|
353
|
+
it 'should render multivalued actuals' do
|
354
354
|
locals = { 'userid' => %w(johndoe yeti) } # Silly case
|
355
355
|
|
356
356
|
rendered_text = subject.render(Object.new, locals)
|
@@ -15,20 +15,20 @@ describe Placeholder do
|
|
15
15
|
# Default instantiation rule
|
16
16
|
subject { Placeholder.new('foobar') }
|
17
17
|
|
18
|
-
context
|
18
|
+
context 'Creation and initialization:' do
|
19
19
|
|
20
|
-
it
|
20
|
+
it 'should be created with a variable name' do
|
21
21
|
->() { Placeholder.new('foobar') }.should_not raise_error
|
22
22
|
end
|
23
23
|
|
24
|
-
it
|
24
|
+
it 'should know the name of its variable' do
|
25
25
|
subject.name.should == 'foobar'
|
26
26
|
end
|
27
27
|
|
28
28
|
end # context
|
29
29
|
|
30
|
-
context
|
31
|
-
it
|
30
|
+
context 'Provided services:' do
|
31
|
+
it 'should render an empty string when no actual value is absent' do
|
32
32
|
# Case: context has no value associated to 'foobar'
|
33
33
|
rendered_text = subject.render(Object.new, {})
|
34
34
|
rendered_text.should be_empty
|
@@ -41,12 +41,12 @@ describe Placeholder do
|
|
41
41
|
context = Object.new
|
42
42
|
def context.foobar # Add singleton method foobar that returns nil
|
43
43
|
nil
|
44
|
-
end
|
44
|
+
end
|
45
45
|
rendered_text = subject.render(context, {})
|
46
46
|
rendered_text.should be_empty
|
47
47
|
end
|
48
48
|
|
49
|
-
it
|
49
|
+
it 'should render the actual value bound to the placeholder' do
|
50
50
|
# Case: locals Hash has a value associated to 'foobar'
|
51
51
|
rendered_text = subject.render(Object.new, { 'foobar' => 'hello' })
|
52
52
|
rendered_text.should == 'hello'
|
@@ -17,30 +17,30 @@ describe Section do
|
|
17
17
|
|
18
18
|
# Return a list of possible child elements
|
19
19
|
let(:sample_children) do
|
20
|
-
[ StaticText.new(
|
21
|
-
Placeholder.new(
|
20
|
+
[ StaticText.new('Hello '),
|
21
|
+
Placeholder.new('user'),
|
22
22
|
EOLine.new
|
23
23
|
]
|
24
24
|
end
|
25
25
|
|
26
|
-
context
|
26
|
+
context 'Creation and initialization' do
|
27
27
|
|
28
|
-
it
|
28
|
+
it 'should be created with a variable name' do
|
29
29
|
->() { Section.new('foobar') }.should_not raise_error
|
30
30
|
end
|
31
31
|
|
32
|
-
it
|
32
|
+
it 'should know the name of its variable' do
|
33
33
|
subject.name.should == 'foobar'
|
34
34
|
end
|
35
35
|
|
36
|
-
it
|
36
|
+
it 'should have no child at start' do
|
37
37
|
subject.should have(0).children
|
38
38
|
end
|
39
39
|
|
40
40
|
end # context
|
41
41
|
|
42
|
-
context
|
43
|
-
it
|
42
|
+
context 'Provided services:' do
|
43
|
+
it 'should add child element(s)' do
|
44
44
|
sample_children.each do |a_child|
|
45
45
|
subject.add_child(a_child)
|
46
46
|
end
|
@@ -49,7 +49,7 @@ describe Section do
|
|
49
49
|
subject.children.should == sample_children
|
50
50
|
end
|
51
51
|
|
52
|
-
it
|
52
|
+
it 'should know the name all child placeholders' do
|
53
53
|
# Case: simple flat list of children
|
54
54
|
sample_children.each { |a_child| subject.add_child(a_child) }
|
55
55
|
subject.variables.should == [ 'user' ]
|
@@ -57,8 +57,8 @@ describe Section do
|
|
57
57
|
# Case: at least one child is a group
|
58
58
|
parent = Section.new('son')
|
59
59
|
[ subject,
|
60
|
-
StaticText.new(
|
61
|
-
Placeholder.new(
|
60
|
+
StaticText.new('Bye '),
|
61
|
+
Placeholder.new('firstname'),
|
62
62
|
EOLine.new
|
63
63
|
].each { |a_child| parent.add_child(a_child) }
|
64
64
|
|
@@ -66,8 +66,8 @@ describe Section do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
|
69
|
-
it
|
70
|
-
error_message =
|
69
|
+
it 'should expect that its subclasses render the children' do
|
70
|
+
error_message = 'Method Section.render must be implemented in subclass.'
|
71
71
|
->(){ subject.send(:render, Object.new, {}) }.should raise_error(
|
72
72
|
NotImplementedError, error_message)
|
73
73
|
end
|
@@ -81,14 +81,14 @@ end # describe
|
|
81
81
|
|
82
82
|
describe ConditionalSection do
|
83
83
|
|
84
|
-
context
|
84
|
+
context 'Creation and initialization:' do
|
85
85
|
|
86
|
-
it
|
86
|
+
it 'should be created with a variable name and a boolean' do
|
87
87
|
->(){ ConditionalSection.new('foobar', false) }.should_not raise_error
|
88
88
|
->(){ ConditionalSection.new('foobar', true) }.should_not raise_error
|
89
89
|
end
|
90
90
|
|
91
|
-
it
|
91
|
+
it 'should know whether the rendition on existence of actual value' do
|
92
92
|
[false, true].each do |existence|
|
93
93
|
instance = ConditionalSection.new('foobar', existence)
|
94
94
|
instance.existence.should == existence
|
@@ -97,11 +97,11 @@ describe ConditionalSection do
|
|
97
97
|
|
98
98
|
end # context
|
99
99
|
|
100
|
-
context
|
100
|
+
context 'Provided services:' do
|
101
101
|
# Return a list of possible child elements
|
102
102
|
let(:sample_children) do
|
103
|
-
[ StaticText.new(
|
104
|
-
Placeholder.new(
|
103
|
+
[ StaticText.new('Hello '),
|
104
|
+
Placeholder.new('user'),
|
105
105
|
EOLine.new
|
106
106
|
]
|
107
107
|
end
|
@@ -109,16 +109,16 @@ describe ConditionalSection do
|
|
109
109
|
# Default instantiation rule
|
110
110
|
subject { ConditionalSection.new('foobar', true) }
|
111
111
|
|
112
|
-
it
|
112
|
+
it 'should know its original source text' do
|
113
113
|
subject.to_s.should == '<?foobar>'
|
114
114
|
end
|
115
115
|
|
116
|
-
it
|
116
|
+
it 'should render its children when conditions are met' do
|
117
117
|
# Adding the children
|
118
118
|
sample_children.each { |a_child| subject.add_child(a_child) }
|
119
119
|
|
120
120
|
# Case of an existing actual
|
121
|
-
locals = { 'user' =>
|
121
|
+
locals = { 'user' => 'joe', 'foobar' => 'exists' }
|
122
122
|
rendered_text = subject.render(Object.new, locals)
|
123
123
|
expected_text = "Hello joe\n"
|
124
124
|
rendered_text.should == expected_text
|
@@ -129,7 +129,7 @@ describe ConditionalSection do
|
|
129
129
|
sample_children.each { |a_child| instance.add_child(a_child) }
|
130
130
|
|
131
131
|
# Case of a non-existing actual
|
132
|
-
locals = { 'user' =>
|
132
|
+
locals = { 'user' => 'joe' }
|
133
133
|
rendered_text = instance.render(Object.new, locals)
|
134
134
|
rendered_text.should == expected_text
|
135
135
|
end
|
@@ -139,9 +139,9 @@ describe ConditionalSection do
|
|
139
139
|
sample_children.each { |a_child| subject.add_child(a_child) }
|
140
140
|
|
141
141
|
# Case of a non-existing actual
|
142
|
-
locals = { 'user' =>
|
142
|
+
locals = { 'user' => 'joe' }
|
143
143
|
rendered_text = subject.render(Object.new, locals)
|
144
|
-
rendered_text.should ==
|
144
|
+
rendered_text.should == ''
|
145
145
|
|
146
146
|
# Case of a conditional section that should be
|
147
147
|
# rendering when value is non-existing.
|
@@ -149,9 +149,9 @@ describe ConditionalSection do
|
|
149
149
|
sample_children.each { |a_child| instance.add_child(a_child) }
|
150
150
|
|
151
151
|
# Case of a non-existing actual
|
152
|
-
locals = { 'user' =>
|
152
|
+
locals = { 'user' => 'joe', 'foobar' => 'exists' }
|
153
153
|
rendered_text = instance.render(Object.new, locals)
|
154
|
-
rendered_text.should ==
|
154
|
+
rendered_text.should == ''
|
155
155
|
end
|
156
156
|
|
157
157
|
end # context
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: macros4cuke
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.21
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cucumber
|