/* * Author: Jake G * Date: 2024 * filename: test_load.cpp * description: */ #include "CppUTest/CommandLineTestRunner.h" #include "CppUTestExt/MockSupport.h" #include //This define allows us to dircetly include the device header without error. #define _AVR_IO_H_ extern "C" { #include //ATtiny404 header fille. #include "load.h" #include "MockADC.h" } TEST_GROUP(test_load) { uint8_t adc_pin; uint8_t load_pin; void setup() { adc_pin = 4; load_pin = 7; MockADC_ZeroIndex(); Load_SoftResetDisabledLoads(); } void teardown() { mock().checkExpectations(); mock().clear(); } }; TEST(test_load, LoadPass) { CHECK_TRUE(true); } void setup_adc_expectations(uint8_t adc_pin) { mock().expectOneCall("ADC_Init") .withUnsignedIntParameter("pin_num", adc_pin); mock().expectOneCall("ADC_Enable"); mock().expectOneCall("ADC_ReadValue_Impl") .withUnsignedIntParameter("pin_num", adc_pin); mock().expectOneCall("ADC_Disable"); } void expect_porta_disabled(uint8_t load_pin, bool output_level) { mock().expectOneCall("RegEdit_IsBitSet") .withPointerParameter("reg", (void *) &PORTA.OUT) .withUnsignedIntParameter("bit_num", load_pin) .andReturnValue(output_level); mock().expectOneCall("RegEdit_ClearBit") .withPointerParameter("reg", (void *) &PORTA.OUT) .withUnsignedIntParameter("bit_num", load_pin); } void expect_porta_enabled(uint8_t load_pin, bool output_level) { mock().expectOneCall("RegEdit_IsBitSet") .withPointerParameter("reg", (void *) &PORTA.OUT) .withUnsignedIntParameter("bit_num", load_pin) .andReturnValue(output_level); mock().expectOneCall("RegEdit_SetBit") .withPointerParameter("reg", (void *) &PORTA.DIR) .withUnsignedIntParameter("bit_num", load_pin); mock().expectOneCall("RegEdit_SetBit") .withPointerParameter("reg", (void *) &PORTA.OUT) .withUnsignedIntParameter("bit_num", load_pin); } void expect_portb_disabled(uint8_t load_pin, bool output_level) { mock().expectOneCall("RegEdit_IsBitSet") .withPointerParameter("reg", (void *) &PORTB.OUT) .withUnsignedIntParameter("bit_num", load_pin) .andReturnValue(output_level); mock().expectOneCall("RegEdit_ClearBit") .withPointerParameter("reg", (void *) &PORTB.OUT) .withUnsignedIntParameter("bit_num", load_pin); } void expect_portb_enabled(uint8_t load_pin, bool output_level) { mock().expectOneCall("RegEdit_IsBitSet") .withPointerParameter("reg", (void *) &PORTB.OUT) .withUnsignedIntParameter("bit_num", load_pin) .andReturnValue(output_level); mock().expectOneCall("RegEdit_SetBit") .withPointerParameter("reg", (void *) &PORTB.DIR) .withUnsignedIntParameter("bit_num", load_pin); mock().expectOneCall("RegEdit_SetBit") .withPointerParameter("reg", (void *) &PORTB.OUT) .withUnsignedIntParameter("bit_num", load_pin); } TEST(test_load, PortAHandlerDisabledHigh) { MockADC_PushValue(HIGHTHRESH); setup_adc_expectations(adc_pin); expect_porta_disabled(load_pin, true); Load_HandleLoadPortA(adc_pin, load_pin); } TEST(test_load, PortAHandlerDisabledLow) { MockADC_PushValue(LOWTHRESH); setup_adc_expectations(adc_pin); expect_porta_disabled(load_pin, false); Load_HandleLoadPortA(adc_pin, load_pin); } TEST(test_load, PortAHandlerEnabledRisingEdgeLO) { //Start from the rising edge. MockADC_PushValue(HYSTERESIS_LO - 1); setup_adc_expectations(adc_pin); expect_porta_enabled(load_pin, false); Load_HandleLoadPortA(adc_pin, load_pin); } TEST(test_load, PortAHandlerEnabledRisingEdgeHI) { //Start from the rising edge above lo. MockADC_PushValue(HYSTERESIS_HI - 1); setup_adc_expectations(adc_pin); expect_porta_enabled(load_pin, true); Load_HandleLoadPortA(adc_pin, load_pin); } TEST(test_load, PortAHandlerDisabledAboveTarget) { MockADC_PushValue(HYSTERESIS_HI + 1); setup_adc_expectations(adc_pin); expect_porta_disabled(load_pin, true); Load_HandleLoadPortA(adc_pin, load_pin); } TEST(test_load, PortAHandlerDisablesUntilPoweReset) { MockADC_PushValue(HYSTERESIS_HI - 1); MockADC_PushValue(HIGHTHRESH); setup_adc_expectations(adc_pin); expect_porta_disabled(load_pin, true); setup_adc_expectations(adc_pin); expect_porta_disabled(load_pin, false); Load_HandleLoadPortA(adc_pin, load_pin); Load_HandleLoadPortA(adc_pin, load_pin); } TEST(test_load, PortBHandlerDisabledHigh) { MockADC_PushValue(HIGHTHRESH); setup_adc_expectations(adc_pin); expect_portb_disabled(load_pin, true); Load_HandleLoadPortB(adc_pin, load_pin); } TEST(test_load, PortBHandlerDisabledLow) { MockADC_PushValue(LOWTHRESH); setup_adc_expectations(adc_pin); expect_portb_disabled(load_pin, false); Load_HandleLoadPortB(adc_pin, load_pin); } TEST(test_load, PortBHandlerEnabledRisingEdgeLO) { //Start from the rising edge. MockADC_PushValue(HYSTERESIS_LO - 1); setup_adc_expectations(adc_pin); expect_portb_enabled(load_pin, false); Load_HandleLoadPortB(adc_pin, load_pin); } TEST(test_load, PortBHandlerEnabledRisingEdgeHI) { //Start from the rising edge. MockADC_PushValue(HYSTERESIS_HI - 1); setup_adc_expectations(adc_pin); expect_portb_enabled(load_pin, true); Load_HandleLoadPortB(adc_pin, load_pin); } TEST(test_load, PortBHandlerDisabledAboveTarget) { MockADC_PushValue(HYSTERESIS_HI); setup_adc_expectations(adc_pin); expect_portb_disabled(load_pin, true); Load_HandleLoadPortB(adc_pin, load_pin); } TEST(test_load, PortBHandlerDisablesUntilPoweReset) { MockADC_PushValue(HYSTERESIS_HI - 1); MockADC_PushValue(HIGHTHRESH); setup_adc_expectations(adc_pin); expect_portb_disabled(load_pin, true); setup_adc_expectations(adc_pin); expect_portb_disabled(load_pin, false); Load_HandleLoadPortB(adc_pin, load_pin); Load_HandleLoadPortB(adc_pin, load_pin); }