diff options
| author | Petteri.Aimonen <Petteri.Aimonen@gmail.com> | 2012-08-29 14:38:36 +0000 |
|---|---|---|
| committer | Petteri.Aimonen <Petteri.Aimonen@gmail.com> | 2012-08-29 14:38:36 +0000 |
| commit | 543e39f42d00fbaa3dfd7a2ed19e3ea84e4f19ee (patch) | |
| tree | fe1dab9907b4679feefb25da84da5b69722d80c5 /unittests | |
| parent | cb1744b88691fbb6db938d702c87dd40929efb42 (diff) | |
| download | libfixmath-543e39f42d00fbaa3dfd7a2ed19e3ea84e4f19ee.tar.gz | |
Added to/from string conversion functions, and testcases for them.
Diffstat (limited to 'unittests')
| -rw-r--r-- | unittests/Makefile | 12 | ||||
| -rw-r--r-- | unittests/fix16_str_unittests.c | 117 |
2 files changed, 127 insertions, 2 deletions
diff --git a/unittests/Makefile b/unittests/Makefile index cb5dbb4..14dac10 100644 --- a/unittests/Makefile +++ b/unittests/Makefile @@ -5,10 +5,10 @@ CC = gcc CFLAGS = -g -O0 -I../libfixmath -Wall -Wextra -Werror # The files required for tests -FIX16_SRC = ../libfixmath/fix16.c ../libfixmath/fix16_sqrt.c \ +FIX16_SRC = ../libfixmath/fix16.c ../libfixmath/fix16_sqrt.c ../libfixmath/fix16_str.c \ ../libfixmath/fix16_exp.c ../libfixmath/fix16.h -all: run_fix16_unittests run_fix16_exp_unittests +all: run_fix16_unittests run_fix16_exp_unittests run_fix16_str_unittests clean: rm -f fix16_unittests_???? @@ -55,3 +55,11 @@ run_fix16_exp_unittests: fix16_exp_unittests fix16_exp_unittests: fix16_exp_unittests.c $(FIX16_SRC) $(CC) $(CFLAGS) $(DEFINES) -o $@ $^ -lm + +# Tests for string conversion, run only in default config +run_fix16_str_unittests: fix16_str_unittests + ./fix16_str_unittests > /dev/null + +fix16_str_unittests: fix16_str_unittests.c $(FIX16_SRC) + $(CC) $(CFLAGS) $(DEFINES) -o $@ $^ -lm + diff --git a/unittests/fix16_str_unittests.c b/unittests/fix16_str_unittests.c new file mode 100644 index 0000000..5a5bf94 --- /dev/null +++ b/unittests/fix16_str_unittests.c @@ -0,0 +1,117 @@ +#include <fix16.h> +#include <stdio.h> +#include <math.h> +#include <string.h> +#include <stdbool.h> +#include "unittests.h" + +int main() +{ + int status = 0; + + { + COMMENT("Testing fix16_to_str corner cases"); + char buf[13]; + + fix16_to_str(fix16_from_dbl(1234.5678), buf, 4); + printf("1234.5678 = %s\n", buf); + TEST(strcmp(buf, "1234.5678") == 0); + + fix16_to_str(fix16_from_dbl(-1234.5678), buf, 4); + printf("-1234.5678 = %s\n", buf); + TEST(strcmp(buf, "-1234.5678") == 0); + + fix16_to_str(0, buf, 0); + TEST(strcmp(buf, "0") == 0); + + fix16_to_str(fix16_from_dbl(0.9), buf, 0); + TEST(strcmp(buf, "1") == 0); + + fix16_to_str(1, buf, 5); + printf("(fix16_t)1 = %s\n", buf); + TEST(strcmp(buf, "0.00002") == 0); + + fix16_to_str(-1, buf, 5); + printf("(fix16_t)-1 = %s\n", buf); + TEST(strcmp(buf, "-0.00002") == 0); + + fix16_to_str(65535, buf, 5); + printf("(fix16_t)65535 = %s\n", buf); + TEST(strcmp(buf, "0.99998") == 0); + + fix16_to_str(65535, buf, 4); + printf("(fix16_t)65535 = %s\n", buf); + TEST(strcmp(buf, "1.0000") == 0); + + fix16_to_str(fix16_maximum, buf, 5); + printf("fix16_maximum = %s\n", buf); + TEST(strcmp(buf, "32767.99998") == 0); + + fix16_to_str(fix16_minimum, buf, 5); + printf("fix16_minimum = %s\n", buf); + TEST(strcmp(buf, "-32768.00000") == 0); + } + + { + COMMENT("Testing fix16_from_str corner cases"); + + TEST(fix16_from_str("1234.5678") == fix16_from_dbl(1234.5678)); + TEST(fix16_from_str("-1234.5678") == fix16_from_dbl(-1234.5678)); + TEST(fix16_from_str(" +1234,56780 ") == fix16_from_dbl(1234.5678)); + + TEST(fix16_from_str("0") == 0); + TEST(fix16_from_str("1") == fix16_one); + TEST(fix16_from_str("1.0") == fix16_one); + TEST(fix16_from_str("1.0000000000") == fix16_one); + + TEST(fix16_from_str("0.00002") == 1); + TEST(fix16_from_str("0.99998") == 65535); + + TEST(fix16_from_str("32767.99998") == fix16_maximum); + TEST(fix16_from_str("-32768.00000") == fix16_minimum); + } + + { + COMMENT("Extended testing for whole range"); + fix16_t value = fix16_minimum; + char testbuf[13]; + char goodbuf[13]; + + bool ok = true; + while (value < fix16_maximum) + { + double fvalue = fix16_to_dbl(value); + + /* Turns out we have to jump through some hoops to round + doubles perfectly for printing: + http://stackoverflow.com/questions/994764/rounding-doubles-5-sprintf + */ + fvalue = round(fvalue * 100000.)/100000.; + + snprintf(goodbuf, 13, "%0.5lf", fvalue); + fix16_to_str(value, testbuf, 5); + + if (strcmp(goodbuf, testbuf) != 0) + { + printf("Value (fix16_t)%d gave %s, should be %s\n", value, testbuf, goodbuf); + ok = false; + } + + fix16_t roundtrip = fix16_from_str(testbuf); + if (roundtrip != value) + { + printf("Roundtrip failed: (fix16_t)%d -> %s -> (fix16_t)%d\n", value, testbuf, roundtrip); + ok = false; + } + + value += 0x10001; + } + + TEST(ok); + } + + if (status != 0) + fprintf(stdout, "\n\nSome tests FAILED!\n"); + + return status; +} |
