From a679ab1c4bb4438e44750746f146fd7ae9ad78a2 Mon Sep 17 00:00:00 2001 From: IlushaShurupov Date: Mon, 31 Jul 2023 22:10:46 +0300 Subject: [PATCH] Objects adding dict test & fixes --- Objects/private/core/objectsave.cpp | 8 +++-- Objects/private/primitives/dictobject.cpp | 5 ++- Objects/private/primitives/stringobject.cpp | 7 +++-- Objects/tests/Tests.cpp | 2 ++ Objects/tests/core/TestCore.cpp | 5 +++ Objects/tests/primitives/TestPrimitives.cpp | 35 +++++++++++++++++++++ 6 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 Objects/tests/primitives/TestPrimitives.cpp diff --git a/Objects/private/core/objectsave.cpp b/Objects/private/core/objectsave.cpp index 6b24f1c..dc67e1e 100644 --- a/Objects/private/core/objectsave.cpp +++ b/Objects/private/core/objectsave.cpp @@ -221,7 +221,7 @@ namespace obj { ndf << tp::String(in->type->name); // allocate for object file header - ndf.setFreeAddress(ndf.getFreeAddress() + sizeof(ObjectFileHead) + tp::String::Logic::calcLength(in->type->name) + 1); + ndf.setFreeAddress(ndf.getFreeAddress() + sizeof(ObjectFileHead) + tp::String::Logic::calcLength(in->type->name) + sizeof(tp::String::Logic::Index)); // calc max size needed for saving all hierarchy of types tp::alni file_alloc_size = objsize_file_util(in, in->type); @@ -372,8 +372,10 @@ namespace obj { ndf.setAddress(0); - loaded_file = (tp::int1*) malloc(ndf.getSize()); - ndf.readBytes(loaded_file, ndf.getSize()); + const auto fileSize = ndf.getSize(); + loaded_file = (tp::int1*) malloc(fileSize); + tp::memSetVal(loaded_file, fileSize, 0); + ndf.readBytes(loaded_file, fileSize); ndf.setAddress(sizeof(ObjectsFileHeader)); diff --git a/Objects/private/primitives/dictobject.cpp b/Objects/private/primitives/dictobject.cpp index c6b8e9e..f83aea0 100644 --- a/Objects/private/primitives/dictobject.cpp +++ b/Objects/private/primitives/dictobject.cpp @@ -44,7 +44,10 @@ alni DictObject::save_size(DictObject* self) { for (auto item : self->items) { // string length - save_size += (item->key.size() + 1) * sizeof(*item->key.read()); + auto size = item->key.size(); + save_size += size * sizeof(*item->key.read()); + save_size += sizeof(decltype(size)); + // object file adress save_size += sizeof(alni); } diff --git a/Objects/private/primitives/stringobject.cpp b/Objects/private/primitives/stringobject.cpp index 3ef9dd7..58f9947 100644 --- a/Objects/private/primitives/stringobject.cpp +++ b/Objects/private/primitives/stringobject.cpp @@ -50,8 +50,11 @@ alnf StringObject::to_float(StringObject* self) { } static alni save_size(StringObject* self) { - // return self->val.save_size(); - return {}; + alni save_size = 0; + auto size = self->val.size(); + save_size += (size) * sizeof(*self->val.read()); + save_size += sizeof(decltype(size)); + return save_size; } static void save(StringObject* self, ArchiverOut& file_self) { diff --git a/Objects/tests/Tests.cpp b/Objects/tests/Tests.cpp index 0a9b12d..f3a24b4 100644 --- a/Objects/tests/Tests.cpp +++ b/Objects/tests/Tests.cpp @@ -9,6 +9,7 @@ using namespace obj; void testCore(); +void testPrimitives(); int main() { @@ -18,6 +19,7 @@ int main() { if (module.initialize()) { testCore(); + testPrimitives(); module.deinitialize(); } diff --git a/Objects/tests/core/TestCore.cpp b/Objects/tests/core/TestCore.cpp index a482294..9166570 100644 --- a/Objects/tests/core/TestCore.cpp +++ b/Objects/tests/core/TestCore.cpp @@ -22,6 +22,11 @@ TEST_DEF_STATIC(BasicAPI) { printf("%s\n", NDO->toString(savedInt).read()); + TEST(NDO->compare(integer, savedInt)); + TEST(NDO_CAST(IntObject, savedInt)); + TEST(integer->val == NDO_CAST(IntObject, savedInt)->val); + + NDO->destroy(integer); NDO->destroy(savedInt); } diff --git a/Objects/tests/primitives/TestPrimitives.cpp b/Objects/tests/primitives/TestPrimitives.cpp new file mode 100644 index 0000000..4e7d01b --- /dev/null +++ b/Objects/tests/primitives/TestPrimitives.cpp @@ -0,0 +1,35 @@ + +#include "NewPlacement.hpp" + +#include "Testing.hpp" + +#include "core/object.h" + +#include "primitives/dictobject.h" +#include "primitives/intobject.h" + +using namespace tp; +using namespace obj; + +TEST_DEF_STATIC(Dict) { + auto integer = NDO_CAST(IntObject, NDO->create("int")); + integer->val = 10; + + auto dict = NDO_CAST(DictObject, NDO->create("dict")); + + dict->put("val", integer); + + NDO->save(dict, "dict.o"); + + auto dictLoaded = NDO_CAST(DictObject, NDO->load("dict.o")); + + TEST(dictLoaded->presents("val").isValid()); + TEST(NDO_CAST(IntObject, dictLoaded->get("val"))->val == 10); + + NDO->destroy(dict); + NDO->destroy(dictLoaded); +} + +TEST_DEF(Primitives) { + testDict(); +} \ No newline at end of file