mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-05-02 12:06:53 +02:00
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
118 lines
3.4 KiB
C
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 ();
|
|
}
|
|
|