macros4cuke 0.3.15 → 0.3.16

Sign up to get free protection for your applications and to get access to all the features.
@@ -23,6 +23,11 @@ Scenario: Defining a macro with conditional substeps
23
23
  And I click "Save"
24
24
  """
25
25
 
26
+
27
+ Scenario: An exception is forced by invoking the above macro with a triple quote string instead of a data table.
28
+ When I generate a DataTableNotFound exception
29
+
30
+
26
31
  Scenario: # Let's use the macro-step WITHOUT the optional argument values.
27
32
  When I [fill in the form with]:
28
33
  |firstname|Alice|
@@ -70,4 +75,5 @@ Scenario: # Let's use the macro-step WITH the optional argument values.
70
75
  Invoked step: ... I fill in "email" with "alice.inn@wonder.land"
71
76
  Invoked step: ... I fill in "comment" with "No comment!"
72
77
  Invoked step: ... I click "Save"
73
- """
78
+ """
79
+
@@ -21,4 +21,21 @@ Then(/^I expect the following step trace:$/) do |step_text|
21
21
  end
22
22
 
23
23
 
24
+ # This step is used for testing a particular exception
25
+ When(/^I generate a DataTableNotFound exception$/) do
26
+ wrong = <<-SNIPPET
27
+ When I [fill in the form with]:
28
+ """
29
+ Should be a table instead of triple quote string
30
+ """
31
+ SNIPPET
32
+ begin
33
+ steps(wrong)
34
+ rescue Macros4Cuke::DataTableNotFound => exc
35
+ msg = "The step with phrase [fill in the form with]: requires a data table."
36
+ exc.message.should == msg
37
+ end
38
+ end
39
+
40
+
24
41
  # End of file
@@ -7,7 +7,7 @@
7
7
 
8
8
  begin
9
9
  require 'simplecov'
10
- rescue LoadError => exc
10
+ rescue LoadError
11
11
  # Gobble silently the exception if simplecov isn't installed.
12
12
  end
13
13
 
@@ -43,6 +43,4 @@ end # module
43
43
  # making our world object an instance of the TracingWorld class
44
44
  World { DemoMacros4Cuke::TracingWorld.new }
45
45
 
46
-
47
-
48
46
  # End of file
data/lib/macro_steps.rb CHANGED
@@ -1,5 +1,7 @@
1
+ # encoding: utf-8
1
2
  # File: macro_steps.rb
2
- # Purpose: step definitions that help to build macro-steps (i.e. a step that is equivalent to a sequence of steps)
3
+ # Purpose: step definitions that help to build macro-steps
4
+ # (i.e. a step that is equivalent to a sequence of steps)
3
5
 
4
6
 
5
7
 
@@ -13,7 +15,8 @@
13
15
  # And I fill in "Password" with "unguessable"
14
16
  # And I click "Submit"
15
17
  # """
16
- # The regexp has two capturing group: one for the phrase, a second for the terminating colon (:)
18
+ # The regexp has two capturing group: one for the phrase,
19
+ # a second for the terminating colon (:)
17
20
  Given(/^I define the step "(?:Given|When|Then|\*) I \[((?:[^\\\]]|\\.)+)\](:?)" to mean:$/) do |macro_phrase, colon_capture, template|
18
21
  use_table = (colon_capture == ':')
19
22
  add_macro(macro_phrase, template, use_table)
@@ -38,11 +41,12 @@ end
38
41
  When(/^I \[([^\]]+)\]:$/) do |macro_phrase, table_argument|
39
42
  # Ensure that the second argument is of the correct type
40
43
  unless table_argument.kind_of?(Cucumber::Ast::Table)
41
- raise Macros4Cuke::DataTableNotFound, "This step must have a data table as an argument."
44
+ raise Macros4Cuke::DataTableNotFound.new(macro_phrase)
42
45
  end
43
46
 
44
47
  # This will call the macro with the given phrase.
