blob: 25bfcf095e89ce5bda6d0cc70c27f7655c3943a2 [file] [log] [blame]
David Srbecky052f8ca2018-04-26 15:42:54 +01001/*
2 * Copyright (C) 2018 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 "bit_table.h"
18
19#include "gtest/gtest.h"
20
21namespace art {
22
23TEST(BitTableTest, TestVarint) {
24 for (size_t start_bit_offset = 0; start_bit_offset <= 32; start_bit_offset++) {
25 uint32_t values[] = { 0, 1, 11, 12, 15, 16, 255, 256, ~1u, ~0u };
26 for (uint32_t value : values) {
27 std::vector<uint8_t> buffer;
28 size_t encode_bit_offset = start_bit_offset;
29 EncodeVarintBits(&buffer, &encode_bit_offset, value);
30
31 size_t decode_bit_offset = start_bit_offset;
32 BitMemoryRegion region(MemoryRegion(buffer.data(), buffer.size()));
33 uint32_t result = DecodeVarintBits(region, &decode_bit_offset);
34 EXPECT_EQ(encode_bit_offset, decode_bit_offset);
35 EXPECT_EQ(value, result);
36 }
37 }
38}
39
40TEST(BitTableTest, TestEmptyTable) {
41 std::vector<uint8_t> buffer;
42 size_t encode_bit_offset = 0;
43 BitTableBuilder<1> builder;
44 builder.Encode(&buffer, &encode_bit_offset);
45
46 size_t decode_bit_offset = 0;
47 BitTable<1> table(buffer.data(), buffer.size(), &decode_bit_offset);
48 EXPECT_EQ(encode_bit_offset, decode_bit_offset);
49 EXPECT_EQ(0u, table.NumRows());
50}
51
52TEST(BitTableTest, TestSingleColumnTable) {
53 constexpr uint32_t kNoValue = -1;
54 std::vector<uint8_t> buffer;
55 size_t encode_bit_offset = 0;
56 BitTableBuilder<1> builder;
57 builder.AddRow(42u);
58 builder.AddRow(kNoValue);
59 builder.AddRow(1000u);
60 builder.AddRow(kNoValue);
61 builder.Encode(&buffer, &encode_bit_offset);
62
63 size_t decode_bit_offset = 0;
64 BitTable<1> table(buffer.data(), buffer.size(), &decode_bit_offset);
65 EXPECT_EQ(encode_bit_offset, decode_bit_offset);
66 EXPECT_EQ(4u, table.NumRows());
67 EXPECT_EQ(42u, table.Get(0));
68 EXPECT_EQ(kNoValue, table.Get(1));
69 EXPECT_EQ(1000u, table.Get(2));
70 EXPECT_EQ(kNoValue, table.Get(3));
71 EXPECT_EQ(10u, table.NumColumnBits(0));
72}
73
74TEST(BitTableTest, TestUnalignedTable) {
75 for (size_t start_bit_offset = 0; start_bit_offset <= 32; start_bit_offset++) {
76 std::vector<uint8_t> buffer;
77 size_t encode_bit_offset = start_bit_offset;
78 BitTableBuilder<1> builder;
79 builder.AddRow(42u);
80 builder.Encode(&buffer, &encode_bit_offset);
81
82 size_t decode_bit_offset = start_bit_offset;
83 BitTable<1> table(buffer.data(), buffer.size(), &decode_bit_offset);
84 EXPECT_EQ(encode_bit_offset, decode_bit_offset) << " start_bit_offset=" << start_bit_offset;
85 EXPECT_EQ(1u, table.NumRows());
86 EXPECT_EQ(42u, table.Get(0));
87 }
88}
89
90TEST(BitTableTest, TestBigTable) {
91 constexpr uint32_t kNoValue = -1;
92 std::vector<uint8_t> buffer;
93 size_t encode_bit_offset = 0;
94 BitTableBuilder<4> builder;
95 builder.AddRow(42u, kNoValue, 0u, static_cast<uint32_t>(-2));
96 builder.AddRow(62u, kNoValue, 63u, static_cast<uint32_t>(-3));
97 builder.Encode(&buffer, &encode_bit_offset);
98
99 size_t decode_bit_offset = 0;
100 BitTable<4> table(buffer.data(), buffer.size(), &decode_bit_offset);
101 EXPECT_EQ(encode_bit_offset, decode_bit_offset);
102 EXPECT_EQ(2u, table.NumRows());
103 EXPECT_EQ(42u, table.Get(0, 0));
104 EXPECT_EQ(kNoValue, table.Get(0, 1));
105 EXPECT_EQ(0u, table.Get(0, 2));
106 EXPECT_EQ(static_cast<uint32_t>(-2), table.Get(0, 3));
107 EXPECT_EQ(62u, table.Get(1, 0));
108 EXPECT_EQ(kNoValue, table.Get(1, 1));
109 EXPECT_EQ(63u, table.Get(1, 2));
110 EXPECT_EQ(static_cast<uint32_t>(-3), table.Get(1, 3));
111 EXPECT_EQ(6u, table.NumColumnBits(0));
112 EXPECT_EQ(0u, table.NumColumnBits(1));
113 EXPECT_EQ(7u, table.NumColumnBits(2));
114 EXPECT_EQ(32u, table.NumColumnBits(3));
115}
116
117} // namespace art