module FunctionalTestMatrix
def action(action, *results)
def action(action, *results) testcases = @@setups.zip(results).reject { |a,b| b == :na } testcases = Hash[*testcases.flatten] matrix = @@matrix # bind to local scope for define_method closure testcases.each do |setup, expected| expected_action = expected == :OK ? action : expected define_method "test_#{matrix}_#{action}_#{setup}" do @action = action send "matrix_init_#{matrix}", *setup.to_s.split(/_/).map {|c| c.intern } send "matrix_setup_#{action}", setup, expected send "matrix_test_#{expected_action}", setup end end end
def matrix(name, *setups)
def matrix(name, *setups) @@matrix, @@setups = name, setups end