blob: c7923bc1b223c29ee6b3a218c8f6ac217c12eeae [file] [log] [blame]
Austin Schuh812d0d12021-11-04 20:16:48 -07001// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5#include <hal/Relay.h>
6#include <wpi/SmallVector.h>
7
8#include "CrossConnects.h"
9#include "LifetimeWrappers.h"
10#include "gtest/gtest.h"
11
12using namespace hlt;
13
14class RelayDigitalTest : public ::testing::TestWithParam<RelayCross> {};
15
16TEST_P(RelayDigitalTest, RelayCross) {
17 auto param = GetParam();
18 int32_t status = 0;
19 RelayHandle fwd{param.Relay, true, &status};
20 ASSERT_EQ(0, status);
21 RelayHandle rev{param.Relay, false, &status};
22 ASSERT_EQ(0, status);
23 DIOHandle fwdInput{param.FwdDio, true, &status};
24 ASSERT_EQ(0, status);
25 DIOHandle revInput{param.RevDio, true, &status};
26 ASSERT_EQ(0, status);
27
28 HAL_SetRelay(fwd, false, &status);
29 ASSERT_EQ(0, status);
30 HAL_SetRelay(rev, false, &status);
31 ASSERT_EQ(0, status);
32 usleep(1000);
33 ASSERT_FALSE(HAL_GetDIO(fwdInput, &status));
34 ASSERT_EQ(0, status);
35 ASSERT_FALSE(HAL_GetDIO(revInput, &status));
36 ASSERT_EQ(0, status);
37
38 HAL_SetRelay(fwd, false, &status);
39 ASSERT_EQ(0, status);
40 HAL_SetRelay(rev, true, &status);
41 ASSERT_EQ(0, status);
42 usleep(1000);
43 ASSERT_FALSE(HAL_GetDIO(fwdInput, &status));
44 ASSERT_EQ(0, status);
45 ASSERT_TRUE(HAL_GetDIO(revInput, &status));
46 ASSERT_EQ(0, status);
47
48 HAL_SetRelay(fwd, true, &status);
49 ASSERT_EQ(0, status);
50 HAL_SetRelay(rev, false, &status);
51 ASSERT_EQ(0, status);
52 usleep(1000);
53 ASSERT_TRUE(HAL_GetDIO(fwdInput, &status));
54 ASSERT_EQ(0, status);
55 ASSERT_FALSE(HAL_GetDIO(revInput, &status));
56 ASSERT_EQ(0, status);
57
58 HAL_SetRelay(fwd, true, &status);
59 ASSERT_EQ(0, status);
60 HAL_SetRelay(rev, true, &status);
61 ASSERT_EQ(0, status);
62 usleep(1000);
63 ASSERT_TRUE(HAL_GetDIO(fwdInput, &status));
64 ASSERT_EQ(0, status);
65 ASSERT_TRUE(HAL_GetDIO(revInput, &status));
66 ASSERT_EQ(0, status);
67}
68
69TEST(RelayDigitalTest, AllocateAll) {
70 wpi::SmallVector<RelayHandle, 32> relayHandles;
71 for (int i = 0; i < HAL_GetNumRelayChannels(); i++) {
72 int32_t status = 0;
73 relayHandles.emplace_back(i / 2, i % 2, &status);
74 ASSERT_EQ(status, 0);
75 }
76}
77
78TEST(RelayDigitalTest, MultipleAllocateFails) {
79 int32_t status = 0;
80 RelayHandle handle(0, true, &status);
81 ASSERT_NE(handle, HAL_kInvalidHandle);
82 ASSERT_EQ(status, 0);
83
84 RelayHandle handle2(0, true, &status);
85 ASSERT_EQ(handle2, HAL_kInvalidHandle);
86 ASSERT_LAST_ERROR_STATUS(status, RESOURCE_IS_ALLOCATED);
87}
88
89TEST(RelayDigitalTest, OverAllocateFails) {
90 int32_t status = 0;
91 RelayHandle handle(HAL_GetNumRelayChannels(), true, &status);
92 ASSERT_EQ(handle, HAL_kInvalidHandle);
93 ASSERT_LAST_ERROR_STATUS(status, RESOURCE_OUT_OF_RANGE);
94}
95
96TEST(RelayDigitalTest, UnderAllocateFails) {
97 int32_t status = 0;
98 RelayHandle handle(-1, true, &status);
99 ASSERT_EQ(handle, HAL_kInvalidHandle);
100 ASSERT_LAST_ERROR_STATUS(status, RESOURCE_OUT_OF_RANGE);
101}
102
103INSTANTIATE_TEST_SUITE_P(RelayDigitalCrossConnectsTests, RelayDigitalTest,
104 ::testing::ValuesIn(RelayCrossConnects));