/* * print-test.cpp * * Tests the various Print methods. (For USBSerial; assuming that * writing a single character works, this should generalize to * HardwareSerial). * * This file is released into the public domain. */ #include "wirish.h" #undef min #undef max // For snprintf() #include // The that comes with newlib is missing LLONG_MAX, etc. #include using namespace std; #define BUF_SIZE 100 char buf[BUF_SIZE]; void test_numbers(void); void test_base_arithmetic(void); void test_floating_point(void); void print_separator(void); void setup() { while (!SerialUSB.available()) continue; SerialUSB.read(); } void loop() { SerialUSB.println("Testing Print methods."); print_separator(); test_numbers(); print_separator(); test_base_arithmetic(); print_separator(); test_floating_point(); print_separator(); SerialUSB.println("Test finished."); while (true) { continue; } } void test_numbers(void) { SerialUSB.println("Numeric types:"); SerialUSB.println("unsigned char: "); // prevent Print from treating it as an (extended) ASCII character: SerialUSB.println((uint32)numeric_limits::max()); SerialUSB.print("int: "); SerialUSB.print(numeric_limits::min()); SerialUSB.print(" -- "); SerialUSB.println(numeric_limits::max()); SerialUSB.print("unsigned int: "); SerialUSB.print(numeric_limits::max()); SerialUSB.println(); SerialUSB.print("long: "); SerialUSB.print(numeric_limits::min()); SerialUSB.print(" -- "); SerialUSB.println(numeric_limits::max()); SerialUSB.print("long long: "); SerialUSB.print(numeric_limits::min()); SerialUSB.print(" -- "); SerialUSB.println(numeric_limits::max()); SerialUSB.print("unsigned long long: "); SerialUSB.println(numeric_limits::max()); } void test_base_arithmetic(void) { SerialUSB.println("Base arithmetic:"); SerialUSB.print("Binary: "); SerialUSB.print(numeric_limits::max(), BIN); SerialUSB.print(", "); SerialUSB.println(numeric_limits::max(), BIN); SerialUSB.print("Octal: "); SerialUSB.print(numeric_limits::max(), OCT); SerialUSB.print(", "); SerialUSB.println(numeric_limits::max(), OCT); SerialUSB.print("Decimal: "); SerialUSB.print(numeric_limits::max(), DEC); SerialUSB.print(", "); SerialUSB.println(numeric_limits::max(), DEC); SerialUSB.print("Hexadecimal: "); SerialUSB.print(numeric_limits::max(), HEX); SerialUSB.print(", "); SerialUSB.println(numeric_limits::max(), HEX); } void test_floating_point(void) { double dmax = numeric_limits::max(); SerialUSB.println("Floating point:"); SerialUSB.print("sizeof double: "); SerialUSB.println(sizeof(double)); SerialUSB.print("println(-5.67): "); SerialUSB.println(-5.67); SerialUSB.print("println((double)(LLONG_MAX - 10)): "); SerialUSB.println((double)(numeric_limits::max() - 10)); SerialUSB.print("println((double)(LLONG_MAX - 10)) from snprintf(): "); snprintf(buf, BUF_SIZE, "%.2f", (double)(numeric_limits::max() - 10)); SerialUSB.println(buf); SerialUSB.print("println((double)LLONG_MAX / 2): "); SerialUSB.println((double)(numeric_limits::max()) / 2); SerialUSB.print("println((double)LLONG_MAX / 2) from snprintf(): "); snprintf(buf, BUF_SIZE, "%.2f", (double)(numeric_limits::max()) / 2); SerialUSB.println(buf); SerialUSB.print("DBL_MAX: "); SerialUSB.println(dmax); SerialUSB.print("DBL_MAX from snprintf(): "); snprintf(buf, BUF_SIZE, "%g", dmax); SerialUSB.println(buf); SerialUSB.print("-DBL_MAX / 2: "); SerialUSB.println(-dmax / 2.0); SerialUSB.print("-DBL_MAX / 2 from snprintf(): "); snprintf(buf, BUF_SIZE, "%g", -dmax / 2.0); SerialUSB.println(buf); SerialUSB.print("Double epsilon, round error: "); SerialUSB.print(numeric_limits::epsilon()); SerialUSB.print(", "); SerialUSB.println(numeric_limits::round_error()); SerialUSB.println(); float fmax = numeric_limits::max(); SerialUSB.print("sizeof float: "); SerialUSB.println(sizeof(float)); SerialUSB.print("println(-5.67f): "); SerialUSB.println(-5.67f); SerialUSB.print("Float max: "); SerialUSB.println(fmax); SerialUSB.print("Float epsilon, round error: "); SerialUSB.print(numeric_limits::epsilon()); SerialUSB.print(", "); SerialUSB.println(numeric_limits::round_error()); } void print_separator(void) { SerialUSB.println(); SerialUSB.println(" ** "); SerialUSB.println(); } // Force init to be called *first*, i.e. before static object allocation. // Otherwise, statically allocated objects that need libmaple may fail. __attribute__((constructor)) void premain() { init(); } int main(void) { setup(); while (1) { loop(); } return 0; }