1*61c4878aSAndroid Build Coastguard Worker // Copyright 2024 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker #include "pw_allocator/layout.h"
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include <cstddef>
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard Worker #include "pw_result/result.h"
20*61c4878aSAndroid Build Coastguard Worker #include "pw_status/status.h"
21*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard Worker namespace {
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker using ::pw::allocator::Layout;
26*61c4878aSAndroid Build Coastguard Worker
TEST(LayoutTest,DefaultConstructor)27*61c4878aSAndroid Build Coastguard Worker TEST(LayoutTest, DefaultConstructor) {
28*61c4878aSAndroid Build Coastguard Worker Layout layout;
29*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.size(), 0U);
30*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.alignment(), alignof(std::max_align_t));
31*61c4878aSAndroid Build Coastguard Worker }
32*61c4878aSAndroid Build Coastguard Worker
TEST(LayoutTest,SizeOnlyConstructor)33*61c4878aSAndroid Build Coastguard Worker TEST(LayoutTest, SizeOnlyConstructor) {
34*61c4878aSAndroid Build Coastguard Worker constexpr size_t kSize = 512;
35*61c4878aSAndroid Build Coastguard Worker Layout layout(kSize);
36*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.size(), kSize);
37*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.alignment(), alignof(std::max_align_t));
38*61c4878aSAndroid Build Coastguard Worker }
39*61c4878aSAndroid Build Coastguard Worker
TEST(LayoutTest,FullConstructor)40*61c4878aSAndroid Build Coastguard Worker TEST(LayoutTest, FullConstructor) {
41*61c4878aSAndroid Build Coastguard Worker constexpr size_t kSize = 2048;
42*61c4878aSAndroid Build Coastguard Worker constexpr size_t kAlignment = 4;
43*61c4878aSAndroid Build Coastguard Worker Layout layout(kSize, kAlignment);
44*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.size(), kSize);
45*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.alignment(), kAlignment);
46*61c4878aSAndroid Build Coastguard Worker }
47*61c4878aSAndroid Build Coastguard Worker
TEST(LayoutTest,ConstructUsingInitializer)48*61c4878aSAndroid Build Coastguard Worker TEST(LayoutTest, ConstructUsingInitializer) {
49*61c4878aSAndroid Build Coastguard Worker constexpr size_t kSize = 1024;
50*61c4878aSAndroid Build Coastguard Worker constexpr size_t kAlignment = 8;
51*61c4878aSAndroid Build Coastguard Worker Layout layout = {kSize, kAlignment};
52*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.size(), kSize);
53*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.alignment(), kAlignment);
54*61c4878aSAndroid Build Coastguard Worker }
55*61c4878aSAndroid Build Coastguard Worker
TEST(LayoutTest,ConstructFromType)56*61c4878aSAndroid Build Coastguard Worker TEST(LayoutTest, ConstructFromType) {
57*61c4878aSAndroid Build Coastguard Worker struct Values {
58*61c4878aSAndroid Build Coastguard Worker uint8_t u8;
59*61c4878aSAndroid Build Coastguard Worker uint16_t u16;
60*61c4878aSAndroid Build Coastguard Worker uint32_t u32;
61*61c4878aSAndroid Build Coastguard Worker };
62*61c4878aSAndroid Build Coastguard Worker Layout layout = Layout::Of<Values>();
63*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.size(), sizeof(Values));
64*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.alignment(), alignof(Values));
65*61c4878aSAndroid Build Coastguard Worker }
66*61c4878aSAndroid Build Coastguard Worker
TEST(LayoutTest,Extend)67*61c4878aSAndroid Build Coastguard Worker TEST(LayoutTest, Extend) {
68*61c4878aSAndroid Build Coastguard Worker constexpr size_t kSize1 = 2048;
69*61c4878aSAndroid Build Coastguard Worker constexpr size_t kSize2 = 1024;
70*61c4878aSAndroid Build Coastguard Worker constexpr size_t kAlignment = 2;
71*61c4878aSAndroid Build Coastguard Worker Layout layout1 = {kSize1, kAlignment};
72*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout1.size(), kSize1);
73*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout1.alignment(), kAlignment);
74*61c4878aSAndroid Build Coastguard Worker
75*61c4878aSAndroid Build Coastguard Worker Layout layout2 = layout1.Extend(kSize2);
76*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout2.size(), kSize1 + kSize2);
77*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout2.alignment(), kAlignment);
78*61c4878aSAndroid Build Coastguard Worker }
79*61c4878aSAndroid Build Coastguard Worker
TEST(LayoutTest,UnwrapOk)80*61c4878aSAndroid Build Coastguard Worker TEST(LayoutTest, UnwrapOk) {
81*61c4878aSAndroid Build Coastguard Worker constexpr size_t kSize = 1024;
82*61c4878aSAndroid Build Coastguard Worker constexpr size_t kAlignment = 8;
83*61c4878aSAndroid Build Coastguard Worker pw::Result<Layout> result = Layout(kSize, kAlignment);
84*61c4878aSAndroid Build Coastguard Worker Layout layout = Layout::Unwrap(result);
85*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.size(), kSize);
86*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.alignment(), kAlignment);
87*61c4878aSAndroid Build Coastguard Worker }
88*61c4878aSAndroid Build Coastguard Worker
TEST(LayoutTest,UnwrapError)89*61c4878aSAndroid Build Coastguard Worker TEST(LayoutTest, UnwrapError) {
90*61c4878aSAndroid Build Coastguard Worker pw::Result<Layout> result = pw::Status::Unimplemented();
91*61c4878aSAndroid Build Coastguard Worker Layout layout = Layout::Unwrap(result);
92*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.size(), 0U);
93*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(layout.alignment(), alignof(std::max_align_t));
94*61c4878aSAndroid Build Coastguard Worker }
95*61c4878aSAndroid Build Coastguard Worker
96*61c4878aSAndroid Build Coastguard Worker } // namespace
97