summaryrefslogtreecommitdiff
path: root/asl/format_tests.cpp
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2024-10-09 23:08:48 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2024-12-20 15:35:58 +0100
commit8dfd173285df515fe9b41d970321da9d049460f8 (patch)
tree570b3ffbbe53ffee6a2d7d08646bfa448b95a509 /asl/format_tests.cpp
parent0e7999f2d147b026aaee6693bdd2be2cb4a2519e (diff)
More work on format
Diffstat (limited to 'asl/format_tests.cpp')
-rw-r--r--asl/format_tests.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/asl/format_tests.cpp b/asl/format_tests.cpp
index e69de29..2288a77 100644
--- a/asl/format_tests.cpp
+++ b/asl/format_tests.cpp
@@ -0,0 +1,82 @@
+#include "asl/format.hpp"
+
+#include <cstdlib>
+#include <cstring>
+#include <cassert>
+#include <cstdio>
+
+// @Todo Improve this to use our utilities, not the C stdlib
+
+static_assert(asl::formattable<decltype("Hello")>);
+
+class StringSink : public asl::writer
+{
+ int64_t m_current_len{};
+ char* m_data{};
+
+public:
+ void write(const char* str, int64_t len) override
+ {
+ m_data = (char*)realloc(m_data, (size_t)(m_current_len + len + 1));
+ memcpy(m_data + m_current_len, str, (size_t)len);
+ m_current_len += len;
+ m_data[m_current_len] = '\0';
+ }
+
+ constexpr const char* cstr() const { return m_data; }
+
+ void reset()
+ {
+ m_current_len = 0;
+ free(m_data);
+ m_data = nullptr;
+ }
+};
+
+int main()
+{
+ StringSink sink;
+
+ // @Todo Use the testing framework
+
+ asl::format(&sink, "Hello, world!");
+ assert(strcmp(sink.cstr(), "Hello, world!") == 0);
+
+ sink.reset();
+ asl::format(&sink, "");
+ assert(strcmp(sink.cstr(), "") == 0);
+
+ sink.reset();
+ asl::format(&sink, "Hello, {}!", "world");
+ assert(strcmp(sink.cstr(), "Hello, world!") == 0);
+
+ sink.reset();
+ asl::format(&sink, "Hello, {}! {}", "world");
+ assert(strcmp(sink.cstr(), "Hello, world! <ERROR>") == 0);
+
+ sink.reset();
+ asl::format(&sink, "Hello, pup!", "world");
+ assert(strcmp(sink.cstr(), "Hello, pup!") == 0);
+
+ sink.reset();
+ asl::format(&sink, "{}", "CHEESE");
+ assert(strcmp(sink.cstr(), "CHEESE") == 0);
+
+ sink.reset();
+ asl::format(&sink, "{ ", "CHEESE");
+ assert(strcmp(sink.cstr(), "<ERROR> ") == 0);
+
+ sink.reset();
+ asl::format(&sink, "{", "CHEESE");
+ assert(strcmp(sink.cstr(), "<ERROR>") == 0);
+
+ sink.reset();
+ asl::format(&sink, "a{{b");
+ assert(strcmp(sink.cstr(), "a{b") == 0);
+
+ sink.reset();
+ asl::format(&sink, "{{{}}} }", "CHEESE");
+ assert(strcmp(sink.cstr(), "{CHEESE} }") == 0);
+
+ return 0;
+}