1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
/*
* SPDX-FileCopyrightText: 2016-2016 CSSlayer <wengxt@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
*/
#include "fcitx-utils/charutils.h"
#include "fcitx-utils/log.h"
#include "fcitx-utils/macros.h"
#include "fcitx-utils/stringutils.h"
using namespace fcitx;
int main() {
FCITX_ASSERT(stringutils::startsWith("abc", "ab"));
FCITX_ASSERT(!stringutils::startsWith("abc", "abd"));
FCITX_ASSERT(!stringutils::startsWith("abc", "abcd"));
FCITX_ASSERT(stringutils::startsWith("abc", ""));
FCITX_ASSERT(!stringutils::endsWith("abc", "ab"));
FCITX_ASSERT(stringutils::endsWith("abc", "abc"));
FCITX_ASSERT(!stringutils::endsWith("abc", "eabc"));
std::string trim = " ab c\td\n";
auto pair = stringutils::trimInplace(trim);
auto start = pair.first, end = pair.second;
FCITX_ASSERT(start == 1);
FCITX_ASSERT(end == 7);
FCITX_ASSERT(trim.compare(start, end - start, "ab c\td") == 0);
pair = stringutils::trimInplace("\t\n\r ");
start = pair.first;
end = pair.second;
FCITX_ASSERT(start == end);
std::string_view testView = stringutils::trimView("\t\n\r ");
FCITX_ASSERT(testView.empty());
auto replace_result = stringutils::replaceAll("abcabc", "a", "b");
FCITX_ASSERT(replace_result == "bbcbbc");
{
#define REPEAT 2049
char largeReplace[3 * REPEAT + 1];
char largeReplaceCorrect[REPEAT + 1];
char largeReplaceCorrect2[4 * REPEAT + 1];
int i = 0, j = 0, k = 0;
for (int n = 0; n < REPEAT; n++) {
largeReplace[i++] = 'a';
largeReplace[i++] = 'b';
largeReplace[i++] = 'c';
largeReplaceCorrect[j++] = 'e';
largeReplaceCorrect2[k++] = 'a';
largeReplaceCorrect2[k++] = 'b';
largeReplaceCorrect2[k++] = 'c';
largeReplaceCorrect2[k++] = 'd';
}
largeReplace[i] = '\0';
largeReplaceCorrect[j] = '\0';
largeReplaceCorrect2[k] = '\0';
auto replace_result = stringutils::replaceAll(largeReplace, "abc", "e");
FCITX_ASSERT(replace_result == largeReplaceCorrect);
auto replace_result2 =
stringutils::replaceAll(replace_result, "e", "abcd");
FCITX_ASSERT(replace_result2 == largeReplaceCorrect2);
}
FCITX_ASSERT(stringutils::replaceAll("ababba", "a", "cc") == "ccbccbbcc");
FCITX_ASSERT(stringutils::replaceAll("\"a\nb\"", "\"", "\\\"") ==
"\\\"a\nb\\\"");
FCITX_ASSERT(stringutils::backwardSearch("abcabc", "bc", 0) ==
std::string::npos);
FCITX_ASSERT(stringutils::backwardSearch("abcabc", "bc", 1) == 1);
FCITX_ASSERT(stringutils::backwardSearch("abcabc", "bc", 2) == 1);
FCITX_ASSERT(stringutils::backwardSearch("abcabc", "bc", 3) == 1);
FCITX_ASSERT(stringutils::backwardSearch("abcabc", "bc", 4) == 4);
FCITX_ASSERT(stringutils::backwardSearch("abcabc", "bc", 5) == 4);
FCITX_ASSERT(stringutils::backwardSearch("abcabc", "bc", 6) == 4);
FCITX_ASSERT(stringutils::backwardSearch("abcabc", "bc", 7) ==
std::string::npos);
FCITX_ASSERT(stringutils::backwardSearch("abcabc", "bc", 8) ==
std::string::npos);
FCITX_ASSERT((stringutils::split("a b c", FCITX_WHITESPACE) ==
std::vector<std::string>{"a", "b", "c"}));
FCITX_ASSERT((stringutils::split("a b ", FCITX_WHITESPACE) ==
std::vector<std::string>{"a", "b"}));
FCITX_ASSERT(stringutils::split(" ", FCITX_WHITESPACE).empty());
const char *p = "def";
FCITX_ASSERT(stringutils::concat().empty());
FCITX_ASSERT(stringutils::concat("abc", 1, p) == "abc1def");
FCITX_ASSERT(stringutils::joinPath("/", 1, p) == "/1/def");
FCITX_ASSERT(stringutils::joinPath("/abc", 1, p) == "/abc/1/def");
FCITX_ASSERT(stringutils::joinPath("///abc", 1, p) == "///abc/1/def");
FCITX_ASSERT(stringutils::joinPath("///abc") == "///abc");
FCITX_ASSERT(stringutils::joinPath("///") == "///");
FCITX_ASSERT(stringutils::joinPath("abc") == "abc");
FCITX_ASSERT(stringutils::split(",dvorak", ",",
stringutils::SplitBehavior::KeepEmpty) ==
(std::vector<std::string>{"", "dvorak"}));
FCITX_ASSERT(stringutils::split(",dvorak,,", ",",
stringutils::SplitBehavior::KeepEmpty) ==
(std::vector<std::string>{"", "dvorak", "", ""}));
FCITX_ASSERT(stringutils::split("dvorak", ",",
stringutils::SplitBehavior::KeepEmpty) ==
(std::vector<std::string>{"dvorak"}));
FCITX_ASSERT(
stringutils::split("", ",", stringutils::SplitBehavior::KeepEmpty) ==
(std::vector<std::string>{""}));
FCITX_ASSERT(stringutils::escapeForValue("\"") == R"("\"")");
FCITX_ASSERT(stringutils::escapeForValue("\"\"\n") == R"("\"\"\n")");
FCITX_ASSERT(stringutils::escapeForValue("abc") == R"(abc)");
FCITX_ASSERT(stringutils::escapeForValue("ab\"c") == R"("ab\"c")");
FCITX_ASSERT(stringutils::escapeForValue("a c") == R"("a c")");
for (int i = 0; i < 16; i++) {
if (i < 10) {
FCITX_ASSERT(charutils::toHex(i) == i + '0');
} else {
FCITX_ASSERT(charutils::toHex(i) == i - 10 + 'a');
}
}
std::string_view str = "abc";
FCITX_ASSERT(!stringutils::consumePrefix(str, "ae"));
FCITX_ASSERT(str == "abc");
FCITX_ASSERT(stringutils::consumePrefix(str, "ab"));
FCITX_ASSERT(str == "c");
return 0;
}
|