Add simple array test
This commit is contained in:
parent
91280bc5aa
commit
7bcd6afeb2
4 changed files with 40 additions and 2 deletions
|
@ -47,6 +47,7 @@ enable_testing()
|
|||
|
||||
set(CPP_TESTS
|
||||
dict
|
||||
array
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -184,9 +184,12 @@ Result<Value> Array::get(Arena& arena, Value& key) {
|
|||
Result<Array> Array::append(Arena& arena, Value& rhs) {
|
||||
uint64_t res_size = size() + 1;
|
||||
|
||||
auto pod = TRY(arena.alloc<PodArray>(res_size * sizeof(PodObject*)));
|
||||
auto pod = TRY(arena.alloc<PodArray>(res_size * sizeof(OffPtr<PodObject>)));
|
||||
pod->header.tag = Tag::Array;
|
||||
pod->size = res_size;
|
||||
memcpy(pod->data, _value->data, sizeof(PodObject*) * size());
|
||||
for (uint64_t i = 0; i < size(); i++) {
|
||||
pod->data[i] = OffPtr<PodObject>(pod, _value->data[i].get(_value.get()));
|
||||
}
|
||||
pod->data[size()] = OffPtr<PodObject>(pod, rhs.pod());
|
||||
|
||||
return Array(TRY(MkGcRoot(pod, arena)));
|
||||
|
|
|
@ -140,6 +140,8 @@ class Array : public Object {
|
|||
virtual Result<Value> get(Arena& arena, Value& key) final;
|
||||
|
||||
Result<Array> append(Arena& arena, Value& rhs);
|
||||
template <class V>
|
||||
Result<Array> append(Arena& arena, const V& value);
|
||||
|
||||
Result<Array> concat(Arena& arena, Array& rhs) {
|
||||
uint64_t rhs_size = rhs.size();
|
||||
|
@ -766,3 +768,9 @@ Result<Dict> Dict::insert(Arena& arena, const K& key, const V& value) {
|
|||
|
||||
return insert(arena, k, v);
|
||||
}
|
||||
|
||||
template <class V>
|
||||
Result<Array> Array::append(Arena& arena, const V& value) {
|
||||
Value v = TRY(Value::create(arena, value));
|
||||
return append(arena, v);
|
||||
}
|
||||
|
|
26
test/array.cpp
Normal file
26
test/array.cpp
Normal file
|
@ -0,0 +1,26 @@
|
|||
#include "common.hpp"
|
||||
#include "die.hpp"
|
||||
#include "reader.hpp"
|
||||
#include "test.hpp"
|
||||
#include "writer.hpp"
|
||||
|
||||
StaticArena<64 * 1024 * 1024> arena;
|
||||
|
||||
TEST_CASE(array_append) {
|
||||
auto a = DIEX(Array::create(arena));
|
||||
|
||||
a = DIEX(a.append(arena, 1));
|
||||
a = DIEX(a.append(arena, 2));
|
||||
a = DIEX(a.append(arena, 3));
|
||||
|
||||
DIEX(arena.gc());
|
||||
|
||||
auto s = DIEX(write_one(arena, a));
|
||||
|
||||
DIEX(arena.gc());
|
||||
|
||||
ASSERT_EQUALS(s, "[1 2 3]");
|
||||
|
||||
auto v = DIEX(a.get(arena, 1));
|
||||
ASSERT_EQUALS(v, 2);
|
||||
}
|
Loading…
Reference in a new issue