From 73cfec103c8649a2b6f6456e804c23f7d4fa0860 Mon Sep 17 00:00:00 2001
From: Mitya Selivanov <0x7fffff@guattari.ru>
Date: Sun, 21 Aug 2022 18:24:31 +0400
Subject: move back algorithm

---
 source/test/unittests/CMakeLists.txt   |   2 +-
 source/test/unittests/move_back.test.c | 156 +++++++++++++++++++++++++++++++++
 2 files changed, 157 insertions(+), 1 deletion(-)
 create mode 100644 source/test/unittests/move_back.test.c

(limited to 'source/test/unittests')

diff --git a/source/test/unittests/CMakeLists.txt b/source/test/unittests/CMakeLists.txt
index e64628d..29dd1b2 100644
--- a/source/test/unittests/CMakeLists.txt
+++ b/source/test/unittests/CMakeLists.txt
@@ -5,4 +5,4 @@ target_sources(
       main.test.c string_ref.test.c atomic.test.c thread.test.c
       array_ref.test.c input_stream.test.c lower_bound.test.c
       condition_variable.test.c mersenne_twister_64.test.c input_buffer.test.c
-      dynamic_array.test.c)
+      move_back.test.c dynamic_array.test.c)
diff --git a/source/test/unittests/move_back.test.c b/source/test/unittests/move_back.test.c
new file mode 100644
index 0000000..cbb6f23
--- /dev/null
+++ b/source/test/unittests/move_back.test.c
@@ -0,0 +1,156 @@
+#include "../../kit/move_back.h"
+
+#define TEST_FILE move_back
+#include "../../kit_test/test.h"
+
+static int is_equal(int const x, int const y) {
+  return x == y;
+}
+
+static int is_equal_ref(int const *const x, int const *const y) {
+  return *x == *y;
+}
+
+static int is_even(int const x, int const _) {
+  return (x % 2) == 0;
+}
+
+static int is_even_ref(int const *const x, int const *const _) {
+  return (*x % 2) == 0;
+}
+
+TEST("move back val") {
+  int v[] = { 1, 2, 2, 2, 1, 1 };
+
+  struct {
+    int  size;
+    int *values;
+  } ref = { .size = sizeof v / sizeof *v, .values = v };
+
+  MOVE_BACK(ref.size, ref, 2, is_equal);
+
+  REQUIRE(ref.size == 3);
+  REQUIRE(v[0] == 1);
+  REQUIRE(v[1] == 1);
+  REQUIRE(v[2] == 1);
+}
+
+TEST("move back ref val") {
+  int v[] = { 1, 2, 2, 2, 1, 1 };
+
+  struct {
+    int  size;
+    int *values;
+  } ref = { .size = sizeof v / sizeof *v, .values = v };
+
+  int const two = 2;
+
+  MOVE_BACK_REF(ref.size, ref, two, is_equal_ref);
+
+  REQUIRE(ref.size == 3);
+  REQUIRE(v[0] == 1);
+  REQUIRE(v[1] == 1);
+  REQUIRE(v[2] == 1);
+}
+
+TEST("move back 1") {
+  int v[] = { 1, 2, 3, 4, 5, 6 };
+
+  struct {
+    int  size;
+    int *values;
+  } ref = { .size = sizeof v / sizeof *v, .values = v };
+
+  MOVE_BACK(ref.size, ref, 0, is_even);
+
+  REQUIRE(ref.size == 3);
+  REQUIRE(v[0] == 1);
+  REQUIRE(v[1] == 5);
+  REQUIRE(v[2] == 3);
+}
+
+TEST("move back 2") {
+  int v[] = { 2, 4, 6, 1, 3, 5 };
+
+  struct {
+    int  size;
+    int *values;
+  } ref = { .size = sizeof v / sizeof *v, .values = v };
+
+  MOVE_BACK(ref.size, ref, 0, is_even);
+
+  REQUIRE(ref.size == 3);
+  REQUIRE(v[0] == 5);
+  REQUIRE(v[1] == 3);
+  REQUIRE(v[2] == 1);
+}
+
+TEST("move back 3") {
+  int v[] = { 1, 3, 5, 2, 4, 6 };
+
+  struct {
+    int  size;
+    int *values;
+  } ref = { .size = sizeof v / sizeof *v, .values = v };
+
+  MOVE_BACK(ref.size, ref, 0, is_even);
+
+  REQUIRE(ref.size == 3);
+  REQUIRE(v[0] == 1);
+  REQUIRE(v[1] == 3);
+  REQUIRE(v[2] == 5);
+}
+
+TEST("move back ref 1") {
+  int v[] = { 1, 2, 3, 4, 5, 6 };
+
+  struct {
+    int  size;
+    int *values;
+  } ref = { .size = sizeof v / sizeof *v, .values = v };
+
+  int const nothing = 0;
+
+  MOVE_BACK_REF(ref.size, ref, nothing, is_even_ref);
+
+  REQUIRE(ref.size == 3);
+  REQUIRE(v[0] == 1);
+  REQUIRE(v[1] == 5);
+  REQUIRE(v[2] == 3);
+}
+
+TEST("move back ref 2") {
+  int v[] = { 2, 4, 6, 1, 3, 5 };
+
+  struct {
+    int  size;
+    int *values;
+  } ref = { .size = sizeof v / sizeof *v, .values = v };
+
+  int const nothing = 0;
+
+  MOVE_BACK_REF(ref.size, ref, nothing, is_even_ref);
+
+  REQUIRE(ref.size == 3);
+  REQUIRE(v[0] == 5);
+  REQUIRE(v[1] == 3);
+  REQUIRE(v[2] == 1);
+}
+
+TEST("move back ref 3") {
+  int v[] = { 1, 3, 5, 2, 4, 6 };
+
+  struct {
+    int  size;
+    int *values;
+  } ref = { .size = sizeof v / sizeof *v, .values = v };
+
+  int const nothing = 0;
+
+  MOVE_BACK_REF(ref.size, ref, nothing, is_even_ref);
+
+  REQUIRE(ref.size == 3);
+  REQUIRE(v[0] == 1);
+  REQUIRE(v[1] == 3);
+  REQUIRE(v[2] == 5);
+}
-- 
cgit v1.2.3