#include "hdr/types/size_t.h"
#include "hdr/types/wchar_t.h"
#include "src/wchar/wcstok.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcWCSTokReentrantTest, NoTokenFound) {
{
wchar_t empty[] = L"";
wchar_t *reserve = nullptr;
ASSERT_EQ(LIBC_NAMESPACE::wcstok(empty, L"", &reserve), nullptr);
ASSERT_EQ(LIBC_NAMESPACE::wcstok(empty, L"", &reserve), nullptr);
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L"", &reserve), nullptr);
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L"", &reserve), nullptr);
}
{
wchar_t empty[] = L"";
wchar_t *reserve = nullptr;
ASSERT_EQ(LIBC_NAMESPACE::wcstok(empty, L"_", &reserve), nullptr);
ASSERT_EQ(LIBC_NAMESPACE::wcstok(empty, L"_", &reserve), nullptr);
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L"_", &reserve), nullptr);
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L"_", &reserve), nullptr);
}
{
wchar_t single[] = L"_";
wchar_t *reserve = nullptr;
ASSERT_EQ(LIBC_NAMESPACE::wcstok(single, L"_", &reserve), nullptr);
ASSERT_EQ(LIBC_NAMESPACE::wcstok(single, L"_", &reserve), nullptr);
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L"_", &reserve), nullptr);
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L"_", &reserve), nullptr);
}
{
wchar_t multiple[] = L"1,2";
wchar_t *reserve = nullptr;
wchar_t *tok = LIBC_NAMESPACE::wcstok(multiple, L":", &reserve);
ASSERT_TRUE(tok[0] == L'1');
ASSERT_TRUE(tok[1] == L',');
ASSERT_TRUE(tok[2] == L'2');
ASSERT_TRUE(tok[3] == L'\0');
tok = LIBC_NAMESPACE::wcstok(multiple, L":", &reserve);
ASSERT_TRUE(tok[0] == L'1');
ASSERT_TRUE(tok[1] == L',');
ASSERT_TRUE(tok[2] == L'2');
ASSERT_TRUE(tok[3] == L'\0');
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L":", &reserve), nullptr);
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L":", &reserve), nullptr);
}
}
TEST(LlvmLibcWCSTokReentrantTest, DelimiterAsFirstCharacterShouldBeIgnored) {
wchar_t src[] = L".123";
wchar_t *reserve = nullptr;
wchar_t *tok = LIBC_NAMESPACE::wcstok(src, L".", &reserve);
ASSERT_TRUE(tok[0] == L'1');
ASSERT_TRUE(tok[1] == L'2');
ASSERT_TRUE(tok[2] == L'3');
ASSERT_TRUE(tok[3] == L'\0');
tok = LIBC_NAMESPACE::wcstok(src, L".", &reserve);
ASSERT_TRUE(tok[0] == L'1');
ASSERT_TRUE(tok[1] == L'2');
ASSERT_TRUE(tok[2] == L'3');
ASSERT_TRUE(tok[3] == L'\0');
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L".", &reserve), nullptr);
}
TEST(LlvmLibcWCSTokReentrantTest, DelimiterIsMiddleCharacter) {
wchar_t src[] = L"12,34";
wchar_t *reserve = nullptr;
wchar_t *tok = LIBC_NAMESPACE::wcstok(src, L",", &reserve);
ASSERT_TRUE(tok[0] == L'1');
ASSERT_TRUE(tok[1] == L'2');
ASSERT_TRUE(tok[2] == L'\0');
tok = LIBC_NAMESPACE::wcstok(src, L",", &reserve);
ASSERT_TRUE(tok[0] == L'1');
ASSERT_TRUE(tok[1] == L'2');
ASSERT_TRUE(tok[2] == L'\0');
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L",", &reserve), nullptr);
}
TEST(LlvmLibcWCSTokReentrantTest, DelimiterAsLastCharacterShouldBeIgnored) {
wchar_t src[] = L"1234:";
wchar_t *reserve = nullptr;
wchar_t *tok = LIBC_NAMESPACE::wcstok(src, L":", &reserve);
ASSERT_TRUE(tok[0] == L'1');
ASSERT_TRUE(tok[1] == L'2');
ASSERT_TRUE(tok[2] == L'3');
ASSERT_TRUE(tok[3] == L'4');
ASSERT_TRUE(tok[4] == L'\0');
tok = LIBC_NAMESPACE::wcstok(src, L":", &reserve);
ASSERT_TRUE(tok[0] == L'1');
ASSERT_TRUE(tok[1] == L'2');
ASSERT_TRUE(tok[2] == L'3');
ASSERT_TRUE(tok[3] == L'4');
ASSERT_TRUE(tok[4] == L'\0');
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L":", &reserve), nullptr);
}
TEST(LlvmLibcWCSTokReentrantTest, ShouldNotGoPastNullTerminator) {
wchar_t src[] = {L'1', L'2', L'\0', L',', L'3'};
wchar_t *reserve = nullptr;
wchar_t *tok = LIBC_NAMESPACE::wcstok(src, L",", &reserve);
ASSERT_TRUE(tok[0] == L'1');
ASSERT_TRUE(tok[1] == L'2');
ASSERT_TRUE(tok[2] == L'\0');
tok = LIBC_NAMESPACE::wcstok(src, L",", &reserve);
ASSERT_TRUE(tok[0] == L'1');
ASSERT_TRUE(tok[1] == L'2');
ASSERT_TRUE(tok[2] == L'\0');
ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L",", &reserve), nullptr);
}
TEST(LlvmLibcWCSTokReentrantTest,
ShouldReturnNullptrWhenBothSrcAndSaveptrAreNull) {
wchar_t *src = nullptr;
wchar_t *reserve = nullptr;
ASSERT_EQ(LIBC_NAMESPACE::wcstok(src, L",", &reserve), nullptr);
ASSERT_EQ(src, nullptr);
ASSERT_EQ(reserve, nullptr);
}
TEST(LlvmLibcWCSTokReentrantTest,
SubsequentCallsShouldFindFollowingDelimiters) {
wchar_t src[] = L"12,34.56";
wchar_t *reserve = nullptr;
wchar_t *token = LIBC_NAMESPACE::wcstok(src, L",.", &reserve);
ASSERT_TRUE(token[0] == L'1');
ASSERT_TRUE(token[1] == L'2');
ASSERT_TRUE(token[2] == L'\0');
token = LIBC_NAMESPACE::wcstok(nullptr, L",.", &reserve);
ASSERT_TRUE(token[0] == L'3');
ASSERT_TRUE(token[1] == L'4');
ASSERT_TRUE(token[2] == L'\0');
token = LIBC_NAMESPACE::wcstok(nullptr, L",.", &reserve);
ASSERT_TRUE(token[0] == L'5');
ASSERT_TRUE(token[1] == L'6');
ASSERT_TRUE(token[2] == L'\0');
token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,_", &reserve);
ASSERT_EQ(token, nullptr);
token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,_", &reserve);
ASSERT_EQ(token, nullptr);
}
TEST(LlvmLibcWCSTokReentrantTest, DelimitersShouldNotBeIncludedInToken) {
wchar_t src[] = L"__ab__:_cd__:__ef__:__";
wchar_t *reserve = nullptr;
wchar_t *token = LIBC_NAMESPACE::wcstok(src, L"_:", &reserve);
ASSERT_TRUE(token[0] == L'a');
ASSERT_TRUE(token[1] == L'b');
ASSERT_TRUE(token[2] == L'\0');
token = LIBC_NAMESPACE::wcstok(nullptr, L":_", &reserve);
ASSERT_TRUE(token[0] == L'c');
ASSERT_TRUE(token[1] == L'd');
ASSERT_TRUE(token[2] == L'\0');
token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,", &reserve);
ASSERT_TRUE(token[0] == L'e');
ASSERT_TRUE(token[1] == L'f');
ASSERT_TRUE(token[2] == L'\0');
token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,_", &reserve);
ASSERT_EQ(token, nullptr);
}