/*  Copyright (C) 2013 VATSIM Community / contributors
 *  This Source Code Form is subject to the terms of the Mozilla Public
 *  License, v. 2.0. If a copy of the MPL was not distributed with this
 *  file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "testnetwork.h"
#include "expect.h"

using namespace BlackCore;
using namespace BlackMisc;
using namespace BlackMisc::Aviation;
using namespace BlackMisc::Network;
using namespace BlackMisc::Geo;
using namespace BlackMisc::PhysicalQuantities;

void BlackCoreTest::CTestNetwork::networkTest(BlackCore::INetwork *net)
{
    QString string = net->connectionStatusToString(INetwork::Connected);
    QVERIFY(string == "Connected");

    Expect e(net);

    EXPECT_UNIT(e)
    .send(&INetwork::presetServer, CServer("", "", "vatsim-germany.org", 6809, CUser("1234567", "", "", "123456")))
    .send(&INetwork::presetCallsign, "BLACK")
    .send(&INetwork::presetIcaoCodes, CAircraftIcao("C172", "P1L", "YYY", "YYY", "white"))
    .send(&INetwork::initiateConnection)
    .expect(&INetwork::connectionStatusChanged, [](INetwork::ConnectionStatus, INetwork::ConnectionStatus newStatus)
    {
        QVERIFY(newStatus == INetwork::Connecting);
        qDebug() << "CONNECTING";
    })
    .expect(&INetwork::connectionStatusChanged, [](INetwork::ConnectionStatus, INetwork::ConnectionStatus newStatus)
    {
        QVERIFY(newStatus == INetwork::Connected);
        qDebug() << "CONNECTED";
    })
    .wait(10);

    EXPECT_UNIT(e)
    .send(&INetwork::sendPing, "server")
    .expect(&INetwork::pongReceived, [](CCallsign callsign, PhysicalQuantities::CTime elapsedTime)
    {
        qDebug() << "PONG" << callsign << elapsedTime;
    })
    .wait(10);

    EXPECT_UNIT(e)
    .send(&INetwork::terminateConnection)
    .expect(&INetwork::connectionStatusChanged, [](INetwork::ConnectionStatus, INetwork::ConnectionStatus newStatus)
    {
        QVERIFY(newStatus == INetwork::Disconnecting);
        qDebug() << "DISCONNECTING";
    })
    .expect(&INetwork::connectionStatusChanged, [](INetwork::ConnectionStatus, INetwork::ConnectionStatus newStatus)
    {
        QVERIFY(newStatus == INetwork::Disconnected);
        qDebug() << "DISCONNECTED";
    })
    .wait(10);
}
