Skip to content

Commit 4fc98b6

Browse files
committed
src/corelibs: Extended test for GPIO reinit.
Signed-off-by: IFX-Anusha <[email protected]>
1 parent af1cce6 commit 4fc98b6

File tree

1 file changed

+39
-6
lines changed

1 file changed

+39
-6
lines changed

src/corelibs/digitalio/test_digitalio_single.cpp

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ const uint8_t INVALID_PIN = 255;
3737
TEST_GROUP(digitalio_single);
3838
TEST_GROUP(digitalio_single_internal);
3939

40+
volatile bool interrupt_triggered = false;
41+
42+
void test_pin_interrupt_handler() {
43+
interrupt_triggered = true;
44+
}
45+
4046
/**
4147
* @brief Setup method called by Unity before every test in this test group.
4248
*/
@@ -62,6 +68,7 @@ TEST_IFX(digitalio_single_internal, test_digitalio_read_write_input_normal)
6268

6369
digitalWrite(TEST_PIN_DIGITAL_IO_OUTPUT, HIGH);
6470
TEST_ASSERT_EQUAL_MESSAGE(HIGH, digitalRead(TEST_PIN_DIGITAL_IO_INPUT), "Input Pin should be set to HIGH");
71+
6572
digitalWrite(TEST_PIN_DIGITAL_IO_OUTPUT, LOW);
6673
TEST_ASSERT_EQUAL_MESSAGE(LOW, digitalRead(TEST_PIN_DIGITAL_IO_INPUT), "Input Pin should be set to LOW");
6774
}
@@ -77,11 +84,11 @@ TEST_IFX(digitalio_single_internal, test_digitalio_read_write_input_pullup)
7784
pinMode(TEST_PIN_DIGITAL_IO_OUTPUT, OUTPUT_OPENDRAIN);
7885
pinMode(TEST_PIN_DIGITAL_IO_INPUT, INPUT_PULLUP);
7986

80-
digitalWrite(TEST_PIN_DIGITAL_IO_OUTPUT, HIGH); // set output pin to HIGH ie, floating state
81-
TEST_ASSERT_EQUAL_MESSAGE(HIGH, digitalRead(TEST_PIN_DIGITAL_IO_INPUT), "Input Pin should be set to HIGH initially");
82-
8387
digitalWrite(TEST_PIN_DIGITAL_IO_OUTPUT, LOW);
8488
TEST_ASSERT_EQUAL_MESSAGE(LOW, digitalRead(TEST_PIN_DIGITAL_IO_INPUT), "Input Pin should be set to LOW");
89+
90+
digitalWrite(TEST_PIN_DIGITAL_IO_OUTPUT, HIGH); // set output pin to HIGH ie, floating state
91+
TEST_ASSERT_EQUAL_MESSAGE(HIGH, digitalRead(TEST_PIN_DIGITAL_IO_INPUT), "Input Pin should be set to HIGH when output is floating and input is pullup");
8592
}
8693

8794
/**
@@ -97,8 +104,8 @@ TEST_IFX(digitalio_single_internal, test_digitalio_read_write_input_pulldown)
97104

98105
TEST_ASSERT_EQUAL_MESSAGE(LOW, digitalRead(TEST_PIN_DIGITAL_IO_INPUT), "Input Pin should be set to LOW initially");
99106

100-
digitalWrite(TEST_PIN_DIGITAL_IO_OUTPUT, HIGH);
101-
// Skip assert as it may not be set to HIGH due to open-drain configuration
107+
digitalWrite(TEST_PIN_DIGITAL_IO_OUTPUT, HIGH);// set output pin to HIGH ie, floating state
108+
TEST_ASSERT_EQUAL_MESSAGE(LOW, digitalRead(TEST_PIN_DIGITAL_IO_INPUT), "Input Pin should be LOW when output is floating and input is pulldown");
102109

103110
digitalWrite(TEST_PIN_DIGITAL_IO_OUTPUT, LOW);
104111
TEST_ASSERT_EQUAL_MESSAGE(LOW, digitalRead(TEST_PIN_DIGITAL_IO_INPUT), "Input Pin should be set to LOW");
@@ -155,21 +162,47 @@ TEST_IFX(digitalio_single_internal, test_invalid_pinmode) {
155162
// No assertion as pinMode doesn't return a value, but ensure no crash
156163
}
157164

165+
/**
166+
* @brief Test switching pinmode from OUTPUT to INPUT_PULLUP.
167+
* Here an interrupt is attached to the input pin to check if it gets triggered on state change.
168+
* This is to ensure that when the init pin value remains unchanged, underlying reconfigure function is used and there is no state change.
169+
*
170+
* @note: Assumption is made that TEST_PIN_DIGITAL_IO_OUTPUT is connected to TEST_PIN_DIGITAL_IO_INPUT
171+
* for the test cases to work as expected.
172+
*/
173+
174+
TEST_IFX(digitalio_single_internal, test_switch_input_output)
175+
{
176+
pinMode(TEST_PIN_DIGITAL_IO_OUTPUT, OUTPUT);
177+
pinMode(TEST_PIN_DIGITAL_IO_INPUT, INPUT);
178+
digitalWrite(TEST_PIN_DIGITAL_IO_OUTPUT, HIGH);
179+
180+
interrupt_triggered = false;
181+
attachInterrupt(digitalPinToInterrupt(TEST_PIN_DIGITAL_IO_INPUT), test_pin_interrupt_handler, CHANGE);
182+
183+
pinMode(TEST_PIN_DIGITAL_IO_OUTPUT, INPUT_PULLUP);
184+
185+
TEST_ASSERT_FALSE_MESSAGE(interrupt_triggered, "Interrupt should not have been triggered on state change");
186+
}
187+
158188
/**
159189
* @brief Test group runner to run all test cases in this group.
160190
*/
161191
static TEST_GROUP_RUNNER(digitalio_single_internal)
162-
{
192+
{
163193
RUN_TEST_CASE(digitalio_single_internal, test_digitalio_read_write_input_normal);
164194
RUN_TEST_CASE(digitalio_single_internal, test_digitalio_read_write_input_pullup);
165195
RUN_TEST_CASE(digitalio_single_internal, test_digitalio_read_write_input_pulldown);
166196
RUN_TEST_CASE(digitalio_single_internal, test_digitalio_read_write_output_opendrain);
197+
167198
#if !defined(ARDUINO_ARCH_XMC)
168199
RUN_TEST_CASE(digitalio_single_internal, test_pinMode_invalid_pin);
169200
RUN_TEST_CASE(digitalio_single_internal, test_digitalWrite_invalid_pin);
170201
RUN_TEST_CASE(digitalio_single_internal, test_digitalRead_invalid_pin);
171202
RUN_TEST_CASE(digitalio_single_internal, test_invalid_pinmode);
172203
#endif // ARDUINO_ARCH_XMC skip these tests.
204+
205+
RUN_TEST_CASE(digitalio_single_internal, test_switch_input_output);
173206
}
174207

175208
/**

0 commit comments

Comments
 (0)