45
- # The second argument consists of an array with couples of the kind: [argument name, actual value]
48
+ # The second argument consists of an array
49
+ # with couples of the kind: [argument name, actual value]
46
50
  invoke_macro(macro_phrase, table_argument.raw)
47
51
  end
48
52
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  module Macros4Cuke # Module used as a namespace
6
6
  # The version number of the gem.
7
- Version = '0.3.15'
7
+ Version = '0.3.16'
8
8
 
9
9
  # Brief description of the gem.
10
10
  Description = "Macros for Cucumber"
@@ -30,7 +30,8 @@ end # class
30
30
  # and that argument name does not appear in any sub-step.
31
31
  class UnreachableSubstepArgument < Macros4CukeError
32
32
  def initialize(anArgName)
33
- super("The sub-step argument '#{anArgName}' does not appear in the phrase.")
33
+ msg = "The sub-step argument '#{anArgName}' does not appear in the phrase."
34
+ super(msg)
34
35
  end
35
36
  end # class
36
37
 
@@ -46,8 +47,9 @@ end # class
46
47
 
47
48
  # Raised when an argument name contains invalid characters.
48
49
  class InvalidCharError < Macros4CukeError
49
- def initialize(aText, aWrongChar)
50
- super("The invalid sign '#{aWrongChar}' occurs in the argument/tag '#{aText}'.")
50
+ def initialize(aTag, aWrongChar)
51
+ msg = "The invalid sign '#{aWrongChar}' occurs in the argument '#{aTag}'."
52
+ super(msg)
51
53
  end
52
54
  end # class
53
55
 
@@ -73,11 +75,14 @@ end # class
73
75
 
74
76
  # Raised when one invokes a macro-step without a required data table argument
75
77
  class DataTableNotFound < Macros4CukeError
76
- def initialize(argName)
77
- super("The macro-step is missing a data table argument.")
78
+ def initialize(phrase)
79
+ msg = "The step with phrase [#{phrase}]: requires a data table."
80
+ super(msg)
78
81
  end
79
82
  end # class
80
83
 
84
+ msg =
85
+
81
86
 
82
87
 
83
88
  # Raised when Macros4Cuke encountered an issue
@@ -12,7 +12,8 @@ module Macros4Cuke # Module used as a namespace
12
12
  # an aggregation of lower-level sub-steps.
13
13
  # When a macro-step is used in a scenario, then its execution is equivalent
14
14
  # to the execution of its sub-steps.
15
- # A macro-step may have zero or more arguments. The actual values bound to these arguments
15
+ # A macro-step may have zero or more arguments.
16
+ # The actual values bound to these arguments
16
17
  # are passed to the sub-steps at execution time.
17
18
  class MacroStep
18
19
  # A template engine that expands the sub-steps upon request.
@@ -24,14 +25,18 @@ class MacroStep
24
25
  # The list of macro arguments that appears in the macro phrase.
25
26
  attr_reader(:phrase_args)
26
27
 
27
- # The list of macro argument names (as appearing in the substeps and in the macro phrase).
28
+ # The list of macro argument names (as appearing in the substeps
29
+ # and in the macro phrase).
28
30
  attr_reader(:args)
29
31
 
30
32
 
31
33
  # Constructor.
32
- # @param aMacroPhrase[String] The text from the macro step definition that is between the square brackets.
33
- # @param theSubsteps [String] The source text of the steps to be expanded upon macro invokation.
34
- # @param useTable [boolean] A flag indicating whether a data table must be used to pass actual values.
34
+ # @param aMacroPhrase[String] The text from the macro step definition
35
+ # that is between the square brackets.
36
+ # @param theSubsteps [String] The source text of the steps to be expanded
37
+ # upon macro invokation.
38
+ # @param useTable [boolean] A flag indicating whether a data table
39
+ # must be used to pass actual values.
35
40
  def initialize(aMacroPhrase, theSubsteps, useTable)
36
41
  @key = self.class.macro_key(aMacroPhrase, useTable, :definition)
37
42
 
@@ -54,19 +59,23 @@ class MacroStep
54
59
  # Compute the identifier of the macro from the given macro phrase.
