From d2c84bea307a0f247ea8b393a875fa02f5f27a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Tue, 18 Sep 2018 15:25:55 +0200 Subject: [PATCH] [poincare] Add tests on Helpers::Rotate --- poincare/Makefile | 1 + poincare/test/helpers.cpp | 112 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 poincare/test/helpers.cpp diff --git a/poincare/Makefile b/poincare/Makefile index e409014cf..d09a2bcff 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -141,6 +141,7 @@ tests += $(addprefix poincare/test/,\ fraction_layout.cpp\ function.cpp\ helper.cpp\ + helpers.cpp\ integer.cpp\ layouts.cpp\ logarithm.cpp\ diff --git a/poincare/test/helpers.cpp b/poincare/test/helpers.cpp new file mode 100644 index 000000000..fb9e3b283 --- /dev/null +++ b/poincare/test/helpers.cpp @@ -0,0 +1,112 @@ +#include +#include +#include + +#include +#include "helper.h" + +static inline void assert_gcd_is(size_t a, size_t b, size_t g) { + quiz_assert(Poincare::Helpers::Gcd(a, b) == g); +} + +QUIZ_CASE(poincare_helpers_gcd) { + assert_gcd_is(1, 1, 1); + assert_gcd_is(2, 3, 1); + assert_gcd_is(7, 5, 1); + assert_gcd_is(3, 9, 3); +} + +QUIZ_CASE(poincare_helpers_insert_simple_swap) { + constexpr size_t bufSize = 3; + uint32_t buf[bufSize]; + for (size_t i = 0; i < bufSize; i++) { + buf[i] = (uint32_t) i; + } + + Poincare::Helpers::Rotate(&buf[0], &buf[1], 1); + assert(buf[0] == 1); + assert(buf[1] == 0); + assert(buf[2] == 2); + + Poincare::Helpers::Rotate(&buf[2], &buf[0], 1); + assert(buf[0] == 0); + assert(buf[1] == 1); + assert(buf[2] == 2); +} + +static inline void test_rotate(uint32_t buf[], size_t bufSize, size_t dstIndex, size_t srcIndex, size_t len) { + quiz_assert(len == 0 || (srcIndex + len - 1 < bufSize)); + + Poincare::Helpers::Rotate(&buf[dstIndex], &buf[srcIndex], len); + + if (len == 0 || srcIndex == dstIndex || (dstIndex > srcIndex && dstIndex < srcIndex + len)) { + for (size_t i = 0; i < bufSize; i++) { + quiz_assert(buf[i] == i); + } + } else if (dstIndex < srcIndex) { + /* Typical case: + * + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | + * ^¨¨¨¨¨¨¨^---^ + * Dst Src Len = 1 + * + * After rotation: + * | 0 | 1 | 4 | 2 | 3 | 5 | 6 | + * --- ¨¨¨¨¨¨¨ + * */ + for (size_t i = 0; i < dstIndex; i++) { + quiz_assert(buf[i] == i); + } + for (size_t i = dstIndex; i < dstIndex + len; i++) { + quiz_assert(buf[i] == srcIndex + (i - dstIndex)); + } + for (size_t i = dstIndex + len; i < srcIndex + len; i++) { + quiz_assert(buf[i] == dstIndex + (i - (dstIndex + len))); + } + for (size_t i = srcIndex + len; i < bufSize; i++) { + quiz_assert(buf[i] == i); + } + } else { + /* Typical case: + * + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | + * ^-------^¨¨¨^ + * Src Dst Len = 2 + * + * After rotation: + * | 0 | 1 | 4 | 2 | 3 | 5 | 6 | + * ¨¨¨ ------- + * */ + for (size_t i = 0; i < srcIndex; i++) { + quiz_assert(buf[i] == i); + } + size_t srcDataNewPosition = srcIndex + dstIndex - (srcIndex + len); + for (size_t i = srcIndex; i < srcDataNewPosition; i++) { + quiz_assert(buf[i] == i + len); + } + for (size_t i = srcDataNewPosition; i < dstIndex; i++) { + quiz_assert(buf[i] == srcIndex + i - srcDataNewPosition); + } + for (size_t i = dstIndex; i < bufSize; i++) { + quiz_assert(buf[i] == i); + } + } +} + +QUIZ_CASE(poincare_helpers_rotate) { + // We test all dst, src and len combinations for a buffer of size 100 + constexpr size_t bufSize = 100; + uint32_t buf[bufSize]; + for (size_t dst = 0; dst < bufSize; dst++) { + for (size_t src = 0; src < bufSize; src++) { + for (size_t len = 0; len < bufSize - src + 1; len++) { + // Reset the start buffer + for (size_t i = 0; i < bufSize; i++) { + buf[i] = (uint32_t) i; + } + // Launch the test + test_rotate(buf, bufSize, dst, src, len); + } + } + } +}