Skip to content

Commit

Permalink
Allow concat to take non-array second parameters
Browse files Browse the repository at this point in the history
Also improve and extend concat tests to lock down functionality
  • Loading branch information
Martin Foot committed Feb 21, 2014
1 parent ab98142 commit 35bf5fd
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 5 deletions.
5 changes: 5 additions & 0 deletions README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,11 @@ Would result in:

['1','2','3','4','5','6']

concat(['1','2','3'],'4')

Would result in:

['1','2','3','4']

- *Type*: rvalue

Expand Down
10 changes: 7 additions & 3 deletions lib/puppet/parser/functions/concat.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,16 @@ module Puppet::Parser::Functions
a = arguments[0]
b = arguments[1]

# Check that both args are arrays.
unless a.is_a?(Array) and b.is_a?(Array)
# Check that the first parameter is an array
unless a.is_a?(Array)
raise(Puppet::ParseError, 'concat(): Requires array to work with')
end

result = a.concat(b)
if b.is_a?(Array)
result = a.concat(b)
else
result = a << b
end

return result
end
Expand Down
19 changes: 17 additions & 2 deletions spec/unit/puppet/parser/functions/concat_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,27 @@
describe "the concat function" do
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }

it "should raise a ParseError if there is less than 1 arguments" do
lambda { scope.function_concat([]) }.should( raise_error(Puppet::ParseError))
it "should raise a ParseError if the client does not provide two arguments" do
lambda { scope.function_concat([]) }.should(raise_error(Puppet::ParseError))
end

it "should raise a ParseError if the first parameter is not an array" do
lambda { scope.function_concat([1, []])}.should(raise_error(Puppet::ParseError))
end

it "should be able to concat an array" do
result = scope.function_concat([['1','2','3'],['4','5','6']])
result.should(eq(['1','2','3','4','5','6']))
end

it "should be able to concat a primitive to an array" do
result = scope.function_concat([['1','2','3'],'4'])
result.should(eq(['1','2','3','4']))
end

it "should not accidentally flatten nested arrays" do
result = scope.function_concat([['1','2','3'],[['4','5'],'6']])
result.should(eq(['1','2','3',['4','5'],'6']))
end

end

0 comments on commit 35bf5fd

Please sign in to comment.