/*============================================================================ * ET: embedded test (super-simple embedded testing framework) * GitHub: https://github.com/QuantumLeaps/Embedded-Test * * Q u a n t u m L e a P s * ------------------------ * Modern Embedded Software * * Copyright (C) 2005 Quantum Leaps, . * * SPDX-License-Identifier: MIT * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ============================================================================*/ #include "et.h" /* ET: embedded test */ /*..........................................................................*/ static void print_str(char const *str); static void print_dec(unsigned const num); static void print_summary(unsigned ok); static void test_end(void); static int str_cmp(char const *str1, char const *str2); static unsigned l_test_count; static unsigned l_skip_count; static unsigned l_skip_last; static char const *l_expect_assert_module; static int l_expect_assert_label; /*..........................................................................*/ int main(int argc, char *argv[]) { ET_onInit(argc, argv); print_str("\nET embedded test " ET_VERSION ", https://github.com/QuantumLeaps/ET\n"); print_str("---------------- group: "); print_str(ET_group_); print_str(" -----------------\n"); ET_run_(); test_end(); print_summary(1U); ET_onExit(0); /* success */ } /*..........................................................................*/ int ET_test_(char const *title, int skip) { test_end(); ++l_test_count; ET_onPrintChar('['); print_dec(l_test_count); print_str("] \""); print_str(title); print_str("\" "); if (skip) { ++l_skip_count; } else { setup(); ET_onPrintChar('.'); } l_skip_last = skip; return skip == 0; } /*..........................................................................*/ static void test_end(void) { if (l_expect_assert_module != (char const *)0) { ET_fail("Expected Assertion didn't fire", l_expect_assert_module, l_expect_assert_label); } else if (l_test_count > 0) { if (l_skip_last) { print_str(" SKIPPED\n"); l_skip_last = 0; } else { teardown(); print_str(". PASSED\n"); } } } /*..........................................................................*/ void ET_fail(char const *cond, char const *group, int line) { print_str(" FAILED\n--> "); print_str(group); ET_onPrintChar(':'); print_dec(line); ET_onPrintChar(' '); print_str(cond); ET_onPrintChar('\n'); print_summary(0U); ET_onExit(-1); /* failure */ } /*..........................................................................*/ void ET_expect_assert(char const *module, int label) { l_expect_assert_module = module; l_expect_assert_label = label; } /*..........................................................................*/ void ET_verify_assert_(char const *module, int label) { if ((l_expect_assert_label == label) && (str_cmp(module, l_expect_assert_module) == 0)) { l_expect_assert_module = (char const *)0; test_end(); print_str("Assertion (expected) --> Exiting\n"); print_summary(1U); ET_onExit(0); /* success */ } else { ET_fail("Unexpected assertion", module, label); } } /*..........................................................................*/ static void print_summary(unsigned ok) { print_str("------------ "); print_dec(l_test_count); print_str(" test(s), "); print_dec(l_skip_count); print_str(" skipped -------------\n"); print_str(ok ? "OK\n" : "FAILED\n"); } /*..........................................................................*/ static void print_str(char const *str) { for (; *str != '\0'; ++str) { ET_onPrintChar(*str); } } /*..........................................................................*/ static void print_dec(unsigned const num) { /* find power of 10 of the first decimal digit of the number */ unsigned pwr10 = 1U; for (; num > (pwr10 * 9U); pwr10 *= 10U) { } /* print the decimal digits of the number... */ do { ET_onPrintChar((char)('0' + ((num / pwr10) % 10U))); pwr10 /= 10U; } while (pwr10 != 0U); } /*..........................................................................*/ static int str_cmp(char const *str1, char const *str2) { while (*str1 == *str2++) { if (*str1++ == '\0') { return 0; } } --str2; return *(unsigned char *)str1 - *(unsigned char *)str2; }