DryChem 1.0.0
A generic, compile-time C++ toolbox with no dependencies for the modern computational chemistry project.
Loading...
Searching...
No Matches
testCaseInsensitiveStrings.hpp
Go to the documentation of this file.
1// Copyright (c) 2020-2025 Cody R. Drisko. All rights reserved.
2// Licensed under the MIT License. See the LICENSE file in the project root for more information.
3//
4// Name: testCaseInsensitiveStrings.hpp
5// Author: crdrisko
6// Date: 11/03/2020-08:39:39
7// Description: Provides ~100% unit test coverage over the case-insensitive string comparisons
8
9#ifndef DRYCHEM_COMMON_UTILITIES_LIBS_STRINGS_TESTS_TESTUTILITIES_TESTCASEINSENSITIVESTRINGS_HPP
10#define DRYCHEM_COMMON_UTILITIES_LIBS_STRINGS_TESTS_TESTUTILITIES_TESTCASEINSENSITIVESTRINGS_HPP
11
12#include <iostream>
13#include <iterator>
14#include <sstream>
15#include <string>
16
18#include <gtest/gtest.h>
19
20GTEST_TEST(testCaseInsensitiveStrings, only_a_to_z_charsAreConvertedToUpperCase)
21{
22 for (char ch = 0; ch < 127; ++ch)
23 {
24 if (ch >= 'a' && ch <= 'z')
25 ASSERT_TRUE((ch - 'a' + 'A') == DryChem::ci_char_traits::ct_toupper(ch));
26 else
27 ASSERT_TRUE(ch == DryChem::ci_char_traits::ct_toupper(ch));
28 }
29
30 static_assert('A' == DryChem::ci_char_traits::ct_toupper('a'), "'a' wasn't converted to 'A'.");
31}
32
33GTEST_TEST(testCaseInsensitiveStrings, ci_char_traits_compare_ConvertsBothArgsToUpperCaseBeforeComparison)
34{
35 static_assert(DryChem::ci_char_traits::compare("hello", "hElLoWorld", 11) == -1, "s2 should be greater than s1.");
36 static_assert(DryChem::ci_char_traits::compare("hello", "hElLo", 6) == 0, "The two strings should be equal.");
37 static_assert(DryChem::ci_char_traits::compare("helloworld", "hElLo", 6) == 1, "s1 should be greater than s2.");
38}
39
40GTEST_TEST(testCaseInsensitiveStrings, ci_char_traits_find_ConvertsBothArgsToUpperCaseBeforeSearching)
41{
42 const char word[12] {"Hello World"};
43
44 const char* actualResult = DryChem::ci_char_traits::find(word, std::size(word), 'w');
45 const char* expectedResult = std::char_traits<char>::find(word, std::size(word), 'W');
46 ASSERT_EQ(*actualResult, *expectedResult);
47
48 actualResult = DryChem::ci_char_traits::find(word, std::size(word), 's');
49 ASSERT_FALSE(actualResult); // false because no match
50
51 actualResult = DryChem::ci_char_traits::find(word, 0, 's');
52 ASSERT_FALSE(actualResult); // false because count == 0
53}
54
55GTEST_TEST(testCaseInsensitiveStrings, ci_char_traits_eq_ConvertsBothArgsToUpperCaseBeforeComparison)
56{
57 static_assert(!std::char_traits<char>::eq('t', 'T'), "'t' should not be equal to 'T'.");
58 static_assert(DryChem::ci_char_traits::eq('t', 'T'), "'t' should be equal to 'T'.");
59}
60
61GTEST_TEST(testCaseInsensitiveStrings, ci_char_traits_lt_ConvertsBothArgsToUpperCaseBeforeComparison)
62{
63 static_assert(std::char_traits<char>::lt('Z', 'a'), "'Z' should be less than 'a'.");
64 static_assert(!DryChem::ci_char_traits::lt('Z', 'a'), "'Z' should not be less than 'a'.");
65}
66
67GTEST_TEST(testCaseInsensitiveStrings, allComparisonOperatorsAreSupportedForA_ci_string)
68{
69 DryChem::ci_string lower = "test";
70 DryChem::ci_string upper = "TEST";
71 DryChem::ci_string longer = "THis_iS_A_tEsT";
72
73 ASSERT_TRUE(lower == upper);
74 ASSERT_TRUE(longer != upper);
75 ASSERT_TRUE(lower < longer);
76 ASSERT_TRUE(longer > upper);
77 ASSERT_TRUE(lower <= upper);
78 ASSERT_TRUE(longer >= lower);
79}
80
81GTEST_TEST(testCaseInsensitiveStrings, char_traitsCanBeCastIntoOtherchar_traits)
82{
83 std::string lower = "test";
84 std::string upper = "TEST";
85
86 DryChem::ci_string ci_lower = DryChem::traits_cast<DryChem::ci_char_traits>(lower);
87 DryChem::ci_string ci_upper = DryChem::traits_cast<DryChem::ci_char_traits>(upper);
88
89 ASSERT_TRUE(lower > upper);
90 ASSERT_TRUE(ci_lower == ci_upper);
91 ASSERT_FALSE(DryChem::traits_cast<std::char_traits<char>>(ci_lower) == upper);
92}
93
94GTEST_TEST(testCaseInsensitiveStrings, a_ci_stringCanUseAllNormalStringMemberFunctions)
95{
96 DryChem::ci_string ci_lower = "SomE LOng StRInG";
97
98 ASSERT_EQ(DryChem::ci_string::npos, ci_lower.find("x"));
99 ASSERT_EQ(1ul, ci_lower.find_first_not_of("s"));
100 ASSERT_EQ(2ul, ci_lower.find_first_of("m"));
101 ASSERT_EQ(15ul, ci_lower.find_last_not_of("x"));
102 ASSERT_EQ(12ul, ci_lower.find_last_of("r"));
103 ASSERT_EQ(16ul, ci_lower.length());
104}
105
106GTEST_TEST(testCaseInsensitiveStrings, ci_stringsCanBePrintedJustLikeNormalStrings)
107{
108 using namespace DryChem;
109 testing::internal::CaptureStdout();
110
111 ci_string str = "THIS is A casE-InsensiTivE StrinG.";
112
113 std::cout << str << std::endl;
114
115 ci_string actualOutput = traits_cast<ci_char_traits>(testing::internal::GetCapturedStdout());
116 ASSERT_EQ(actualOutput, "this is a case-insensitive string.\n");
117}
118
119#endif
Allow for a shorter namespace name for less using statements.
Definition errors.hpp:23
GTEST_TEST(testCaseInsensitiveStrings, only_a_to_z_charsAreConvertedToUpperCase)
Definition testCaseInsensitiveStrings.hpp:20