HelenOS sources
This source file includes following definitions.
- print_string_hex
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- count_diff
- PCUT_TEST
#include "pcut/asserts.h"
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <str.h>
#include <pcut/pcut.h>
#define BUFFER_SIZE 256
#define SET_BUFFER(str) snprintf(buffer, BUFFER_SIZE, "%s", str)
#define EQ(expected, value) PCUT_ASSERT_STR_EQUALS(expected, value)
PCUT_INIT;
PCUT_TEST_SUITE(str);
static char buffer[BUFFER_SIZE];
PCUT_TEST_BEFORE
{
memset(buffer, 0, BUFFER_SIZE);
}
static void print_string_hex(char *out, const char *s, size_t len)
{
*out++ = '"';
for (size_t i = 0; i < len && s[i]; i++) {
if (s[i] >= 32 && s[i] <= 126)
*out++ = s[i];
else
out += snprintf(out, 5, "\\x%02x", (uint8_t) s[i]);
}
*out++ = '"';
*out++ = 0;
}
PCUT_TEST(rtrim)
{
SET_BUFFER("foobar");
str_rtrim(buffer, ' ');
EQ("foobar", buffer);
SET_BUFFER(" foobar ");
str_rtrim(buffer, ' ');
EQ(" foobar", buffer);
SET_BUFFER(" ššš ");
str_rtrim(buffer, ' ');
EQ(" ššš", buffer);
SET_BUFFER("ššAAAšš");
str_rtrim(buffer, L'š');
EQ("ššAAA", buffer);
}
PCUT_TEST(ltrim)
{
SET_BUFFER("foobar");
str_ltrim(buffer, ' ');
EQ("foobar", buffer);
SET_BUFFER(" foobar ");
str_ltrim(buffer, ' ');
EQ("foobar ", buffer);
SET_BUFFER(" ššš ");
str_ltrim(buffer, ' ');
EQ("ššš ", buffer);
SET_BUFFER("ššAAAšš");
str_ltrim(buffer, L'š');
EQ("AAAšš", buffer);
}
PCUT_TEST(str_str_found)
{
const char *hs = "abracadabra";
const char *n = "raca";
char *p;
p = str_str(hs, n);
PCUT_ASSERT_TRUE((const char *)p == hs + 2);
}
PCUT_TEST(str_str_not_found)
{
const char *hs = "abracadabra";
const char *n = "racab";
char *p;
p = str_str(hs, n);
PCUT_ASSERT_TRUE(p == NULL);
}
PCUT_TEST(str_str_empty_n)
{
const char *hs = "abracadabra";
const char *n = "";
char *p;
p = str_str(hs, n);
PCUT_ASSERT_TRUE((const char *)p == hs);
}
PCUT_TEST(str_non_shortest)
{
const char overlong1[] = "\xC0\x80";
const char overlong2[] = "\xE0\x80\x80";
const char overlong3[] = "\xF0\x80\x80\x80";
const char overlong4[] = "\xC1\xBF";
const char overlong5[] = "\xE0\x9F\xBF";
const char overlong6[] = "\xF0\x8F\xBF\xBF";
size_t offset = 0;
PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong1, &offset, sizeof(overlong1)));
offset = 0;
PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong2, &offset, sizeof(overlong2)));
offset = 0;
PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong3, &offset, sizeof(overlong3)));
offset = 0;
PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong4, &offset, sizeof(overlong4)));
offset = 0;
PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong5, &offset, sizeof(overlong5)));
offset = 0;
PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong6, &offset, sizeof(overlong6)));
}
struct sanitize_test {
const char *input;
const char *output;
};
static const struct sanitize_test sanitize_tests[] = {
{ "", "" },
{ "Hello, world!", "Hello, world!" },
{ "Aπ你🐱", "Aπ你🐱" },
{ "A\xED\x9F\xBFZ", "A\xED\x9F\xBFZ" },
{ "A\xF4\x8F\xBF\xBFZ", "A\xF4\x8F\xBF\xBFZ" },
{ "A\xC2Z", "A?Z" },
{ "A\xE2\x82", "A??" },
{ "A\x80Y\xBFZ", "A?Y?Z" },
{ "\xC1\x81X", "??X" },
{ "\xE0\x82\xA2X", "???X" },
{ "\xF0\x80\x82\xA2X", "????X" },
{ "\xF0\x82\x82\xACX", "????X" },
{ "\xC0\x80X", "??X" },
{ "A\xED\xA0\x80Z", "A???Z" },
{ "A\xF4\x90\x80\x80Z", "A????Z" },
{ "A\xC2\xA9\xE2\x28\xA1\xF0\x9F\x98\x81\x80Z", "A©?(?😁?Z" },
};
static size_t count_diff(const char *a, const char *b, size_t n)
{
size_t count = 0;
for (size_t i = 0; i < n; i++) {
if (a[i] != b[i])
count++;
}
return count;
}
PCUT_TEST(str_sanitize)
{
char replacement = '?';
char buffer2[255];
for (size_t i = 0; i < sizeof(sanitize_tests) / sizeof(sanitize_tests[0]); i++) {
const char *in = sanitize_tests[i].input;
const char *out = sanitize_tests[i].output;
size_t n = str_size(in) + 1;
assert(str_size(out) + 1 == n);
memcpy(buffer, in, n);
size_t replaced = str_sanitize(buffer, n, replacement);
if (memcmp(buffer, out, n) != 0) {
print_string_hex(buffer2, buffer, n);
print_string_hex(buffer, out, n);
PCUT_ASSERTION_FAILED("Expected %s, got %s", buffer, buffer2);
}
size_t expect_replaced = count_diff(buffer, in, n);
PCUT_ASSERT_INT_EQUALS(expect_replaced, replaced);
}
const char *in = "ABC€";
const char *out = "ABC??\xAC";
size_t n = str_size(in) + 1;
memcpy(buffer, in, n);
size_t replaced = str_sanitize(buffer, 5, replacement);
if (memcmp(buffer, out, n) != 0) {
print_string_hex(buffer2, buffer, n);
print_string_hex(buffer, out, n);
PCUT_ASSERTION_FAILED("Expected %s, got %s", buffer, buffer2);
}
PCUT_ASSERT_INT_EQUALS(2, replaced);
}
PCUT_EXPORT(str);
HelenOS homepage, sources at GitHub