105e1612cScgyurgyik //===-- Unittests for strcmp ----------------------------------------------===// 205e1612cScgyurgyik // 305e1612cScgyurgyik // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 405e1612cScgyurgyik // See https://llvm.org/LICENSE.txt for license information. 505e1612cScgyurgyik // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 605e1612cScgyurgyik // 705e1612cScgyurgyik //===----------------------------------------------------------------------===// 805e1612cScgyurgyik 905e1612cScgyurgyik #include "src/string/strcmp.h" 10af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h" 1105e1612cScgyurgyik 121df0dbfcSMichael Jones TEST(LlvmLibcStrCmpTest, EmptyStringsShouldReturnZero) { 1305e1612cScgyurgyik const char *s1 = ""; 1405e1612cScgyurgyik const char *s2 = ""; 15b6bc9d72SGuillaume Chatelet int result = LIBC_NAMESPACE::strcmp(s1, s2); 1605e1612cScgyurgyik ASSERT_EQ(result, 0); 1705e1612cScgyurgyik 1805e1612cScgyurgyik // Verify operands reversed. 19b6bc9d72SGuillaume Chatelet result = LIBC_NAMESPACE::strcmp(s2, s1); 2005e1612cScgyurgyik ASSERT_EQ(result, 0); 2105e1612cScgyurgyik } 2205e1612cScgyurgyik 231df0dbfcSMichael Jones TEST(LlvmLibcStrCmpTest, EmptyStringShouldNotEqualNonEmptyString) { 2405e1612cScgyurgyik const char *empty = ""; 2505e1612cScgyurgyik const char *s2 = "abc"; 26b6bc9d72SGuillaume Chatelet int result = LIBC_NAMESPACE::strcmp(empty, s2); 2705e1612cScgyurgyik // This should be '\0' - 'a' = -97 28*a0c4f854SMichael Jones ASSERT_EQ(result, '\0' - 'a'); 2905e1612cScgyurgyik 3005e1612cScgyurgyik // Similar case if empty string is second argument. 3105e1612cScgyurgyik const char *s3 = "123"; 32b6bc9d72SGuillaume Chatelet result = LIBC_NAMESPACE::strcmp(s3, empty); 3305e1612cScgyurgyik // This should be '1' - '\0' = 49 34*a0c4f854SMichael Jones ASSERT_EQ(result, '1' - '\0'); 3505e1612cScgyurgyik } 3605e1612cScgyurgyik 371df0dbfcSMichael Jones TEST(LlvmLibcStrCmpTest, EqualStringsShouldReturnZero) { 3805e1612cScgyurgyik const char *s1 = "abc"; 3905e1612cScgyurgyik const char *s2 = "abc"; 40b6bc9d72SGuillaume Chatelet int result = LIBC_NAMESPACE::strcmp(s1, s2); 4105e1612cScgyurgyik ASSERT_EQ(result, 0); 4205e1612cScgyurgyik 4305e1612cScgyurgyik // Verify operands reversed. 44b6bc9d72SGuillaume Chatelet result = LIBC_NAMESPACE::strcmp(s2, s1); 4505e1612cScgyurgyik ASSERT_EQ(result, 0); 4605e1612cScgyurgyik } 4705e1612cScgyurgyik 481df0dbfcSMichael Jones TEST(LlvmLibcStrCmpTest, ShouldReturnResultOfFirstDifference) { 4905e1612cScgyurgyik const char *s1 = "___B42__"; 5005e1612cScgyurgyik const char *s2 = "___C55__"; 51b6bc9d72SGuillaume Chatelet int result = LIBC_NAMESPACE::strcmp(s1, s2); 5205e1612cScgyurgyik // This should return 'B' - 'C' = -1. 53*a0c4f854SMichael Jones ASSERT_EQ(result, 'B' - 'C'); 5405e1612cScgyurgyik 5505e1612cScgyurgyik // Verify operands reversed. 56b6bc9d72SGuillaume Chatelet result = LIBC_NAMESPACE::strcmp(s2, s1); 5705e1612cScgyurgyik // This should return 'C' - 'B' = 1. 58*a0c4f854SMichael Jones ASSERT_EQ(result, 'C' - 'B'); 5905e1612cScgyurgyik } 6005e1612cScgyurgyik 611df0dbfcSMichael Jones TEST(LlvmLibcStrCmpTest, CapitalizedLetterShouldNotBeEqual) { 6205e1612cScgyurgyik const char *s1 = "abcd"; 6305e1612cScgyurgyik const char *s2 = "abCd"; 64b6bc9d72SGuillaume Chatelet int result = LIBC_NAMESPACE::strcmp(s1, s2); 6505e1612cScgyurgyik // 'c' - 'C' = 32. 66*a0c4f854SMichael Jones ASSERT_EQ(result, 'c' - 'C'); 6705e1612cScgyurgyik 6805e1612cScgyurgyik // Verify operands reversed. 69b6bc9d72SGuillaume Chatelet result = LIBC_NAMESPACE::strcmp(s2, s1); 7005e1612cScgyurgyik // 'C' - 'c' = -32. 71*a0c4f854SMichael Jones ASSERT_EQ(result, 'C' - 'c'); 7205e1612cScgyurgyik } 7305e1612cScgyurgyik 741df0dbfcSMichael Jones TEST(LlvmLibcStrCmpTest, UnequalLengthStringsShouldNotReturnZero) { 7505e1612cScgyurgyik const char *s1 = "abc"; 7605e1612cScgyurgyik const char *s2 = "abcd"; 77b6bc9d72SGuillaume Chatelet int result = LIBC_NAMESPACE::strcmp(s1, s2); 7805e1612cScgyurgyik // '\0' - 'd' = -100. 79*a0c4f854SMichael Jones ASSERT_EQ(result, -'\0' - 'd'); 8005e1612cScgyurgyik 8105e1612cScgyurgyik // Verify operands reversed. 82b6bc9d72SGuillaume Chatelet result = LIBC_NAMESPACE::strcmp(s2, s1); 8305e1612cScgyurgyik // 'd' - '\0' = 100. 84*a0c4f854SMichael Jones ASSERT_EQ(result, 'd' - '\0'); 8505e1612cScgyurgyik } 8605e1612cScgyurgyik 871df0dbfcSMichael Jones TEST(LlvmLibcStrCmpTest, StringArgumentSwapChangesSign) { 8805e1612cScgyurgyik const char *a = "a"; 8905e1612cScgyurgyik const char *b = "b"; 90b6bc9d72SGuillaume Chatelet int result = LIBC_NAMESPACE::strcmp(b, a); 9105e1612cScgyurgyik // 'b' - 'a' = 1. 92*a0c4f854SMichael Jones ASSERT_EQ(result, 'b' - 'a'); 9305e1612cScgyurgyik 94b6bc9d72SGuillaume Chatelet result = LIBC_NAMESPACE::strcmp(a, b); 9505e1612cScgyurgyik // 'a' - 'b' = -1. 96*a0c4f854SMichael Jones ASSERT_EQ(result, 'a' - 'b'); 9705e1612cScgyurgyik } 98e9d571d3SAlex Brachet 99e9d571d3SAlex Brachet TEST(LlvmLibcStrCmpTest, Case) { 100e9d571d3SAlex Brachet const char *s1 = "aB"; 101e9d571d3SAlex Brachet const char *s2 = "ab"; 102b6bc9d72SGuillaume Chatelet int result = LIBC_NAMESPACE::strcmp(s1, s2); 103e9d571d3SAlex Brachet ASSERT_LT(result, 0); 104e9d571d3SAlex Brachet 105e9d571d3SAlex Brachet // Verify operands reversed. 106b6bc9d72SGuillaume Chatelet result = LIBC_NAMESPACE::strcmp(s2, s1); 107e9d571d3SAlex Brachet ASSERT_GT(result, 0); 108e9d571d3SAlex Brachet } 109