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.cpp127
1 files changed, 127 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..a59490f55
--- /dev/null
+++ b/src/tests/common/scratch_buffer.cpp
@@ -0,0 +1,127 @@
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 <span>
7#include <catch2/catch.hpp>
8#include "common/common_types.h"
9#include "common/scratch_buffer.h"
10
11namespace Common {
12
13TEST_CASE("ScratchBuffer: Basic Test", "[common]") {
14 ScratchBuffer<u8> buf;
15
16 REQUIRE(buf.size() == 0U);
17 REQUIRE(buf.capacity() == 0U);
18
19 std::array<u8, 10> payload;
20 payload.fill(66);
21
22 buf.resize(payload.size());
23 REQUIRE(buf.size() == payload.size());
24 REQUIRE(buf.capacity() == payload.size());
25
26 std::memcpy(buf.data(), payload.data(), payload.size());
27 for (size_t i = 0; i < payload.size(); ++i) {
28 REQUIRE(buf[i] == payload[i]);
29 }
30}
31
32TEST_CASE("ScratchBuffer: Resize Grow", "[common]") {
33 std::array<u8, 10> payload;
34 payload.fill(66);
35
36 ScratchBuffer<u8> buf(payload.size());
37 REQUIRE(buf.size() == payload.size());
38 REQUIRE(buf.capacity() == payload.size());
39
40 // Increasing the size should reallocate the buffer
41 buf.resize(payload.size() * 2);
42 REQUIRE(buf.size() == payload.size() * 2);
43 REQUIRE(buf.capacity() == payload.size() * 2);
44
45 // Since the buffer is not value initialized, reading its data will be garbage
46}
47
48TEST_CASE("ScratchBuffer: Resize Shrink", "[common]") {
49 std::array<u8, 10> payload;
50 payload.fill(66);
51
52 ScratchBuffer<u8> buf(payload.size());
53 REQUIRE(buf.size() == payload.size());
54 REQUIRE(buf.capacity() == payload.size());
55
56 std::memcpy(buf.data(), payload.data(), payload.size());
57 for (size_t i = 0; i < payload.size(); ++i) {
58 REQUIRE(buf[i] == payload[i]);
59 }
60
61 // Decreasing the size should not cause a buffer reallocation
62 // This can be tested by ensuring the buffer capacity and data has not changed,
63 buf.resize(1U);
64 REQUIRE(buf.size() == 1U);
65 REQUIRE(buf.capacity() == payload.size());
66
67 for (size_t i = 0; i < payload.size(); ++i) {
68 REQUIRE(buf[i] == payload[i]);
69 }
70}
71
72TEST_CASE("ScratchBuffer: Span Size", "[common]") {
73 std::array<u8, 10> payload;
74 payload.fill(66);
75
76 ScratchBuffer<u8> buf(payload.size());
77 REQUIRE(buf.size() == payload.size());
78 REQUIRE(buf.capacity() == payload.size());
79
80 std::memcpy(buf.data(), payload.data(), payload.size());
81 for (size_t i = 0; i < payload.size(); ++i) {
82 REQUIRE(buf[i] == payload[i]);
83 }
84
85 buf.resize(3U);
86 REQUIRE(buf.size() == 3U);
87 REQUIRE(buf.capacity() == payload.size());
88
89 const auto buf_span = std::span<u8>(buf);
90 // The span size is the last requested size of the buffer, not its capacity
91 REQUIRE(buf_span.size() == buf.size());
92
93 for (size_t i = 0; i < buf_span.size(); ++i) {
94 REQUIRE(buf_span[i] == buf[i]);
95 REQUIRE(buf_span[i] == payload[i]);
96 }
97}
98
99TEST_CASE("ScratchBuffer: Span Writes", "[common]") {
100 std::array<u8, 10> payload;
101 payload.fill(66);
102
103 ScratchBuffer<u8> buf(payload.size());
104 REQUIRE(buf.size() == payload.size());
105 REQUIRE(buf.capacity() == payload.size());
106
107 std::memcpy(buf.data(), payload.data(), payload.size());
108 for (size_t i = 0; i < payload.size(); ++i) {
109 REQUIRE(buf[i] == payload[i]);
110 }
111
112 buf.resize(3U);
113 REQUIRE(buf.size() == 3U);
114 REQUIRE(buf.capacity() == payload.size());
115
116 const auto buf_span = std::span<u8>(buf);
117 REQUIRE(buf_span.size() == buf.size());
118
119 for (size_t i = 0; i < buf_span.size(); ++i) {
120 const auto new_value = static_cast<u8>(i + 1U);
121 // Writes to a span of the scratch buffer will propogate to the buffer itself
122 buf_span[i] = new_value;
123 REQUIRE(buf[i] == new_value);
124 }
125}
126
127} // namespace Common