Skip to content

Commit df1575d

Browse files
YannLocatelliAermanioSamHadjes
committed
✅ (dac): Add CoreDAC_test
Co-Authored-By: Maxime Blanc <[email protected]> Co-Authored-By: SamHadjes <[email protected]>
1 parent 4f994e3 commit df1575d

File tree

3 files changed

+189
-1
lines changed

3 files changed

+189
-1
lines changed

drivers/CoreDAC/CMakeLists.txt

+6
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,9 @@ target_link_libraries(CoreDAC
2626
mbed-os
2727
CoreSTM32Hal
2828
)
29+
30+
if(${CMAKE_PROJECT_NAME} STREQUAL "LekaOSUnitTests")
31+
leka_unit_tests_sources(
32+
tests/CoreDAC_test.cpp
33+
)
34+
endif()
+181
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
// Leka - LekaOS
2+
// Copyright 2024 APF France handicap
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#include "CoreDAC.h"
6+
7+
#include "gmock/gmock.h"
8+
#include "gtest/gtest.h"
9+
#include "mocks/leka/CoreSTM32Hal.h"
10+
#include "mocks/leka/STM32HalBasicTimer.h"
11+
12+
using namespace leka;
13+
14+
using testing::_;
15+
using ::testing::DoAll;
16+
using ::testing::InSequence;
17+
using ::testing::MockFunction;
18+
using ::testing::Return;
19+
using ::testing::SaveArg;
20+
using ::testing::SaveArgPointee;
21+
22+
class CoreDACTest : public ::testing::Test
23+
{
24+
protected:
25+
void SetUp() override
26+
{
27+
dac.registerDMACallbacks(on_half_transfer_callback.AsStdFunction(),
28+
on_complete_transfer_callback.AsStdFunction());
29+
30+
EXPECT_CALL(halmock, HAL_DAC_RegisterCallback(_, HAL_DAC_MSPINIT_CB_ID, _))
31+
.WillOnce(DoAll(SaveArg<2>(&mspinit_callback), Return(HAL_StatusTypeDef::HAL_OK)));
32+
EXPECT_CALL(halmock, HAL_DAC_RegisterCallback(_, HAL_DAC_MSPDEINIT_CB_ID, _))
33+
.WillOnce(DoAll(SaveArg<2>(&mspdeinit_callback), Return(HAL_StatusTypeDef::HAL_OK)));
34+
EXPECT_CALL(halmock, HAL_DAC_RegisterCallback(_, HAL_DAC_CH1_HALF_COMPLETE_CB_ID, _))
35+
.WillOnce(DoAll(SaveArg<2>(&dma_half_transfer_callback), Return(HAL_StatusTypeDef::HAL_OK)));
36+
EXPECT_CALL(halmock, HAL_DAC_RegisterCallback(_, HAL_DAC_CH1_COMPLETE_CB_ID, _))
37+
.WillOnce(DoAll(SaveArg<2>(&dma_complete_transfer_callback), Return(HAL_StatusTypeDef::HAL_OK)));
38+
39+
EXPECT_CALL(halmock, HAL_DAC_Init);
40+
EXPECT_CALL(haltimermock, linkDACTimer);
41+
EXPECT_CALL(halmock, HAL_DAC_ConfigChannel)
42+
.WillOnce(DoAll(SaveArgPointee<1>(&dac_config), Return(HAL_StatusTypeDef::HAL_OK)));
43+
44+
dac.initialize();
45+
}
46+
// void TearDown() override {}
47+
48+
mock::CoreSTM32Hal halmock;
49+
mock::STM32HalBasicTimer haltimermock;
50+
51+
CoreDAC dac {halmock, haltimermock};
52+
53+
MockFunction<void()> on_half_transfer_callback;
54+
MockFunction<void()> on_complete_transfer_callback;
55+
56+
std::function<void(DAC_HandleTypeDef *)> mspinit_callback = [](DAC_HandleTypeDef *) {};
57+
std::function<void(DAC_HandleTypeDef *)> mspdeinit_callback = [](DAC_HandleTypeDef *) {};
58+
59+
DAC_ChannelConfTypeDef dac_config {};
60+
61+
std::function<void(DAC_HandleTypeDef *)> dma_half_transfer_callback = [](DAC_HandleTypeDef *) {};
62+
std::function<void(DAC_HandleTypeDef *)> dma_complete_transfer_callback = [](DAC_HandleTypeDef *) {};
63+
};
64+
65+
TEST_F(CoreDACTest, initializationDefault)
66+
{
67+
EXPECT_NE(&dac, nullptr);
68+
69+
auto handle = dac.getHandle();
70+
EXPECT_NE(&handle, nullptr);
71+
EXPECT_EQ(handle.Instance, DAC);
72+
}
73+
74+
TEST_F(CoreDACTest, initialize)
75+
{
76+
{
77+
InSequence seq;
78+
79+
{
80+
EXPECT_CALL(halmock, HAL_DAC_RegisterCallback(_, HAL_DAC_MSPINIT_CB_ID, _));
81+
EXPECT_CALL(halmock, HAL_DAC_RegisterCallback(_, HAL_DAC_MSPDEINIT_CB_ID, _));
82+
} // MSP callbacks
83+
84+
{
85+
EXPECT_CALL(halmock, HAL_DAC_Init);
86+
EXPECT_CALL(haltimermock, linkDACTimer);
87+
EXPECT_CALL(halmock, HAL_DAC_ConfigChannel);
88+
} // DAC config
89+
90+
{
91+
EXPECT_CALL(halmock, HAL_DAC_RegisterCallback(_, HAL_DAC_CH1_HALF_COMPLETE_CB_ID, _));
92+
EXPECT_CALL(halmock, HAL_DAC_RegisterCallback(_, HAL_DAC_CH1_COMPLETE_CB_ID, _));
93+
} // DAC DMA config
94+
}
95+
96+
dac.initialize();
97+
}
98+
99+
TEST_F(CoreDACTest, initializeMspInit)
100+
{
101+
EXPECT_CALL(halmock, HAL_RCC_DMA1_CLK_ENABLE);
102+
EXPECT_CALL(halmock, HAL_NVIC_SetPriority);
103+
EXPECT_CALL(halmock, HAL_NVIC_EnableIRQ);
104+
EXPECT_CALL(halmock, HAL_DMA_Init);
105+
106+
EXPECT_CALL(halmock, HAL_RCC_DAC_CLK_ENABLE);
107+
108+
mspinit_callback(&dac.getHandle());
109+
}
110+
111+
TEST_F(CoreDACTest, initializeMspDeinit)
112+
{
113+
EXPECT_CALL(halmock, HAL_DMA_DeInit);
114+
EXPECT_CALL(halmock, HAL_RCC_DAC_CLK_DISABLE);
115+
mspdeinit_callback(&dac.getHandle());
116+
}
117+
118+
TEST_F(CoreDACTest, initializeMspInitDMAConfig)
119+
{
120+
auto dma_handle = DMA_HandleTypeDef {};
121+
122+
EXPECT_CALL(halmock, HAL_RCC_DMA1_CLK_ENABLE);
123+
EXPECT_CALL(halmock, HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, _, _));
124+
EXPECT_CALL(halmock, HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn));
125+
EXPECT_CALL(halmock, HAL_DMA_Init)
126+
.WillOnce(DoAll(SaveArgPointee<0>(&dma_handle), Return(HAL_StatusTypeDef::HAL_OK)));
127+
128+
EXPECT_CALL(halmock, HAL_RCC_DAC_CLK_ENABLE);
129+
130+
mspinit_callback(&dac.getHandle());
131+
132+
EXPECT_NE(&dma_handle, nullptr);
133+
EXPECT_EQ(dma_handle.Instance, DMA1_Stream5);
134+
135+
EXPECT_EQ(dma_handle.Init.Channel, DMA_CHANNEL_7);
136+
EXPECT_EQ(dma_handle.Init.Direction, DMA_MEMORY_TO_PERIPH);
137+
}
138+
139+
TEST_F(CoreDACTest, initializeConfig)
140+
{
141+
// necessary to reach the full voltage range in DAC output
142+
EXPECT_EQ(dac_config.DAC_OutputBuffer, DAC_OUTPUTBUFFER_ENABLE);
143+
}
144+
145+
TEST_F(CoreDACTest, initializeDmaHalfTransferCallback)
146+
{
147+
EXPECT_CALL(on_half_transfer_callback, Call);
148+
dma_half_transfer_callback(&dac.getHandle());
149+
}
150+
151+
TEST_F(CoreDACTest, initializeDmaCompleteTransferCallback)
152+
{
153+
EXPECT_CALL(on_complete_transfer_callback, Call);
154+
dma_complete_transfer_callback(&dac.getHandle());
155+
}
156+
157+
TEST_F(CoreDACTest, terminate)
158+
{
159+
EXPECT_CALL(halmock, HAL_DAC_DeInit);
160+
161+
dac.terminate();
162+
}
163+
164+
TEST_F(CoreDACTest, start)
165+
{
166+
auto data = std::array<uint16_t, 3> {0x01, 0x02, 0x03};
167+
168+
dac.registerDataToPlay(data);
169+
170+
EXPECT_CALL(haltimermock, start);
171+
EXPECT_CALL(halmock, HAL_DAC_Start_DMA(_, _, reinterpret_cast<uint32_t *>(data.data()), _, _));
172+
173+
dac.start();
174+
}
175+
176+
TEST_F(CoreDACTest, stop)
177+
{
178+
EXPECT_CALL(halmock, HAL_DAC_Stop_DMA);
179+
180+
dac.stop();
181+
}

tests/unit/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ add_subdirectory(template)
253253
# Register drivers
254254
leka_register_unit_tests_for_driver(CoreBattery)
255255
leka_register_unit_tests_for_driver(CoreBufferedSerial)
256-
leka_register_unit_tests_for_driver(CoreQDAC)
256+
leka_register_unit_tests_for_driver(CoreDAC)
257257
leka_register_unit_tests_for_driver(CoreEventFlags)
258258
leka_register_unit_tests_for_driver(CoreEventQueue)
259259
leka_register_unit_tests_for_driver(CoreFlashMemory)
@@ -270,6 +270,7 @@ leka_register_unit_tests_for_driver(CoreMicrophone)
270270
leka_register_unit_tests_for_driver(CoreMotor)
271271
leka_register_unit_tests_for_driver(CoreMutex)
272272
leka_register_unit_tests_for_driver(CorePwm)
273+
leka_register_unit_tests_for_driver(CoreQDAC)
273274
leka_register_unit_tests_for_driver(CoreQSPI)
274275
leka_register_unit_tests_for_driver(CoreRFIDReader)
275276
leka_register_unit_tests_for_driver(CoreSPI)

0 commit comments

Comments
 (0)