Cleaner test setup
This commit is contained in:
parent
216fb486cd
commit
737dc03054
6 changed files with 102 additions and 6 deletions
|
@ -4,6 +4,7 @@
|
||||||
#include "error.hpp"
|
#include "error.hpp"
|
||||||
#include "pod.hpp"
|
#include "pod.hpp"
|
||||||
#include "utf8.hpp"
|
#include "utf8.hpp"
|
||||||
|
#include "writer.hpp"
|
||||||
|
|
||||||
Syntax::Syntax(String filename, String modulename, Value expression) {}
|
Syntax::Syntax(String filename, String modulename, Value expression) {}
|
||||||
|
|
||||||
|
@ -163,6 +164,12 @@ Result<void> debug_print(Arena& arena, String& val) {
|
||||||
return Result<void>();
|
return Result<void>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result<void> debug_print(Arena& arena, Value& val) {
|
||||||
|
auto w = Writer(arena);
|
||||||
|
auto s = TRY(w.write_one(val));
|
||||||
|
return debug_print(arena, s);
|
||||||
|
}
|
||||||
|
|
||||||
Result<Value> Array::get(Arena& arena, uint64_t idx) {
|
Result<Value> Array::get(Arena& arena, uint64_t idx) {
|
||||||
if (idx >= _value->size) return ErrorCode::IndexOutOfRange;
|
if (idx >= _value->size) return ErrorCode::IndexOutOfRange;
|
||||||
auto val = _value->data[idx].get(pod());
|
auto val = _value->data[idx].get(pod());
|
||||||
|
|
|
@ -330,7 +330,26 @@ class String : public Object {
|
||||||
virtual Tag tag() final { return Tag::String; }
|
virtual Tag tag() final { return Tag::String; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
||||||
virtual Result<short> cmp(String& rhs) final { return 0; }
|
virtual Result<short> cmp(String& rhs) final {
|
||||||
|
auto lsize = size();
|
||||||
|
auto rsize = rhs.size();
|
||||||
|
uint64_t i = 0;
|
||||||
|
uint64_t j = 0;
|
||||||
|
while (1) {
|
||||||
|
if (i == lsize && j == lsize) return 0;
|
||||||
|
|
||||||
|
short cmp = short(i == lsize) - short(j == rsize);
|
||||||
|
if (cmp != 0) return cmp;
|
||||||
|
|
||||||
|
char32_t lc = _value->data[i];
|
||||||
|
char32_t rc = rhs._value->data[j];
|
||||||
|
cmp = (lc > rc) - (lc < rc);
|
||||||
|
if (cmp != 0) return cmp;
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
virtual void move(Object* obj) final { new (obj) String(std::move(_value)); }
|
virtual void move(Object* obj) final { new (obj) String(std::move(_value)); }
|
||||||
|
|
||||||
|
@ -654,6 +673,10 @@ class Value {
|
||||||
return Value(TRY(Int64::create(arena, value)));
|
return Value(TRY(Int64::create(arena, value)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Result<Value> create(Arena& arena, const char* value) {
|
||||||
|
return Value(TRY(String::create(arena, value)));
|
||||||
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
bool is() {
|
bool is() {
|
||||||
return dynamic_cast<T*>((Object*)buf) != nullptr;
|
return dynamic_cast<T*>((Object*)buf) != nullptr;
|
||||||
|
@ -688,6 +711,7 @@ Result<Value> syntax_unwrap(Value& val);
|
||||||
Result<Value> reverse(Arena& arena, Value& val);
|
Result<Value> reverse(Arena& arena, Value& val);
|
||||||
|
|
||||||
Result<void> debug_print(Arena& arena, String& val);
|
Result<void> debug_print(Arena& arena, String& val);
|
||||||
|
Result<void> debug_print(Arena& arena, Value& val);
|
||||||
|
|
||||||
template <class K, class V>
|
template <class K, class V>
|
||||||
Result<Dict> Dict::insert(Arena& arena, const K& key, const V& value) {
|
Result<Dict> Dict::insert(Arena& arena, const K& key, const V& value) {
|
||||||
|
|
|
@ -216,3 +216,8 @@ Result<String> Writer::write_dict(Dict& val) {
|
||||||
res = TRY(res.concat(_arena, "}"));
|
res = TRY(res.concat(_arena, "}"));
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result<String> write_one(Arena& arena, Value& value) {
|
||||||
|
auto w = Writer(arena);
|
||||||
|
return w.write_one(value);
|
||||||
|
}
|
||||||
|
|
|
@ -25,3 +25,14 @@ class Writer {
|
||||||
|
|
||||||
Arena& _arena;
|
Arena& _arena;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Result<String> write_one(Arena& arena, Value& value);
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
Result<String> write_one(Arena& arena, T& value)
|
||||||
|
requires std::derived_from<T, Object>
|
||||||
|
{
|
||||||
|
auto w = Writer(arena);
|
||||||
|
auto v = DIEX(value.copy(arena));
|
||||||
|
return w.write_one(v);
|
||||||
|
}
|
||||||
|
|
|
@ -15,10 +15,7 @@ TEST_CASE(dict_insert) {
|
||||||
d = DIEX(d.insert(arena, 0, 5));
|
d = DIEX(d.insert(arena, 0, 5));
|
||||||
d = DIEX(d.insert(arena, 2, 6));
|
d = DIEX(d.insert(arena, 2, 6));
|
||||||
|
|
||||||
auto w = Writer(arena);
|
auto s = DIEX(write_one(arena, d));
|
||||||
|
|
||||||
auto dd = DIEX(d.copy(arena));
|
ASSERT_EQUALS(s, "{0 5 1 3 2 6 3 3}");
|
||||||
auto s = DIEX(w.write_one(dd));
|
|
||||||
|
|
||||||
DIEX(debug_print(arena, s));
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#include "common.hpp"
|
||||||
|
#include "result.hpp"
|
||||||
|
|
||||||
const uint64_t MAX_TESTS = 1024 * 1024;
|
const uint64_t MAX_TESTS = 1024 * 1024;
|
||||||
static void (*tests[MAX_TESTS])() = {0};
|
static void (*tests[MAX_TESTS])() = {0};
|
||||||
|
@ -37,4 +42,51 @@ bool run_tests() {
|
||||||
|
|
||||||
#define TEST_CASE(fun_) TEST_CASE_IMPL(MACRO_CONCAT(fun_, _COUNTER_))
|
#define TEST_CASE(fun_) TEST_CASE_IMPL(MACRO_CONCAT(fun_, _COUNTER_))
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct Capture {
|
||||||
|
Capture(T& value) : value(value) {}
|
||||||
|
T& value;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct Capture<T&> {
|
||||||
|
Capture(T& value) : value(value) {}
|
||||||
|
T& value;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct Capture<T&&> {
|
||||||
|
Capture(T&& value) : value(value) {}
|
||||||
|
T value;
|
||||||
|
};
|
||||||
|
|
||||||
|
Value& to_value(Arena& arena, Value& val) { return val; }
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
requires std::derived_from<T, Object>
|
||||||
|
Value to_value(Arena& arena, T& val) {
|
||||||
|
return DIEX(val.copy(arena));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
requires(!std::derived_from<T, Object>)
|
||||||
|
Value to_value(Arena& arena, T& val) {
|
||||||
|
return DIEX(Value::create(arena, val));
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ASSERT_EQUALS(lhs, rhs) \
|
||||||
|
do { \
|
||||||
|
auto l = Capture(lhs); \
|
||||||
|
auto r = Capture(rhs); \
|
||||||
|
auto lv = to_value(arena, l.value); \
|
||||||
|
auto rv = to_value(arena, r.value); \
|
||||||
|
short c = DIEX(lv.cmp(rv)); \
|
||||||
|
if (c != 0) { \
|
||||||
|
fprintf(stderr, "Values not equal at %s:%d\n", __FILE__, __LINE__); \
|
||||||
|
debug_print(arena, lv); \
|
||||||
|
debug_print(arena, rv); \
|
||||||
|
exit(EXIT_FAILURE); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
int main() { return run_tests() ? 0 : 1; }
|
int main() { return run_tests() ? 0 : 1; }
|
||||||
|
|
Loading…
Reference in a new issue