55
60
  # A macro phrase is a text that may contain zero or more placeholders.
56
61
  # In definition mode, a placeholder is delimited by chevrons <..>.
57
- # In invokation mode, a value bound to a placeholder is delimited by double quotes.
62
+ # In invokation mode, a value bound to a placeholder is delimited
63
+ # by double quotes.
58
64
  # The rule for building the identifying key are:
59
65
  # - Leading and trailing space(s) are removed.
60
66
  # - Each underscore character is removed.
61
67
  # - Every sequence of one or more space(s) is converted into an underscore
62
- # - Each placeholder (i.e. = delimiters + enclosed text) is converted into a letter X.
68
+ # - Each placeholder (i.e. = delimiters + enclosed text)
69
+ # is converted into a letter X.
63
70
  # - when useTable is true, concatenate: _T
64
71
  # @example:
65
72
  # Consider the macro phrase: 'create the following "contactType" contact'
66
73
  # The resulting macro_key is: 'create_the_following_X_contact_T'
67
74
  #
68
- # @param aMacroPhrase [String] The text from the macro step definition that is between the square brackets.
69
- # @param useTable [boolean] A flag indicating whether a table should be used to pass actual values.
75
+ # @param aMacroPhrase [String] The text from the macro step definition
76
+ # that is between the square brackets.
77
+ # @param useTable [boolean] A flag indicating whether a table
78
+ # should be used to pass actual values.
70
79
  # @param mode [:definition, :invokation]
71
80
  # @return [String] the key of the phrase/macro.
72
81
  def self.macro_key(aMacroPhrase, useTable, mode)
@@ -79,7 +88,8 @@ class MacroStep
79
88
  stripped_phrase.gsub!(/\s+/, '_')
80
89
 
81
90
 
82
- # Determine the pattern to isolate each argument/parameter with its delimiters
91
+ # Determine the pattern to isolate
92
+ # each argument/parameter with its delimiters
83
93
  pattern = case mode
84
94
  when :definition
85
95
  /<(?:[^\\<>]|\\.)*>/
@@ -15,13 +15,15 @@ module Templating
15
15
 
16
16
  # Class used internally by the template engine.
17
17
  # Represents a static piece of text from a template.
18
- # A static text is a text that is reproduced verbatim when rendering a template.
18
+ # A static text is a text that is reproduced verbatim
19
+ # when rendering a template.
19
20
  class StaticText
20
21
  # The static text extracted from the original template.
21
22
  attr_reader(:source)
22
23
 
23
24
 
24
- # @param aSourceText [String] A piece of text extracted from the template that must be rendered verbatim.
25
+ # @param aSourceText [String] A piece of text extracted
26
+ # from the template that must be rendered verbatim.
25
27
  def initialize(aSourceText)
26
28
  @source = aSourceText
27
29
  end
@@ -64,7 +66,8 @@ class UnaryElement
64
66
 
65
67
  protected
66
68
  # This method has the same signature as the {Engine#render} method.
67
- # @return [Object] The actual value from the locals or context that is assigned to the variable.
69
+ # @return [Object] The actual value from the locals or context
70
+ # that is assigned to the variable.
68
71
  def retrieve_value_from(aContextObject, theLocals)
69
72
  actual_value = theLocals[name]
70
73
  if actual_value.nil? && aContextObject.respond_to?(name.to_sym)
@@ -81,7 +84,8 @@ end # class
81
84
  # Class used internally by the template engine.
82
85
  # Represents a named placeholder in a template, that is,
83
86
  # a name placed between <..> in the template.
84
- # At rendition, a placeholder is replaced by the text value that is associated with it.
87
+ # At rendition, a placeholder is replaced by the text value
88
+ # that is associated with it.
85
89
  class Placeholder < UnaryElement
86
90
 
87
91
  public
@@ -155,7 +159,8 @@ public
155
159
  # @return [String] The text value assigned to the placeholder.
156
160
  # Returns an empty string when no value is assigned to the placeholder.
