glib/glib/tests/refstring.c
Emmanuele Bassi 5e64ee3af7 Drop a questionable test from the refstring suite
Testing that an interned string is released once its last reference is
dropped is not possible without a hook into the interning machinery;
just checking that the returned pointer for the same string is going to
be different after the last release() is not guaranteed to work, as the
systema allocator is perfectly within its rights to recycle pointers, as
long as they are unique while valid.

Closes #1467
2018-08-02 12:21:38 +01:00

118 lines
3.4 KiB
C

/* refstring.c: Reference counted strings
*
* Copyright 2018 Emmanuele Bassi
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#include <glib.h>
#include <string.h>
/* test_refstring_base: Test the base API of GRefString */
static void
test_refstring_base (void)
{
char *s = g_ref_string_new ("hello, world");
g_test_message ("s = '%s' (%p)", s, s);
g_assert_cmpint (strcmp (s, "hello, world"), ==, 0);
g_assert_cmpint (strlen (s), ==, strlen ("hello, world"));
g_assert_cmpuint (g_ref_string_length (s), ==, strlen ("hello, world"));
g_assert_true (g_ref_string_acquire (s) == s);
g_ref_string_release (s);
g_ref_string_release (s);
}
/* test_refstring_length: Test the _len variant */
static void
test_refstring_length (void)
{
char buf[] = {'h', 'e', 'l', 'l', 'o'}; /* no NUL */
char *s = g_ref_string_new_len (buf, 5);
g_assert_cmpstr (s, ==, "hello");
g_assert_cmpint (strlen (s), ==, strlen ("hello"));
g_assert_cmpuint (g_ref_string_length (s), ==, strlen ("hello"));
g_ref_string_release (s);
}
/* test_refstring_length: Test the _len variant with no size set */
static void
test_refstring_length_auto (void)
{
char *s = g_ref_string_new_len ("hello", -1);
g_assert_cmpstr (s, ==, "hello");
g_assert_cmpuint (g_ref_string_length (s), ==, strlen ("hello"));
g_ref_string_release (s);
}
/* test_refstring_length_nuls: Test the _len variant */
static void
test_refstring_length_nuls (void)
{
char buf[] = {'h', 'e', '\0', 'l', 'o'}; /* no NUL */
char *s = g_ref_string_new_len (buf, 5);
g_assert_cmpstr (s, ==, "he");
g_assert_cmpint (memcmp (s, "he\0lo", 5), ==, 0);
g_assert_cmpuint (g_ref_string_length (s), ==, 5);
g_ref_string_release (s);
}
/* test_refstring_intern: Test the interning API of GRefString */
static void
test_refstring_intern (void)
{
char *s = g_ref_string_new_intern ("hello, world");
char *p;
g_test_message ("s = '%s' (%p)", s, s);
g_assert_cmpstr (s, ==, "hello, world");
p = g_ref_string_new_intern ("hello, world");
g_test_message ("p = s = '%s' (%p)", p, p);
g_assert_true (s == p);
g_test_message ("releasing p[%p] ('%s')", p, p);
g_ref_string_release (p);
p = g_ref_string_new_intern ("goodbye, world");
g_test_message ("p = '%s' (%p)", p, p);
g_assert_false (s == p);
g_test_message ("releasing p[%p] ('%s')", p, p);
g_ref_string_release (p);
g_test_message ("releasing s[%p] ('%s')", s, s);
g_ref_string_release (s);
}
int
main (int argc,
char *argv[])
{
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/refstring/base", test_refstring_base);
g_test_add_func ("/refstring/length", test_refstring_length);
g_test_add_func ("/refstring/length-auto", test_refstring_length_auto);
g_test_add_func ("/refstring/length-nuls", test_refstring_length_nuls);
g_test_add_func ("/refstring/intern", test_refstring_intern);
return g_test_run ();
}