diff options
-rw-r--r-- | lib/puppet/parser/ast.rb | 21 | ||||
-rw-r--r-- | lib/puppet/parser/ast/caseopt.rb | 14 | ||||
-rw-r--r-- | lib/puppet/parser/ast/casestatement.rb | 17 | ||||
-rwxr-xr-x | test/language/ast/casestatement.rb | 39 |
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$ |