summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/parser/ast.rb21
-rw-r--r--lib/puppet/parser/ast/caseopt.rb14
-rw-r--r--lib/puppet/parser/ast/casestatement.rb17
-rwxr-xr-xtest/language/ast/casestatement.rb39
4 files changed, 52 insertions, 39 deletions
diff --git a/lib/puppet/parser/ast.rb b/lib/puppet/parser/ast.rb
index d8d421c47..055559e1c 100644
--- a/lib/puppet/parser/ast.rb
+++ b/lib/puppet/parser/ast.rb
@@ -120,25 +120,6 @@ class Puppet::Parser::AST
@autoloader.loadall
end
-#require 'puppet/parser/ast/astarray'
-#require 'puppet/parser/ast/branch'
-#require 'puppet/parser/ast/collection'
-#require 'puppet/parser/ast/caseopt'
-#require 'puppet/parser/ast/casestatement'
-#require 'puppet/parser/ast/component'
-#require 'puppet/parser/ast/else'
-#require 'puppet/parser/ast/hostclass'
-#require 'puppet/parser/ast/ifstatement'
-#require 'puppet/parser/ast/leaf'
-#require 'puppet/parser/ast/node'
-#require 'puppet/parser/ast/resourcedef'
-#require 'puppet/parser/ast/resourceparam'
-#require 'puppet/parser/ast/resourceref'
-#require 'puppet/parser/ast/resourceoverride'
-#require 'puppet/parser/ast/selector'
-#require 'puppet/parser/ast/resourcedefaults'
-#require 'puppet/parser/ast/vardef'
-#require 'puppet/parser/ast/tag'
-#require 'puppet/parser/ast/function'
+require 'puppet/parser/ast/leaf'
# $Id$
diff --git a/lib/puppet/parser/ast/caseopt.rb b/lib/puppet/parser/ast/caseopt.rb
index 1c712e896..8d578a10b 100644
--- a/lib/puppet/parser/ast/caseopt.rb
+++ b/lib/puppet/parser/ast/caseopt.rb
@@ -44,18 +44,10 @@ class Puppet::Parser::AST
def eachvalue(scope)
if @value.is_a?(AST::ASTArray)
@value.each { |subval|
- if scope
- yield subval.evaluate(:scope => scope)
- elsif subval.is_a? AST::Leaf
- yield subval.value
- end
+ yield subval.evaluate(:scope => scope)
}
else
- if scope
- yield @value.evaluate(:scope => scope)
- elsif @value.is_a? AST::Leaf
- yield @value.value
- end
+ yield @value.evaluate(:scope => scope)
end
end
@@ -76,3 +68,5 @@ class Puppet::Parser::AST
end
end
end
+
+# $Id$
diff --git a/lib/puppet/parser/ast/casestatement.rb b/lib/puppet/parser/ast/casestatement.rb
index b4197d9b4..760a1095c 100644
--- a/lib/puppet/parser/ast/casestatement.rb
+++ b/lib/puppet/parser/ast/casestatement.rb
@@ -19,16 +19,17 @@ class Puppet::Parser::AST
# Iterate across the options looking for a match.
@options.each { |option|
- if option.eachvalue(scope) { |opval|
- opval = opval.downcase if ! sensitive and opval.respond_to?(:downcase)
- # break true if opval == value
- if opval == value
- break true
- end
- }
+ option.eachvalue(scope) { |opval|
+ opval = opval.downcase if ! sensitive and opval.respond_to?(:downcase)
+ if opval == value
+ found = true
+ break
+ end
+ }
+
+ if found
# we found a matching option
retvalue = option.safeevaluate(:scope => scope)
- found = true
break
end
}
diff --git a/test/language/ast/casestatement.rb b/test/language/ast/casestatement.rb
index 493474909..036216757 100755
--- a/test/language/ast/casestatement.rb
+++ b/test/language/ast/casestatement.rb
@@ -62,6 +62,43 @@ class TestCaseStatement < Test::Unit::TestCase
assert_equal(["lower"], result, "Did not match case-insensitively")
assert(! hash["MyParam"].evaluated?, "upper value was evaluated even though it did not match")
end
+
+ # #522 - test that case statements with multiple values work as
+ # expected, where any true value suffices.
+ def test_multiple_values
+ ast = nil
+
+ tests = {
+ "one" => %w{a b c},
+ "two" => %w{e f g}
+ }
+ options = tests.collect do |result, values|
+ values = values.collect { |v| AST::Leaf.new :value => v }
+ AST::CaseOpt.new(:value => AST::ASTArray.new(:children => values),
+ :statements => AST::Leaf.new(:value => result))
+ end
+ options << AST::CaseOpt.new(:value => AST::Default.new(:value => "default"),
+ :statements => AST::Leaf.new(:value => "default"))
+
+ ast = nil
+ param = AST::Variable.new(:value => "testparam")
+ assert_nothing_raised do
+ ast = AST::CaseStatement.new(:test => param, :options => options)
+ end
+ result = nil
+ tests.each do |should, values|
+ values.each do |value|
+ result = nil
+ scope = mkscope
+ scope.setvar("testparam", value)
+ assert_nothing_raised do
+ result = ast.evaluate(:scope => scope)
+ end
+
+ assert_equal(should, result, "Got incorrect result for %s" % value)
+ end
+ end
+ end
end
-# $Id$ \ No newline at end of file
+# $Id$