sl@0: /*
sl@0: * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
sl@0: *
sl@0: * This library is free software; you can redistribute it and/or
sl@0: * modify it under the terms of the GNU Lesser General Public
sl@0: * License as published by the Free Software Foundation; either
sl@0: * version 2 of the License, or (at your option) any later version.
sl@0: *
sl@0: * This library is distributed in the hope that it will be useful,
sl@0: * but WITHOUT ANY WARRANTY; without even the implied warranty of
sl@0: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
sl@0: * Lesser General Public License for more details.
sl@0: *
sl@0: * You should have received a copy of the GNU Lesser General Public
sl@0: * License along with this library; if not, write to the
sl@0: * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
sl@0: * Boston, MA 02111-1307, USA.
sl@0: *
sl@0: * Description:
sl@0: *
sl@0: */
sl@0: 
sl@0: 
sl@0: 
sl@0: #undef G_DISABLE_ASSERT
sl@0: #undef G_LOG_DOMAIN
sl@0: 
sl@0: #include <stdio.h>
sl@0: #include <glib.h>
sl@0: #include <glib/gatomic.h>
sl@0: #include <glib/galloca.h>
sl@0: #include <glib/gprintf.h>
sl@0: #include <glib-object.h>
sl@0: 
sl@0: #include <stdlib.h>
sl@0: 
sl@0: 
sl@0: #ifdef SYMBIAN
sl@0: #include "mrt2_glib2_test.h"
sl@0: #endif /*SYMBIAN*/
sl@0: 
sl@0: #define THREADS 10
sl@0: 
sl@0: typedef enum
sl@0: {
sl@0:   MY_ENUM_FOO,
sl@0:   MY_ENUM_BAR,
sl@0: } myEnum;
sl@0: 
sl@0: typedef enum
sl@0: {
sl@0:   MY_FLAG_FOO = 1 << 0,
sl@0:   MY_FLAG_BAR = 1 << 1,
sl@0: } myFlags;
sl@0: 
sl@0: 
sl@0: 
sl@0: #define	TEST(m,cond)	G_STMT_START { failed = !(cond); \
sl@0: if (failed) \
sl@0:   { ++notpassed; \
sl@0:   	assert_failed = TRUE; \
sl@0:     if (!m) \
sl@0:       g_print ("\n(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \
sl@0:     else \
sl@0:       g_print ("\n(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), (gchar*)m); \
sl@0:   } \
sl@0: else \
sl@0:   ++passed;    \
sl@0:   if ((passed+notpassed) % 10000 == 0) /*g_print (".")*/; fflush (stdout); \
sl@0: } G_STMT_END
sl@0: 
sl@0: 
sl@0: 
sl@0: void g_ascii_strdown_test()
sl@0: {
sl@0: 	gchar str[] = "ABCd";
sl@0: 	gchar *str1;
sl@0: 	str1 = g_ascii_strdown(str,4);
sl@0: 	g_assert(str1[0] == 'a');
sl@0: 	g_assert(str1[1] == 'b');
sl@0: 	g_assert(str1[2] == 'c');
sl@0: 	g_assert(str1[3] == 'd');	
sl@0: }
sl@0: 
sl@0: #if 0
sl@0: void g_assert_warning_test()
sl@0: {
sl@0: 	g_assert_warning(NULL, __FILE__,__LINE__,"g_assert_warning_test","'a'== 'a'");
sl@0: 	#ifdef SYMBIAN
sl@0:   	testResultXml("extra_test");
sl@0:   	#endif /* EMULATOR */
sl@0: 	/*following will abort!*/
sl@0: 	g_assert_warning(NULL, __FILE__,__LINE__,"g_assert_warning_test","'a'== 'b'");
sl@0: }
sl@0: #endif
sl@0: 
sl@0: 
sl@0: static gpointer
sl@0: atomic_int_thread (gpointer data)
sl@0: {
sl@0: 	gint* val = (gint*)data;
sl@0: 	g_atomic_int_set ((gint *) data,
sl@0:                   (*val)+1);
sl@0: 
sl@0: 	return NULL;
sl@0: }
sl@0: 
sl@0: 
sl@0: static void
sl@0: test_g_atomic_int_set ()
sl@0: {
sl@0:   GThread *threads[THREADS];
sl@0:   guint i;
sl@0:   
sl@0:     
sl@0:   for (i = 0; i < THREADS; i++)
sl@0:     {
sl@0:       int data;
sl@0:       data = i;
sl@0:       threads[i] = g_thread_create (atomic_int_thread, 
sl@0: 				    &data, TRUE, NULL);      
sl@0:     }
sl@0:   g_usleep (G_USEC_PER_SEC * 5);
sl@0:   for (i = 0; i < THREADS; i++)
sl@0:     {
sl@0:       g_thread_join (threads[i]);
sl@0:     }
sl@0: }
sl@0: 
sl@0: 
sl@0: static gpointer
sl@0: atomic_pointer_thread (gpointer data)
sl@0: {
sl@0: 	
sl@0: 	g_atomic_pointer_set ((gpointer*) &data,NULL);
sl@0: 
sl@0: 	return NULL;
sl@0: }
sl@0: 
sl@0: 
sl@0: static void
sl@0: test_g_atomic_pointer_set ()
sl@0: {
sl@0:   GThread *threads[THREADS];
sl@0:   guint i;
sl@0:   
sl@0:     
sl@0:   for (i = 0; i < THREADS; i++)
sl@0:     {
sl@0:       int data;
sl@0:       data = i;
sl@0:       threads[i] = g_thread_create (atomic_pointer_thread, 
sl@0: 				    &data, TRUE, NULL);      
sl@0:     }
sl@0:   g_usleep (G_USEC_PER_SEC * 5);
sl@0:   for (i = 0; i < THREADS; i++)
sl@0:     {
sl@0:       g_thread_join (threads[i]);
sl@0:     }
sl@0: }
sl@0: 
sl@0: 
sl@0: #if 0
sl@0: void test_g_get_codeset()
sl@0: {
sl@0: 	gchar* charset =  g_get_codeset ();
sl@0:     g_assert(!strcmp(charset,"US-ASCII"));
sl@0:     g_free(charset);
sl@0: }
sl@0: #endif
sl@0: 
sl@0: 
sl@0: void test_g_blow_chunks()
sl@0: {
sl@0: 	gchar *name = "chunk";
sl@0: 	GMemChunk *mem_chunk = g_mem_chunk_new(name,2,10,G_ALLOC_ONLY);
sl@0: 	g_blow_chunks();
sl@0: }
sl@0: 
sl@0: void test_g_date_set_time_val()
sl@0: {
sl@0:   GDate* d = g_date_new();
sl@0:   
sl@0:   GTimeVal current_time;
sl@0:   g_get_current_time (&current_time);
sl@0:   g_date_set_time_val(d, &current_time);
sl@0:   
sl@0:   g_assert(g_date_valid(d));
sl@0:   
sl@0: 
sl@0: }
sl@0: 
sl@0: 
sl@0: 
sl@0: gboolean func1(int *data)
sl@0: {
sl@0: 	*data = 1;
sl@0: 	return TRUE;
sl@0: }
sl@0: 
sl@0: gboolean func2(int *data)
sl@0: {
sl@0: 	*data = 2;
sl@0: 	return TRUE;
sl@0: }
sl@0: 
sl@0: gboolean func3(int *data)
sl@0: {
sl@0: 	*data = 3;
sl@0: 	return FALSE;
sl@0: }
sl@0: 
sl@0: gboolean func4(int *data)
sl@0: {
sl@0: 	*data = 4;
sl@0: 	return TRUE;
sl@0: }
sl@0: 
sl@0: 
sl@0: void hook_test()
sl@0: {
sl@0: 	GHookList hooklist;
sl@0: 	GHook *hook1 = NULL,*hook2 = NULL,*hook3 = NULL,*hook4 = NULL,*temp_hook;
sl@0: 	int data1 = 0,data2 = 0,data3 = 0,data4 = 0;
sl@0: 	int comp_value;
sl@0: 	gboolean val;
sl@0: 	
sl@0: 	g_hook_list_init(&hooklist,sizeof(GHook));
sl@0: 	
sl@0: 	hook1 = g_hook_alloc(&hooklist);
sl@0: 	hook1->func = (gpointer)func1;
sl@0: 	hook1->data = &data1;
sl@0: 	
sl@0: 	hook2 = g_hook_alloc(&hooklist);
sl@0: 	hook2->func = (gpointer)func2;
sl@0: 	hook2->data = &data2;
sl@0: 	
sl@0: 	hook3 = g_hook_alloc(&hooklist);
sl@0: 	hook3->func = (gpointer)func3;
sl@0: 	hook3->data = &data3;
sl@0: 	
sl@0: 	hook4 = g_hook_alloc(&hooklist);
sl@0: 	hook4->func = (gpointer)func4;
sl@0: 	hook4->data = &data4;
sl@0: 	
sl@0: 	g_hook_append(&hooklist,hook1);
sl@0: 	g_hook_append(&hooklist,hook2);
sl@0: 	g_hook_append(&hooklist,hook3);
sl@0: 	g_hook_append(&hooklist,hook4);
sl@0: 	
sl@0: 	g_hook_list_invoke_check(&hooklist,FALSE);
sl@0: 	
sl@0: 	g_assert(data1 == 1 && data2 == 2 && data3 == 3 && data4 == 4);
sl@0: 	
sl@0: 	//now only func3 must be in hooklist
sl@0: 	data1 = 0,data2 = 0,data3 = 0,data4 = 0;
sl@0: 	g_hook_list_invoke_check(&hooklist,FALSE);
sl@0: 	
sl@0: 	//check for implemention behaviour as opposed to documented behaviour
sl@0: 	
sl@0: 	//enable this to check for documented behaviour
sl@0: 	//g_assert(data1 == 0 && data2 == 0 && data3 == 3 && data4 == 0);
sl@0: 	
sl@0: 	//disable this to stop checking implemented behaviour
sl@0: 	g_assert(data1 == 1 && data2 == 2 && data3 == 0 && data4 == 4);
sl@0: 	
sl@0: 	g_hook_list_clear(&hooklist);
sl@0: 	
sl@0: }
sl@0: 
sl@0: void test_g_mem_chunk_alloc0()
sl@0: {
sl@0: 	gchar *name = "chunk";
sl@0: 	char* pchar;
sl@0: 	GMemChunk *mem_chunk = g_mem_chunk_new(name,2,10,G_ALLOC_ONLY);
sl@0: 	gpointer data = g_mem_chunk_alloc0(mem_chunk);
sl@0: 	g_assert(data != NULL);
sl@0: 	pchar = (char*)data;
sl@0: 	g_assert( (*pchar) == '\0' && *(pchar+1) == '\0');
sl@0: 	g_mem_chunk_print(mem_chunk);
sl@0: 	g_mem_chunk_clean(mem_chunk);
sl@0: 	g_mem_chunk_destroy(mem_chunk);
sl@0: }
sl@0: 
sl@0: 
sl@0: 
sl@0: gpointer theFunc(gpointer data)
sl@0: {
sl@0: 	int* pval = (int*) data;
sl@0: 	(*pval)++;
sl@0: 	return NULL;
sl@0: }
sl@0: 
sl@0: void test_gonce()
sl@0: {
sl@0: 	GOnce onceObject;
sl@0: 	int val = 1;
sl@0: 	
sl@0: 	g_once_impl (&onceObject,theFunc, &val);
sl@0: 	g_once_impl (&onceObject,theFunc, &val);
sl@0: 	g_once_impl (&onceObject,theFunc, &val);
sl@0: 	g_assert(val == 2);
sl@0: }
sl@0: 
sl@0: void test_g_return_if_fail_warning()
sl@0: {
sl@0: 	//currently not exported 
sl@0: 	//g_return_if_fail_warning (NULL,"extra_tests::main","1== 1");
sl@0: }
sl@0: 
sl@0: void test_g_slist_alloc()
sl@0: {
sl@0: 	GSList*    pList =  g_slist_alloc();
sl@0: 	g_assert(pList != NULL);
sl@0: 	g_slist_free_1 (pList);
sl@0: }
sl@0: 
sl@0: void test_g_string_insert_c()
sl@0: {
sl@0: 	GString* string1 = g_string_new ("firstlast");
sl@0:     g_string_insert_c (string1, 5, '_');
sl@0:   	g_assert (strcmp (string1->str, "first_last") == 0);
sl@0:   	g_string_free (string1, TRUE);
sl@0: }
sl@0: 
sl@0: void test_g_strsignal()
sl@0: {
sl@0: 	const gchar* errmsg = g_strsignal(0);
sl@0: 	g_assert(strcmp(errmsg, "unknown signal (0)")==0);	
sl@0: }
sl@0: 
sl@0: 
sl@0: 
sl@0: void test_g_generictype_get_type()
sl@0: {
sl@0: 	GType type_id, type_id2;
sl@0: 	int i;
sl@0: 	
sl@0: 
sl@0: 	GType (*fnArray[])() =
sl@0: 	{
sl@0: 	g_closure_get_type,
sl@0: 	g_date_get_type,	
sl@0: 	g_gstring_get_type,	
sl@0: 	g_hash_table_get_type,
sl@0: 	g_io_channel_get_type,
sl@0: 	g_io_condition_get_type,
sl@0: 	g_strv_get_type,
sl@0: 	g_value_get_type,
sl@0: 	};
sl@0: 	
sl@0: 		
sl@0: 	
sl@0: #define NumFns sizeof(fnArray)/sizeof(GType (*)())	
sl@0: 		
sl@0: 	for(i =0; i<NumFns;i++)
sl@0: 	{
sl@0: 		type_id =  fnArray[i]();
sl@0: 		g_assert(type_id != 0);
sl@0: 		type_id2 =  fnArray[i]();
sl@0: 		g_assert(type_id == type_id2);	
sl@0: 		//pInstance = g_type_create_instance(type_id);
sl@0: 		//g_assert(g_type_name(type_id) == g_type_name_from_instance(pInstance) );
sl@0: 	}
sl@0: 	
sl@0: }
sl@0: 
sl@0: void test_enumClass()
sl@0: {
sl@0: 	GType type_id = 0;
sl@0: 	GEnumClass* pPointer = NULL;
sl@0: 	GEnumValue* retrievedValue;
sl@0: 	static GEnumValue enum_array[] =
sl@0: 	{
sl@0: 		{ 0, "EZero", "zero"},
sl@0: 		{ 1, "EOne", "One"},
sl@0: 		{ 2, "ETwo", "Two"},
sl@0: 		{ 0, NULL, NULL},
sl@0: 	};
sl@0: 
sl@0: 	//g_type_init();
sl@0: 
sl@0: 	type_id =  g_enum_register_static("egEnum",enum_array);
sl@0: 	pPointer = g_type_class_ref(type_id);
sl@0: 	if(pPointer)
sl@0: 	{
sl@0: 
sl@0: 		retrievedValue = g_enum_get_value(pPointer,1);
sl@0: 		g_assert(retrievedValue && retrievedValue->value == 1);
sl@0: 		retrievedValue = g_enum_get_value(pPointer,5);
sl@0: 		g_assert(retrievedValue == NULL);
sl@0: 
sl@0: 		retrievedValue = g_enum_get_value_by_name(pPointer,"EOne");
sl@0: 		g_assert(retrievedValue && retrievedValue->value == 1);
sl@0: 		retrievedValue = g_enum_get_value_by_name(pPointer,"EFive");
sl@0: 		g_assert(retrievedValue == NULL);
sl@0: 
sl@0: 		retrievedValue = g_enum_get_value_by_nick(pPointer,"One");
sl@0: 		g_assert(retrievedValue && retrievedValue->value == 1);
sl@0: 		retrievedValue = g_enum_get_value_by_nick(pPointer,"Five");
sl@0: 		g_assert(retrievedValue == NULL);
sl@0: 
sl@0: 	}
sl@0: }//fn
sl@0: 
sl@0: 
sl@0: void test_flagsClass()
sl@0: {
sl@0: 	GType type_id = 0;
sl@0: 	GFlagsClass* pPointer = NULL;
sl@0: 	GFlagsValue* retrievedValue;
sl@0: 	static GFlagsValue flags_array[] =
sl@0: 	{
sl@0: 		{ 1, "EOne", "One"},
sl@0: 		{ 2, "ETwo", "Two"},
sl@0: 		{ 4, "EFour", "Four"},
sl@0: 		{ 0, NULL, NULL},
sl@0: 	};
sl@0: 
sl@0: 	//g_type_init();
sl@0: 
sl@0: 	type_id =  g_flags_register_static("egFlags",flags_array);
sl@0: 	pPointer = g_type_class_ref(type_id);
sl@0: 	if(pPointer)
sl@0: 	{
sl@0: 
sl@0: 		retrievedValue = g_flags_get_value_by_name(pPointer,"EOne");
sl@0: 		g_assert(retrievedValue && retrievedValue->value == 1);
sl@0: 		retrievedValue = g_flags_get_value_by_name(pPointer,"EFive");
sl@0: 		g_assert(retrievedValue == NULL);
sl@0: 
sl@0: 		retrievedValue = g_flags_get_value_by_nick(pPointer,"One");
sl@0: 		g_assert(retrievedValue && retrievedValue->value == 1);
sl@0: 		retrievedValue = g_flags_get_value_by_nick(pPointer,"Five");
sl@0: 		g_assert(retrievedValue == NULL);
sl@0: 	}
sl@0: }//fn
sl@0: 
sl@0: 
sl@0: 
sl@0: int main (int   argc,
sl@0:       char *argv[])
sl@0: {
sl@0: 	#ifdef SYMBIAN
sl@0: 	int handler = g_log_set_handler (NULL,  G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL);
sl@0: 	#endif /*SYMBIAN*/
sl@0: 
sl@0: 	g_thread_init(NULL);	
sl@0: 	g_type_init();
sl@0: 	
sl@0: 	g_ascii_strdown_test();
sl@0:     test_g_atomic_int_set();
sl@0:     test_g_atomic_pointer_set();
sl@0: 
sl@0: 	//test_g_get_codeset();    
sl@0: 	test_g_blow_chunks();
sl@0: 	test_g_date_set_time_val();
sl@0: 	hook_test();
sl@0: 	
sl@0: 	test_g_mem_chunk_alloc0();
sl@0: 	test_gonce();
sl@0: 	//test_g_return_if_fail_warning ();
sl@0: 	test_g_slist_alloc();
sl@0: 	test_g_string_insert_c();
sl@0: 	test_g_strsignal();
sl@0: 	
sl@0: 	test_g_generictype_get_type();
sl@0: 	
sl@0: 	test_enumClass();
sl@0:  	test_flagsClass();
sl@0: 	
sl@0: 	
sl@0: 	
sl@0: 	//test 
sl@0: 	#ifdef SYMBIAN
sl@0: 	g_log_remove_handler (NULL, handler);
sl@0: 	g_warning("This test message should have been printed on console\n");
sl@0: 	g_log_set_handler (NULL,  G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL);
sl@0: 	#endif /*SYMBIAN*/
sl@0: 	
sl@0:     
sl@0: 		
sl@0: 	//g_assert_warning_test();
sl@0: 	
sl@0: 	#ifdef SYMBIAN
sl@0:   	testResultXml("extra_tests");
sl@0:   	#endif /* EMULATOR */
sl@0: 	
sl@0: 	return 0;
sl@0: }