diff options
author | cgyurgyik <gyurgyikcp@gmail.com> | 2020-08-11 13:38:16 -0400 |
---|---|---|
committer | cgyurgyik <gyurgyikcp@gmail.com> | 2020-08-11 13:44:53 -0400 |
commit | 667843cc07c934b7fc20de0cc86323ae5fde48ce (patch) | |
tree | 09f7a3129949eba4cb626c9a5e318363cd6bfb0e /libc/test | |
parent | bebe6a6449811e877f7eba3f1798ddd1fa83e440 (diff) | |
download | llvm-project-667843cc07c934b7fc20de0cc86323ae5fde48ce.tar.gz |
[libc] Add strtok implementation.
Reviewed By: sivachandra
Differential Revision: https://reviews.llvm.org/D85615
Diffstat (limited to 'libc/test')
-rw-r--r-- | libc/test/src/string/CMakeLists.txt | 10 | ||||
-rw-r--r-- | libc/test/src/string/strtok_test.cpp | 78 |
2 files changed, 88 insertions, 0 deletions
diff --git a/libc/test/src/string/CMakeLists.txt b/libc/test/src/string/CMakeLists.txt index f7c580dd1876..8dfffa65175c 100644 --- a/libc/test/src/string/CMakeLists.txt +++ b/libc/test/src/string/CMakeLists.txt @@ -132,6 +132,16 @@ add_libc_unittest( libc.src.string.strpbrk ) +add_libc_unittest( + strtok_test + SUITE + libc_string_unittests + SRCS + strtok_test.cpp + DEPENDS + libc.src.string.strtok +) + # Tests all implementations that can run on the host. function(add_libc_multi_impl_test name) get_property(fq_implementations GLOBAL PROPERTY ${name}_implementations) diff --git a/libc/test/src/string/strtok_test.cpp b/libc/test/src/string/strtok_test.cpp new file mode 100644 index 000000000000..311b9cf28fd4 --- /dev/null +++ b/libc/test/src/string/strtok_test.cpp @@ -0,0 +1,78 @@ +//===-- Unittests for strtok ---------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/string/strtok.h" +#include "utils/UnitTest/Test.h" + +TEST(StrTokTest, NoTokenFound) { + char empty[] = ""; + ASSERT_STREQ(__llvm_libc::strtok(empty, ""), nullptr); + ASSERT_STREQ(__llvm_libc::strtok(empty, "_"), nullptr); + + char single[] = "_"; + ASSERT_STREQ(__llvm_libc::strtok(single, ""), "_"); + + char multiple[] = "1,2"; + ASSERT_STREQ(__llvm_libc::strtok(multiple, ":"), "1,2"); +} + +TEST(StrTokTest, DelimiterAsFirstCharacterShouldBeIgnored) { + char src[] = ".123"; + ASSERT_STREQ(__llvm_libc::strtok(src, "."), "123"); +} + +TEST(StrTokTest, DelimiterIsMiddleCharacter) { + char src[] = "12,34"; + ASSERT_STREQ(__llvm_libc::strtok(src, ","), "12"); +} + +TEST(StrTokTest, DelimiterAsLastCharacterShouldBeIgnored) { + char src[] = "1234:"; + ASSERT_STREQ(__llvm_libc::strtok(src, ":"), "1234"); +} + +TEST(StrTokTest, MultipleDelimiters) { + char src[] = "12,.34"; + ASSERT_STREQ(__llvm_libc::strtok(src, "."), "12,"); + ASSERT_STREQ(__llvm_libc::strtok(src, ".,"), "12"); + ASSERT_STREQ(__llvm_libc::strtok(src, ",."), "12"); + ASSERT_STREQ(__llvm_libc::strtok(src, ":,."), "12"); +} + +TEST(StrTokTest, ShouldNotGoPastNullTerminator) { + char src[] = {'1', '2', '\0', ',', '3'}; + ASSERT_STREQ(__llvm_libc::strtok(src, ","), "12"); +} + +TEST(StrTokTest, SubsequentCallsShouldFindFollowingDelimiters) { + char src[] = "12,34.56"; + char *token = __llvm_libc::strtok(src, ",."); + ASSERT_STREQ(token, "12"); + token = __llvm_libc::strtok(nullptr, ",."); + ASSERT_STREQ(token, "34"); + token = __llvm_libc::strtok(nullptr, ",."); + ASSERT_STREQ(token, "56"); + token = __llvm_libc::strtok(nullptr, "_:,_"); + ASSERT_STREQ(token, nullptr); + // Subsequent calls after hitting the end of the string should also return + // nullptr. + token = __llvm_libc::strtok(nullptr, "_:,_"); + ASSERT_STREQ(token, nullptr); +} + +TEST(StrTokTest, DelimitersShouldNotBeIncludedInToken) { + char src[] = "__ab__:_cd__:__ef__:__"; + char *token = __llvm_libc::strtok(src, "_:"); + ASSERT_STREQ(token, "ab"); + token = __llvm_libc::strtok(nullptr, ":_"); + ASSERT_STREQ(token, "cd"); + token = __llvm_libc::strtok(nullptr, "_:,"); + ASSERT_STREQ(token, "ef"); + token = __llvm_libc::strtok(nullptr, "_:,_"); + ASSERT_STREQ(token, nullptr); +} |