/* 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 ();
}
