mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-11-04 01:58:54 +01:00 
			
		
		
		
	2008-06-21 Johan Dahlin <jdahlin@async.com.br> * *.[ch]: Include "config.h" instead of <config.h> Command used: find -name \*.[ch]|xargs perl -p -i -e 's/^#include <config.h>/#include "config.h"/g' Rubberstamped by Mitch svn path=/trunk/; revision=7092
		
			
				
	
	
		
			224 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* GLIB - Library of useful routines for C programming
 | 
						|
 * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
 | 
						|
 *
 | 
						|
 * 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 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, write to the
 | 
						|
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 | 
						|
 * Boston, MA 02111-1307, USA.
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
 * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
 | 
						|
 * file for a list of people on the GLib Team.  See the ChangeLog
 | 
						|
 * files for a list of changes.  These files are distributed with
 | 
						|
 * GLib at ftp://ftp.gtk.org/pub/gtk/. 
 | 
						|
 */
 | 
						|
 | 
						|
#undef G_DISABLE_ASSERT
 | 
						|
#undef G_LOG_DOMAIN
 | 
						|
 | 
						|
#ifdef HAVE_CONFIG_H
 | 
						|
#include "config.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include <stdlib.h>
 | 
						|
 | 
						|
#ifdef HAVE_UNISTD_H
 | 
						|
#include <unistd.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include "glib.h"
 | 
						|
 | 
						|
int array[10000];
 | 
						|
gboolean failed = FALSE;
 | 
						|
 | 
						|
#define	TEST(m,cond)	G_STMT_START { failed = !(cond); \
 | 
						|
if (failed) \
 | 
						|
  { if (!m) \
 | 
						|
      g_print ("\n(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \
 | 
						|
    else \
 | 
						|
      g_print ("\n(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), (gchar*)m); \
 | 
						|
      exit(1); \
 | 
						|
  } \
 | 
						|
} G_STMT_END
 | 
						|
 | 
						|
#define	C2P(c)		((gpointer) ((long) (c)))
 | 
						|
#define	P2C(p)		((gchar) ((long) (p)))
 | 
						|
 | 
						|
#define GLIB_TEST_STRING "el dorado "
 | 
						|
#define GLIB_TEST_STRING_5 "el do"
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	guint age;
 | 
						|
	gchar name[40];
 | 
						|
} GlibTestInfo;
 | 
						|
 | 
						|
static gboolean
 | 
						|
