1+ #include " gtest/gtest.h"
2+
3+ namespace Memory
4+ {
5+
6+ size_t mallocCount = 0 ;
7+ size_t freeCount = 0 ;
8+
9+ struct Header
10+ {
11+ void * p;
12+ size_t size;
13+ size_t magic;
14+ };
15+
16+ const size_t kMinValidAlignment = 4 ;
17+
18+ void * malloc (size_t bytesCount, size_t alignment)
19+ {
20+ mallocCount++;
21+ if (alignment < kMinValidAlignment )
22+ {
23+ alignment = kMinValidAlignment ;
24+ }
25+ void * p;
26+ void ** p2;
27+ size_t offset = alignment - 1 + sizeof (Header);
28+ if ((p = (void *)std::malloc (bytesCount + offset)) == NULL )
29+ {
30+ return NULL ;
31+ }
32+ p2 = (void **)(((size_t )(p) + offset) & ~(alignment - 1 ));
33+
34+ Header* h = reinterpret_cast <Header*>(reinterpret_cast <char *>(p2) - sizeof (Header));
35+ h->p = p;
36+ h->size = bytesCount;
37+ h->magic = 0x13061979 ;
38+ return p2;
39+ }
40+
41+ void mfree (void * p)
42+ {
43+ freeCount++;
44+ if (!p)
45+ {
46+ return ;
47+ }
48+ Header* h = reinterpret_cast <Header*>(reinterpret_cast <char *>(p) - sizeof (Header));
49+ ASSERT_EQ (h->magic , 0x13061979 );
50+ std::free (h->p );
51+ }
52+
53+ } // namespace Memory
54+
55+ #define ZMEYA_ALLOC (sizeInBytes, alignment ) Memory::malloc(sizeInBytes, alignment)
56+ #define ZMEYA_FREE (ptr ) Memory::mfree(ptr)
157#include " TestHelper.h"
258#include " Zmeya.h"
3- #include " gtest/gtest.h"
459
560struct SimpleTestRoot
661{
@@ -11,8 +66,6 @@ struct SimpleTestRoot
1166 uint32_t arr[32 ];
1267};
1368
14-
15-
1669static void validate (const SimpleTestRoot* root)
1770{
1871 EXPECT_FLOAT_EQ (root->a , 13 .0f );
@@ -30,7 +83,7 @@ TEST(ZmeyaTestSuite, SimpleTest)
3083 std::vector<char > bytesCopy;
3184 {
3285 // create blob
33- std::shared_ptr<zm::BlobBuilder> blobBuilder = zm::BlobBuilder::create ();
86+ std::shared_ptr<zm::BlobBuilder> blobBuilder = zm::BlobBuilder::create (1 );
3487
3588 // allocate structure
3689 zm::BlobPtr<SimpleTestRoot> root = blobBuilder->allocate <SimpleTestRoot>();
@@ -61,3 +114,68 @@ TEST(ZmeyaTestSuite, SimpleTest)
61114 const SimpleTestRoot* rootCopy = (const SimpleTestRoot*)(bytesCopy.data ());
62115 validate (rootCopy);
63116}
117+
118+ struct Desc
119+ {
120+ zm::String name;
121+ float v1;
122+ uint32_t v2;
123+ };
124+
125+ struct TestRoot
126+ {
127+ zm::Array<Desc> arr;
128+ };
129+
130+ TEST (ZmeyaTestSuite, SimpleTest2)
131+ {
132+ const std::vector<std::string> names = {" apple" , " banana" , " orange" , " castle" , " dragon" , " flower" , " guitar" ,
133+ " hockey" , " island" , " jungle" , " kingdom" , " library" , " monster" , " notable" ,
134+ " oceanic" , " painter" , " quarter" , " rescue" , " seventh" , " trivial" , " umbrella" ,
135+ " village" , " warrior" , " xenial" , " yonder" , " zephyr" };
136+
137+ Memory::mallocCount = 0 ;
138+ Memory::freeCount = 0 ;
139+ EXPECT_EQ (Memory::mallocCount, 0 );
140+ EXPECT_EQ (Memory::freeCount, 0 );
141+
142+ std::vector<char > blob;
143+ {
144+ std::shared_ptr<zm::BlobBuilder> blobBuilder = zm::BlobBuilder::create (1 );
145+ zm::BlobPtr<TestRoot> root = blobBuilder->allocate <TestRoot>();
146+
147+ blobBuilder->resizeArray (root->arr , names.size ());
148+ EXPECT_EQ (root->arr .size (), names.size ());
149+
150+ for (size_t i = 0 ; i < names.size (); i++)
151+ {
152+ zm::BlobPtr<Desc> desc = blobBuilder->getArrayElement (root->arr , i);
153+ blobBuilder->copyTo (desc->name , names[i].c_str ());
154+ const char * s1 = root->arr [i].name .c_str ();
155+ const char * s2 = names[i].c_str ();
156+ EXPECT_STREQ (s1, s2);
157+ desc->v1 = (float )(i);
158+ desc->v2 = (uint32_t )(i);
159+ }
160+ zm::Span<char > bytes = blobBuilder->finalize ();
161+ blob = std::vector<char >(bytes.data , bytes.data + bytes.size );
162+ }
163+
164+ EXPECT_GT (Memory::mallocCount, 0 );
165+ EXPECT_GT (Memory::freeCount, 0 );
166+ EXPECT_EQ (Memory::mallocCount, Memory::freeCount);
167+
168+ // validate
169+ const TestRoot* rootCopy = (const TestRoot*)(blob.data ());
170+ EXPECT_EQ (rootCopy->arr .size (), names.size ());
171+
172+ for (size_t i = 0 ; i < names.size (); i++)
173+ {
174+ const Desc& desc = rootCopy->arr [i];
175+ EXPECT_STREQ (desc.name .c_str (), names[i].c_str ());
176+ EXPECT_FLOAT_EQ (desc.v1 , (float )(i));
177+ EXPECT_EQ (desc.v2 , (uint32_t )(i));
178+ }
179+
180+ EXPECT_EQ (Memory::mallocCount, Memory::freeCount);
181+ }
0 commit comments