int tests_disable_stdout = 1;
static char *test_name = "(uninitialized test)";
-static FILE *orig_stderr = NULL;
static int finished = 0;
+#ifdef __MINGW32__
+#define restore_stderr() {}
+#define map_stderr() {}
+#else
+static FILE *orig_stderr = NULL;
+#define restore_stderr() { if (orig_stderr) stderr = orig_stderr; }
+#define map_stderr() { if (tests_disable_stdout) { \
+ orig_stderr = stderr; \
+ fclose(stdout); \
+ stderr = stdout; \
+ } }
+#endif
+
static void atexit_handler(void) {
if (!finished)
_fail(NULL, 0, "Test exit without indicating success.");
}
void tests_success(void) {
- if (orig_stderr)
- stderr = orig_stderr;
+ restore_stderr();
fprintf(stderr, "OK: %s\n", test_name);
finished = 1;
}
cycle_timer_longjmp_cb(struct avr_t *avr, avr_cycle_count_t when, void *param) {
jmp_buf *jmp = param;
longjmp(*jmp, LJR_CYCLE_TIMER);
+ return 0; // clear warning
}
static jmp_buf *special_deinit_jmpbuf = NULL;
// if we just re-enabled the interrupts...
// double buffer the I flag, to detect that edge
if (avr->sreg[S_I] && !avr->i_shadow)
- avr->pending_wait++;
+ avr->interrupts.pending_wait++;
avr->i_shadow = avr->sreg[S_I];
// run the cycle timers, get the suggested sleep time
avr_t *tests_init_avr(const char *elfname) {
tests_cycle_count = 0;
- if (tests_disable_stdout) {
- orig_stderr = stderr;
- fclose(stdout);
- stderr = stdout;
- }
+ map_stderr();
+
elf_firmware_t fw;
if (elf_read_firmware(elfname, &fw))
fail("Failed to read ELF firmware \"%s\"", elfname);
buf->maxlen = 4096;
}
-void tests_assert_uart_receive(const char *elfname,
+void tests_assert_uart_receive_avr(avr_t *avr,
unsigned long run_usec,
const char *expected,
char uart) {
- avr_t *avr = tests_init_avr(elfname);
struct output_buffer buf;
init_output_buffer(&buf);
_fail(NULL, 0, "UART outputs differ: expected \"%s\", got \"%s\"", expected, buf.str);
}
+void tests_assert_uart_receive(const char *elfname,
+ unsigned long run_usec,
+ const char *expected,
+ char uart) {
+ avr_t *avr = tests_init_avr(elfname);
+
+ tests_assert_uart_receive_avr(avr,
+ run_usec,
+ expected,
+ uart);
+}
+
void tests_assert_cycles_at_least(unsigned long n) {
if (tests_cycle_count < n)
_fail(NULL, 0, "Program ran for too few cycles (%"
}
void _fail(const char *filename, int linenum, const char *fmt, ...) {
- if (orig_stderr)
- stderr = orig_stderr;
+ restore_stderr();
if (filename)
fprintf(stderr, "%s:%d: ", filename, linenum);