xref: /aosp_15_r20/frameworks/minikin/tests/unittest/BufferTest.cpp (revision 834a2baab5fdfc28e9a428ee87c7ea8f6a06a53d)
1*834a2baaSAndroid Build Coastguard Worker /*
2*834a2baaSAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*834a2baaSAndroid Build Coastguard Worker  *
4*834a2baaSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*834a2baaSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*834a2baaSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*834a2baaSAndroid Build Coastguard Worker  *
8*834a2baaSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*834a2baaSAndroid Build Coastguard Worker  *
10*834a2baaSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*834a2baaSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*834a2baaSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*834a2baaSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*834a2baaSAndroid Build Coastguard Worker  * limitations under the License.
15*834a2baaSAndroid Build Coastguard Worker  */
16*834a2baaSAndroid Build Coastguard Worker 
17*834a2baaSAndroid Build Coastguard Worker #include "minikin/Buffer.h"
18*834a2baaSAndroid Build Coastguard Worker 
19*834a2baaSAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*834a2baaSAndroid Build Coastguard Worker 
21*834a2baaSAndroid Build Coastguard Worker namespace minikin {
22*834a2baaSAndroid Build Coastguard Worker 
23*834a2baaSAndroid Build Coastguard Worker class TestObject {
24*834a2baaSAndroid Build Coastguard Worker public:
writeTo(BufferWriter * writer) const25*834a2baaSAndroid Build Coastguard Worker     void writeTo(BufferWriter* writer) const {
26*834a2baaSAndroid Build Coastguard Worker         // Total size = 20
27*834a2baaSAndroid Build Coastguard Worker         // uint8_t (1)
28*834a2baaSAndroid Build Coastguard Worker         writer->write<uint8_t>(0xAB);
29*834a2baaSAndroid Build Coastguard Worker         // padding (1), uint16_t (2)
30*834a2baaSAndroid Build Coastguard Worker         writer->write<uint16_t>(0xCDEF);
31*834a2baaSAndroid Build Coastguard Worker         // uint8_t(1)
32*834a2baaSAndroid Build Coastguard Worker         writer->write<uint8_t>(0x01);
33*834a2baaSAndroid Build Coastguard Worker         // padding (3), array size (4), uint32_t (4) * 2
34*834a2baaSAndroid Build Coastguard Worker         uint32_t uint32Array[] = {0x98765432, 0x98765433};
35*834a2baaSAndroid Build Coastguard Worker         writer->writeArray<uint32_t>(uint32Array, 2);
36*834a2baaSAndroid Build Coastguard Worker         uint16_t* uint16Array = writer->reserve<uint16_t>(2 * sizeof(uint16_t));
37*834a2baaSAndroid Build Coastguard Worker         if (uint16Array != nullptr) {
38*834a2baaSAndroid Build Coastguard Worker             uint16Array[0] = 0x1234u;
39*834a2baaSAndroid Build Coastguard Worker             uint16Array[1] = 0x5678u;
40*834a2baaSAndroid Build Coastguard Worker         }
41*834a2baaSAndroid Build Coastguard Worker     }
42*834a2baaSAndroid Build Coastguard Worker };
43*834a2baaSAndroid Build Coastguard Worker 
TEST(BufferTest,testMeasureWriteRead)44*834a2baaSAndroid Build Coastguard Worker TEST(BufferTest, testMeasureWriteRead) {
45*834a2baaSAndroid Build Coastguard Worker     TestObject testObject;
46*834a2baaSAndroid Build Coastguard Worker     BufferWriter fakeWriter(nullptr);
47*834a2baaSAndroid Build Coastguard Worker     testObject.writeTo(&fakeWriter);
48*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(fakeWriter.size(), 24u);
49*834a2baaSAndroid Build Coastguard Worker     std::vector<uint8_t> buffer(fakeWriter.size());
50*834a2baaSAndroid Build Coastguard Worker 
51*834a2baaSAndroid Build Coastguard Worker     BufferWriter writer(buffer.data());
52*834a2baaSAndroid Build Coastguard Worker     testObject.writeTo(&writer);
53*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(writer.size(), buffer.size());
54*834a2baaSAndroid Build Coastguard Worker 
55*834a2baaSAndroid Build Coastguard Worker     BufferReader reader(buffer.data());
56*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data());
57*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.read<uint8_t>(), 0xABu);
58*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data() + 1u);
59*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.read<uint16_t>(), 0xCDEFu);
60*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data() + 4u);
61*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.read<uint8_t>(), 0x01u);
62*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data() + 5u);
63*834a2baaSAndroid Build Coastguard Worker     auto [uint32Array, size] = reader.readArray<uint32_t>();
64*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(size, 2u);
65*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(uint32Array[0], 0x98765432u);
66*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(uint32Array[1], 0x98765433u);
67*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data() + 20u);
68*834a2baaSAndroid Build Coastguard Worker     const uint16_t* uint16Array = reader.map<uint16_t>(4);
69*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(uint16Array[0], 0x1234u);
70*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(uint16Array[1], 0x5678u);
71*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data() + 24u);
72*834a2baaSAndroid Build Coastguard Worker }
73*834a2baaSAndroid Build Coastguard Worker 
TEST(BufferTest,testSkip)74*834a2baaSAndroid Build Coastguard Worker TEST(BufferTest, testSkip) {
75*834a2baaSAndroid Build Coastguard Worker     TestObject testObject;
76*834a2baaSAndroid Build Coastguard Worker     BufferWriter fakeWriter(nullptr);
77*834a2baaSAndroid Build Coastguard Worker     testObject.writeTo(&fakeWriter);
78*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(fakeWriter.size(), 24u);
79*834a2baaSAndroid Build Coastguard Worker     std::vector<uint8_t> buffer(fakeWriter.size());
80*834a2baaSAndroid Build Coastguard Worker 
81*834a2baaSAndroid Build Coastguard Worker     BufferWriter writer(buffer.data());
82*834a2baaSAndroid Build Coastguard Worker     testObject.writeTo(&writer);
83*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(writer.size(), buffer.size());
84*834a2baaSAndroid Build Coastguard Worker 
85*834a2baaSAndroid Build Coastguard Worker     BufferReader reader(buffer.data());
86*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data());
87*834a2baaSAndroid Build Coastguard Worker     reader.skip<uint8_t>();
88*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data() + 1u);
89*834a2baaSAndroid Build Coastguard Worker     reader.read<uint16_t>();
90*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data() + 4u);
91*834a2baaSAndroid Build Coastguard Worker     reader.skip<uint8_t>();
92*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data() + 5u);
93*834a2baaSAndroid Build Coastguard Worker     reader.skipArray<uint32_t>();
94*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data() + 20u);
95*834a2baaSAndroid Build Coastguard Worker     // No skip function for mapped data.
96*834a2baaSAndroid Build Coastguard Worker     reader.map<uint16_t>(4);
97*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(reader.current(), buffer.data() + 24u);
98*834a2baaSAndroid Build Coastguard Worker }
99*834a2baaSAndroid Build Coastguard Worker 
100*834a2baaSAndroid Build Coastguard Worker }  // namespace minikin
101