/** @file DArray.test.cpp * * @author Roland Conybeare, Jan 2026 **/ #include #include #include #include #include #include namespace xo { using xo::scm::ListOps; using xo::scm::DArray; using xo::scm::DInteger; using xo::mm::ACollector; using xo::mm::AAllocator; using xo::mm::AGCObject; using xo::mm::DArena; using xo::mm::ArenaConfig; using xo::facet::with_facet; using xo::facet::obj; namespace ut { TEST_CASE("DArray-nullctor", "[object2][DArray]") { DArray arr; REQUIRE(arr.size() == 0); REQUIRE(arr.capacity() == 0); REQUIRE(arr.is_empty()); // null_mm: for no memory barrier obj null_mm; REQUIRE(arr.push_back(null_mm, ListOps::nil()) == false); } TEST_CASE("DArray-empty", "[object2][DArray]") { ArenaConfig cfg { .name_ = "testarena", .size_ = 4*1024 }; DArena arena = DArena::map(cfg); auto alloc = with_facet::mkobj(&arena); DArray * arr = DArray::_empty(alloc, 16); REQUIRE(arr != nullptr); REQUIRE(arr->capacity() == 16); REQUIRE(arr->is_empty() == true); REQUIRE(arr->size() == 0); REQUIRE(arr->is_finite() == true); } TEST_CASE("DArray-push_back", "[object2][DArray]") { ArenaConfig cfg { .name_ = "testarena", .size_ = 4*1024 }; DArena arena = DArena::map(cfg); auto alloc = with_facet::mkobj(&arena); obj null_mm; REQUIRE(!null_mm.data()); REQUIRE(!null_mm._has_null_vptr()); // any DArray * arr = DArray::_empty(alloc, 16); REQUIRE(arr != nullptr); REQUIRE(arr->capacity() == 16); REQUIRE(arr->size() == 0); obj elt = DInteger::box(alloc, 42); bool ok = arr->push_back(null_mm, elt); REQUIRE(ok == true); REQUIRE(arr->is_empty() == false); REQUIRE(arr->size() == 1); REQUIRE(arr->capacity() == 16); } TEST_CASE("DArray-push_back-multiple", "[object2][DArray]") { ArenaConfig cfg { .name_ = "testarena", .size_ = 4*1024 }; DArena arena = DArena::map(cfg); auto alloc = with_facet::mkobj(&arena); obj null_mm; DArray * arr = DArray::_empty(alloc, 4); REQUIRE(arr != nullptr); REQUIRE(arr->capacity() == 4); REQUIRE(arr->size() == 0); for (int i = 0; i < 4; ++i) { REQUIRE(arr->capacity() == 4); REQUIRE(arr->size() == i); obj elt = DInteger::box(alloc, 100 + i); bool ok = arr->push_back(null_mm, elt); REQUIRE(ok == true); REQUIRE(arr->capacity() == 4); REQUIRE(arr->is_empty() == false); REQUIRE(arr->size() == i+1); } } TEST_CASE("DArray-push_back-overflow", "[object2][DArray]") { ArenaConfig cfg { .name_ = "testarena", .size_ = 4*1024 }; DArena arena = DArena::map(cfg); auto alloc = with_facet::mkobj(&arena); DArray * arr = DArray::_empty(alloc, 2); obj null_mm; REQUIRE(arr != nullptr); REQUIRE(arr->capacity() == 2); REQUIRE(arr->size() == 0); obj e1 = DInteger::box(alloc, 1); obj e2 = DInteger::box(alloc, 2); obj e3 = DInteger::box(alloc, 3); REQUIRE(arr->push_back(null_mm, e1) == true); REQUIRE(arr->size() == 1); REQUIRE(arr->push_back(null_mm, e2) == true); REQUIRE(arr->size() == 2); REQUIRE(arr->push_back(null_mm, e3) == false); REQUIRE(arr->size() == 2); REQUIRE(arr->capacity() == 2); } TEST_CASE("DArray-at", "[object2][DArray]") { ArenaConfig cfg { .name_ = "testarena", .size_ = 4*1024 }; DArena arena = DArena::map(cfg); auto alloc = with_facet::mkobj(&arena); DArray * arr = DArray::_empty(alloc, 4); obj null_mm; REQUIRE(arr != nullptr); REQUIRE(arr->size() == 0); REQUIRE(arr->capacity() == 4); obj e0 = DInteger::box(alloc, 100); obj e1 = DInteger::box(alloc, 200); obj e2 = DInteger::box(alloc, 300); arr->push_back(null_mm, e0); arr->push_back(null_mm, e1); arr->push_back(null_mm, e2); REQUIRE(arr->size() == 3); REQUIRE(arr->at(0).data() == e0.data()); REQUIRE(arr->at(1).data() == e1.data()); REQUIRE(arr->at(2).data() == e2.data()); } TEST_CASE("DArray-array", "[object2][DArray]") { ArenaConfig cfg { .name_ = "testarena", .size_ = 4*1024 }; DArena arena = DArena::map(cfg); auto alloc = with_facet::mkobj(&arena); obj e0 = DInteger::box(alloc, 10); obj e1 = DInteger::box(alloc, 20); obj e2 = DInteger::box(alloc, 30); DArray * arr = DArray::array(alloc, e0, e1, e2); REQUIRE(arr != nullptr); REQUIRE(arr->size() == 3); REQUIRE(arr->capacity() == 3); REQUIRE(arr->is_empty() == false); REQUIRE(arr->at(0).data() == e0.data()); REQUIRE(arr->at(1).data() == e1.data()); REQUIRE(arr->at(2).data() == e2.data()); } TEST_CASE("DArray-array-empty", "[object2][DArray]") { ArenaConfig cfg { .name_ = "testarena", .size_ = 4*1024 }; DArena arena = DArena::map(cfg); auto alloc = with_facet::mkobj(&arena); DArray * arr = DArray::array(alloc); REQUIRE(arr != nullptr); REQUIRE(arr->size() == 0); REQUIRE(arr->capacity() == 0); REQUIRE(arr->is_empty() == true); } } /*namespace ut*/ } /*namespace xo*/ /* end DArray.test.cpp */