aboutsummaryrefslogtreecommitdiff
path: root/libc/test
diff options
context:
space:
mode:
authorcgyurgyik <gyurgyikcp@gmail.com>2020-08-11 13:38:16 -0400
committercgyurgyik <gyurgyikcp@gmail.com>2020-08-11 13:44:53 -0400
commit667843cc07c934b7fc20de0cc86323ae5fde48ce (patch)
tree09f7a3129949eba4cb626c9a5e318363cd6bfb0e /libc/test
parentbebe6a6449811e877f7eba3f1798ddd1fa83e440 (diff)
downloadllvm-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.txt10
-rw-r--r--libc/test/src/string/strtok_test.cpp78
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);
+}