1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "dictionary/utils/byte_array_utils.h"
18 
19 #include <gtest/gtest.h>
20 
21 #include <cstdint>
22 
23 namespace latinime {
24 namespace {
25 
TEST(ByteArrayUtilsTest,TestReadCodePointTable)26 TEST(ByteArrayUtilsTest, TestReadCodePointTable) {
27     const int codePointTable[] = { 0x6f, 0x6b };
28     const uint8_t buffer[] = { 0x20u, 0x21u, 0x00u, 0x01u, 0x00u };
29     int pos = 0;
30     // Expect the first entry of codePointTable
31     EXPECT_EQ(0x6f, ByteArrayUtils::readCodePointAndAdvancePosition(buffer, codePointTable, &pos));
32     // Expect the second entry of codePointTable
33     EXPECT_EQ(0x6b, ByteArrayUtils::readCodePointAndAdvancePosition(buffer, codePointTable, &pos));
34     // Expect the original code point from buffer[2] to buffer[4], 0x100
35     // It isn't picked from the codePointTable, since it exceeds the range of the codePointTable.
36     EXPECT_EQ(0x100, ByteArrayUtils::readCodePointAndAdvancePosition(buffer, codePointTable, &pos));
37 }
38 
TEST(ByteArrayUtilsTest,TestReadInt)39 TEST(ByteArrayUtilsTest, TestReadInt) {
40     const uint8_t buffer[] = { 0x1u, 0x8Au, 0x0u, 0xAAu };
41 
42     EXPECT_EQ(0x01u, ByteArrayUtils::readUint8(buffer, 0));
43     EXPECT_EQ(0x8Au, ByteArrayUtils::readUint8(buffer, 1));
44     EXPECT_EQ(0x0u, ByteArrayUtils::readUint8(buffer, 2));
45     EXPECT_EQ(0xAAu, ByteArrayUtils::readUint8(buffer, 3));
46 
47     EXPECT_EQ(0x018Au, ByteArrayUtils::readUint16(buffer, 0));
48     EXPECT_EQ(0x8A00u, ByteArrayUtils::readUint16(buffer, 1));
49     EXPECT_EQ(0xAAu, ByteArrayUtils::readUint16(buffer, 2));
50 
51     EXPECT_EQ(0x18A00AAu, ByteArrayUtils::readUint32(buffer, 0));
52 
53     int pos = 0;
54     EXPECT_EQ(0x18A00, ByteArrayUtils::readSint24AndAdvancePosition(buffer, &pos));
55     pos = 1;
56     EXPECT_EQ(-0xA00AA, ByteArrayUtils::readSint24AndAdvancePosition(buffer, &pos));
57 }
58 
TEST(ByteArrayUtilsTest,TestWriteAndReadInt)59 TEST(ByteArrayUtilsTest, TestWriteAndReadInt) {
60     uint8_t buffer[4];
61 
62     int pos = 0;
63     const uint8_t data_1B = 0xC8;
64     ByteArrayUtils::writeUintAndAdvancePosition(buffer, data_1B, 1, &pos);
65     EXPECT_EQ(data_1B, ByteArrayUtils::readUint(buffer, 1, 0));
66 
67     pos = 0;
68     const uint32_t data_4B = 0xABCD1234;
69     ByteArrayUtils::writeUintAndAdvancePosition(buffer, data_4B, 4, &pos);
70     EXPECT_EQ(data_4B, ByteArrayUtils::readUint(buffer, 4, 0));
71 }
72 
TEST(ByteArrayUtilsTest,TestReadCodePoint)73 TEST(ByteArrayUtilsTest, TestReadCodePoint) {
74     const uint8_t buffer[] = { 0x10, 0xFF, 0x00u, 0x20u, 0x41u, 0x1Fu, 0x60 };
75 
76     EXPECT_EQ(0x10FF00, ByteArrayUtils::readCodePoint(buffer, 0));
77     EXPECT_EQ(0x20, ByteArrayUtils::readCodePoint(buffer, 3));
78     EXPECT_EQ(0x41, ByteArrayUtils::readCodePoint(buffer, 4));
79     EXPECT_EQ(NOT_A_CODE_POINT, ByteArrayUtils::readCodePoint(buffer, 5));
80 
81     int pos = 0;
82     int codePointArray[3];
83     EXPECT_EQ(3, ByteArrayUtils::readStringAndAdvancePosition(buffer, MAX_WORD_LENGTH, nullptr,
84             codePointArray, &pos));
85     EXPECT_EQ(0x10FF00, codePointArray[0]);
86     EXPECT_EQ(0x20, codePointArray[1]);
87     EXPECT_EQ(0x41, codePointArray[2]);
88     EXPECT_EQ(0x60, ByteArrayUtils::readCodePoint(buffer, pos));
89 }
90 
TEST(ByteArrayUtilsTest,TestWriteAndReadCodePoint)91 TEST(ByteArrayUtilsTest, TestWriteAndReadCodePoint) {
92     uint8_t buffer[10];
93 
94     const int codePointArray[] = { 0x10FF00, 0x20, 0x41 };
95     int pos = 0;
96     ByteArrayUtils::writeCodePointsAndAdvancePosition(buffer, codePointArray, 3,
97             true /* writesTerminator */, &pos);
98     EXPECT_EQ(0x10FF00, ByteArrayUtils::readCodePoint(buffer, 0));
99     EXPECT_EQ(0x20, ByteArrayUtils::readCodePoint(buffer, 3));
100     EXPECT_EQ(0x41, ByteArrayUtils::readCodePoint(buffer, 4));
101     EXPECT_EQ(NOT_A_CODE_POINT, ByteArrayUtils::readCodePoint(buffer, 5));
102 }
103 
104 }  // namespace
105 }  // namespace latinime
106