Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
fixed_size_data_vector_unittest.cpp
Go to the documentation of this file.
1// Copyright 2024 The PDFium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "core/fxcrt/fixed_size_data_vector.h"
6
7#include <limits>
8#include <numeric>
9#include <utility>
10
11#include "core/fxcrt/span.h"
12#include "core/fxcrt/stl_util.h"
13#include "testing/gmock/include/gmock/gmock.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
17 FixedSizeDataVector<int> vec;
18 EXPECT_EQ(0u, vec.size());
19 EXPECT_TRUE(vec.empty());
20 EXPECT_TRUE(vec.span().empty());
21}
22
23TEST(FixedSizeDataVector, UninitData) {
24 auto vec = FixedSizeDataVector<int>::Uninit(4);
25 EXPECT_FALSE(vec.empty());
26 ASSERT_EQ(4u, vec.size());
27 ASSERT_EQ(4u, vec.span().size());
28
29 constexpr int kData[] = {1, 2, 3, 4};
30 fxcrt::Copy(kData, vec.span());
31 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
32}
33
34TEST(FixedSizeDataVector, TryUninitData) {
35 auto vec = FixedSizeDataVector<int>::TryUninit(4);
36 EXPECT_FALSE(vec.empty());
37 ASSERT_EQ(4u, vec.size());
38 ASSERT_EQ(4u, vec.span().size());
39
40 constexpr int kData[] = {1, 2, 3, 4};
41 fxcrt::Copy(kData, vec.span());
42 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
43}
44
45TEST(FixedSizeDataVector, ZeroedData) {
46 auto vec = FixedSizeDataVector<int>::Zeroed(4);
47 EXPECT_FALSE(vec.empty());
48 EXPECT_EQ(4u, vec.size());
49 EXPECT_EQ(4u, vec.span().size());
50 EXPECT_THAT(vec.span(), testing::ElementsAre(0, 0, 0, 0));
51
52 constexpr int kData[] = {1, 2, 3, 4};
53 fxcrt::Copy(kData, vec.span());
54 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
55}
56
57TEST(FixedSizeDataVector, TryZeroedData) {
58 auto vec = FixedSizeDataVector<int>::TryZeroed(4);
59 EXPECT_FALSE(vec.empty());
60 ASSERT_EQ(4u, vec.size());
61 ASSERT_EQ(4u, vec.span().size());
62 EXPECT_THAT(vec.span(), testing::ElementsAre(0, 0, 0, 0));
63
64 constexpr int kData[] = {1, 2, 3, 4};
65 fxcrt::Copy(kData, vec.span());
66 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
67}
68
69TEST(FixedSizeDataVector, TryAllocFailures) {
70 constexpr size_t kCloseToMaxByteAlloc =
71 std::numeric_limits<size_t>::max() - 100;
72 auto vec = FixedSizeDataVector<int>::TryZeroed(kCloseToMaxByteAlloc);
73 EXPECT_TRUE(vec.empty());
74 EXPECT_EQ(0u, vec.size());
75 EXPECT_EQ(0u, vec.span().size());
76
77 vec = FixedSizeDataVector<int>::TryUninit(kCloseToMaxByteAlloc);
78 EXPECT_TRUE(vec.empty());
79 EXPECT_EQ(0u, vec.size());
80 EXPECT_EQ(0u, vec.span().size());
81}
82
83TEST(FixedSizeDataVector, MoveConstruct) {
84 constexpr int kData[] = {1, 2, 3, 4};
85 auto vec = FixedSizeDataVector<int>::Uninit(4);
86 ASSERT_EQ(4u, vec.span().size());
87 fxcrt::Copy(kData, vec.span());
88 const int* const original_data_ptr = vec.span().data();
89
90 FixedSizeDataVector<int> vec2(std::move(vec));
91 EXPECT_FALSE(vec2.empty());
92 EXPECT_EQ(4u, vec2.size());
93 EXPECT_EQ(4u, vec2.span().size());
94 EXPECT_THAT(vec2.span(), testing::ElementsAre(1, 2, 3, 4));
95 EXPECT_EQ(vec2.span().data(), original_data_ptr);
96
97 EXPECT_EQ(0u, vec.size());
98 EXPECT_TRUE(vec.empty());
99 EXPECT_TRUE(vec.span().empty());
100
101 vec = std::move(vec2);
102 EXPECT_FALSE(vec.empty());
103 EXPECT_EQ(4u, vec.size());
104 EXPECT_EQ(4u, vec.span().size());
105 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
106 EXPECT_EQ(vec.span().data(), original_data_ptr);
107
108 EXPECT_EQ(0u, vec2.size());
109 EXPECT_TRUE(vec2.empty());
110 EXPECT_TRUE(vec2.span().empty());
111}
112
113TEST(FixedSizeDataVector, MoveAssign) {
114 auto vec = FixedSizeDataVector<int>();
115 auto vec2 = FixedSizeDataVector<int>::Zeroed(4);
116 constexpr int kData[] = {1, 2, 3, 4};
117 ASSERT_EQ(4u, vec2.span().size());
118 fxcrt::Copy(kData, vec2.span());
119
120 vec = std::move(vec2);
121 EXPECT_TRUE(vec2.empty());
122 EXPECT_EQ(4u, vec.span().size());
123 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
124}
125
126TEST(FixedSizeDataVector, TruncatedFrom) {
127 constexpr int kData[] = {1, 2, 3, 4};
128 auto vec1 = FixedSizeDataVector<int>::Uninit(4);
129 fxcrt::Copy(kData, vec1.span());
130
131 auto vec2 = FixedSizeDataVector<int>::TruncatedFrom(std::move(vec1), 3);
132 EXPECT_EQ(0u, vec1.span().size());
133 EXPECT_EQ(nullptr, vec1.span().data());
134 EXPECT_THAT(vec2.span(), testing::ElementsAre(1, 2, 3));
135}
136
137TEST(FixedSizeDataVector, Subspan) {
138 auto vec = FixedSizeDataVector<uint32_t>::Uninit(4);
139 std::iota(vec.span().begin(), vec.span().end(), 0u);
140
141 pdfium::span<uint32_t> empty = vec.subspan(2, 0);
142 EXPECT_TRUE(empty.empty());
143
144 pdfium::span<uint32_t> first = vec.subspan(0, 1);
145 ASSERT_EQ(first.size(), 1u);
146 EXPECT_EQ(first[0], 0u);
147
148 pdfium::span<uint32_t> mids = vec.subspan(1, 2);
149 ASSERT_EQ(mids.size(), 2u);
150 EXPECT_EQ(mids[0], 1u);
151 EXPECT_EQ(mids[1], 2u);
152
153 pdfium::span<uint32_t> rest = vec.subspan(3);
154 ASSERT_EQ(rest.size(), 1u);
155 EXPECT_EQ(rest[0], 3u);
156}
157
158TEST(FixedSizeDataVector, First) {
159 auto vec = FixedSizeDataVector<uint32_t>::Uninit(4);
160 std::iota(vec.span().begin(), vec.span().end(), 0u);
161
162 pdfium::span<uint32_t> empty = vec.first(0);
163 EXPECT_TRUE(empty.empty());
164
165 pdfium::span<uint32_t> some = vec.first(2);
166 ASSERT_EQ(some.size(), 2u);
167 EXPECT_EQ(some[0], 0u);
168 EXPECT_EQ(some[1], 1u);
169}
170
171TEST(FixedSizeDataVector, Last) {
172 auto vec = FixedSizeDataVector<uint32_t>::Uninit(4);
173 std::iota(vec.span().begin(), vec.span().end(), 0u);
174
175 pdfium::span<uint32_t> empty = vec.first(0);
176 EXPECT_TRUE(empty.empty());
177
178 pdfium::span<uint32_t> some = vec.first(2);
179 ASSERT_EQ(some.size(), 2u);
180 EXPECT_EQ(some[0], 0u);
181 EXPECT_EQ(some[1], 1u);
182}
TEST(FXCRYPT, MD5GenerateEmtpyData)