11 #include "HardwareFake.h"
14 #include "test_BiColorLed.h"
15 #include "test_ReadWriteBits.h"
16 #include "test_Flag.h"
18 #include "test_SpiSlave.h"
19 #include "test_SpiMaster.h"
20 #include "test_Queue.h"
21 #include "test_UartSpi.h"
23 #include "test_StatusCode.h"
26 void (*tearDown)(void);
27 void EmptySetup(
void) {
29 void EmptyTeardown(
void) {
32 void SetUp_Mock(
void){
35 void TearDown_Mock(
void){
42 void test_BiColorLed(
bool run_test)
46 puts(
"# BiColorLed tests");
49 tearDown = EmptyTeardown;
51 puts(
"## BiColorLedOn");
52 RUN_TEST(BiColorLedOn_sets_bit_in_ddr);
53 puts(
"## BiColorLedOff");
54 RUN_TEST(BiColorLedOff_clears_bit_in_ddr);
55 puts(
"## BiColorLedGreen");
56 RUN_TEST(BiColorLedGreen_clears_bit_in_port);
57 puts(
"## BiColorLedRed");
58 RUN_TEST(BiColorLedRed_sets_bit_in_port);
63 void test_ReadWriteBits(
bool run_test)
67 puts(
"# ReadWriteBits tests");
69 tearDown = EmptyTeardown;
71 RUN_TEST(SetBit_sets_bit_in_register);
73 RUN_TEST(ClearBit_clears_bit_in_register);
75 RUN_TEST(BitIsSet_returns_true_if_bit_is_set);
76 RUN_TEST(BitIsSet_returns_false_if_bit_is_clear);
77 puts(
"## BitIsClear");
78 RUN_TEST(BitIsClear_returns_true_if_bit_is_clear);
79 RUN_TEST(BitIsClear_returns_false_if_bit_is_set);
83 void test_Spi(
bool run_test)
89 puts(
"## ClearSpiInterruptFlag");
91 tearDown = EmptyTeardown;
92 RUN_TEST(ClearSpiInterruptFlag_first_reads_SPI_status_register);
93 RUN_TEST(ClearSpiInterruptFlag_then_reads_SPI_data_register);
95 puts(
"## _SpiTransferIsDone");
97 tearDown = EmptyTeardown;
98 RUN_TEST(SpiTransferIsDone_returns_true_if_the_SPI_Interrupt_Flag_is_set);
99 RUN_TEST(SpiTransferIsDone_returns_false_if_the_SPI_Interrupt_Flag_is_clear);
103 void test_SpiSlave(
bool run_test)
107 puts(
"# SpiSlave tests");
109 puts(
"## _SignalDataReady");
111 tearDown = EmptyTeardown;
112 RUN_TEST(SignalDataReady_drives_DataReady_LOW);
114 puts(
"## DisableSpiInterrupt");
116 tearDown = EmptyTeardown;
117 RUN_TEST(DisableSpiInterrupt_clears_the_SPI_Interrupt_Enable_bit);
119 puts(
"## EnableSpiInterrupt");
121 tearDown = TearDown_Mock;
122 RUN_TEST(EnableSpiInterrupt_clears_SPI_interrupt_flag);
123 RUN_TEST(EnableSpiInterrupt_enables_interrupt_SPI_Transfer_Complete);
124 RUN_TEST(EnableSpiInterrupt_consumes_6_cycles);
126 puts(
"## SpiSlaveInit");
128 tearDown = TearDown_Mock;
129 RUN_TEST(SpiSlaveInit_makes_DataReady_an_output_pin);
130 RUN_TEST(SpiSlaveInit_idles_DataReady_high);
131 RUN_TEST(SpiSlaveInit_makes_Miso_an_output_pin);
132 RUN_TEST(SpiSlaveInit_enables_SPI);
133 RUN_TEST(SpiSlaveInit_enables_SPI_interrupt);
135 puts(
"## SpiSlaveTxByte");
137 tearDown = TearDown_Mock;
138 RUN_TEST(SpiSlaveTxByte_loads_SPI_data_register_with_input_byte);
139 RUN_TEST(SpiSlaveTxByte_disables_SPI_ISR_before_signaling_data_ready);
140 RUN_TEST(SpiSlaveTxByte_drives_DataReady_LOW_to_signal_data_is_ready);
141 RUN_TEST(SpiSlaveTxByte_waits_until_SPI_transfer_is_done);
142 RUN_TEST(SpiSlaveTxByte_drives_DataReady_HIGH_immediately_after_SPI_transfer_finishes);
143 RUN_TEST(SpiSlaveTxByte_enables_SPI_ISR_after_transfer);
145 puts(
"## SpiSlaveTx");
147 tearDown = TearDown_Mock;
148 RUN_TEST(SpiSlaveTx_sends_nbytes_of_input_buffer_to_SpiMaster);
152 void SetUp_SpiMasterXfrByte(
void) {
153 SetBit(
Spi_SPSR, Spi_InterruptFlag);
155 void TearDown_SpiMasterXfrByte(
void) {
156 ClearBit(
Spi_SPSR, Spi_InterruptFlag);
158 void test_SpiMaster(
bool run_test)
163 puts(
"# SpiMaster tests");
165 puts(
"## SpiMasterInit");
167 tearDown = TearDown_Mock;
168 RUN_TEST(SpiMasterInit_idles_SlaveSelect_high);
169 RUN_TEST(SpiMasterInit_makes_SlaveSelect_an_output);
170 RUN_TEST(SpiMasterInit_makes_Miso_an_input);
171 RUN_TEST(SpiMasterInit_enables_pullup_on_Miso);
172 RUN_TEST(SpiMasterInit_makes_DataReady_an_input);
173 RUN_TEST(SpiMasterInit_enables_pullup_on_DataReady);
174 RUN_TEST(SpiMasterInit_makes_Mosi_an_output);
175 RUN_TEST(SpiMasterInit_makes_Sck_an_output);
176 RUN_TEST(SpiMasterInit_makes_this_MCU_the_SPI_Master);
177 RUN_TEST(SpiMasterInit_sets_SPI_Clock_to_10MHz_ext_osc_divided_by_8);
178 RUN_TEST(SpiMasterInit_enables_the_SPI_hardware_module);
179 RUN_TEST(SpiMasterInit_clears_SPI_interrupt_flag);
181 puts(
"## SpiMasterXfrByte");
182 setUp = SetUp_SpiMasterXfrByte;
183 tearDown = TearDown_SpiMasterXfrByte;
184 RUN_TEST(SpiMasterXfrByte_selects_the_SPI_slave);
185 RUN_TEST(SpiMasterXfrByte_loads_SPI_data_reg_with_the_byte_to_send);
186 RUN_TEST(SpiMasterXfrByte_waits_until_the_transfer_is_done_by_reading_the_SPI_Interrupt_Flag);
187 RUN_TEST(SpiMasterXfrByte_unselects_the_SPI_slave);
188 RUN_TEST(SpiMasterXfrByte_clears_the_SPI_Interrupt_Flag_by_reading_the_SPI_data_reg);
189 RUN_TEST(SpiMasterXfrByte_returns_the_byte_in_the_SPI_data_reg);
193 void test_Queue(
bool run_test)
197 puts(
"# Queue tests");
199 puts(
"## QueueInit");
201 tearDown = EmptyTeardown;
202 RUN_TEST(QueueInit_returns_a_pointer_to_a_Queue_struct);
203 RUN_TEST(QueueInit_memory_for_Queue_struct_is_allocated_in_Queue_object_file);
204 RUN_TEST(QueueInit_assigns_input_buffer_as_Queue_buffer);
205 RUN_TEST(QueueInit_size_input_is_the_maximum_Queue_length);
206 RUN_TEST(QueueInit_initializes_Queue_with_length_0);
208 puts(
"## QueueLength");
210 tearDown = EmptyTeardown;
211 RUN_TEST(QueueLength_increments_after_a_push);
212 RUN_TEST(QueueLength_does_not_increase_beyond_max_length);
213 RUN_TEST(QueueLength_decrements_after_a_pop);
214 RUN_TEST(QueueLength_does_not_decrease_below_zero);
216 puts(
"## QueuePush");
218 tearDown = EmptyTeardown;
219 RUN_TEST(QueuePush_writes_byte_to_Queue_buffer);
220 RUN_TEST(QueuePush_writes_next_byte_to_address_after_previous_write);
221 RUN_TEST(QueuePush_does_not_write_byte_if_Queue_is_full);
222 RUN_TEST(QueuePush_hits_end_of_buffer_and_wraps_around_if_Queue_is_not_full);
226 tearDown = EmptyTeardown;
227 RUN_TEST(QueuePop_removes_oldest_byte_from_Queue);
228 RUN_TEST(QueuePop_returns_oldest_byte);
229 RUN_TEST(QueuePop_does_not_remove_any_bytes_if_Queue_is_empty);
230 RUN_TEST(QueuePop_returns_0_if_Queue_is_empty);
231 RUN_TEST(QueuePop_hits_end_of_buffer_and_wraps_around_if_Queue_is_not_empty);
233 puts(
"## QueueIsFull");
235 tearDown = EmptyTeardown;
236 RUN_TEST(QueueIsFull_returns_true_if_Queue_is_full);
237 RUN_TEST(QueueIsFull_returns_false_if_Queue_is_not_full);
239 puts(
"## QueueIsEmpty");
241 tearDown = EmptyTeardown;
242 RUN_TEST(QueueIsEmpty_returns_true_if_Queue_is_empty);
243 RUN_TEST(QueueIsEmpty_returns_false_if_Queue_is_not_empty);
247 void test_UartSpi(
bool run_test)
251 puts(
"# UartSpi tests");
253 puts(
"## UartSpiInit");
255 tearDown = EmptyTeardown;
256 RUN_TEST(UartSpiInit_clocks_SPI_bus_at_5MHz);
257 RUN_TEST(UartSpiInit_sets_Sck_as_an_output);
258 RUN_TEST(UartSpiInit_sets_AdcConv_to_idle_low);
259 RUN_TEST(UartSpiInit_sets_AdcConv_as_an_output);
260 RUN_TEST(UartSpiInit_enables_the_UART_in_Master_SPI_Mode);
261 RUN_TEST(UartSpiInit_uses_SPI_data_mode_CPOL_1_CPHA_1);
262 RUN_TEST(UartSpiInit_cfgs_SPI_to_transfer_MSB_first);
263 RUN_TEST(UartSpiInit_gives_SPI_control_over_Miso_and_Mosi_pin_behavior);
267 void test_Lis(
bool run_test)
275 tearDown = EmptyTeardown;
276 RUN_TEST(MSB_returns_most_significant_bit_of_16bit_input);
280 tearDown = EmptyTeardown;
281 RUN_TEST(LSB_returns_least_significant_bit_of_16bit_input);
285 tearDown = EmptyTeardown;
286 RUN_TEST(LisInit_sets_PixSelect_as_an_output);
287 RUN_TEST(LisInit_idles_PixSelect_low);
288 RUN_TEST(LisInit_sets_Rst_as_an_output);
289 RUN_TEST(LisInit_idles_Rst_low);
290 RUN_TEST(LisInit_sets_Sync_as_an_input);
291 RUN_TEST(LisInit_sets_Clk_as_an_output);
292 RUN_TEST(LisInit_resets_PWM_timer_at_top);
293 RUN_TEST(LisInit_PWM_timer_top_is_OCR0A);
294 RUN_TEST(LisInit_PWM_timer_is_clocked_by_CPU_with_no_prescaling);
295 RUN_TEST(LisInit_sets_PWM_frequency_at_50kHz);
296 RUN_TEST(LisInit_sets_PWM_duty_cycle_to_50_percent);
297 RUN_TEST(LisInit_outputs_the_PWM_clock_on_pin_Clk);
299 puts(
"## LisConfigIsValid");
301 tearDown = EmptyTeardown;
302 RUN_TEST(LisConfigIsValid_returns_false_if_binning_is_invalid);
303 RUN_TEST(LisConfigIsValid_returns_false_if_gain_is_invalid);
304 RUN_TEST(LisConfigIsValid_returns_false_if_active_rows_is_invalid);
305 RUN_TEST(LisConfigIsValid_returns_true_if_config_is_valid);
307 puts(
"## _ConfigAs28bits");
309 tearDown = EmptyTeardown;
310 RUN_TEST(ConfigAs28bits_writes_config_as_little_endian_ie_binning_is_config_byte0_bit0);
311 RUN_TEST(ConfigAs28bits_sets_config_byte0_bit0_if_BINNING_ON);
312 RUN_TEST(ConfigAs28bits_clears_config_byte0_bit0_if_BINNING_OFF);
313 RUN_TEST(ConfigAs28bits_byte0_bit1_clear_and_bit2_clear_if_GAIN_1X);
314 RUN_TEST(ConfigAs28bits_byte0_bit1_clear_and_bit2_set_if_GAIN_2X5);
315 RUN_TEST(ConfigAs28bits_byte0_bit1_set_and_bit2_clear_if_GAIN_4X);
316 RUN_TEST(ConfigAs28bits_byte0_bit1_set_and_bit2_set_if_GAIN_5X);
317 RUN_TEST(ConfigAs28bits_bit3_to_bit27_set_if_ALL_ROWS_ACTIVE);
318 RUN_TEST(ConfigAs28bits_b3b8b13b18b23_set_if_ROW_1_ACTIVE);
319 RUN_TEST(ConfigAs28bits_b4b9b14b19b24_set_if_ROW_2_ACTIVE);
320 RUN_TEST(ConfigAs28bits_b5b10b15b20b25_set_if_ROW_3_ACTIVE);
321 RUN_TEST(ConfigAs28bits_b6b11b16b21b26_set_if_ROW_4_ACTIVE);
322 RUN_TEST(ConfigAs28bits_b7b12b17b22b27_set_if_ROW_5_ACTIVE);
324 puts(
"## _WaitForLisClkLow");
326 tearDown = EmptyTeardown;
327 RUN_TEST(WaitForLisClkLow_clears_flag_PwmTimerMatchesOCF0B);
328 RUN_TEST(WaitForLisClkLow_waits_until_flag_PwmTimerMatchesOCF0B_is_set);
330 puts(
"## _WaitForLisClkHigh");
332 tearDown = EmptyTeardown;
333 RUN_TEST(WaitForLisClkHigh_clears_flag_PwmTimerMatchesOCF0A);
334 RUN_TEST(WaitForLisClkHigh_waits_until_flag_PwmTimerMatchesOCF0A_is_set);
336 puts(
"## _EnterLisProgrammingMode");
338 tearDown = TearDown_Mock;
339 RUN_TEST(EnterLisProgrammingMode_waits_for_LisClk_LOW);
340 RUN_TEST(EnterLisProgrammingMode_asserts_LisPixSelect_to_program_Lis);
342 puts(
"## _WriteLisConfigBit");
344 tearDown = TearDown_Mock;
345 RUN_TEST(WriteLisConfigBit_outputs_bit_on_LisRst);
346 RUN_TEST(WriteLisConfigBit_waits_for_LisClk_HIGH);
347 RUN_TEST(WriteLisConfigBit_waits_for_LisClk_LOW);
349 puts(
"## _Write28bitLisConfig");
351 tearDown = TearDown_Mock;
352 RUN_TEST(Write28bitLisConfig_writes_28bits_starting_at_byte0_bit0_and_ending_at_byte3_bit3);
354 puts(
"## _ExitLisProgrammingMode");
356 tearDown = EmptyTeardown;
357 RUN_TEST(ExitLisProgrammingMode_outputs_LOW_on_pin_LisRst);
358 RUN_TEST(ExitLisProgrammingMode_outputs_LOW_on_pin_LisPixSelect);
360 puts(
"## LisWriteConfig");
362 tearDown = TearDown_Mock;
363 RUN_TEST(LisWriteConfig_converts_config_to_28bit_sequence);
364 RUN_TEST(LisWriteConfig_enters_LIS_programming_mode);
365 RUN_TEST(LisWriteConfig_writes_28bits_to_LIS_setup_register);
366 RUN_TEST(LisWriteConfig_exits_LIS_programming_mode);
368 puts(
"## LisExpose");
370 tearDown = EmptyTeardown;
371 RUN_TEST(LisExpose_waits_for_the_falling_edge_of_Lis_Clk);
372 RUN_TEST(LisExpose_starts_exposure_by_driving_Lis_Rst_HIGH);
373 RUN_TEST(LisExpose_counts_falling_edges_of_Lis_Clk_until_count_equals_exposure_ticks);
374 RUN_TEST(LisExpose_stops_exposure_by_driving_Lis_Rst_LOW);
378 void test_Usb(
bool run_test)
384 puts(
"## _FtClockDatabus");
386 tearDown = EmptyTeardown;
387 RUN_TEST(FtClockDatabus_drives_FtClock_HIGH_if_direction_is_FtDrive);
388 RUN_TEST(FtClockDatabus_drives_FtClock_LOW_if_direction_is_FtSample);
390 puts(
"## _FtReadDatabus");
392 tearDown = EmptyTeardown;
393 RUN_TEST(FtReadDatabus_copies_databus_pin_values_to_address_pbyte);
395 puts(
"## _FtWriteDatabus");
397 tearDown = EmptyTeardown;
398 RUN_TEST(FtWriteDatabus_outputs_byte_on_databus_pins);
400 puts(
"## _FtDatabusPinDirection");
402 tearDown = EmptyTeardown;
403 RUN_TEST(FtDatabusPinDirection_makes_databus_pins_outputs_if_direction_is_FtOut);
404 RUN_TEST(FtDatabusPinDirection_makes_databus_pins_inputs_if_direction_is_FtIn);
406 puts(
"## FtSelectFT221X");
408 tearDown = EmptyTeardown;
409 RUN_TEST(FtSelectFT221X_drives_FtChipSelect_LOW);
411 puts(
"## FtUnselectFT221X");
413 tearDown = EmptyTeardown;
414 RUN_TEST(FtUnselectFT221X_drives_FtChipSelect_HIGH);
416 puts(
"## FtBusTurnaround");
418 tearDown = TearDown_Mock;
419 RUN_TEST(FtBusTurnaround_clocks_one_cycle_to_signal_data_drive_then_data_sample);
423 tearDown = EmptyTeardown;
424 RUN_TEST(FtIsOk_returns_true_if_FtMiso_is_LOW);
425 RUN_TEST(FtIsOk_returns_false_if_FtMiso_is_HIGH);
429 tearDown = TearDown_Mock;
430 RUN_TEST(FtRead_clocks_one_byte_out_of_the_FT221X);
431 RUN_TEST(FtRead_stores_the_byte_at_address_pbyte);
435 tearDown = TearDown_Mock;
436 RUN_TEST(FtWrite_signals_to_drive_data_onto_the_databus);
437 RUN_TEST(FtWrite_sets_microcontroller_databus_pins_as_outputs);
438 RUN_TEST(FtWrite_outputs_byte_on_databus_pins);
439 RUN_TEST(FtWrite_signals_FT221X_to_sample_the_databus);
440 RUN_TEST(FtWrite_sets_microcontroller_databus_pins_as_inputs);
442 puts(
"## UsbRxbufferIsEmpty");
444 tearDown = EmptyTeardown;
445 RUN_TEST(UsbRxbufferIsEmpty_returns_true_if_pin_FT1248_MISO_is_HIGH);
446 RUN_TEST(UsbRxbufferIsEmpty_returns_false_if_pin_FT1248_MISO_is_LOW);
448 puts(
"## UsbTxbufferIsFull");
450 tearDown = EmptyTeardown;
451 RUN_TEST(UsbTxbufferIsFull_returns_true_if_pin_MIOSIO0_is_HIGH);
452 RUN_TEST(UsbTxbufferIsFull_returns_false_if_pin_MIOSIO0_is_LOW);
454 puts(
"## UsbReadByte");
456 tearDown = TearDown_Mock;
457 RUN_TEST(UsbReadByte_selects_the_FT221X);
458 RUN_TEST(UsbReadByte_drives_databus_with_read_command);
459 RUN_TEST(UsbReadByte_signals_FT221X_to_sample_the_databus);
460 RUN_TEST(UsbReadByte_reads_the_byte_if_data_transfer_status_is_OK);
461 RUN_TEST(UsbReadByte_unselects_the_FT221X);
462 RUN_TEST(UsbReadByte_returns_either_FtOK_if_pbyte_has_the_read_data_or_FtError_if_Usb_receive_buffer_was_empty);
464 puts(
"## UsbWriteByte");
466 puts(
"FAIL: Implement Test");
471 void test_StatusCode(
bool run_test)
475 puts(
"# StatusCode tests");
477 puts(
"## led_setting_is_valid");
479 tearDown = EmptyTeardown;
480 RUN_TEST(led_setting_is_valid_returns_TRUE_if_setting_is_OFF);
481 RUN_TEST(led_setting_is_valid_returns_TRUE_if_setting_is_GREEN);
482 RUN_TEST(led_setting_is_valid_returns_TRUE_if_setting_is_RED);
483 RUN_TEST(led_setting_is_valid_returns_FALSE_if_setting_is_any_other_value);
491 test_BiColorLed(Yep);
492 test_ReadWriteBits(Yep);
495 tearDown = EmptyTeardown;
504 test_StatusCode(Yep);
See LisConfig.h for context.
spi_ptr Spi_SPSR
SPI Status Register.
See StatusCode.h for context.