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