1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 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_bytes/array.h"
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include <array>
18*61c4878aSAndroid Build Coastguard Worker #include <cstddef>
19*61c4878aSAndroid Build Coastguard Worker
20*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
21*61c4878aSAndroid Build Coastguard Worker
22*61c4878aSAndroid Build Coastguard Worker namespace pw::bytes {
23*61c4878aSAndroid Build Coastguard Worker namespace {
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker using std::byte;
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker template <typename T, typename U>
Equal(const T & lhs,const U & rhs)28*61c4878aSAndroid Build Coastguard Worker constexpr bool Equal(const T& lhs, const U& rhs) {
29*61c4878aSAndroid Build Coastguard Worker if (sizeof(lhs) != sizeof(rhs) || std::size(lhs) != std::size(rhs)) {
30*61c4878aSAndroid Build Coastguard Worker return false;
31*61c4878aSAndroid Build Coastguard Worker }
32*61c4878aSAndroid Build Coastguard Worker
33*61c4878aSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(lhs); ++i) {
34*61c4878aSAndroid Build Coastguard Worker if (lhs[i] != rhs[i]) {
35*61c4878aSAndroid Build Coastguard Worker return false;
36*61c4878aSAndroid Build Coastguard Worker }
37*61c4878aSAndroid Build Coastguard Worker }
38*61c4878aSAndroid Build Coastguard Worker
39*61c4878aSAndroid Build Coastguard Worker return true;
40*61c4878aSAndroid Build Coastguard Worker }
41*61c4878aSAndroid Build Coastguard Worker
42*61c4878aSAndroid Build Coastguard Worker constexpr std::array<byte, 5> kHello{
43*61c4878aSAndroid Build Coastguard Worker byte{'H'}, byte{'e'}, byte{'l'}, byte{'l'}, byte{'o'}};
44*61c4878aSAndroid Build Coastguard Worker
45*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kEllo =
46*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>('e') << 0 | static_cast<uint32_t>('l') << 8 |
47*61c4878aSAndroid Build Coastguard Worker static_cast<uint32_t>('l') << 16 | static_cast<uint32_t>('o') << 24;
48*61c4878aSAndroid Build Coastguard Worker
49*61c4878aSAndroid Build Coastguard Worker static_assert(Equal(String("Hello"), kHello));
50*61c4878aSAndroid Build Coastguard Worker static_assert(Equal(String(""), std::array<byte, 0>{}));
51*61c4878aSAndroid Build Coastguard Worker static_assert(Equal(MakeArray('H', 'e', 'l', 'l', 'o'), kHello));
52*61c4878aSAndroid Build Coastguard Worker static_assert(Equal(Concat('H', kEllo), kHello));
53*61c4878aSAndroid Build Coastguard Worker
54*61c4878aSAndroid Build Coastguard Worker constexpr std::array<byte, 3> kInit{byte{'?'}, byte{'?'}, byte{'?'}};
55*61c4878aSAndroid Build Coastguard Worker static_assert(Equal(Initialized<3>('?'), kInit));
56*61c4878aSAndroid Build Coastguard Worker
57*61c4878aSAndroid Build Coastguard Worker constexpr std::array<byte, 3> kCounting = MakeArray(0, 1, 2);
__anon03e978e90202(size_t i) 58*61c4878aSAndroid Build Coastguard Worker static_assert(Equal(Initialized<3>([](size_t i) { return i; }), kCounting));
59*61c4878aSAndroid Build Coastguard Worker
60*61c4878aSAndroid Build Coastguard Worker constexpr std::array<byte, 3> kCounting2 = MakeArray(256, 1, 2);
__anon03e978e90302(size_t i) 61*61c4878aSAndroid Build Coastguard Worker static_assert(Equal(Initialized<3>([](size_t i) { return i; }), kCounting2));
62*61c4878aSAndroid Build Coastguard Worker
63*61c4878aSAndroid Build Coastguard Worker constexpr auto kArray = Array<1, 2, 3, 255>();
64*61c4878aSAndroid Build Coastguard Worker static_assert(Equal(MakeArray(1, 2, 3, 255), kArray));
65*61c4878aSAndroid Build Coastguard Worker
66*61c4878aSAndroid Build Coastguard Worker constexpr std::array<uint8_t, 4> kUintArray = Array<uint8_t, 1, 2, 3, 255>();
67*61c4878aSAndroid Build Coastguard Worker static_assert(Equal(MakeArray<uint8_t>(1, 2, 3, 255), kUintArray));
68*61c4878aSAndroid Build Coastguard Worker
69*61c4878aSAndroid Build Coastguard Worker // Create a byte array with bytes::Concat and bytes::String and check that its
70*61c4878aSAndroid Build Coastguard Worker // contents are correct.
71*61c4878aSAndroid Build Coastguard Worker constexpr std::array<char, 2> kTestArray = {'a', 'b'};
72*61c4878aSAndroid Build Coastguard Worker
73*61c4878aSAndroid Build Coastguard Worker constexpr auto kConcatTest = bytes::Concat('a',
74*61c4878aSAndroid Build Coastguard Worker uint16_t(1),
75*61c4878aSAndroid Build Coastguard Worker uint8_t(23),
76*61c4878aSAndroid Build Coastguard Worker kTestArray,
77*61c4878aSAndroid Build Coastguard Worker bytes::String("c"),
78*61c4878aSAndroid Build Coastguard Worker uint64_t(-1));
79*61c4878aSAndroid Build Coastguard Worker
80*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest.size() == 15);
81*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[0] == byte{'a'});
82*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[1] == byte{1});
83*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[2] == byte{0});
84*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[3] == byte{23});
85*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[4] == byte{'a'});
86*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[5] == byte{'b'});
87*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[6] == byte{'c'});
88*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[7] == byte{0xff});
89*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[8] == byte{0xff});
90*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[9] == byte{0xff});
91*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[10] == byte{0xff});
92*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[11] == byte{0xff});
93*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[12] == byte{0xff});
94*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[13] == byte{0xff});
95*61c4878aSAndroid Build Coastguard Worker static_assert(kConcatTest[14] == byte{0xff});
96*61c4878aSAndroid Build Coastguard Worker
97*61c4878aSAndroid Build Coastguard Worker } // namespace
98*61c4878aSAndroid Build Coastguard Worker } // namespace pw::bytes
99