157
161
  def render(aContextObject, theLocals)
158
- raise NotImplementedError, "Method Section.#{__method__} must be implemented in subclass."
162
+ msg = "Method Section.#{__method__} must be implemented in subclass."
163
+ raise NotImplementedError, msg
159
164
  end
160
165
 
161
166
  end # class
@@ -165,12 +170,14 @@ end # class
165
170
  # a set of template elements for which its rendition depends
166
171
  # on the (in)existence of an actual value bound to the variable name.
167
172
  class ConditionalSection < Section
168
- # A boolean that indicates whether the rendition condition is the existence of a value for the variable (true)
173
+ # A boolean that indicates whether the rendition condition is
174
+ # the existence of a value for the variable (true)
169
175
  # or its inexistence (false).
170
176
  attr_reader(:existence)
171
177
 
172
178
  # @param aVarName [String] The name of the placeholder from a template.
173
- # @param renderWhenExisting [boolean] When true, render the children elements if a value exists for the variable.
179
+ # @param renderWhenExisting [boolean] When true, render the children elements
180
+ # if a value exists for the variable.
174
181
  def initialize(aVarName, renderWhenExisting = true)
175
182
  super(aVarName)
176
183
  @existence = renderWhenExisting
@@ -208,16 +215,22 @@ SectionEndMarker = Struct.new(:name)
208
215
 
209
216
 
210
217
  # A very simple implementation of a templating engine.
211
- # Earlier versions of Macros4Cuke relied on the logic-less Mustache template engine.
212
- # But it was decided afterwards to replace it by a very simple template engine.
218
+ # Earlier versions of Macros4Cuke relied on the logic-less
219
+ # Mustache template engine.
220
+ # But it was decided afterwards to replace it by a very simple
221
+ # template engine.
213
222
  # The reasons were the following:
214
- # - Be closer to the usual Gherkin syntax (parameters of scenario outlines use chevrons <...>,
223
+ # - Be closer to the usual Gherkin syntax (parameters of scenario outlines
224
+ # use chevrons <...>,
215
225
  # while Mustache use !{{...}} delimiters),
216
226
  # - Feature files are meant to be simple, so should the template engine be.
217
227
  class Engine
218
- # The regular expression that matches a space, any punctuation sign or delimiter that is forbidden between chevrons <...> template tags.
228
+ # The regular expression that matches a space,
229
+ # any punctuation sign or delimiter that is forbidden
230
+ # between chevrons <...> template tags.
219
231
  DisallowedSigns = begin
220
- forbidden = ' !"#' + "$%&'()*+,-./:;<=>?[\\]^`{|}~" # Used concatenation (+) to work around Ruby bug!
232
+ # Use concatenation (+) to work around Ruby bug!
233
+ forbidden = ' !"#' + "$%&'()*+,-./:;<=>?[\\]^`{|}~"
221
234
  all_escaped = []
222
235
  forbidden.each_char() { |ch| all_escaped << Regexp.escape(ch) }
223
236
  pattern = all_escaped.join("|")
@@ -227,19 +240,25 @@ class Engine
227
240
  # The original text of the template is kept here.
228
241
  attr_reader(:source)
229
242
 
230
- # Builds an Engine and compiles the given template text into an internal representation.
231
- # @param aSourceTemplate [String] The template source text. It may contain zero or tags enclosed between chevrons <...>.
243
+ # Builds an Engine and compiles the given template text into
244
+ # an internal representation.
245
+ # @param aSourceTemplate [String] The template source text.
246
+ # It may contain zero or tags enclosed between chevrons <...>.
232
247
  def initialize(aSourceTemplate)
233
248
  @source = aSourceTemplate
234
249
  @representation = compile(aSourceTemplate)
235
250
  end
236
251
 
237
252
  public
238
- # Render the template within the given scope object and with the locals specified.
253
+ # Render the template within the given scope object and
254
+ # with the locals specified.
239
255
  # The method mimicks the signature of the Tilt::Template#render method.
