mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-27 17:50:04 +01:00
[poincare] Add tests on Helpers::Rotate
This commit is contained in:
@@ -141,6 +141,7 @@ tests += $(addprefix poincare/test/,\
|
||||
fraction_layout.cpp\
|
||||
function.cpp\
|
||||
helper.cpp\
|
||||
helpers.cpp\
|
||||
integer.cpp\
|
||||
layouts.cpp\
|
||||
logarithm.cpp\
|
||||
|
||||
112
poincare/test/helpers.cpp
Normal file
112
poincare/test/helpers.cpp
Normal file
@@ -0,0 +1,112 @@
|
||||
#include <quiz.h>
|
||||
#include <assert.h>
|
||||
#include <iostream>
|
||||
|
||||
#include <poincare/helpers.h>
|
||||
#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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user