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_util.h"
12#include "testing/gmock/include/gmock/gmock.h"
13#include "testing/gtest/include/gtest/gtest.h"
14#include "third_party/base/containers/span.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::spancpy(vec.span(), pdfium::make_span(kData));
31 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
32}
33
34TEST(FixedSizeDataVector, ZeroedData) {
35 auto vec = FixedSizeDataVector<int>::Zeroed(4);
36 EXPECT_FALSE(vec.empty());
37 EXPECT_EQ(4u, vec.size());
38 EXPECT_EQ(4u, vec.span().size());
39 EXPECT_THAT(vec.span(), testing::ElementsAre(0, 0, 0, 0));
40
41 constexpr int kData[] = {1, 2, 3, 4};
42 fxcrt::spancpy(vec.span(), pdfium::make_span(kData));
43 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
44}
45
46TEST(FixedSizeDataVector, TryZeroedData) {
47 auto vec = FixedSizeDataVector<int>::TryZeroed(4);
48 EXPECT_FALSE(vec.empty());
49 ASSERT_EQ(4u, vec.size());
50 ASSERT_EQ(4u, vec.span().size());
51 EXPECT_THAT(vec.span(), testing::ElementsAre(0, 0, 0, 0));
52
53 constexpr int kData[] = {1, 2, 3, 4};
54 fxcrt::spancpy(vec.span(), pdfium::make_span(kData));
55 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
56}
57
58TEST(FixedSizeDataVector, TryAllocFailure) {
59 constexpr size_t kCloseToMaxByteAlloc =
60 std::numeric_limits<size_t>::max() - 100;
61 auto vec = FixedSizeDataVector<int>::TryZeroed(kCloseToMaxByteAlloc);
62 EXPECT_TRUE(vec.empty());
63 EXPECT_EQ(0u, vec.size());
64 EXPECT_EQ(0u, vec.span().size());
65}
66
67TEST(FixedSizeDataVector, MoveConstruct) {
68 constexpr int kData[] = {1, 2, 3, 4};
69 auto vec = FixedSizeDataVector<int>::Uninit(4);
70 ASSERT_EQ(4u, vec.span().size());
71 fxcrt::spancpy(vec.span(), pdfium::make_span(kData));
72 const int* const original_data_ptr = vec.span().data();
73
74 FixedSizeDataVector<int> vec2(std::move(vec));
75 EXPECT_FALSE(vec2.empty());
76 EXPECT_EQ(4u, vec2.size());
77 EXPECT_EQ(4u, vec2.span().size());
78 EXPECT_THAT(vec2.span(), testing::ElementsAre(1, 2, 3, 4));
79 EXPECT_EQ(vec2.span().data(), original_data_ptr);
80
81 EXPECT_EQ(0u, vec.size());
82 EXPECT_TRUE(vec.empty());
83 EXPECT_TRUE(vec.span().empty());
84
85 vec = std::move(vec2);
86 EXPECT_FALSE(vec.empty());
87 EXPECT_EQ(4u, vec.size());
88 EXPECT_EQ(4u, vec.span().size());
89 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
90 EXPECT_EQ(vec.span().data(), original_data_ptr);
91
92 EXPECT_EQ(0u, vec2.size());
93 EXPECT_TRUE(vec2.empty());
94 EXPECT_TRUE(vec2.span().empty());
95}
96
97TEST(FixedSizeDataVector, MoveAssign) {
98 auto vec = FixedSizeDataVector<int>();
99 auto vec2 = FixedSizeDataVector<int>::Zeroed(4);
100 constexpr int kData[] = {1, 2, 3, 4};
101 ASSERT_EQ(4u, vec2.span().size());
102 fxcrt::spancpy(vec2.span(), pdfium::make_span(kData));
103
104 vec = std::move(vec2);
105 EXPECT_TRUE(vec2.empty());
106 EXPECT_EQ(4u, vec.span().size());
107 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
108}
109
110TEST(FixedSizeDataVector, Subspan) {
111 auto vec = FixedSizeDataVector<uint32_t>::Uninit(4);
112 std::iota(vec.span().begin(), vec.span().end(), 0u);
113
114 pdfium::span<uint32_t> empty = vec.subspan(2, 0);
115 EXPECT_TRUE(empty.empty());
116
117 pdfium::span<uint32_t> first = vec.subspan(0, 1);
118 ASSERT_EQ(first.size(), 1u);
119 EXPECT_EQ(first[0], 0u);
120
121 pdfium::span<uint32_t> mids = vec.subspan(1, 2);
122 ASSERT_EQ(mids.size(), 2u);
123 EXPECT_EQ(mids[0], 1u);
124 EXPECT_EQ(mids[1], 2u);
125
126 pdfium::span<uint32_t> rest = vec.subspan(3);
127 ASSERT_EQ(rest.size(), 1u);
128 EXPECT_EQ(rest[0], 3u);
129}
130
131TEST(FixedSizeDataVector, First) {
132 auto vec = FixedSizeDataVector<uint32_t>::Uninit(4);
133 std::iota(vec.span().begin(), vec.span().end(), 0u);
134
135 pdfium::span<uint32_t> empty = vec.first(0);
136 EXPECT_TRUE(empty.empty());
137
138 pdfium::span<uint32_t> some = vec.first(2);
139 ASSERT_EQ(some.size(), 2u);
140 EXPECT_EQ(some[0], 0u);
141 EXPECT_EQ(some[1], 1u);
142}
143
144TEST(FixedSizeDataVector, Last) {
145 auto vec = FixedSizeDataVector<uint32_t>::Uninit(4);
146 std::iota(vec.span().begin(), vec.span().end(), 0u);
147
148 pdfium::span<uint32_t> empty = vec.first(0);
149 EXPECT_TRUE(empty.empty());
150
151 pdfium::span<uint32_t> some = vec.first(2);
152 ASSERT_EQ(some.size(), 2u);
153 EXPECT_EQ(some[0], 0u);
154 EXPECT_EQ(some[1], 1u);
155}
TEST(FXCRYPT, MD5GenerateEmtpyData)