/**
 * @file UDPStreamerClientTest.h
 * @brief Header file for class UDPStreamerClientTest
 * @date 01/07/2026
 * @author Martino Ferrari
 *
 * @copyright Copyright 2015 F4E | European Joint Undertaking for ITER and
 * the Development of Fusion Energy ('Fusion for Energy').
 * Licensed under the EUPL, Version 1.1 or - as soon they will be approved
 * by the European Commission - subsequent versions of the EUPL (the "Licence")
 * You may not use this work except in compliance with the Licence.
 * You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl
 *
 * @warning Unless required by applicable law or agreed to in writing,
 * software distributed under the Licence is distributed on an "AS IS"
 * basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the Licence permissions and limitations under the Licence.
 *
 * @details This header file contains the declaration of the class UDPStreamerClientTest
 * with all of its public, protected and private members. It may also include
 * definitions for inline methods which need to be visible to the compiler.
 */

#ifndef UDPSTREAMERCLIENTTEST_H_
#define UDPSTREAMERCLIENTTEST_H_

/*---------------------------------------------------------------------------*/
/*                        Standard header includes                           */
/*---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/
/*                        Project header includes                            */
/*---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/
/*                           Class declaration                               */
/*---------------------------------------------------------------------------*/

/**
 * @brief Tests the UDPStreamerClient DataSource public methods.
 */
class UDPStreamerClientTest {
public:

    /**
     * @brief Tests Initialise with a fully valid unicast configuration.
     */
    bool TestInitialise_Valid();

    /**
     * @brief Tests that a missing ServerAddress uses the default (127.0.0.1).
     */
    bool TestInitialise_DefaultServerAddress();

    /**
     * @brief Tests that a missing Port uses the default (44500).
     */
    bool TestInitialise_DefaultPort();

    /**
     * @brief Tests Initialise with MulticastGroup and an explicit DataPort.
     */
    bool TestInitialise_MulticastMode_Valid();

    /**
     * @brief Tests that DataPort defaults to Port+1 when MulticastGroup is
     * set but DataPort is absent.
     */
    bool TestInitialise_MulticastMode_DefaultDataPort();

    /**
     * @brief Tests SetConfiguredDatabase / AllocateMemory with several
     * signals of different types and array sizes.
     */
    bool TestSetConfiguredDatabase_MultipleSignals();

    /**
     * @brief Tests PrepareNextState starts the background receiver thread.
     */
    bool TestPrepareNextState_StartsReceiver();

    /**
     * @brief Tests that Synchronise() with no data received is a safe no-op.
     */
    bool TestSynchronise_NoData();

    /**
     * @brief Tests the full OnUDPSConfig -> OnUDPSData -> Synchronise path
     * for a single unquantised scalar signal.
     */
    bool TestOnUDPSConfig_BasicAccept();

    /**
     * @brief Tests that a CONFIG with a different signal count is rejected.
     */
    bool TestOnUDPSConfig_SignalCountMismatch();

    /**
     * @brief Tests that a CONFIG with a mismatched signal name is rejected.
     */
    bool TestOnUDPSConfig_NameMismatch();

    /**
     * @brief Tests that a CONFIG with a mismatched element count is rejected.
     */
    bool TestOnUDPSConfig_ElementCountMismatch();

    /**
     * @brief Tests that an undersized CONFIG payload is safely rejected.
     */
    bool TestOnUDPSConfig_TooSmallPayload();

    /**
     * @brief Tests UINT16 dequantisation into a Float32Bit destination signal.
     */
    bool TestOnUDPSData_QuantizedUint16();

    /**
     * @brief Tests INT8 dequantisation formula into a Float64Bit destination signal.
     */
    bool TestOnUDPSData_QuantizedInt8();

    /**
     * @brief Tests that multiple signals decode into the correct buffer offsets.
     */
    bool TestOnUDPSData_MultipleSignalsOrder();

    /**
     * @brief Tests Accumulate publishing mode: scalar signals publish only the
     * most recent sample, array signals publish once regardless of numSamples.
     */
    bool TestOnUDPSData_AccumulateMode();

    /**
     * @brief Tests that an undersized DATA payload (missing timestamp) is a safe no-op.
     */
    bool TestOnUDPSData_TooSmallPayload();

    /**
     * @brief Tests that OnUDPSData before a valid CONFIG is a safe no-op.
     */
    bool TestOnUDPSData_BeforeConfig();

    /**
     * @brief Tests that OnUDPSDisconnected() invalidates the CONFIG so
     * subsequent DATA payloads are ignored until a new CONFIG arrives.
     */
    bool TestOnUDPSDisconnected_InvalidatesConfig();

    /**
     * @brief Tests the full CONNECT -> CONFIG -> DATA flow over real loopback
     * UDP sockets, mirroring the server side of the wire protocol.
     */
    bool TestExecute_ConnectConfigDataEndToEnd();
};

#endif /* UDPSTREAMERCLIENTTEST_H_ */
