aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/Makefile10
-rw-r--r--test/checker.cc68
-rw-r--r--test/test_helper.h73
3 files changed, 151 insertions, 0 deletions
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 0000000..0efa3fc
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,10 @@
+# Copyright (c) 2020 Johannes Stoelp
+
+check: build
+ ./checker
+
+build: checker.cc
+ g++ -o cHecker -g -O2 -I ../include -Wall -Wextra $^
+
+clean:
+ rm -f checker
diff --git a/test/checker.cc b/test/checker.cc
new file mode 100644
index 0000000..2b5bc8a
--- /dev/null
+++ b/test/checker.cc
@@ -0,0 +1,68 @@
+// Copyright (c) 2020 Johannes Stoelp
+
+#include "test_helper.h"
+
+#include <cstdio>
+#include <fmt.h>
+
+void check_dec() {
+ char have[16];
+ int len = dynld_snprintf(have, sizeof(have), "%d %d", 12345, -54321);
+
+ ASSERT_EQ("12345 -54321", have);
+ ASSERT_EQ(12, len);
+ ASSERT_EQ('\0', have[len]);
+}
+
+void check_hex() {
+ char have[16];
+ int len = dynld_snprintf(have, sizeof(have), "%x %x", 0xdeadbeef, 0xcafe);
+
+ ASSERT_EQ("deadbeef cafe", have);
+ ASSERT_EQ(13, len);
+ ASSERT_EQ('\0', have[len]);
+}
+
+void check_ptr() {
+ char have[16];
+ int len = dynld_snprintf(have, sizeof(have), "%p %p", (void*)0xabcd, (void*)0x0);
+
+ ASSERT_EQ("0xabcd 0x0", have);
+ ASSERT_EQ(10, len);
+ ASSERT_EQ('\0', have[len]);
+}
+
+void check_null() {
+ int len = dynld_snprintf(0, 0, "%s", "abcd1234efgh5678");
+
+ ASSERT_EQ(16, len);
+}
+
+void check_exact_len() {
+ char have[8];
+ int len = dynld_snprintf(have, sizeof(have), "%s", "12345678");
+
+ ASSERT_EQ("1234567", have);
+ ASSERT_EQ(8, len);
+ ASSERT_EQ('\0', have[7]);
+}
+
+void check_exceed_len() {
+ char have[8];
+ int len = dynld_snprintf(have, sizeof(have), "%s", "123456789abcedf");
+
+ ASSERT_EQ("1234567", have);
+ ASSERT_EQ(15, len);
+ ASSERT_EQ('\0', have[7]);
+}
+
+int main() {
+ TEST_INIT;
+ TEST(check_dec);
+ TEST(check_hex);
+ TEST(check_ptr);
+ TEST(check_null);
+ TEST(check_exact_len);
+ TEST(check_exceed_len);
+ return TEST_FAIL_CNT;
+}
diff --git a/test/test_helper.h b/test/test_helper.h
new file mode 100644
index 0000000..43cfce9
--- /dev/null
+++ b/test/test_helper.h
@@ -0,0 +1,73 @@
+// Copyright (c) 2020 Johannes Stoelp
+
+#pragma once
+#include <cstring>
+#include <exception>
+#include <iostream>
+
+/* Extremely trivial helper, just to get some tests out. */
+
+struct TestFailed : std::exception {};
+
+/* Requirements
+ * T1: comparable + printable (stream operator)
+ * T2: comparable + printable (stream operator)
+ */
+
+template<typename T1, typename T2>
+void ASSERT_EQ(T1 expected, T2 have) {
+ if (expected != have) {
+ std::cerr << "ASSERT_EQ failed:\n"
+ << " expected: " << expected << "\n"
+ << " have : " << have << "\n"
+ << std::flush;
+ throw TestFailed{};
+ }
+}
+
+template<typename T1, typename T2>
+void ASSERT_EQ(T1* expected, T2* have) {
+ ASSERT_EQ(*expected, *have);
+}
+
+template<>
+void ASSERT_EQ(const char* expected, const char* have) {
+ if (std::strcmp(expected, have) != 0) {
+ std::cerr << "ASSERT_EQ failed:\n"
+ << " expected: " << expected << "\n"
+ << " have : " << have << "\n"
+ << std::flush;
+ throw TestFailed{};
+ }
+}
+
+template<>
+void ASSERT_EQ(const char* expected, char* have) {
+ ASSERT_EQ(expected, static_cast<const char*>(have));
+}
+
+template<>
+void ASSERT_EQ(char* expected, const char* have) {
+ ASSERT_EQ(static_cast<const char*>(expected), have);
+}
+
+void ASSERT_EQ(char* expected, char* have) {
+ ASSERT_EQ(static_cast<const char*>(expected), static_cast<const char*>(have));
+}
+
+#define TEST_INIT unsigned fail_cnt = 0;
+#define TEST_FAIL_CNT fail_cnt
+
+#define TEST(fn) \
+ { \
+ try { \
+ fn(); \
+ std::cerr << "SUCCESS " #fn << std::endl; \
+ } catch (TestFailed&) { \
+ ++fail_cnt; \
+ std::cerr << "FAIL " #fn << std::endl; \
+ } catch (...) { \
+ ++fail_cnt; \
+ std::cerr << "FAIL " #fn << "(caught unspecified exception)" << std::endl; \
+ } \
+ }