xref: /llvm-project/libc/test/src/string/strtok_test.cpp (revision b6bc9d72f65a5086f310f321e969d96e9a559e75)
1667843ccScgyurgyik //===-- Unittests for strtok ---------------------------------------------===//
2667843ccScgyurgyik //
3667843ccScgyurgyik // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4667843ccScgyurgyik // See https://llvm.org/LICENSE.txt for license information.
5667843ccScgyurgyik // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6667843ccScgyurgyik //
7667843ccScgyurgyik //===----------------------------------------------------------------------===//
8667843ccScgyurgyik 
9667843ccScgyurgyik #include "src/string/strtok.h"
10af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h"
11667843ccScgyurgyik 
TEST(LlvmLibcStrTokTest,NoTokenFound)121df0dbfcSMichael Jones TEST(LlvmLibcStrTokTest, NoTokenFound) {
13667843ccScgyurgyik   char empty[] = "";
14*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(empty, ""), nullptr);
15*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(empty, "_"), nullptr);
16667843ccScgyurgyik 
17667843ccScgyurgyik   char single[] = "_";
18*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(single, ""), "_");
19667843ccScgyurgyik 
20667843ccScgyurgyik   char multiple[] = "1,2";
21*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(multiple, ":"), "1,2");
22667843ccScgyurgyik }
23667843ccScgyurgyik 
TEST(LlvmLibcStrTokTest,DelimiterAsFirstCharacterShouldBeIgnored)241df0dbfcSMichael Jones TEST(LlvmLibcStrTokTest, DelimiterAsFirstCharacterShouldBeIgnored) {
25667843ccScgyurgyik   char src[] = ".123";
26*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, "."), "123");
27667843ccScgyurgyik }
28667843ccScgyurgyik 
TEST(LlvmLibcStrTokTest,DelimiterIsMiddleCharacter)291df0dbfcSMichael Jones TEST(LlvmLibcStrTokTest, DelimiterIsMiddleCharacter) {
30667843ccScgyurgyik   char src[] = "12,34";
31*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ","), "12");
32667843ccScgyurgyik }
33667843ccScgyurgyik 
TEST(LlvmLibcStrTokTest,DelimiterAsLastCharacterShouldBeIgnored)341df0dbfcSMichael Jones TEST(LlvmLibcStrTokTest, DelimiterAsLastCharacterShouldBeIgnored) {
35667843ccScgyurgyik   char src[] = "1234:";
36*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ":"), "1234");
37667843ccScgyurgyik }
38667843ccScgyurgyik 
TEST(LlvmLibcStrTokTest,MultipleDelimiters)391df0dbfcSMichael Jones TEST(LlvmLibcStrTokTest, MultipleDelimiters) {
40667843ccScgyurgyik   char src[] = "12,.34";
41*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, "."), "12,");
42*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ".,"), "12");
43*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ",."), "12");
44*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ":,."), "12");
45667843ccScgyurgyik }
46667843ccScgyurgyik 
TEST(LlvmLibcStrTokTest,ShouldNotGoPastNullTerminator)471df0dbfcSMichael Jones TEST(LlvmLibcStrTokTest, ShouldNotGoPastNullTerminator) {
48667843ccScgyurgyik   char src[] = {'1', '2', '\0', ',', '3'};
49*b6bc9d72SGuillaume Chatelet   ASSERT_STREQ(LIBC_NAMESPACE::strtok(src, ","), "12");
50667843ccScgyurgyik }
51667843ccScgyurgyik 
TEST(LlvmLibcStrTokTest,SubsequentCallsShouldFindFollowingDelimiters)521df0dbfcSMichael Jones TEST(LlvmLibcStrTokTest, SubsequentCallsShouldFindFollowingDelimiters) {
53667843ccScgyurgyik   char src[] = "12,34.56";
54*b6bc9d72SGuillaume Chatelet   char *token = LIBC_NAMESPACE::strtok(src, ",.");
55667843ccScgyurgyik   ASSERT_STREQ(token, "12");
56*b6bc9d72SGuillaume Chatelet   token = LIBC_NAMESPACE::strtok(nullptr, ",.");
57667843ccScgyurgyik   ASSERT_STREQ(token, "34");
58*b6bc9d72SGuillaume Chatelet   token = LIBC_NAMESPACE::strtok(nullptr, ",.");
59667843ccScgyurgyik   ASSERT_STREQ(token, "56");
60*b6bc9d72SGuillaume Chatelet   token = LIBC_NAMESPACE::strtok(nullptr, "_:,_");
61667843ccScgyurgyik   ASSERT_STREQ(token, nullptr);
62667843ccScgyurgyik   // Subsequent calls after hitting the end of the string should also return
63667843ccScgyurgyik   // nullptr.
64*b6bc9d72SGuillaume Chatelet   token = LIBC_NAMESPACE::strtok(nullptr, "_:,_");
65667843ccScgyurgyik   ASSERT_STREQ(token, nullptr);
66667843ccScgyurgyik }
67667843ccScgyurgyik 
TEST(LlvmLibcStrTokTest,DelimitersShouldNotBeIncludedInToken)681df0dbfcSMichael Jones TEST(LlvmLibcStrTokTest, DelimitersShouldNotBeIncludedInToken) {
69667843ccScgyurgyik   char src[] = "__ab__:_cd__:__ef__:__";
70*b6bc9d72SGuillaume Chatelet   char *token = LIBC_NAMESPACE::strtok(src, "_:");
71667843ccScgyurgyik   ASSERT_STREQ(token, "ab");
72*b6bc9d72SGuillaume Chatelet   token = LIBC_NAMESPACE::strtok(nullptr, ":_");
73667843ccScgyurgyik   ASSERT_STREQ(token, "cd");
74*b6bc9d72SGuillaume Chatelet   token = LIBC_NAMESPACE::strtok(nullptr, "_:,");
75667843ccScgyurgyik   ASSERT_STREQ(token, "ef");
76*b6bc9d72SGuillaume Chatelet   token = LIBC_NAMESPACE::strtok(nullptr, "_:,_");
77667843ccScgyurgyik   ASSERT_STREQ(token, nullptr);
78667843ccScgyurgyik }
79