SmartOS/Test/BufferTest.cpp

158 lines
4.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "Kernel\Sys.h"
#if DEBUG
static void TestAssign()
{
byte buf[] = { 1, 2, 3, 4 };
byte bts[] = { 5, 6, 7, 8, 9, 10 };
Buffer bs(buf, sizeof(buf));
auto err = "Buffer& operator = (const void* ptr)";
// 从指针拷贝,使用我的长度
bs = bts;
assert(bs.GetBuffer() == buf, err);
assert(bs.GetBuffer() != bts, err);
assert(bs.Length() == sizeof(buf), err);
assert(buf[0] == bts[0] && buf[3] == bts[3], err);
}
static void TestAssign2()
{
byte buf[] = { 1, 2, 3, 4 };
byte bts[] = { 5, 6, 7 };
Buffer bs(buf, sizeof(buf));
Buffer bs2(bts, sizeof(bts));
auto err = "Buffer& operator = (const Buffer& rhs)";
// 从另一个对象拷贝数据和长度,长度不足且扩容失败时报错
// Buffer无法自动扩容Arrar可以
//bs2 = bs;
bs = bs2;
assert(bs.GetBuffer() == buf, err);
assert(bs.GetBuffer() != bts, err);
assert(bs.Length() == sizeof(bts), err);
assert(bs.Length() != sizeof(buf), err);
assert(buf[0] == bts[0] && buf[2] == bts[2], err);
assert(buf[3] == 4, err);
}
static void TestCopy(const Buffer& bs)
{
byte buf[5];
buf[4] = '\0';
Buffer bs2(buf, 4);
auto cs = bs.GetBuffer();
auto err = "Buffer& operator = (const Buffer& rhs)";
// 拷贝长度为两者最小者,除非当前对象能自动扩容
//bs2 = bs;
bs2.Copy(0, bs, 0, -1);
debug_printf("bs2 = bs => %s\r\n", buf);
assert(bs2.GetBuffer() != bs.GetBuffer(), err);
assert(bs2 != bs, err);
assert(bs2.Length() == 4, err);
assert(bs2 == cs, err);
err = "Buffer& operator = (const void* p)";
// 从指针拷贝,使用我的长度
bs2 = cs + 8;
debug_printf("bs2 = cs + 8 => %s\r\n", buf);
assert(bs2.GetBuffer() != (byte*)(cs + 8), err);
assert(bs2.Length() == 4, err);
assert(bs2 == cs + 8, err);
}
static void TestCopy2()
{
byte buf[] = { 1, 2, 3, 4 };
Buffer bs(buf, sizeof(buf));
auto err = "自我局部拷贝,不重叠";
// 拷贝123覆盖自己的234结果应该是1123而不是1111
bs.Copy(1, buf, 3);
assert(buf[1] == 1, err);
assert(buf[2] == 2, err);
assert(buf[3] == 3, err);
}
void Buffer::Test()
{
TS("TestBuffer");
// 使用指针和长度构造一个内存区
char cs[] = "This is Buffer Test.";
Buffer bs(cs, sizeof(cs));
debug_printf("Buffer bs(cs, strlen(cs)) => %s\r\n", cs);
assert(bs.GetBuffer() == (byte*)cs, "GetBuffer()");
assert(bs == cs, "Buffer(void* p = nullptr, int len = 0)");
TestAssign();
TestAssign2();
TestCopy(bs);
TestCopy2();
// 设置数组长度。只能缩小不能扩大,子类可以扩展以实现自动扩容
bs.SetLength(11);
cs[11] = '\0';
debug_printf("SetLength(11) => %s\r\n", cs);
assert(bs.Length() == 11, "bool SetLength(int len, bool bak = false)");
assert(bs == cs, "bool SetLength(int len, bool bak = false)");
// 索引访问
bs[8]++;
debug_printf("bs[8]++ => %s\r\n", cs);
assert(cs[8] == 'C', "byte& operator[](int i)");
assert(bs == cs, "byte& operator[](int i)");
// 拷贝数据,默认-1长度表示当前长度
char abc[] = "abcd";
bs.Copy(5, abc, sizeof(abc));
debug_printf("Copy(5, \"abcd\", %d) => %s\r\n", sizeof(abc), cs);
assert(cs[5] == 'a' && cs[8] == 'd', "int Copy(int destIndex, const void* src, int len)");
// 把数据复制到目标缓冲区,默认-1长度表示当前长度
char ef[4];
ef[3] = 0;
bs.CopyTo(1, ef, 3);
debug_printf("CopyTo(1, ef, 3) => %s\r\n", ef);
assert(ef[0] == 'h' && ef[2] == 's', "int CopyTo(int srcIndex, void* dest, int len)");
// 用指定字节设置初始化一个区域
bs.Set('x', 3, 2);
debug_printf("Set('x', 3, 2) => %s\r\n", cs);
assert(cs[3] == 'x' || cs[4] == 'x', "int Set(byte item, int index, int len)");
// 截取一个子缓冲区
auto bs3 = bs.Sub(3, 2);
debug_printf("bs.Sub(3, 2) => %s\r\n", bs3.GetBuffer());
assert(bs3.GetBuffer() == (byte*)(cs + 3), "Buffer Sub(int index, int len)");
assert(bs3[0] == 'x' || bs3[1] == 'x', "Buffer Sub(int index, int len)");
bs.Clear();
assert(cs[0] == 0 && cs[bs.Length() - 1] == 0, "void Clear()");
// 转为十六进制字符串
byte bts[] = { 0xAB, 0x34, 0xfe };
Buffer bs4(bts, 3);
auto str = bs4.ToHex('#', 2);
assert(str == "AB#34\r\nFE", "String ToHex(char sep = 0, int newLine = 0)");
auto str2 = bs4.ToString();
assert(str2 == "AB-34-FE", "String ToString()");
Buffer bs5(cs, sizeof(cs));
debug_printf("Buffer(T (&arr)[N]) => %s\r\n", cs);
assert(bs5.GetBuffer() == (byte*)cs, "Buffer(T (&arr)[N])");
assert(bs5 == cs, "Buffer(void* p = nullptr, int len = 0)");
/*Buffer bs7(cs);
auto type = bs5.GetType();
Buffer bs6(type);*/
debug_printf("内存缓冲区单元测试全部通过!\r\n");
}
#endif