//
// Created by robin on 1/14/18.
//

#include <gtest/gtest.h>
#include <QByteArray>
#include <QString>
#include <QtNetwork/QHostAddress>
#include <dns-base/RecordData/QDnsRecordDataAAAA.h>

struct DnsRDataAAAATestParams
{
    bool isValid;
    const char* hexData;
    quint32 pos;

    Q_IPV6ADDR ip;
};

class DnsRDataAAAATest : public ::testing::TestWithParam<DnsRDataAAAATestParams>
{
};

TEST_P(DnsRDataAAAATest, parseAndGetters)
{
    auto params = GetParam();
    auto data = QByteArray::fromHex(params.hexData);
    auto rdata = dynamic_cast<QDns::Base::QDnsRecordDataAAAA*>(QDns::Base::QDnsRecordDataAAAA(data, params.pos).clone());
    ASSERT_NE(rdata, nullptr);
    ASSERT_EQ(rdata->isValid(), params.isValid);
    
    if (rdata->isValid())
    {
        for (int i = 0; i < 16; ++i)
        {
            ASSERT_EQ(rdata->getIp().toIPv6Address()[i], params.ip[i]);
        }
        
        ASSERT_EQ(rdata->serialize().toHex(), QString(params.hexData).remove(" "));
    }
    delete rdata;
}

INSTANTIATE_TEST_CASE_P(DnsRDataAAAATestInst,
                        DnsRDataAAAATest,
                        ::testing::Values(
                                DnsRDataAAAATestParams {false, "", 0},
                                DnsRDataAAAATestParams {false, "00", 0},
                                DnsRDataAAAATestParams {false, "acd913e3", 0, QHostAddress("172.217.19.227").toIPv6Address()},
                                DnsRDataAAAATestParams {false, "d83ad3a3", 0, QHostAddress("216.58.211.163").toIPv6Address()},
                                DnsRDataAAAATestParams {true, "2a001450400708120000000000002003", 0, QHostAddress("2a00:1450:4007:812::2003").toIPv6Address()},
                                DnsRDataAAAATestParams {true, "2a00145040070812000000000000200e", 0, QHostAddress("2a00:1450:4007:812::200e").toIPv6Address()}
                        ));