1b1994897Sopenharmony_ci/** 2b1994897Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3b1994897Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4b1994897Sopenharmony_ci * you may not use this file except in compliance with the License. 5b1994897Sopenharmony_ci * You may obtain a copy of the License at 6b1994897Sopenharmony_ci * 7b1994897Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8b1994897Sopenharmony_ci * 9b1994897Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10b1994897Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11b1994897Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12b1994897Sopenharmony_ci * See the License for the specific language governing permissions and 13b1994897Sopenharmony_ci * limitations under the License. 14b1994897Sopenharmony_ci */ 15b1994897Sopenharmony_ci 16b1994897Sopenharmony_ci#include "utils/span.h" 17b1994897Sopenharmony_ci 18b1994897Sopenharmony_ci#include <array> 19b1994897Sopenharmony_ci#include <gtest/gtest.h> 20b1994897Sopenharmony_ci#include <memory> 21b1994897Sopenharmony_ci#include <string> 22b1994897Sopenharmony_ci#include <vector> 23b1994897Sopenharmony_ci 24b1994897Sopenharmony_cinamespace panda::test::span { 25b1994897Sopenharmony_ci 26b1994897Sopenharmony_citemplate <class T> 27b1994897Sopenharmony_cistd::string ToString(Span<T> s) 28b1994897Sopenharmony_ci{ 29b1994897Sopenharmony_ci std::ostringstream oss; 30b1994897Sopenharmony_ci for (const auto &e : s) { 31b1994897Sopenharmony_ci oss << e << " "; 32b1994897Sopenharmony_ci } 33b1994897Sopenharmony_ci return oss.str(); 34b1994897Sopenharmony_ci} 35b1994897Sopenharmony_citemplate <class T> 36b1994897Sopenharmony_ciSpan<T> Double(Span<T> s) 37b1994897Sopenharmony_ci{ 38b1994897Sopenharmony_ci for (auto &e : s) { 39b1994897Sopenharmony_ci e *= 2; 40b1994897Sopenharmony_ci } 41b1994897Sopenharmony_ci return s; 42b1994897Sopenharmony_ci} 43b1994897Sopenharmony_ci 44b1994897Sopenharmony_ciTEST(Span, Conversions) 45b1994897Sopenharmony_ci{ 46b1994897Sopenharmony_ci int c[] {1, 2, 3}; 47b1994897Sopenharmony_ci std::vector v {4, 5, 6}; 48b1994897Sopenharmony_ci const std::vector const_v {-4, -5, -6}; 49b1994897Sopenharmony_ci std::array a {7, 8, 9}; 50b1994897Sopenharmony_ci size_t sz = 3; 51b1994897Sopenharmony_ci auto p = std::make_unique<int[]>(sz); 52b1994897Sopenharmony_ci p[0] = 10; 53b1994897Sopenharmony_ci p[1] = 11; 54b1994897Sopenharmony_ci p[2] = 12; 55b1994897Sopenharmony_ci std::string s = " !\""; 56b1994897Sopenharmony_ci 57b1994897Sopenharmony_ci EXPECT_EQ(ToString(Double(Span(c))), "2 4 6 "); 58b1994897Sopenharmony_ci EXPECT_EQ(ToString(Double(Span(v))), "8 10 12 "); 59b1994897Sopenharmony_ci EXPECT_EQ(ToString(Span(const_v)), "-4 -5 -6 "); 60b1994897Sopenharmony_ci EXPECT_EQ(ToString(Double(Span(a))), "14 16 18 "); 61b1994897Sopenharmony_ci EXPECT_EQ(ToString(Double(Span(p.get(), sz))), "20 22 24 "); 62b1994897Sopenharmony_ci EXPECT_EQ(ToString(Double(Span(p.get(), p.get() + 2))), "40 44 "); 63b1994897Sopenharmony_ci EXPECT_EQ(ToString(Double(Span(s))), "@ B D "); 64b1994897Sopenharmony_ci} 65b1994897Sopenharmony_ci 66b1994897Sopenharmony_ciTEST(Span, SubSpan) 67b1994897Sopenharmony_ci{ 68b1994897Sopenharmony_ci int c[] {1, 2, 3, 4, 5}; 69b1994897Sopenharmony_ci auto s = Span(c).SubSpan(1, 3); 70b1994897Sopenharmony_ci auto f = s.First(2); 71b1994897Sopenharmony_ci auto l = s.Last(2); 72b1994897Sopenharmony_ci 73b1994897Sopenharmony_ci EXPECT_EQ(ToString(s), "2 3 4 "); 74b1994897Sopenharmony_ci EXPECT_EQ(ToString(f), "2 3 "); 75b1994897Sopenharmony_ci EXPECT_EQ(ToString(l), "3 4 "); 76b1994897Sopenharmony_ci} 77b1994897Sopenharmony_ci 78b1994897Sopenharmony_ciTEST(Span, SubSpanT) 79b1994897Sopenharmony_ci{ 80b1994897Sopenharmony_ci { 81b1994897Sopenharmony_ci uint8_t buf[] = {1, 1, 1, 1, 1, 0, 0, 0, 2, 0, 0, 0, 0x78, 0x56, 0x34, 0x12, 0xfe, 0xff, 0xff, 0xff}; 82b1994897Sopenharmony_ci struct Foo { 83b1994897Sopenharmony_ci uint32_t a; 84b1994897Sopenharmony_ci int32_t b; 85b1994897Sopenharmony_ci }; 86b1994897Sopenharmony_ci auto sp = Span(buf); 87b1994897Sopenharmony_ci#ifndef NDEBUG 88b1994897Sopenharmony_ci ASSERT_DEATH(sp.SubSpan<Foo>(4, 3), ".*"); 89b1994897Sopenharmony_ci ASSERT_DEATH(sp.SubSpan<Foo>(3, 2), ".*"); 90b1994897Sopenharmony_ci#endif 91b1994897Sopenharmony_ci auto sub_sp = sp.SubSpan<Foo>(4, 2); 92b1994897Sopenharmony_ci ASSERT_EQ(sub_sp.size(), 2U); 93b1994897Sopenharmony_ci ASSERT_EQ(sub_sp[0].a, 1U); 94b1994897Sopenharmony_ci ASSERT_EQ(sub_sp[0].b, 2); 95b1994897Sopenharmony_ci ASSERT_EQ(sub_sp[1].a, 0x12345678U); 96b1994897Sopenharmony_ci ASSERT_EQ(sub_sp[1].b, -2); 97b1994897Sopenharmony_ci } 98b1994897Sopenharmony_ci { 99b1994897Sopenharmony_ci uint32_t buf[] = {0x01020304, 0x05060708, 0x090a0b0c}; 100b1994897Sopenharmony_ci auto sp = Span(buf); 101b1994897Sopenharmony_ci#ifndef NDEBUG 102b1994897Sopenharmony_ci ASSERT_DEATH(sp.SubSpan<uint16_t>(4, 1), ".*"); 103b1994897Sopenharmony_ci#endif 104b1994897Sopenharmony_ci auto sub_sp = sp.SubSpan<uint16_t>(1, 4); 105b1994897Sopenharmony_ci ASSERT_EQ(sub_sp.size(), 4U); 106b1994897Sopenharmony_ci ASSERT_EQ(sub_sp[0], 0x0708); 107b1994897Sopenharmony_ci ASSERT_EQ(sub_sp[1], 0x0506); 108b1994897Sopenharmony_ci ASSERT_EQ(sub_sp[2], 0x0b0c); 109b1994897Sopenharmony_ci ASSERT_EQ(sub_sp[3], 0x090a); 110b1994897Sopenharmony_ci } 111b1994897Sopenharmony_ci} 112b1994897Sopenharmony_ci 113b1994897Sopenharmony_ciTEST(Span, AsBytes) 114b1994897Sopenharmony_ci{ 115b1994897Sopenharmony_ci const int c1[] {1, 2, 3}; 116b1994897Sopenharmony_ci int c2[] {4, 5, 6}; 117b1994897Sopenharmony_ci auto cs = Span(c1); 118b1994897Sopenharmony_ci auto s = Span(c2); 119b1994897Sopenharmony_ci EXPECT_EQ(cs.SizeBytes(), 12U); 120b1994897Sopenharmony_ci EXPECT_EQ(AsBytes(cs)[sizeof(int)], static_cast<std::byte>(2)); 121b1994897Sopenharmony_ci AsWritableBytes(s)[4] = static_cast<std::byte>(1); 122b1994897Sopenharmony_ci EXPECT_EQ(s[1], 1); 123b1994897Sopenharmony_ci} 124b1994897Sopenharmony_ci 125b1994897Sopenharmony_ci} // namespace panda::test::span 126