$:.unshift File.join(File.dirname(__FILE__),'..','lib')

require 'test/unit'
require 'rhcp/command_param'

class CommandParamTest < Test::Unit::TestCase
  
  def param_lookup
    ["foo", "bar", "baz"]
  end
  
  def test_creation
    param = RHCP::CommandParam.new("test", "this param is used for testing purposes only")
    assert_not_nil param, "a param should not be nil after creation"
    assert_equal false, param.mandatory, "by default, params should not be mandatory"
    assert_equal false, param.has_lookup_values, "by default, a param does not have lookup values"
    assert_equal false, param.allows_multiple_values, "by default, a param should not allow multiple values"
    assert_equal false, param.is_default_param
  end
  
  def test_options
    param = RHCP::CommandParam.new("test", "this param is used for testing purposes only",
      :mandatory => true,
      :allows_multiple_values => true,
      :lookup_method => self.method(:param_lookup),
      :is_default_param => true
    )
    assert_not_nil param, "a param should not be nil after creation"
    assert_equal true, param.mandatory
    assert_equal true, param.allows_multiple_values
    assert_equal true, param.has_lookup_values
    assert_equal true, param.is_default_param
  end
  
  def test_lookup_values
    param = RHCP::CommandParam.new("lookup_test", "testing if lookup values are working",
      :lookup_method => self.method(:param_lookup)
    )
    assert_not_nil param
    assert_equal param_lookup(), param.get_lookup_values()
  end
  
  def test_partial_lookup_values
    param = RHCP::CommandParam.new("lookup_test", "testing if partial lookup values are working",
      :lookup_method => self.method(:param_lookup)
    )
    assert_not_nil param
    assert_equal ["bar", "baz"], param.get_lookup_values("ba")
  end
  
  def test_get_lookup_values_without_lookup
    param = RHCP::CommandParam.new("lookup_test", "testing if partial lookup values are working")
    assert_not_nil param
    assert_equal [], param.get_lookup_values()
  end
  
  def test_check_param_is_valid
    param = RHCP::CommandParam.new("validity_test", "testing if valid values are valid")
    assert_not_nil param
    assert param.check_param_is_valid([ "bla" ])
    assert_raise(RHCP::RhcpException) { param.check_param_is_valid [ "bla", "blubb" ] }
  end
  
  # values that aren't part of the lookup values are invalid
  def test_check_param_is_valid_lookup_values
    param = RHCP::CommandParam.new("lookup_test", "testing if partial lookup values are working",
      :lookup_method => self.method(:param_lookup)
    )
    assert_raise(RHCP::RhcpException) { param.check_param_is_valid(["zaphod"]) }
  end
  
end