Skip to content

Commit e85abbc

Browse files
tests: Add mock scenarios for mcp23009e driver. (#203)
* tests: Add mock scenarios for mcp23009e driver. * tests: Refactor and extend mcp23009e test scenarios. * test : Add newLine for mcp23009E test. * test: Add to read gpio register harware mode in mcp23009e test.
1 parent 2b542cc commit e85abbc

1 file changed

Lines changed: 204 additions & 8 deletions

File tree

tests/scenarios/mcp23009e.yaml

Lines changed: 204 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ hardware_init: |
1717
1818
# Register values for mock tests
1919
mock_registers:
20-
# IODIR (0x00): all inputs by default (0xFF)
20+
# IODIR (0x00): all inputs by default
2121
0x00: 0xFF
2222
# IPOL (0x01): no inversion
2323
0x01: 0x00
@@ -35,12 +35,14 @@ mock_registers:
3535
0x07: 0x00
3636
# INTCAP (0x08): default
3737
0x08: 0x00
38-
# GPIO (0x09): D-PAD buttons (bits 4-7 as inputs with pull-ups)
38+
# GPIO (0x09): D-PAD buttons (bits 4-7 high)
3939
0x09: 0xF0
4040
# OLAT (0x0A): default
4141
0x0A: 0x00
4242

4343
tests:
44+
# --- Default state / constructor tests ---
45+
4446
- name: "Read IODIR default value"
4547
action: call
4648
method: get_iodir
@@ -50,9 +52,25 @@ tests:
5052
- name: "Read GPIO register"
5153
action: call
5254
method: get_gpio
53-
expect_not_none: true
55+
expect: 0xF0
5456
mode: [mock, hardware]
5557

58+
- name: "Constructor leaves reset pin high"
59+
action: script
60+
script: |
61+
result = dev.reset_pin.value() == 1
62+
expect_true: true
63+
mode: [mock]
64+
65+
- name: "Read individual GPIO level"
66+
action: call
67+
method: get_level
68+
args: [0]
69+
expect_not_none: true
70+
mode: [mock]
71+
72+
# --- Power / reset tests ---
73+
5674
- name: "Power off holds reset pin low"
5775
action: script
5876
script: |
@@ -70,13 +88,191 @@ tests:
7088
expect_true: true
7189
mode: [mock]
7290

73-
- name: "Read individual GPIO level"
74-
action: call
75-
method: get_level
76-
args: [0]
77-
expect_not_none: true
91+
- name: "Power cycle toggles reset pin"
92+
action: script
93+
script: |
94+
dev.power_off()
95+
off_state = dev.reset_pin.value()
96+
dev.power_on()
97+
on_state = dev.reset_pin.value()
98+
result = off_state == 0 and on_state == 1
99+
expect_true: true
100+
mode: [mock]
101+
102+
- name: "Soft reset restores default registers"
103+
action: script
104+
script: |
105+
dev.set_iodir(0x00)
106+
dev.set_gppu(0xFF)
107+
dev.set_iocon(0x27)
108+
dev.set_gpinten(0xFF)
109+
dev._soft_reset()
110+
result = (
111+
dev.get_iodir() == 0xFF and
112+
dev.get_gppu() == 0x00 and
113+
dev.get_iocon().get_register_value() == 0x00 and
114+
dev.get_gpinten() == 0x00
115+
)
116+
expect_true: true
117+
mode: [mock]
118+
119+
# --- Register access tests ---
120+
121+
- name: "Set IODIR register"
122+
action: script
123+
script: |
124+
dev.set_iodir(0xF0)
125+
result = dev.get_iodir() == 0xF0
126+
expect_true: true
127+
mode: [mock]
128+
129+
- name: "Get GPPU register after write"
130+
action: script
131+
script: |
132+
dev.set_gppu(0xA5)
133+
result = dev.get_gppu() == 0xA5
134+
expect_true: true
135+
mode: [mock]
136+
137+
- name: "Set and get OLAT register"
138+
action: script
139+
script: |
140+
dev.set_olat(0x3C)
141+
result = dev.get_olat() == 0x3C
142+
expect_true: true
143+
mode: [mock]
144+
145+
- name: "Set and read full GPIO port"
146+
action: script
147+
script: |
148+
dev.set_iodir(0x00)
149+
dev.set_gpio(0x5A)
150+
result = dev.get_gpio() == 0x5A
151+
expect_true: true
152+
mode: [mock]
153+
154+
# --- Setup / pin configuration tests ---
155+
156+
- name: "Setup configures pin as input with pull-up"
157+
action: script
158+
script: |
159+
dev.set_iodir(0x00)
160+
dev.set_gppu(0x00)
161+
dev.set_ipol(0x00)
162+
dev.setup(2, 1, pullup=1, polarity=0)
163+
result = (
164+
dev.get_iodir() == 0x04 and
165+
dev.get_gppu() == 0x04 and
166+
dev.get_ipol() == 0x00
167+
)
168+
expect_true: true
169+
mode: [mock]
170+
171+
- name: "Setup configures pin as output without pull-up"
172+
action: script
173+
script: |
174+
dev.set_iodir(0xFF)
175+
dev.set_gppu(0xFF)
176+
dev.set_ipol(0x00)
177+
dev.setup(3, 0, pullup=0, polarity=0)
178+
result = (
179+
dev.get_iodir() == 0xF7 and
180+
dev.get_gppu() == 0xF7 and
181+
dev.get_ipol() == 0x00
182+
)
183+
expect_true: true
78184
mode: [mock]
79185

186+
- name: "Setup configures polarity inversion"
187+
action: script
188+
script: |
189+
dev.set_iodir(0x00)
190+
dev.set_gppu(0x00)
191+
dev.set_ipol(0x00)
192+
dev.setup(1, 1, pullup=1, polarity=1)
193+
result = (
194+
dev.get_iodir() == 0x02 and
195+
dev.get_gppu() == 0x02 and
196+
dev.get_ipol() == 0x02
197+
)
198+
expect_true: true
199+
mode: [mock]
200+
201+
# --- GPIO level tests ---
202+
203+
- name: "Set and get individual output level high"
204+
action: script
205+
script: |
206+
dev.set_iodir(0xFE)
207+
dev.set_gpio(0x00)
208+
dev.set_level(0, 1)
209+
result = dev.get_level(0) == 1 and dev.get_gpio() == 0x01
210+
expect_true: true
211+
mode: [mock]
212+
213+
- name: "Set and get individual output level low"
214+
action: script
215+
script: |
216+
dev.set_iodir(0xFE)
217+
dev.set_gpio(0x01)
218+
dev.set_level(0, 0)
219+
result = dev.get_level(0) == 0 and dev.get_gpio() == 0x00
220+
expect_true: true
221+
mode: [mock]
222+
223+
- name: "Set level ignored on input pin; GP4 remains high from GPIO (0xF0)"
224+
action: script
225+
script: |
226+
dev.set_iodir(0xFF)
227+
dev.set_gpio(0xF0)
228+
dev.set_level(4, 0)
229+
result = dev.get_gpio() == 0xF0 and dev.get_level(4) == 1
230+
expect_true: true
231+
mode: [mock]
232+
233+
- name: "Set level ignores invalid pin index"
234+
action: script
235+
script: |
236+
dev.set_iodir(0x00)
237+
dev.set_gpio(0xAA)
238+
dev.set_level(8, 1)
239+
result = dev.get_gpio() == 0xAA
240+
expect_true: true
241+
mode: [mock]
242+
243+
- name: "Get level returns low for invalid pin index"
244+
action: script
245+
script: |
246+
result = dev.get_level(8) == 0
247+
expect_true: true
248+
mode: [mock]
249+
250+
# --- Interrupt configuration tests ---
251+
252+
- name: "Interrupt on change configures GPINTEN and INTCON"
253+
action: script
254+
script: |
255+
dev.set_gpinten(0x00)
256+
dev.set_intcon(0x00)
257+
dev.interrupt_on_change(2, lambda level: None)
258+
result = (
259+
dev.get_gpinten() == 0x04 and
260+
dev.get_intcon() == 0x00
261+
)
262+
expect_true: true
263+
mode: [mock]
264+
265+
- name: "Disable interrupt clears GPINTEN bit"
266+
action: script
267+
script: |
268+
dev.interrupt_on_change(2, lambda level: None)
269+
dev.disable_interrupt(2)
270+
result = (dev.get_gpinten() & 0x04) == 0
271+
expect_true: true
272+
mode: [mock]
273+
274+
# --- Manual hardware check ---
275+
80276
- name: "D-PAD buttons state"
81277
action: manual
82278
display:

0 commit comments

Comments
 (0)