/*
 * Author: Jake G
 * Date: 2024
 * filename: test_MockADC.c
 * description:
 */

#include "CppUTest/CommandLineTestRunner.h"
#include "CppUTestExt/MockSupport.h"
#include <cstdint>

extern "C"
{
#include "MockADC.h"
}

TEST_GROUP(test_MockADC){
    void   setup(){

    } void teardown(){
        mock().checkExpectations();
mock().clear();
}
}
;

TEST(test_MockADC, ADC_InitExpects)
{
    mock().expectOneCall("ADC_Init").withUnsignedIntParameter("pin_num", 7);

    ADC_Init(7);
}

TEST(test_MockADC, ADC_EnableExpects)
{
    mock().expectOneCall("ADC_Enable");

    ADC_Enable();
}

TEST(test_MockADC, ADC_DisableExpect)
{
    mock().expectOneCall("ADC_Disable");

    ADC_Disable();
}

TEST(test_MockADC, ADC_ReadValue)
{
    MockADC_ZeroIndex();
    MockADC_PushValue(512);

    mock().expectOneCall("ADC_ReadValue_Impl").withUnsignedIntParameter("pin_num", 0x2);

    uint16_t val = ADC_ReadValue(0x2);
    LONGS_EQUAL(512, val);
}

TEST(test_MockADC, ADC_ReadValueReturnsZeroOnEmptyBuffer)
{
    MockADC_ZeroIndex();

    mock().expectOneCall("ADC_ReadValue_Impl").withUnsignedIntParameter("pin_num", 0x2).andReturnValue(0x0000);

    uint16_t val = ADC_ReadValue(0x2);
    LONGS_EQUAL(0, val);
}

TEST(test_MockADC, MockADC_PushValueDoesntOverflowArray)
{
    MockADC_ZeroIndex();
    for (int i = 0; i < 257; i++)
    {
        MockADC_PushValue(512 + i);
        CHECK_TRUE(MockADC_GetIndex() <= 255);
    }
}

TEST(test_MockADC, MockADC_SetupSetsGlobal)
{
    CHECK_FALSE(MockADC_IsSetup());

    ADC_Setup();

    CHECK_TRUE(MockADC_IsSetup());
}
