summaryrefslogtreecommitdiff
path: root/src/tests/common/scratch_buffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/common/scratch_buffer.cpp')
-rw-r--r--src/tests/common/scratch_buffer.cpp200
1 files changed, 200 insertions, 0 deletions
diff --git a/src/tests/common/scratch_buffer.cpp b/src/tests/common/scratch_buffer.cpp
new file mode 100644
index 000000000..f6e50da4a
--- /dev/null
+++ b/src/tests/common/scratch_buffer.cpp
@@ -0,0 +1,200 @@
1// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include <algorithm>
5#include <array>
6#include <cstring>
7#include <span>
8#include <catch2/catch.hpp>
9#include "common/common_types.h"
10#include "common/scratch_buffer.h"
11
12namespace Common {
13
14TEST_CASE("ScratchBuffer: Basic Test", "[common]") {
15 ScratchBuffer<u8> buf;
16
17 REQUIRE(buf.size() == 0U);
18 REQUIRE(buf.capacity() == 0U);
19
20 std::array<u8, 10> payload;
21 payload.fill(66);
22
23 buf.resize(payload.size());
24 REQUIRE(buf.size() == payload.size());
25 REQUIRE(buf.capacity() == payload.size());
26
27 std::memcpy(buf.data(), payload.data(), payload.size());
28 for (size_t i = 0; i < payload.size(); ++i) {
29 REQUIRE(buf[i] == payload[i]);
30 }
31}
32
33TEST_CASE("ScratchBuffer: resize_destructive Grow", "[common]") {
34 std::array<u8, 10> payload;
35 payload.fill(66);
36
37 ScratchBuffer<u8> buf(payload.size());
38 REQUIRE(buf.size() == payload.size());
39 REQUIRE(buf.capacity() == payload.size());
40
41 // Increasing the size should reallocate the buffer
42 buf.resize_destructive(payload.size() * 2);
43 REQUIRE(buf.size() == payload.size() * 2);
44 REQUIRE(buf.capacity() == payload.size() * 2);
45
46 // Since the buffer is not value initialized, reading its data will be garbage
47}
48
49TEST_CASE("ScratchBuffer: resize_destructive Shrink", "[common]") {
50 std::array<u8, 10> payload;
51 payload.fill(66);
52
53 ScratchBuffer<u8> buf(payload.size());
54 REQUIRE(buf.size() == payload.size());
55 REQUIRE(buf.capacity() == payload.size());
56
57 std::memcpy(buf.data(), payload.data(), payload.size());
58 for (size_t i = 0; i < payload.size(); ++i) {
59 REQUIRE(buf[i] == payload[i]);
60 }
61
62 // Decreasing the size should not cause a buffer reallocation
63 // This can be tested by ensuring the buffer capacity and data has not changed,
64 buf.resize_destructive(1U);
65 REQUIRE(buf.size() == 1U);
66 REQUIRE(buf.capacity() == payload.size());
67
68 for (size_t i = 0; i < payload.size(); ++i) {
69 REQUIRE(buf[i] == payload[i]);
70 }
71}
72
73TEST_CASE("ScratchBuffer: resize Grow u8", "[common]") {
74 std::array<u8, 10> payload;
75 payload.fill(66);
76
77 ScratchBuffer<u8> buf(payload.size());
78 REQUIRE(buf.size() == payload.size());
79 REQUIRE(buf.capacity() == payload.size());
80
81 std::memcpy(buf.data(), payload.data(), payload.size());
82 for (size_t i = 0; i < payload.size(); ++i) {
83 REQUIRE(buf[i] == payload[i]);
84 }
85
86 // Increasing the size should reallocate the buffer
87 buf.resize(payload.size() * 2);
88 REQUIRE(buf.size() == payload.size() * 2);
89 REQUIRE(buf.capacity() == payload.size() * 2);
90
91 // resize() keeps the previous data intact
92 for (size_t i = 0; i < payload.size(); ++i) {
93 REQUIRE(buf[i] == payload[i]);
94 }
95}
96
97TEST_CASE("ScratchBuffer: resize Grow u64", "[common]") {
98 std::array<u64, 10> payload;
99 payload.fill(6666);
100
101 ScratchBuffer<u64> buf(payload.size());
102 REQUIRE(buf.size() == payload.size());
103 REQUIRE(buf.capacity() == payload.size());
104
105 std::memcpy(buf.data(), payload.data(), payload.size() * sizeof(u64));
106 for (size_t i = 0; i < payload.size(); ++i) {
107 REQUIRE(buf[i] == payload[i]);
108 }
109
110 // Increasing the size should reallocate the buffer
111 buf.resize(payload.size() * 2);
112 REQUIRE(buf.size() == payload.size() * 2);
113 REQUIRE(buf.capacity() == payload.size() * 2);
114
115 // resize() keeps the previous data intact
116 for (size_t i = 0; i < payload.size(); ++i) {
117 REQUIRE(buf[i] == payload[i]);
118 }
119}
120
121TEST_CASE("ScratchBuffer: resize Shrink", "[common]") {
122 std::array<u8, 10> payload;
123 payload.fill(66);
124
125 ScratchBuffer<u8> buf(payload.size());
126 REQUIRE(buf.size() == payload.size());
127 REQUIRE(buf.capacity() == payload.size());
128
129 std::memcpy(buf.data(), payload.data(), payload.size());
130 for (size_t i = 0; i < payload.size(); ++i) {
131 REQUIRE(buf[i] == payload[i]);
132 }
133
134 // Decreasing the size should not cause a buffer reallocation
135 // This can be tested by ensuring the buffer capacity and data has not changed,
136 buf.resize(1U);
137 REQUIRE(buf.size() == 1U);
138 REQUIRE(buf.capacity() == payload.size());
139
140 for (size_t i = 0; i < payload.size(); ++i) {
141 REQUIRE(buf[i] == payload[i]);
142 }
143}
144
145TEST_CASE("ScratchBuffer: Span Size", "[common]") {
146 std::array<u8, 10> payload;
147 payload.fill(66);
148
149 ScratchBuffer<u8> buf(payload.size());
150 REQUIRE(buf.size() == payload.size());
151 REQUIRE(buf.capacity() == payload.size());
152
153 std::memcpy(buf.data(), payload.data(), payload.size());
154 for (size_t i = 0; i < payload.size(); ++i) {
155 REQUIRE(buf[i] == payload[i]);
156 }
157
158 buf.resize(3U);
159 REQUIRE(buf.size() == 3U);
160 REQUIRE(buf.capacity() == payload.size());
161
162 const auto buf_span = std::span<u8>(buf);
163 // The span size is the last requested size of the buffer, not its capacity
164 REQUIRE(buf_span.size() == buf.size());
165
166 for (size_t i = 0; i < buf_span.size(); ++i) {
167 REQUIRE(buf_span[i] == buf[i]);
168 REQUIRE(buf_span[i] == payload[i]);
169 }
170}
171
172TEST_CASE("ScratchBuffer: Span Writes", "[common]") {
173 std::array<u8, 10> payload;
174 payload.fill(66);
175
176 ScratchBuffer<u8> buf(payload.size());
177 REQUIRE(buf.size() == payload.size());
178 REQUIRE(buf.capacity() == payload.size());
179
180 std::memcpy(buf.data(), payload.data(), payload.size());
181 for (size_t i = 0; i < payload.size(); ++i) {
182 REQUIRE(buf[i] == payload[i]);
183 }
184
185 buf.resize(3U);
186 REQUIRE(buf.size() == 3U);
187 REQUIRE(buf.capacity() == payload.size());
188
189 const auto buf_span = std::span<u8>(buf);
190 REQUIRE(buf_span.size() == buf.size());
191
192 for (size_t i = 0; i < buf_span.size(); ++i) {
193 const auto new_value = static_cast<u8>(i + 1U);
194 // Writes to a span of the scratch buffer will propogate to the buffer itself
195 buf_span[i] = new_value;
196 REQUIRE(buf[i] == new_value);
197 }
198}
199
200} // namespace Common