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
pdfium_span_unittest.cpp
Go to the documentation of this file.
1// Copyright 2018 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 <stdint.h>
6
7#include <vector>
8
9#include "core/fxcrt/raw_span.h"
10#include "core/fxcrt/span.h"
11#include "core/fxcrt/unowned_ptr.h"
12#include "testing/gmock/include/gmock/gmock.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15using ::testing::AnyOf;
16using ::testing::ElementsAre;
17using ::testing::ElementsAreArray;
18
19// Tests PDFium-modifications to base::span. The name of this file is
20// chosen to avoid collisions with base's span_unittest.cc
21
23 int stuff[] = {1, 2, 3};
24 pdfium::span<int> null_span;
25 pdfium::span<int> stuff_span(stuff);
26 EXPECT_TRUE(null_span.empty());
27 EXPECT_FALSE(stuff_span.empty());
28 {
29 pdfium::span<int> empty_first_span = stuff_span.first(0u);
30 pdfium::span<int> empty_last_span = stuff_span.last(0u);
31 pdfium::span<int> empty_sub_span1 = stuff_span.subspan(0u, 0u);
32 pdfium::span<int> empty_sub_span2 = stuff_span.subspan(3u, 0u);
33 pdfium::span<int> empty_sub_span3 = stuff_span.subspan(3u);
34 EXPECT_TRUE(empty_first_span.empty());
35 EXPECT_TRUE(empty_last_span.empty());
36 EXPECT_TRUE(empty_sub_span1.empty());
37 EXPECT_TRUE(empty_sub_span2.empty());
38 EXPECT_TRUE(empty_sub_span3.empty());
39 }
40 {
41 pdfium::span<int> empty_first_span = stuff_span.first<0>();
42 pdfium::span<int> empty_last_span = stuff_span.last<0>();
43 pdfium::span<int> empty_sub_span1 = stuff_span.subspan<0, 0>();
44 pdfium::span<int> empty_sub_span2 = stuff_span.subspan<3, 0>();
45 pdfium::span<int> empty_sub_span3 = stuff_span.subspan<3>();
46 EXPECT_TRUE(empty_first_span.empty());
47 EXPECT_TRUE(empty_last_span.empty());
48 EXPECT_TRUE(empty_sub_span1.empty());
49 EXPECT_TRUE(empty_sub_span2.empty());
50 EXPECT_TRUE(empty_sub_span3.empty());
51 }
52}
53
55 int stuff[] = {1, 2, 3};
56 pdfium::span<int> stuff_span(stuff);
57 EXPECT_FALSE(stuff_span.empty());
58 {
59 pdfium::span<int> first_span = stuff_span.first(2u);
60 pdfium::span<int> last_span = stuff_span.last(2u);
61 pdfium::span<int> sub_span1 = stuff_span.subspan(1u, 1u);
62 pdfium::span<int> sub_span2 = stuff_span.subspan(2u, 1u);
63 pdfium::span<int> sub_span3 = stuff_span.subspan(1u);
64 EXPECT_THAT(first_span, ElementsAre(1, 2));
65 EXPECT_THAT(last_span, ElementsAre(2, 3));
66 EXPECT_THAT(sub_span1, ElementsAre(2));
67 EXPECT_THAT(sub_span2, ElementsAre(3));
68 EXPECT_THAT(sub_span3, ElementsAre(2, 3));
69 }
70 {
71 pdfium::span<int> first_span = stuff_span.first<2>();
72 pdfium::span<int> last_span = stuff_span.last<2>();
73 pdfium::span<int> sub_span1 = stuff_span.subspan<1, 1>();
74 pdfium::span<int> sub_span2 = stuff_span.subspan<2, 1>();
75 pdfium::span<int> sub_span3 = stuff_span.subspan<1>();
76 EXPECT_THAT(first_span, ElementsAre(1, 2));
77 EXPECT_THAT(last_span, ElementsAre(2, 3));
78 EXPECT_THAT(sub_span1, ElementsAre(2));
79 EXPECT_THAT(sub_span2, ElementsAre(3));
80 EXPECT_THAT(sub_span3, ElementsAre(2, 3));
81 }
82}
83
84// Custom implementation of front()/back().
86 int one[] = {1};
87 int stuff[] = {1, 2, 3};
88 pdfium::span<int> one_span(one);
89 pdfium::span<int> stuff_span(stuff);
90 EXPECT_EQ(one_span.front(), 1);
91 EXPECT_EQ(one_span.back(), 1);
92 EXPECT_EQ(stuff_span.front(), 1);
93 EXPECT_EQ(stuff_span.back(), 3);
94}
95
97 int32_t c_style[] = {1, 2};
98 const int32_t const_c_style[] = {3, 4};
99 std::array<int32_t, 2> cxx_style = {1, 2};
100 std::array<const int32_t, 2> const_cxx_style = {3, 4};
101
102 // Don't assume a specific endian architecture.
103 EXPECT_THAT(pdfium::as_byte_span(c_style),
104 AnyOf(ElementsAre(0, 0, 0, 1, 0, 0, 0, 2),
105 ElementsAre(1, 0, 0, 0, 2, 0, 0, 0)));
106 EXPECT_THAT(pdfium::as_writable_byte_span(c_style),
107 AnyOf(ElementsAre(0, 0, 0, 1, 0, 0, 0, 2),
108 ElementsAre(1, 0, 0, 0, 2, 0, 0, 0)));
109 EXPECT_THAT(pdfium::as_byte_span(cxx_style),
110 AnyOf(ElementsAre(0, 0, 0, 1, 0, 0, 0, 2),
111 ElementsAre(1, 0, 0, 0, 2, 0, 0, 0)));
112 EXPECT_THAT(pdfium::as_writable_byte_span(cxx_style),
113 AnyOf(ElementsAre(0, 0, 0, 1, 0, 0, 0, 2),
114 ElementsAre(1, 0, 0, 0, 2, 0, 0, 0)));
115 EXPECT_THAT(pdfium::as_byte_span(const_c_style),
116 AnyOf(ElementsAre(0, 0, 0, 3, 0, 0, 0, 4),
117 ElementsAre(3, 0, 0, 0, 4, 0, 0, 0)));
118 EXPECT_THAT(pdfium::as_byte_span(const_cxx_style),
119 AnyOf(ElementsAre(0, 0, 0, 3, 0, 0, 0, 4),
120 ElementsAre(3, 0, 0, 0, 4, 0, 0, 0)));
121}
122
124 int arr1[] = {1, 3, 5};
125 int arr2[] = {1, 3, 5};
126 std::vector vec1(std::begin(arr1), std::end(arr1));
127 std::vector vec2(std::begin(arr2), std::end(arr2));
128 pdfium::span<int, 3> static_span1(arr1);
129 pdfium::span<int, 3> static_span2(arr2);
130 pdfium::span<int> dynamic_span1(vec1);
131 pdfium::span<int> dynamic_span2(vec2);
132
133 EXPECT_THAT(arr1, ElementsAreArray(static_span2));
134 EXPECT_THAT(arr1, ElementsAreArray(dynamic_span2));
135
136 EXPECT_THAT(vec1, ElementsAreArray(static_span2));
137 EXPECT_THAT(vec1, ElementsAreArray(dynamic_span2));
138
139 EXPECT_THAT(static_span1, ElementsAre(1, 3, 5));
140 EXPECT_THAT(static_span1, ElementsAreArray(arr2));
141 EXPECT_THAT(static_span1, ElementsAreArray(static_span2));
142 EXPECT_THAT(static_span1, ElementsAreArray(dynamic_span2));
143 EXPECT_THAT(static_span1, ElementsAreArray(vec2));
144
145 EXPECT_THAT(dynamic_span1, ElementsAre(1, 3, 5));
146 EXPECT_THAT(dynamic_span1, ElementsAreArray(arr2));
147 EXPECT_THAT(dynamic_span1, ElementsAreArray(static_span2));
148 EXPECT_THAT(dynamic_span1, ElementsAreArray(dynamic_span2));
149 EXPECT_THAT(dynamic_span1, ElementsAreArray(vec2));
150}
151
153 pdfium::span<int> empty_span;
154 EXPECT_DEATH(empty_span[0] += 1, "");
155}
156
158 pdfium::span<int> empty_span;
159 EXPECT_DEATH(empty_span.front() += 1, "");
160}
161
163 pdfium::span<int> empty_span;
164 EXPECT_DEATH(empty_span.back() += 1, "");
165}
166
167#if defined(UNOWNED_PTR_DANGLING_CHECKS)
168namespace {
169
170void CreateDanglingSpan() {
171 pdfium::raw_span<int> data_span;
172 {
173 std::vector<int> data(4);
174 data_span = pdfium::make_span(data);
175 }
176}
177
178} // namespace
179
180TEST(PdfiumSpanDeathTest, DanglingReference) {
181 EXPECT_DEATH(CreateDanglingSpan(), "");
182}
183#endif // defined(UNOWNED_PTR_DANGLING_CHECKS)
TEST(FXCRYPT, MD5GenerateEmtpyData)