node_build_string (GNode    *node,
 | 
						|
		   gpointer  data)
 | 
						|
{
 | 
						|
  gchar **p = data;
 | 
						|
  gchar *string;
 | 
						|
  gchar c[2] = "_";
 | 
						|
 | 
						|
  c[0] = P2C (node->data);
 | 
						|
 | 
						|
  string = g_strconcat (*p ? *p : "", c, NULL);
 | 
						|
  g_free (*p);
 | 
						|
  *p = string;
 | 
						|
 | 
						|
  return FALSE;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
g_node_test (void)
 | 
						|
{
 | 
						|
  GNode *root;
 | 
						|
  GNode *node;
 | 
						|
  GNode *node_B;
 | 
						|
  GNode *node_D;
 | 
						|
  GNode *node_F;
 | 
						|
  GNode *node_G;
 | 
						|
  GNode *node_J;
 | 
						|
  guint i;
 | 
						|
  gchar *tstring;
 | 
						|
 | 
						|
  failed = FALSE;
 | 
						|
 | 
						|
  root = g_node_new (C2P ('A'));
 | 
						|
  TEST (NULL, g_node_depth (root) == 1 && g_node_max_height (root) == 1);
 | 
						|
 | 
						|
  node_B = g_node_new (C2P ('B'));
 | 
						|
  g_node_append (root, node_B);
 | 
						|
  TEST (NULL, root->children == node_B);
 | 
						|
 | 
						|
  g_node_append_data (node_B, C2P ('E'));
 | 
						|
  g_node_prepend_data (node_B, C2P ('C'));
 | 
						|
  node_D = g_node_new (C2P ('D'));
 | 
						|
  g_node_insert (node_B, 1, node_D); 
 | 
						|
 | 
						|
  node_F = g_node_new (C2P ('F'));
 | 
						|
  g_node_append (root, node_F);
 | 
						|
  TEST (NULL, root->children->next == node_F);
 | 
						|
 | 
						|
  node_G = g_node_new (C2P ('G'));
 | 
						|
  g_node_append (node_F, node_G);
 | 
						|
  node_J = g_node_new (C2P ('J'));
 | 
						|
  g_node_prepend (node_G, node_J);
 | 
						|
  g_node_insert (node_G, 42, g_node_new (C2P ('K')));
 | 
						|
  g_node_insert_data (node_G, 0, C2P ('H'));
 | 
						|
  g_node_insert (node_G, 1, g_node_new (C2P ('I')));
 | 
						|
 | 
						|
  TEST (NULL, g_node_depth (root) == 1);
 | 
						|
  TEST (NULL, g_node_max_height (root) == 4);
 | 
						|
  TEST (NULL, g_node_depth (node_G->children->next) == 4);
 | 
						|
  TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_LEAFS) == 7);
 | 
						|
  TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_NON_LEAFS) == 4);
 | 
						|
  TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_ALL) == 11);
 | 
						|
  TEST (NULL, g_node_max_height (node_F) == 3);
 | 
						|
  TEST (NULL, g_node_n_children (node_G) == 4);
 | 
						|
  TEST (NULL, g_node_find_child (root, G_TRAVERSE_ALL, C2P ('F')) == node_F);
 | 
						|
  TEST (NULL, g_node_find (root, G_LEVEL_ORDER, G_TRAVERSE_NON_LEAFS, C2P ('I')) == NULL);
 | 
						|
  TEST (NULL, g_node_find (root, G_IN_ORDER, G_TRAVERSE_LEAFS, C2P ('J')) == node_J);
 | 
						|
 | 
						|
  for (i = 0; i < g_node_n_children (node_B); i++)
 | 
						|
    {
 | 
						|
      node = g_node_nth_child (node_B, i);
 | 
						|
      TEST (NULL, P2C (node->data) == ('C' + i));
 | 
						|
    }
 | 
						|
  
 | 
						|
  for (i = 0; i < g_node_n_children (node_G); i++)
 | 
						|
    TEST (NULL, g_node_child_position (node_G, g_node_nth_child (node_G, i)) == i);
 | 
						|
 | 
						|
  /* we have built:                    A
 | 
						|
   *                                 /   \
 | 
						|
   *                               B       F
 | 
						|
   *                             / | \       \
 | 
						|
   *                           C   D   E       G
 | 
						|
   *                                         / /\ \
 | 
						|
   *                                       H  I  J  K
 | 
						|
   *
 | 
						|
   * for in-order traversal, 'G' is considered to be the "left"
 | 
						|
   * child of 'F', which will cause 'F' to be the last node visited.
 | 
						|
   */
 | 
						|
 | 
						|
  tstring = NULL;
 | 
						|
  g_node_traverse (root, G_PRE_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
 | 
						|
  TEST (tstring, strcmp (tstring, "ABCDEFGHIJK") == 0);
 | 
						|
  g_free (tstring); tstring = NULL;
 | 
						|
  g_node_traverse (root, G_POST_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
 | 
						|
  TEST (tstring, strcmp (tstring, "CDEBHIJKGFA") == 0);
 | 
						|
  g_free (tstring); tstring = NULL;
 | 
						|
  g_node_traverse (root, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
 | 
						|
  TEST (tstring, strcmp (tstring, "CBDEAHGIJKF") == 0);
 | 
						|
  g_free (tstring); tstring = NULL;
 | 
						|
  g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
 | 
						|
  TEST (tstring, strcmp (tstring, "ABFCDEGHIJK") == 0);
 | 
						|
  g_free (tstring); tstring = NULL;
 | 
						|
  
 | 
						|
  g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_LEAFS, -1, node_build_string, &tstring);
 | 
						|
  TEST (tstring, strcmp (tstring, "CDEHIJK") == 0);
 | 
						|
  g_free (tstring); tstring = NULL;
 | 
						|
  g_node_traverse (root, G_PRE_ORDER, G_TRAVERSE_NON_LEAFS, -1, node_build_string, &tstring);
 | 
						|
  TEST (tstring, strcmp (tstring, "ABFG") == 0);
 | 
						|
  g_free (tstring); tstring = NULL;
 | 
						|
 | 
						|
  g_node_reverse_children (node_B);
 | 
						|
  g_node_reverse_children (node_G);
 | 
						|
 | 
						|
  g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
 | 
						|
  TEST (tstring, strcmp (tstring, "ABFEDCGKJIH") == 0);
 | 
						|
  g_free (tstring); tstring = NULL;
 | 
						|
  
 | 
						|
  g_node_append (node_D, g_node_new (C2P ('L')));
 | 
						|
  g_node_append (node_D, g_node_new (C2P ('M')));
 | 
						|
 | 
						|
  g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
 | 
						|
  TEST (tstring, strcmp (tstring, "ABFEDCGLMKJIH") == 0);
 | 
						|
  g_free (tstring); tstring = NULL;
 | 
						|
 | 
						|
  g_node_destroy (root);
 | 
						|
 | 
						|
  /* allocation tests */
 | 
						|
 | 
						|
  root = g_node_new (NULL);
 | 
						|
  node = root;
 | 
						|
 | 
						|
  for (i = 0; i < 2048; i++)
 | 
						|
    {
 | 
						|
      g_node_append (node, g_node_new (NULL));
 | 
						|
      if ((i%5) == 4)
 | 
						|
	node = node->children->next;
 | 
						|
    }
 | 
						|
  TEST (NULL, g_node_max_height (root) > 100);
 | 
						|
  TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_ALL) == 1 + 2048);
 | 
						|
 | 
						|
  g_node_destroy (root);
 | 
						|
  
 | 
						|
  if (failed)
 | 
						|
    exit(1);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int
 | 
						|
main (int   argc,
 | 
						|
      char *argv[])
 | 
						|
{
 | 
						|
  g_node_test ();
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 |