240
- # @param aContextObject [anything] context object to get actual values (when not present in the locals Hash).
241
- # @param theLocals [Hash] Contains one or more pairs of the form: tag/placeholder name => actual value.
242
- # @return [String] The rendition of the template given the passed argument values.
256
+ # @param aContextObject [anything] context object to get actual values
257
+ # (when not present in the locals Hash).
258
+ # @param theLocals [Hash] Contains one or more pairs of the form:
259
+ # tag/placeholder name => actual value.
260
+ # @return [String] The rendition of the template given
261
+ # the passed argument values.
243
262
  def render(aContextObject = Object.new, theLocals)
244
263
  return '' if @representation.empty?
245
264
 
@@ -285,7 +304,9 @@ public
285
304
  until scanner.eos?
286
305
  # Scan tag at current position...
287
306
  tag_literal = scanner.scan(/<(?:[^\\<>]|\\.)*>/)
288
- result << [:dynamic, tag_literal.gsub(/^<|>$/, '')] unless tag_literal.nil?
307
+ unless tag_literal.nil?
308
+ result << [:dynamic, tag_literal.gsub(/^<|>$/, '')]
309
+ end
289
310
 
290
311
  # ... or scan plain text at current position
291
312
  text_literal = scanner.scan(/(?:[^\\<>]|\\.)+/)
@@ -303,11 +324,14 @@ private
303
324
  def self.identify_parse_error(aTextLine)
304
325
  # Unsuccessful scanning: we typically have improperly balanced chevrons.
305
326
  # We will analyze the opening and closing chevrons...
306
- no_escaped = aTextLine.gsub(/\\[<>]/, "--") # First: replace escaped chevron(s)
307
- unbalance = 0 # This variable equals: count of < - count of > (can only be 0 or -temporarily- 1)
327
+ # First: replace escaped chevron(s)
328
+ no_escaped = aTextLine.gsub(/\\[<>]/, "--")
329
+
330
+ # var. equals count_of(<) - count_of(>): can only be 0 or temporarily 1
331
+ unbalance = 0
308
332
 
309
- no_escaped.scan(/(.)/) do |match|
310
- case match[0]
333
+ no_escaped.each_char do |ch|
334
+ case ch
311
335
  when '<'
312
336
  unbalance += 1
313
337
  when '>'
@@ -318,8 +342,7 @@ private
318
342
  raise StandardError, "Missing opening chevron '<'." if unbalance < 0
319
343
  end
320
344
 
321
- raise StandardError, "Missing closing chevron '>'." if unbalance == 1
322
- raise StandardError, "Cannot parse:\n'#{aTextLine}'"
345
+ raise StandardError, "Missing closing chevron '>'." if unbalance == 1
323
346
  end
324
347
 
325
348
 
@@ -333,7 +356,9 @@ private
333
356
  line_items = self.class.parse(line)
334
357
  line_items.each do |(kind, text)|
335
358
  # A tag text cannot be empty nor blank
336
- raise EmptyArgumentError.new(line.strip) if (kind == :dynamic) && text.strip.empty?
359
+ if (kind == :dynamic) && text.strip.empty?
360
+ raise EmptyArgumentError.new(line.strip)
361
+ end
337
362
  end
338
363
 
339
364
  line_items
@@ -343,12 +368,13 @@ private
343
368
  return compile_sections(compiled_lines.flatten())
344
369
  end
345
370
 
346
- # Convert the array of raw entries (per line) into full-fledged template elements.
371
+ # Convert the array of raw entries (per line)
372
+ # into full-fledged template elements.
347
373
  def compile_line(aRawLine)
348
374
  line_rep = aRawLine.map { |couple| compile_couple(couple) }
349
375
 
350
- # Apply the rule: when a line just consist of spaces and a section element,
351
- # then remove all the spaces from that line.
376
+ # Apply the rule: when a line just consist of spaces
377
+ # and a section element, then remove all the spaces from that line.
352
378
  section_item = nil
353
379
  line_to_squeeze = line_rep.all? do |item|
354
380
  case item
