// Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 #include #include #include #include #include #include #include #include #include #include "opentelemetry/nostd/span.h" using opentelemetry::nostd::span; TEST(SpanTest, DefaultConstruction) { span s1; EXPECT_EQ(s1.data(), nullptr); EXPECT_EQ(s1.size(), 0); EXPECT_TRUE(s1.empty()); span s2; EXPECT_EQ(s2.data(), nullptr); EXPECT_EQ(s2.size(), 0); EXPECT_TRUE(s2.empty()); EXPECT_FALSE((std::is_default_constructible>::value)); } TEST(SpanTest, Assignment) { std::array array1 = {1, 2, 3}; std::array array2 = {1, 2, 3}; span s1{array1.data(), array1.size()}; span s2{array1.data(), array1.size()}; span s3; s3 = s1; EXPECT_EQ(s3.data(), array1.data()); EXPECT_EQ(s3.size(), array1.size()); span s4{array2}; s4 = s2; EXPECT_EQ(s4.data(), array1.data()); EXPECT_EQ(s4.size(), array1.size()); } TEST(SpanTest, PointerCountConstruction) { std::array array = {1, 2, 3}; span s1{array.data(), array.size()}; EXPECT_EQ(s1.data(), array.data()); EXPECT_EQ(s1.size(), array.size()); span s2{array.data(), array.size()}; EXPECT_EQ(s2.data(), array.data()); EXPECT_EQ(s2.size(), array.size()); } TEST(SpanTest, RangeConstruction) { int array[] = {1, 2, 3}; span s1{std::begin(array), std::end(array)}; EXPECT_EQ(s1.data(), array); EXPECT_EQ(s1.size(), 3); span s2{std::begin(array), std::end(array)}; EXPECT_EQ(s2.data(), array); EXPECT_EQ(s2.size(), 3); } TEST(SpanTest, ArrayConstruction) { int array1[] = {1, 2, 3}; std::array array2 = {1, 2, 3}; span s1{array1}; EXPECT_EQ(s1.data(), array1); EXPECT_EQ(s1.size(), 3); span s2{array2}; EXPECT_EQ(s2.data(), array2.data()); EXPECT_EQ(s2.size(), array2.size()); span s3{array1}; EXPECT_EQ(s3.data(), array1); EXPECT_EQ(s3.size(), 3); span s4{array2}; EXPECT_EQ(s4.data(), array2.data()); EXPECT_EQ(s4.size(), array2.size()); EXPECT_FALSE((std::is_constructible, int(&)[3]>::value)); } TEST(SpanTest, ContainerConstruction) { std::vector v = {1, 2, 3}; span s1{v}; EXPECT_EQ(s1.data(), v.data()); EXPECT_EQ(s1.size(), v.size()); span s2{v.data(), 3}; EXPECT_EQ(s2.data(), v.data()); EXPECT_EQ(s2.size(), v.size()); EXPECT_FALSE((std::is_constructible, std::vector>::value)); EXPECT_FALSE((std::is_constructible, std::list>::value)); } TEST(SpanTest, OtherSpanConstruction) { std::array array = {1, 2, 3}; span s1{array.data(), array.size()}; span s2{array.data(), array.size()}; span s3{s1}; EXPECT_EQ(s3.data(), array.data()); EXPECT_EQ(s3.size(), array.size()); span s4{s2}; EXPECT_EQ(s4.data(), array.data()); EXPECT_EQ(s4.size(), array.size()); span s5{s1}; EXPECT_EQ(s5.data(), array.data()); EXPECT_EQ(s5.size(), array.size()); EXPECT_FALSE((std::is_constructible, span>::value)); EXPECT_FALSE((std::is_constructible, span>::value)); span s6{s2}; EXPECT_EQ(s6.data(), array.data()); EXPECT_EQ(s6.size(), array.size()); span s7{s2}; EXPECT_EQ(s7.data(), array.data()); EXPECT_EQ(s7.size(), array.size()); EXPECT_FALSE((std::is_constructible, span>::value)); EXPECT_FALSE((std::is_constructible, span>::value)); } TEST(SpanTest, BracketOperator) { std::array array = {1, 2}; span s1{array.data(), array.size()}; EXPECT_EQ(s1[0], 1); EXPECT_EQ(s1[1], 2); span s2{array.data(), array.size()}; EXPECT_EQ(s2[0], 1); EXPECT_EQ(s2[1], 2); } TEST(SpanTest, Iteration) { std::array array = {1, 2, 3}; span s1{array.data(), array.size()}; EXPECT_EQ(std::distance(s1.begin(), s1.end()), static_cast(array.size())); EXPECT_TRUE(std::equal(s1.begin(), s1.end(), array.begin())); span s2{array.data(), array.size()}; EXPECT_EQ(std::distance(s2.begin(), s2.end()), static_cast(array.size())); EXPECT_TRUE(std::equal(s2.begin(), s2.end(), array.begin())); }