* Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
#include <gtest/gtest.h>
#include <cstdint>
#include <cstring>
#include "core/utils/ByteView.h"
* 默认构造应产生空视图:size=0, data=nullptr。
*/
TEST(ByteViewTest, DefaultConstructorEmpty)
{
ByteView view;
EXPECT_EQ(view.size(), 0);
EXPECT_TRUE(view.empty());
EXPECT_EQ(view.data(), nullptr);
EXPECT_EQ(view.begin(), nullptr);
EXPECT_EQ(view.end(), nullptr);
}
* uint8_t 数组模板构造,按元素个数计算 size,data 非空。
*/
TEST(ByteViewTest, TemplateConstructorFromUint8)
{
const uint8_t buf[] = {0x01, 0x02, 0x03};
ByteView view(buf, 3);
EXPECT_EQ(view.size(), 3);
EXPECT_FALSE(view.empty());
EXPECT_NE(view.data(), nullptr);
EXPECT_EQ(view[0], 0x01);
EXPECT_EQ(view[1], 0x02);
EXPECT_EQ(view[2], 0x03);
}
* int8_t 数组模板构造,负值按 uint8_t 转义正确。
*/
TEST(ByteViewTest, TemplateConstructorFromInt8)
{
const int8_t buf[] = {-1, 0, 1};
ByteView view(buf, 3);
EXPECT_EQ(view.size(), 3);
EXPECT_EQ(view[0], static_cast<uint8_t>(-1));
EXPECT_EQ(view[2], static_cast<uint8_t>(1));
}
* nullptr 入参应返回空视图,size=0, data=nullptr。
*/
TEST(ByteViewTest, NullptrYieldsEmpty)
{
ByteView view(static_cast<const uint8_t*>(nullptr), 10);
EXPECT_EQ(view.size(), 0);
EXPECT_TRUE(view.empty());
EXPECT_EQ(view.data(), nullptr);
}
* 拷贝构造/赋值:视图数据与源视图一致,且 data 指针指向同一底层缓冲区。
*/
TEST(ByteViewTest, CopySemantics)
{
const uint8_t buf[] = {0xAA, 0xBB};
ByteView original(buf, 2);
ByteView copy(original);
EXPECT_EQ(copy.size(), 2);
EXPECT_EQ(copy[0], 0xAA);
EXPECT_EQ(copy[1], 0xBB);
EXPECT_EQ(copy.data(), original.data());
const uint8_t buf2[] = {0x22, 0x33};
ByteView view(buf, 1);
ByteView other(buf2, 2);
view = other;
EXPECT_EQ(view.size(), 2);
EXPECT_EQ(view[0], 0x22);
EXPECT_EQ(view.data(), other.data());
}
* 移动构造/赋值:新视图持有源视图的数据指针。
* ByteView 为非拥有型视图,=default 移动为拷贝式搬移,
* 源对象保留有效状态(与 std::string_view 语义一致),无需清空。
*/
TEST(ByteViewTest, MoveSemantics)
{
const uint8_t buf[] = {0xCC, 0xDD};
ByteView original(buf, 2);
ByteView moved(std::move(original));
EXPECT_EQ(moved.size(), 2);
EXPECT_EQ(moved[0], 0xCC);
EXPECT_EQ(moved[1], 0xDD);
const uint8_t buf2[] = {0x44, 0x55};
ByteView other(buf2, 2);
ByteView view(buf, 1);
view = std::move(other);
EXPECT_EQ(view.size(), 2);
EXPECT_EQ(view[0], 0x44);
}
* begin/end 迭代器跨度与视图 size 一致。
*/
TEST(ByteViewTest, BeginEndIterator)
{
const uint8_t buf[] = {0x10, 0x20, 0x30};
ByteView view(buf, 3);
EXPECT_EQ(*view.begin(), 0x10);
const uint8_t* end = view.end();
EXPECT_NE(end, nullptr);
EXPECT_EQ(*(end - 1), 0x30);
EXPECT_EQ(std::distance(view.begin(), view.end()), static_cast<std::ptrdiff_t>(3));
}
* fromBuffer 静态工厂方法产生的视图与原 buffer 内容一致,且 data 指针指向同一底层缓冲区。
*/
TEST(ByteViewTest, FromBufferStaticMethod)
{
const int8_t buf[] = {7, 8, 9};
ByteView view = ByteView::fromBuffer(buf, 3);
EXPECT_EQ(view.size(), 3);
EXPECT_EQ(view[0], 7);
EXPECT_EQ(view[2], 9);
EXPECT_EQ(view.data(), reinterpret_cast<const uint8_t*>(buf));
}
* 模板构造器按 sizeof(T) 计算字节长度,而非元素个数。
*/
TEST(ByteViewTest, SizeofCalculation)
{
const int32_t buf[] = {0x01020304};
ByteView view(buf, 1);
EXPECT_EQ(view.size(), sizeof(int32_t));
}
* length=0 构造的视图 size 为 0,empty() 为 true。
*/
TEST(ByteViewTest, ZeroLengthView)
{
const uint8_t buf[] = {0x42};
ByteView view(buf, 0);
EXPECT_EQ(view.size(), 0);
EXPECT_TRUE(view.empty());
}