xref: /aosp_15_r20/external/pdfium/core/fxcrt/fixed_try_alloc_zeroed_data_vector_unittest.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 // Copyright 2022 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_try_alloc_zeroed_data_vector.h"
6 
7 #include <limits>
8 #include <utility>
9 
10 #include "core/fxcrt/fixed_uninit_data_vector.h"
11 #include "core/fxcrt/fixed_zeroed_data_vector.h"
12 #include "core/fxcrt/span_util.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "third_party/base/containers/span.h"
16 
TEST(FixedTryAllocZeroedDataVector,NoData)17 TEST(FixedTryAllocZeroedDataVector, NoData) {
18   FixedTryAllocZeroedDataVector<int> vec;
19   EXPECT_EQ(0u, vec.size());
20   EXPECT_TRUE(vec.empty());
21   EXPECT_TRUE(vec.span().empty());
22   EXPECT_TRUE(vec.writable_span().empty());
23 }
24 
TEST(FixedTryAllocZeroedDataVector,WithData)25 TEST(FixedTryAllocZeroedDataVector, WithData) {
26   FixedTryAllocZeroedDataVector<int> vec(4);
27   EXPECT_FALSE(vec.empty());
28   EXPECT_EQ(4u, vec.size());
29   EXPECT_EQ(4u, vec.span().size());
30   EXPECT_EQ(4u, vec.writable_span().size());
31   EXPECT_THAT(vec.span(), testing::ElementsAre(0, 0, 0, 0));
32 
33   constexpr int kData[] = {1, 2, 3, 4};
34   fxcrt::spancpy(vec.writable_span(), pdfium::make_span(kData));
35   EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
36 }
37 
TEST(FixedTryAllocZeroedDataVector,AllocFailure)38 TEST(FixedTryAllocZeroedDataVector, AllocFailure) {
39   constexpr size_t kCloseToMaxByteAlloc =
40       std::numeric_limits<size_t>::max() - 100;
41   FixedTryAllocZeroedDataVector<int> vec(kCloseToMaxByteAlloc);
42   EXPECT_TRUE(vec.empty());
43   EXPECT_EQ(0u, vec.size());
44   EXPECT_EQ(0u, vec.span().size());
45   EXPECT_EQ(0u, vec.writable_span().size());
46 }
47 
TEST(FixedTryAllocZeroedDataVector,Move)48 TEST(FixedTryAllocZeroedDataVector, Move) {
49   FixedTryAllocZeroedDataVector<int> vec(4);
50   constexpr int kData[] = {1, 2, 3, 4};
51   ASSERT_EQ(4u, vec.writable_span().size());
52   fxcrt::spancpy(vec.writable_span(), pdfium::make_span(kData));
53   const int* const original_data_ptr = vec.span().data();
54 
55   FixedTryAllocZeroedDataVector<int> vec2(std::move(vec));
56   EXPECT_FALSE(vec2.empty());
57   EXPECT_EQ(4u, vec2.size());
58   EXPECT_EQ(4u, vec2.span().size());
59   EXPECT_EQ(4u, vec2.writable_span().size());
60   EXPECT_THAT(vec2.span(), testing::ElementsAre(1, 2, 3, 4));
61   EXPECT_EQ(vec2.span().data(), original_data_ptr);
62 
63   EXPECT_EQ(0u, vec.size());
64   EXPECT_TRUE(vec.empty());
65   EXPECT_TRUE(vec.span().empty());
66   EXPECT_TRUE(vec.writable_span().empty());
67 
68   vec = std::move(vec2);
69   EXPECT_FALSE(vec.empty());
70   EXPECT_EQ(4u, vec.size());
71   EXPECT_EQ(4u, vec.span().size());
72   EXPECT_EQ(4u, vec.writable_span().size());
73   EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
74   EXPECT_EQ(vec.span().data(), original_data_ptr);
75 
76   EXPECT_EQ(0u, vec2.size());
77   EXPECT_TRUE(vec2.empty());
78   EXPECT_TRUE(vec2.span().empty());
79   EXPECT_TRUE(vec2.writable_span().empty());
80 }
81 
TEST(FixedTryAllocZeroedDataVector,AssignFromFixedZeroedDataVector)82 TEST(FixedTryAllocZeroedDataVector, AssignFromFixedZeroedDataVector) {
83   FixedTryAllocZeroedDataVector<int> vec;
84 
85   FixedZeroedDataVector<int> vec2(4);
86   constexpr int kData[] = {1, 2, 3, 4};
87   ASSERT_EQ(4u, vec2.writable_span().size());
88   fxcrt::spancpy(vec2.writable_span(), pdfium::make_span(kData));
89 
90   vec = std::move(vec2);
91   EXPECT_TRUE(vec2.empty());
92   EXPECT_EQ(4u, vec.span().size());
93   EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
94 }
95 
TEST(FixedTryAllocZeroedDataVector,AssignFromFixedUninitDataVector)96 TEST(FixedTryAllocZeroedDataVector, AssignFromFixedUninitDataVector) {
97   FixedTryAllocZeroedDataVector<int> vec;
98 
99   FixedUninitDataVector<int> vec2(4);
100   constexpr int kData[] = {1, 2, 3, 4};
101   ASSERT_EQ(4u, vec2.writable_span().size());
102   fxcrt::spancpy(vec2.writable_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