@@ -370,7 +396,8 @@ private
370
396
  line_rep = [section_item]
371
397
  else
372
398
  # Apply another rule: if last item in line is an end of section marker,
373
- # then place eoline before that item. Otherwise, end the line with a eoline marker.
399
+ # then place eoline before that item.
400
+ # Otherwise, end the line with a eoline marker.
374
401
  if line_rep.last.is_a?(SectionEndMarker)
375
402
  section_end = line_rep.pop()
376
403
  line_rep << EOLine.new
@@ -395,8 +422,6 @@ private
395
422
 
396
423
  when :dynamic
397
424
  parse_tag(text)
398
- else
399
- raise StandardError, "Internal error: Don't know template element of kind #{kind}"
400
425
  end
401
426
 
402
427
  return result
@@ -414,7 +439,6 @@ private
414
439
  end
415
440
  raise InvalidCharError.new(aText, matching[0]) if matching
416
441
 
417
- SectionEndMarker
418
442
  result = case aText[0, 1]
419
443
  when '?'
420
444
  ConditionalSection.new(aText[1..-1], true)
@@ -443,7 +467,8 @@ private
443
467
  raise StandardError, "End of section</#{element.name}> found while no corresponding section is open."
444
468
  end
445
469
  if element.name != open_sections.last.name
446
- raise StandardError, "End of section</#{element.name}> doesn't match current section '#{open_sections.last.name}'."
470
+ msg = "End of section</#{element.name}> doesn't match current section '#{open_sections.last.name}'."
471
+ raise StandardError, msg
447
472
  end
448
473
  subResult << open_sections.pop()
449
474
 
@@ -457,7 +482,10 @@ private
457
482
 
458
483
  end
459
484
 
460
- raise StandardError, "Unterminated section #{open_sections.last}." unless open_sections.empty?
485
+ unless open_sections.empty?
486
+ error_message = "Unterminated section #{open_sections.last}."
487
+ raise StandardError, error_message
488
+ end
461
489
 
462
490
  return compiled
463
491
  end
data/lib/macros4cuke.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8 -- You should see a paragraph character: §
2
2
  # File: macros4cuke.rb
3
- # This file acts as a jumping-off point for loading dependencies expected for a Macros4Cuke user.
3
+ # This file acts as a jumping-off point for loading dependencies expected
4
+ # for a Macros4Cuke user.
4
5
 
5
6
  require_relative './macros4cuke/constants'
6
7
  require_relative './macros4cuke/macro-step-support'
@@ -50,8 +50,8 @@ SNIPPET
50
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
- -> { world.add_macro(m1_phrase, m1_substeps, true) }.should
54
- raise_error(Macros4Cuke::DuplicateMacroError, msg)
53
+ -> { world.add_macro(m1_phrase, m1_substeps, true) }.should raise_error(
54
+ Macros4Cuke::DuplicateMacroError, msg)
55
55
  end
56
56
 
57
57
  it "should complain macro uses no table and phrase is parameterless" do
@@ -59,8 +59,8 @@ SNIPPET
59
59
  # but the macro has no mechanism to pass the needed data.
60
60
  phrase = "fill in the credentials"
61
61
  msg = "The sub-step argument 'userid' does not appear in the phrase."
62
- ->(){ world.add_macro(phrase, m1_substeps, false) }.should
63
- raise_error(Macros4Cuke::UnreachableSubstepArgument, msg)
62
+ ->(){ world.add_macro(phrase, m1_substeps, false) }.should raise_error(
63
+ Macros4Cuke::UnreachableSubstepArgument, msg)
64
64
  end
65
65
  end # context
66
66
 
@@ -69,8 +69,8 @@ SNIPPET
69
69
  it "should complain when invoking an unknown macro-step" do
70
70
  phrase_unknown = "dream of a perfect world"
71
71
  msg = "Unknown macro-step with phrase: 'dream of a perfect world'."
