require 'test_helper'
require 'net/dns/rr'

class RRAAAATest < Minitest::Test
  def setup
    @rr_name    = "www.nic.it."
    @rr_type    = "AAAA"
    @rr_cls     = "IN"
    @rr_ttl     = 60
    @rr_value   = "2a00:d40:1:1::239"
    @rr_address = IPAddr.new(@rr_value)

    @rr_output  = "www.nic.it.             60      IN      AAAA    2a00:d40:1:1::239"

    @rr         = Net::DNS::RR::AAAA.new(name: @rr_name, address: @rr_address, ttl: @rr_ttl)
  end

  def test_initialize_from_hash
    @record = Net::DNS::RR::AAAA.new(name: @rr_name, address: @rr_value, ttl: @rr_ttl)
    assert_equal @rr_output,  @record.to_s
    assert_equal @rr_name,    @record.name
    assert_equal @rr_type,    @record.type
    assert_equal @rr_cls,     @record.cls
    assert_equal @rr_ttl,     @record.ttl
    assert_equal @rr_address, @record.address
    assert_equal @rr_value,   @record.value
  end

  def test_initialize_from_string
    @record = Net::DNS::RR::AAAA.new("#{@rr_name} #{@rr_ttl} #{@rr_cls} #{@rr_type} #{@rr_value}")
    assert_equal @rr_output,  @record.to_s
    assert_equal @rr_name,    @record.name
    assert_equal @rr_type,    @record.type
    assert_equal @rr_cls,     @record.cls
    assert_equal @rr_ttl,     @record.ttl
    assert_equal @rr_address, @record.address
    assert_equal @rr_value,   @record.value
  end

  def test_parse
    data = "\003www\003nic\002it\000\000\034\000\001\000\000\000<\000\020*\000\r@\000\001\000\001\000\000\000\000\000\000\0029"
    @record = Net::DNS::RR.parse(data)
    assert_equal @rr_output,  @record.to_s
    assert_equal @rr_name,    @record.name
    assert_equal @rr_type,    @record.type
    assert_equal @rr_cls,     @record.cls
    assert_equal @rr_ttl,     @record.ttl
    assert_equal @rr_address, @record.address
    assert_equal @rr_value,   @record.value
  end

  InvalidArguments = [
    { name: "google.com", address: "2a00" },
    { name: "google.com" },
    Object.new,
    Array.new(7),
    "10800 IN AAAA",
    # FIXME: "google.com. 10800 IN B",
    # FIXME: "google.com. 10800 IM AAAA",
  ].freeze

  InvalidArguments.each_with_index do |arguments, index|
    define_method "test_initialize_should_raise_with_invalid_arguments_#{index}" do
      assert_raises(ArgumentError) { Net::DNS::RR::AAAA.new(arguments) }
    end
  end

  def test_address_getter
    assert_equal @rr_address, @rr.address
  end

  def test_address_setter
    assert_raises(ArgumentError) { @rr.address = nil }

    expected = IPAddr.new("2a00:d40:1:1::239")
    assert_equal expected, @rr.address = "2a00:d40:1:1::239"
    assert_equal expected, @rr.address

    expected = IPAddr.new("2a00:d40:1:1::240")
    assert_equal expected, @rr.address = IPAddr.new("2a00:d40:1:1::240")
    assert_equal expected, @rr.address
  end

  def test_value
    assert_equal  @rr_value, @rr.value
  end

  def test_inspect
    assert_equal  "www.nic.it.             60      IN      AAAA    2a00:d40:1:1::239",
                  @rr.inspect
  end

  def test_to_s
    assert_equal  "www.nic.it.             60      IN      AAAA    2a00:d40:1:1::239",
                  @rr.to_s
  end

  def test_to_a
    assert_equal  ["www.nic.it.", 60, "IN", "AAAA", "2a00:d40:1:1::239"],
                  @rr.to_a
  end
end
