blob: 84d2b9d02256c5a75f7bec7f0bcb55653487fcaa [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/DIO.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 DIOTest : public ::testing::TestWithParam<std::pair<int, int>> {};
15
16TEST_P(DIOTest, DIOCross) {
17 auto param = GetParam();
18 int32_t status = 0;
19 DIOHandle first{param.first, false, &status};
20 ASSERT_EQ(0, status);
21 DIOHandle second{param.second, true, &status};
22 ASSERT_EQ(0, status);
23
24 HAL_SetDIO(first, false, &status);
25 ASSERT_EQ(0, status);
26 usleep(1000);
27 ASSERT_FALSE(HAL_GetDIO(first, &status));
28 ASSERT_EQ(0, status);
29 ASSERT_FALSE(HAL_GetDIO(second, &status));
30 ASSERT_EQ(0, status);
31
32 HAL_SetDIO(first, true, &status);
33 ASSERT_EQ(0, status);
34 usleep(1000);
35 ASSERT_TRUE(HAL_GetDIO(second, &status));
36 ASSERT_EQ(0, status);
37
38 HAL_SetDIODirection(first, true, &status);
39 ASSERT_EQ(0, status);
40 HAL_SetDIODirection(second, false, &status);
41 ASSERT_EQ(0, status);
42
43 HAL_SetDIO(second, false, &status);
44 ASSERT_EQ(0, status);
45 usleep(1000);
46 ASSERT_FALSE(HAL_GetDIO(first, &status));
47 ASSERT_EQ(0, status);
48
49 HAL_SetDIO(second, true, &status);
50 ASSERT_EQ(0, status);
51 usleep(1000);
52 ASSERT_TRUE(HAL_GetDIO(first, &status));
53 ASSERT_EQ(0, status);
54}
55
56TEST(DIOTest, AllocateAll) {
57 wpi::SmallVector<DIOHandle, 32> dioHandles;
58 for (int i = 0; i < HAL_GetNumDigitalChannels(); i++) {
59 int32_t status = 0;
60 dioHandles.emplace_back(i, true, &status);
61 ASSERT_EQ(status, 0);
62 }
63}
64
65TEST(DIOTest, MultipleAllocateFails) {
66 int32_t status = 0;
67 DIOHandle handle(0, true, &status);
68 ASSERT_NE(handle, HAL_kInvalidHandle);
69 ASSERT_EQ(status, 0);
70
71 DIOHandle handle2(0, true, &status);
72 ASSERT_EQ(handle2, HAL_kInvalidHandle);
73 ASSERT_LAST_ERROR_STATUS(status, RESOURCE_IS_ALLOCATED);
74}
75
76TEST(DIOTest, OverAllocateFails) {
77 int32_t status = 0;
78 DIOHandle handle(HAL_GetNumDigitalChannels(), true, &status);
79 ASSERT_EQ(handle, HAL_kInvalidHandle);
80 ASSERT_LAST_ERROR_STATUS(status, RESOURCE_OUT_OF_RANGE);
81}
82
83TEST(DIOTest, UnderAllocateFails) {
84 int32_t status = 0;
85 DIOHandle handle(-1, true, &status);
86 ASSERT_EQ(handle, HAL_kInvalidHandle);
87 ASSERT_LAST_ERROR_STATUS(status, RESOURCE_OUT_OF_RANGE);
88}
89
90TEST(DIOTest, CrossAllocationFails) {
91 int32_t status = 0;
92 PWMHandle pwmHandle(10, &status);
93 ASSERT_NE(pwmHandle, HAL_kInvalidHandle);
94 ASSERT_EQ(status, 0);
95 DIOHandle handle(10, true, &status);
96 ASSERT_EQ(handle, HAL_kInvalidHandle);
97 ASSERT_LAST_ERROR_STATUS(status, RESOURCE_IS_ALLOCATED);
98}
99
100INSTANTIATE_TEST_SUITE_P(DIOCrossConnectsTests, DIOTest,
101 ::testing::ValuesIn(DIOCrossConnects));