c14cbf31e2
The setup: list with 3 elements, delete one: $test_list = [‘a’, ‘b’, ‘c’] $test_deleted = delete($test_list, ‘a’) Print out the elements in ‘test_deleted’: notify { ‘group_output2’: withpath => true, name => “$cfeng::test_deleted”, } Notice: /Stage[main]/Syslog/Notify[group_output2]/message: bc Good! Run-on output shows that ‘a’ was deleted Print out the elements in ‘test_list’: notify { ‘group_output1’: withpath => true, name => “$cfeng::test_list”, } Notice: /Stage[main]/Syslog/Notify[group_output1]/message: bc WHAT!? 'a' was deleted from ‘test_list’ as well! Expected abc as output! This behaviour is confirmed for string, hash and array. This is fixed on this commit, I had added two spec tests to cover that cases. bug #20681 spec test for delete() function. I had forgot in the last commit the spec test for hash in the delete function. bug # 20681 delete() function change aproach. Instead of rejecting elements from the original list, we use collection = arguments[0].dup . then latter we could continue to use delete and gsub! on collection without impact on original argument. this is a better solution than the previous one, and works on ruby 1.8.7, 1.9.3 and 2.0.0. The previous solution does not work on ruby 1.8.7. delete function remove typo whitespace. fix typo whitespaces.
56 lines
1.9 KiB
Ruby
Executable file
56 lines
1.9 KiB
Ruby
Executable file
#! /usr/bin/env ruby -S rspec
|
|
require 'spec_helper'
|
|
|
|
describe "the delete function" do
|
|
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }
|
|
|
|
it "should exist" do
|
|
Puppet::Parser::Functions.function("delete").should == "function_delete"
|
|
end
|
|
|
|
it "should raise a ParseError if there are fewer than 2 arguments" do
|
|
lambda { scope.function_delete([]) }.should( raise_error(Puppet::ParseError))
|
|
end
|
|
|
|
it "should raise a ParseError if there are greater than 2 arguments" do
|
|
lambda { scope.function_delete([[], 'foo', 'bar']) }.should( raise_error(Puppet::ParseError))
|
|
end
|
|
|
|
it "should raise a TypeError if a number is passed as the first argument" do
|
|
lambda { scope.function_delete([1, 'bar']) }.should( raise_error(TypeError))
|
|
end
|
|
|
|
it "should delete all instances of an element from an array" do
|
|
result = scope.function_delete([['a','b','c','b'],'b'])
|
|
result.should(eq(['a','c']))
|
|
end
|
|
|
|
it "should delete all instances of a substring from a string" do
|
|
result = scope.function_delete(['foobarbabarz','bar'])
|
|
result.should(eq('foobaz'))
|
|
end
|
|
|
|
it "should delete a key from a hash" do
|
|
result = scope.function_delete([{ 'a' => 1, 'b' => 2, 'c' => 3 },'b'])
|
|
result.should(eq({ 'a' => 1, 'c' => 3 }))
|
|
end
|
|
|
|
it "should not change origin array passed as argument" do
|
|
origin_array = ['a','b','c','d']
|
|
result = scope.function_delete([origin_array, 'b'])
|
|
origin_array.should(eq(['a','b','c','d']))
|
|
end
|
|
|
|
it "should not change the origin string passed as argument" do
|
|
origin_string = 'foobarbabarz'
|
|
result = scope.function_delete([origin_string,'bar'])
|
|
origin_string.should(eq('foobarbabarz'))
|
|
end
|
|
|
|
it "should not change origin hash passed as argument" do
|
|
origin_hash = { 'a' => 1, 'b' => 2, 'c' => 3 }
|
|
result = scope.function_delete([origin_hash, 'b'])
|
|
origin_hash.should(eq({ 'a' => 1, 'b' => 2, 'c' => 3 }))
|
|
end
|
|
|
|
end
|