]> gitweb.fluxo.info Git - puppet-stdlib.git/commitdiff
(#11901) Fix sort order error in tests for 'keys' and 'values'
authorJeff McCune <jeff@puppetlabs.com>
Thu, 12 Jan 2012 01:39:15 +0000 (17:39 -0800)
committerJeff McCune <jeff@puppetlabs.com>
Thu, 12 Jan 2012 01:39:15 +0000 (17:39 -0800)
Between Ruby 1.8.7 p352 and p357 the way arrays were returned when using
keys and values in Ruby changed, and due to assumption about the
ordering our tests are now failing.

This patch fixes the issue by using the =~ operator matcher in rspec.
This matcher is implemented as RSpec::Matchers::MatchArray and performs
multiset equality matching of arrays.  Order doesn't matter, but
duplicate values do.

This patch also switches @scope instance variables to memoized let
methods for clarity in the code.

Original Author: Ken Barber
Reviewed-by: Nick Lewis
This commit closes GH-29

spec/unit/puppet/parser/functions/keys_spec.rb
spec/unit/puppet/parser/functions/values_spec.rb

index 927be9602411596996e2f9bad0699f440506a480..d9285624bd1c5ab262c1e2da8372a451b341b4c2 100644 (file)
@@ -6,21 +6,20 @@ describe "the keys function" do
     Puppet::Parser::Functions.autoloader.loadall
   end
 
-  before :each do
-    @scope = Puppet::Parser::Scope.new
-  end
+  let(:scope) { Puppet::Parser::Scope.new }
 
   it "should exist" do
     Puppet::Parser::Functions.function("keys").should == "function_keys"
   end
 
   it "should raise a ParseError if there is less than 1 arguments" do
-    lambda { @scope.function_keys([]) }.should( raise_error(Puppet::ParseError))
+    lambda { scope.function_keys([]) }.should( raise_error(Puppet::ParseError))
   end
 
   it "should return an array of keys when given a hash" do
-    result = @scope.function_keys([{'a'=>1, 'b' => 2}])
-    result.should(eq(['a','b']))
+    result = scope.function_keys([{'a'=>1, 'b'=>2}])
+    # =~ performs 'array with same elements' (set) matching
+    # For more info see RSpec::Matchers::MatchArray
+    result.should =~ ['a','b']
   end
-
 end
index f6eb5b666ed3ba6436600a63aa6752bdc73ca97b..a5fbbd880aac20dd60e187e78c260fc9ce907e12 100644 (file)
@@ -6,25 +6,30 @@ describe "the values function" do
     Puppet::Parser::Functions.autoloader.loadall
   end
 
-  before :each do
-    @scope = Puppet::Parser::Scope.new
-  end
+  let(:scope) { Puppet::Parser::Scope.new }
 
   it "should exist" do
     Puppet::Parser::Functions.function("values").should == "function_values"
   end
 
   it "should raise a ParseError if there is less than 1 arguments" do
-    lambda { @scope.function_values([]) }.should( raise_error(Puppet::ParseError))
+    lambda { scope.function_values([]) }.should( raise_error(Puppet::ParseError))
   end
 
   it "should return values from a hash" do
-    result = @scope.function_values([{'a'=>'1','b'=>'2','c'=>'3'}])
-    result.should(eq(['1','2','3']))
+    result = scope.function_values([{'a'=>'1','b'=>'2','c'=>'3'}])
+    # =~ is the RSpec::Matchers::MatchArray matcher.
+    # A.K.A. "array with same elements" (multiset) matching
+    result.should =~ %w{ 1 2 3 }
   end
 
-  it "should return values from a hash" do
-    lambda { @scope.function_values([['a','b','c']]) }.should( raise_error(Puppet::ParseError))
+  it "should return a multiset" do
+    result = scope.function_values([{'a'=>'1','b'=>'3','c'=>'3'}])
+    result.should     =~ %w{ 1 3 3 }
+    result.should_not =~ %w{ 1 3 }
   end
 
+  it "should raise a ParseError unless a Hash is provided" do
+    lambda { scope.function_values([['a','b','c']]) }.should( raise_error(Puppet::ParseError))
+  end
 end