// SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package #include "catch.hpp" #include "sls/logger.h" #include #include #include "sls/string_utils.h" namespace sls { TEST_CASE("copy a string") { char src[10] = "hej"; REQUIRE(src[3] == '\0'); char dst[20]; strcpy_safe(dst, src); REQUIRE(dst[0] == 'h'); REQUIRE(dst[1] == 'e'); REQUIRE(dst[2] == 'j'); REQUIRE(dst[3] == '\0'); } #ifdef NDEBUG // This test can only run in release since we assert on the length of the string TEST_CASE("copy a long string") { auto src = "some very very long sting that does not fit"; char dst[3]; strcpy_safe(dst, src); REQUIRE(dst[0] == 's'); REQUIRE(dst[1] == 'o'); REQUIRE(dst[2] == '\0'); } #endif TEST_CASE("split a string with end delimiter") { std::string s("abra+kadabra+"); auto r = split(s, '+'); REQUIRE(r.size() == 2); REQUIRE(r[0] == "abra"); REQUIRE(r[1] == "kadabra"); } TEST_CASE("split a string without end delimiter") { std::string s("abra+kadabra+filibom"); auto r = split(s, '+'); REQUIRE(r.size() == 3); REQUIRE(r[0] == "abra"); REQUIRE(r[1] == "kadabra"); REQUIRE(r[2] == "filibom"); } TEST_CASE("Remove char from string") { char str[] = "sometest"; removeChar(str, 'e'); REQUIRE(std::string(str) == "somtst"); } TEST_CASE("Remove char from empty string") { char str[50] = {}; removeChar(str, 'e'); REQUIRE(std::string(str).empty()); } TEST_CASE("Many characters in a row") { char str[] = "someeequitellll::ongstring"; removeChar(str, 'l'); REQUIRE(std::string(str) == "someeequite::ongstring"); } TEST_CASE("Check is string is integer") { REQUIRE(is_int("75")); REQUIRE(is_int("11675")); REQUIRE_FALSE(is_int("7.5")); REQUIRE_FALSE(is_int("hej")); REQUIRE_FALSE(is_int("7a")); REQUIRE_FALSE(is_int("")); } TEST_CASE("Replace substring in string") { std::string s = "this string should be replaced"; auto r = replace_first(&s, "string ", ""); REQUIRE(r == true); REQUIRE(s == "this should be replaced"); } TEST_CASE("Replace --help in command") { std::string s = "sls_detector_get --help exptime"; auto r = replace_first(&s, " --help", ""); REQUIRE(r == true); REQUIRE(s == "sls_detector_get exptime"); } TEST_CASE("Replace -h in command") { std::string s = "sls_detector_get -h exptime"; auto r = replace_first(&s, " -h", ""); REQUIRE(r == true); REQUIRE(s == "sls_detector_get exptime"); } TEST_CASE("replace --help") { std::string s = "list --help"; auto r = replace_first(&s, " --help", ""); REQUIRE(r == true); REQUIRE(s == "list"); } TEST_CASE("port host") { std::string hostport = "localhost:1954"; auto res = ParseHostPort(hostport); REQUIRE(res.first == "localhost"); REQUIRE(res.second == 1954); } TEST_CASE("port missing") { // TODO! is this the intended result? std::string host = "localhost"; auto res = ParseHostPort(host); REQUIRE(res.first == "localhost"); REQUIRE(res.second == 0); } TEST_CASE("to_lower converts uppercase to lowercase") { REQUIRE(to_lower("HELLO") == "hello"); REQUIRE(to_lower("Hello World") == "hello world"); } TEST_CASE("to_lower leaves an already lowercase string unchanged") { REQUIRE(to_lower("already lower") == "already lower"); } TEST_CASE("to_lower only affects alphabetic characters") { REQUIRE(to_lower("ABC123!?_-XYZ") == "abc123!?_-xyz"); } TEST_CASE("to_lower on an empty string returns an empty string") { REQUIRE(to_lower("").empty()); } TEST_CASE("to_lower does not modify the original string") { std::string original = "MixedCase"; auto result = to_lower(original); REQUIRE(result == "mixedcase"); // the source string must be untouched REQUIRE(original == "MixedCase"); } // TEST_CASE("concat things not being strings") } // namespace sls