xref: /llvm-project/libc/test/src/string/strcmp_test.cpp (revision a0c4f854cad2b97e44a1b58dc1fd982e1c4d60f3)
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