72
- ->(){ world.invoke_macro(phrase_unknown) }.should
73
- raise_error(Macros4Cuke::UnknownMacroError, msg)
72
+ ->(){ world.invoke_macro(phrase_unknown) }.should raise_error(
73
+ Macros4Cuke::UnknownMacroError, msg)
74
74
  end
75
75
 
76
76
  end # context
@@ -36,16 +36,16 @@ end
36
36
 
37
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
- ->(){ MacroStep.new(sample_phrase, sample_template, false) }.should
40
- raise_error(Macros4Cuke::UnreachableSubstepArgument, msg)
39
+ ->(){ MacroStep.new(sample_phrase, sample_template, false) }.should raise_error(
40
+ Macros4Cuke::UnreachableSubstepArgument, msg)
41
41
  end
42
42
 
43
43
 
44
44
  it "should complain when an argument in phrase never occurs in substeps" do
45
45
  phrase = "enter my credentials as <foobar>"
46
46
  msg = "The phrase argument 'foobar' does not appear in a sub-step."
47
- ->(){ MacroStep.new(phrase, sample_template, true) }.should
48
- raise_error(Macros4Cuke::UselessPhraseArgument, msg)
47
+ ->(){ MacroStep.new(phrase, sample_template, true) }.should raise_error(
48
+ Macros4Cuke::UselessPhraseArgument, msg)
49
49
  end
50
50
 
51
51
 
@@ -114,8 +114,8 @@ SNIPPET
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) ]
117
- ->(){ subject.expand(phrase_instance, args) }.should
118
- raise_error(UnknownArgumentError, error_message)
117
+ ->(){ subject.expand(phrase_instance, args) }.should raise_error(
118
+ UnknownArgumentError, error_message)
119
119
  end
120
120
 
121
121
  end # context
@@ -210,15 +210,15 @@ SNIPPET
210
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
- ->(){ Engine.new text_w_empty_arg }.should
214
- raise_error(Macros4Cuke::EmptyArgumentError, msg)
213
+ ->(){ Engine.new text_w_empty_arg }.should raise_error(
214
+ Macros4Cuke::EmptyArgumentError, msg)
215
215
  end
216
216
 
217
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
- msg = "The invalid sign '%' occurs in the argument/tag 'user%id'."
220
- ->(){ Engine.new text_w_empty_arg }.should
221
- raise_error(Macros4Cuke::InvalidCharError, msg)
219
+ msg = "The invalid sign '%' occurs in the argument 'user%id'."
220
+ ->(){ Engine.new text_w_empty_arg }.should raise_error(
221
+ Macros4Cuke::InvalidCharError, msg)
222
222
  end
223
223
 
224
224
  it "should complain when a section has no closing tag" do
@@ -226,8 +226,8 @@ SNIPPET
226
226
  text_w_open_section = sophisticated_template.sub(/<\/address>/, '')
227
227
 
228
228
  error_message = "Unterminated section <?address>."
229
- ->(){ Engine.new text_w_open_section}.should
230
- raise_error(StandardError, error_message)
229
+ ->(){ Engine.new text_w_open_section}.should raise_error(
230
+ StandardError, error_message)
231
231
  end
232
232
 
233
233
  it "should complain when a closing tag has no corresponding opening tag" do
@@ -235,16 +235,15 @@ SNIPPET
235
235
  text_w_wrong_end = sophisticated_template.sub(/<\/address>/, '</foobar>')
236
236
 
237
237
  msg = "End of section</foobar> doesn't match current section 'address'."
238
- ->(){ Engine.new text_w_wrong_end }.should
239
- raise_error(StandardError, msg)
238
+ ->(){ Engine.new text_w_wrong_end }.should raise_error(
239
+ StandardError, msg)
240
240
  end
241
241
 
242
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
245
  msg = "End of section</foobar> found while no corresponding section is open."
246
- ->(){ Engine.new wrong_end }.should
247
- raise_error(StandardError, msg)
246
+ ->(){ Engine.new wrong_end }.should raise_error(StandardError, msg)
248
247
  end
249
248
 
250
249
  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.15
4
+ version: 0.3.16
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: