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 sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include 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 (¤t_time); sl@0: g_date_set_time_val(d, ¤t_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; ivalue == 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: }