From: Bruno Haible Date: Tue, 28 Mar 2023 22:23:55 +0000 (+0200) Subject: string-desc: Add tests. X-Git-Tag: v1.0~1554 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=7e6e6fc13ae94a8a1449153a6b48e9621dcf45a2;p=gnulib.git string-desc: Add tests. * tests/test-string-desc.sh: New file. * tests/test-string-desc.c: New file. * modules/string-desc-tests: New file. --- diff --git a/ChangeLog b/ChangeLog index 2865fdea7e..3f621249b8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2023-03-28 Bruno Haible + string-desc: Add tests. + * tests/test-string-desc.sh: New file. + * tests/test-string-desc.c: New file. + * modules/string-desc-tests: New file. + string-desc: New module. * lib/string-desc.h: New file. * lib/string-desc.c: New file. diff --git a/modules/string-desc-tests b/modules/string-desc-tests new file mode 100644 index 0000000000..d7923c3a60 --- /dev/null +++ b/modules/string-desc-tests @@ -0,0 +1,12 @@ +Files: +tests/test-string-desc.sh +tests/test-string-desc.c +tests/macros.h + +Depends-on: + +configure.ac: + +Makefile.am: +TESTS += test-string-desc.sh +check_PROGRAMS += test-string-desc diff --git a/tests/test-string-desc.c b/tests/test-string-desc.c new file mode 100644 index 0000000000..53aeb68743 --- /dev/null +++ b/tests/test-string-desc.c @@ -0,0 +1,186 @@ +/* Test of string descriptors. + Copyright (C) 2023 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2023. */ + +#include + +#include "string-desc.h" + +#include +#include + +#include "macros.h" + +int +main (void) +{ + string_desc_t s0 = string_desc_new_empty (); + string_desc_t s1 = string_desc_from_c ("Hello world!"); + string_desc_t s2 = string_desc_new_addr (21, "The\0quick\0brown\0\0fox"); + + /* Test string_desc_length. */ + ASSERT (string_desc_length (s0) == 0); + ASSERT (string_desc_length (s1) == 12); + ASSERT (string_desc_length (s2) == 21); + + /* Test string_desc_char_at. */ + ASSERT (string_desc_char_at (s1, 0) == 'H'); + ASSERT (string_desc_char_at (s1, 11) == '!'); + ASSERT (string_desc_char_at (s2, 0) == 'T'); + ASSERT (string_desc_char_at (s2, 1) == 'h'); + ASSERT (string_desc_char_at (s2, 2) == 'e'); + ASSERT (string_desc_char_at (s2, 3) == '\0'); + ASSERT (string_desc_char_at (s2, 4) == 'q'); + ASSERT (string_desc_char_at (s2, 15) == '\0'); + ASSERT (string_desc_char_at (s2, 16) == '\0'); + + /* Test string_desc_data. */ + (void) string_desc_data (s0); + ASSERT (memcmp (string_desc_data (s1), "Hello world!", 12) == 0); + ASSERT (memcmp (string_desc_data (s2), "The\0quick\0brown\0\0fox", 21) == 0); + + /* Test string_desc_is_empty. */ + ASSERT (string_desc_is_empty (s0)); + ASSERT (!string_desc_is_empty (s1)); + ASSERT (!string_desc_is_empty (s2)); + + /* Test string_desc_startswith. */ + ASSERT (string_desc_startswith (s1, s0)); + ASSERT (!string_desc_startswith (s0, s1)); + ASSERT (!string_desc_startswith (s1, s2)); + ASSERT (!string_desc_startswith (s2, s1)); + ASSERT (string_desc_startswith (s2, string_desc_from_c ("The"))); + ASSERT (string_desc_startswith (s2, string_desc_new_addr (9, "The\0quick"))); + ASSERT (!string_desc_startswith (s2, string_desc_new_addr (9, "The\0quirk"))); + + /* Test string_desc_endswith. */ + ASSERT (string_desc_endswith (s1, s0)); + ASSERT (!string_desc_endswith (s0, s1)); + ASSERT (!string_desc_endswith (s1, s2)); + ASSERT (!string_desc_endswith (s2, s1)); + ASSERT (!string_desc_endswith (s2, string_desc_from_c ("fox"))); + ASSERT (string_desc_endswith (s2, string_desc_new_addr (4, "fox"))); + ASSERT (string_desc_endswith (s2, string_desc_new_addr (6, "\0\0fox"))); + ASSERT (!string_desc_endswith (s2, string_desc_new_addr (5, "\0\0ox"))); + + /* Test string_desc_cmp. */ + ASSERT (string_desc_cmp (s0, s0) == 0); + ASSERT (string_desc_cmp (s0, s1) < 0); + ASSERT (string_desc_cmp (s0, s2) < 0); + ASSERT (string_desc_cmp (s1, s0) > 0); + ASSERT (string_desc_cmp (s1, s1) == 0); + ASSERT (string_desc_cmp (s1, s2) < 0); + ASSERT (string_desc_cmp (s2, s0) > 0); + ASSERT (string_desc_cmp (s2, s1) > 0); + ASSERT (string_desc_cmp (s2, s2) == 0); + + /* Test string_desc_index. */ + ASSERT (string_desc_index (s0, 'o') == -1); + ASSERT (string_desc_index (s2, 'o') == 12); + + /* Test string_desc_last_index. */ + ASSERT (string_desc_last_index (s0, 'o') == -1); + ASSERT (string_desc_last_index (s2, 'o') == 18); + + /* Test string_desc_contains. */ + ASSERT (string_desc_contains (s0, string_desc_from_c ("ll")) == -1); + ASSERT (string_desc_contains (s1, string_desc_from_c ("ll")) == 2); + ASSERT (string_desc_contains (s1, string_desc_new_addr (1, "")) == -1); + ASSERT (string_desc_contains (s2, string_desc_new_addr (1, "")) == 3); + ASSERT (string_desc_contains (s1, string_desc_new_addr (2, "\0")) == -1); + ASSERT (string_desc_contains (s2, string_desc_new_addr (2, "\0")) == 15); + + /* Test string_desc_substring. */ + ASSERT (string_desc_cmp (string_desc_substring (s1, 2, 5), + string_desc_from_c ("llo")) == 0); + + /* Test string_desc_write. */ + ASSERT (string_desc_write (3, s0) == 0); + ASSERT (string_desc_write (3, s1) == 0); + ASSERT (string_desc_write (3, s2) == 0); + + /* Test string_desc_fwrite. */ + ASSERT (string_desc_fwrite (stdout, s0) == 0); + ASSERT (string_desc_fwrite (stdout, s1) == 0); + ASSERT (string_desc_fwrite (stdout, s2) == 0); + + /* Test string_desc_new, string_desc_set_char_at, string_desc_fill. */ + string_desc_t s4; + ASSERT (string_desc_new (&s4, 5) == 0); + string_desc_set_char_at (s4, 0, 'H'); + string_desc_set_char_at (s4, 4, 'o'); + string_desc_set_char_at (s4, 1, 'e'); + string_desc_fill (s4, 2, 4, 'l'); + ASSERT (string_desc_length (s4) == 5); + ASSERT (string_desc_startswith (s1, s4)); + + /* Test string_desc_new_filled, string_desc_set_char_at. */ + string_desc_t s5; + ASSERT (string_desc_new_filled (&s5, 5, 'l') == 0); + string_desc_set_char_at (s5, 0, 'H'); + string_desc_set_char_at (s5, 4, 'o'); + string_desc_set_char_at (s5, 1, 'e'); + ASSERT (string_desc_length (s5) == 5); + ASSERT (string_desc_startswith (s1, s5)); + + /* Test string_desc_equals. */ + ASSERT (!string_desc_equals (s1, s5)); + ASSERT (string_desc_equals (s4, s5)); + + /* Test string_desc_copy, string_desc_free. */ + { + string_desc_t s6; + ASSERT (string_desc_copy (&s6, s0) == 0); + ASSERT (string_desc_is_empty (s6)); + string_desc_free (s6); + } + { + string_desc_t s6; + ASSERT (string_desc_copy (&s6, s2) == 0); + ASSERT (string_desc_equals (s6, s2)); + string_desc_free (s6); + } + + /* Test string_desc_overwrite. */ + { + string_desc_t s7; + ASSERT (string_desc_copy (&s7, s2) == 0); + string_desc_overwrite (s7, 4, s1); + ASSERT (string_desc_equals (s7, string_desc_new_addr (21, "The\0Hello world!\0fox"))); + } + + /* Test string_desc_concat. */ + { + string_desc_t s8; + ASSERT (string_desc_concat (&s8, 3, string_desc_new_addr (10, "The\0quick"), + string_desc_new_addr (7, "brown\0"), + string_desc_new_addr (4, "fox"), + string_desc_new_addr (7, "unused")) == 0); + ASSERT (string_desc_equals (s8, s2)); + string_desc_free (s8); + } + + /* Test string_desc_c. */ + { + char *ptr = string_desc_c (s2); + ASSERT (ptr != NULL); + ASSERT (memcmp (ptr, "The\0quick\0brown\0\0fox\0", 22) == 0); + free (ptr); + } + + return 0; +} diff --git a/tests/test-string-desc.sh b/tests/test-string-desc.sh new file mode 100755 index 0000000000..1f52ccf19e --- /dev/null +++ b/tests/test-string-desc.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +./test-string-desc${EXEEXT} > test-string-desc-1.tmp 3> test-string-desc-3.tmp || exit 1 + +printf 'Hello world!The\0quick\0brown\0\0fox\0' > test-string-desc.ok + +: "${DIFF=diff}" +${DIFF} test-string-desc.ok test-string-desc-1.tmp || { echo "string_desc_fwrite KO" 1>&2; exit 1; } +${DIFF} test-string-desc.ok test-string-desc-3.tmp || { echo "string_desc_write KO" 1>&2; exit 1; } + +rm -f test-string-desc-1.tmp test-string-desc-3.tmp + +exit 0