* Purple is the legal property of its developers, whose names are too * numerous to list here. Please refer to the COPYRIGHT file distributed * with this source distribution * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * This program 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 * General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA test_trie_replace_cb(GString *out, const gchar *word, gpointer word_data, /* the "test" word for the test_trie_replace test */ if ((gintptr)word_data == 0x1001) g_string_append_printf(out, "[%d:%x]", (int)(gintptr)user_data, (int)(gintptr)word_data); test_trie_find_cb(const gchar *word, gpointer word_data, if ((gintptr)word_data == 0x7004) find_sum += (gintptr)word_data; find_sum -= (gintptr)user_data * 0x1000; test_trie_replace_normal(void) { trie = purple_trie_new(); purple_trie_set_reset_on_match(trie, FALSE); purple_trie_add(trie, "test", (gpointer)0x1001); purple_trie_add(trie, "testing", (gpointer)0x1002); purple_trie_add(trie, "overtested", (gpointer)0x1003); purple_trie_add(trie, "trie", (gpointer)0x1004); purple_trie_add(trie, "tree", (gpointer)0x1005); purple_trie_add(trie, "implement", (gpointer)0x1006); purple_trie_add(trie, "implementation", (gpointer)0x1007); in = "Alice is testing her trie implementation, " "but she's far away from making test tree overtested"; out = purple_trie_replace(trie, in, test_trie_replace_cb, (gpointer)1); "Alice is [1:1002] her [1:1004] [1:1006]ation," " but she's far away from making test [1:1005] [1:1003]", test_trie_replace_whole(void) { trie = purple_trie_new(); purple_trie_add(trie, "test", (gpointer)0x2002); out = purple_trie_replace(trie, in, test_trie_replace_cb, (gpointer)2); g_assert_cmpstr("[2:2002]", ==, out); test_trie_replace_inner(void) { trie = purple_trie_new(); purple_trie_add(trie, "est", (gpointer)0x3001); purple_trie_add(trie, "tester", (gpointer)0x3002); out = purple_trie_replace(trie, in, test_trie_replace_cb, (gpointer)3); g_assert_cmpstr("the t[3:3001]!", ==, out); test_trie_replace_empty(void) { trie = purple_trie_new(); purple_trie_add(trie, "test", (gpointer)0x4001); out = purple_trie_replace(trie, in, test_trie_replace_cb, (gpointer)4); g_assert_cmpstr("", ==, out); test_trie_multi_replace(void) { PurpleTrie *trie1, *trie2, *trie3; trie1 = purple_trie_new(); trie2 = purple_trie_new(); trie3 = purple_trie_new(); /* appending is not efficient, but we have only 3 elements */ tries = g_slist_append(tries, trie1); tries = g_slist_append(tries, trie2); tries = g_slist_append(tries, trie3); purple_trie_add(trie1, "test", (gpointer)0x5011); purple_trie_add(trie1, "trie1", (gpointer)0x5012); purple_trie_add(trie1, "Alice", (gpointer)0x5013); purple_trie_add(trie2, "test", (gpointer)0x5021); purple_trie_add(trie2, "trie2", (gpointer)0x5022); purple_trie_add(trie2, "example", (gpointer)0x5023); purple_trie_add(trie2, "Ali", (gpointer)0x5024); /* "tester" without last (accepting) letter of "test" */ purple_trie_add(trie3, "teser", (gpointer)0x5031); purple_trie_add(trie3, "trie3", (gpointer)0x5032); purple_trie_add(trie3, "tester", (gpointer)0x5033); purple_trie_add(trie3, "example", (gpointer)0x5034); purple_trie_add(trie3, "Al", (gpointer)0x5035); in = "test tester trie trie1 trie2 trie3 example Alice"; out = purple_trie_multi_replace(tries, in, test_trie_replace_cb, (gpointer)5); "[5:5011] [5:5011]er trie [5:5012] [5:5022] " "[5:5032] [5:5023] [5:5035]ice", g_slist_free_full(tries, g_object_unref); trie = purple_trie_new(); purple_trie_add(trie, "alice", (gpointer)0x6001); purple_trie_add(trie, "bob", (gpointer)0x6002); purple_trie_add(trie, "cherry", (gpointer)0x6003); purple_trie_remove(trie, "bob"); out = purple_trie_replace(trie, in, test_trie_replace_cb, (gpointer)6); g_assert_cmpstr("[6:6001] bob [6:6003]", ==, out); test_trie_find_normal(void) { trie = purple_trie_new(); purple_trie_add(trie, "alice", (gpointer)0x7001); purple_trie_add(trie, "bob", (gpointer)0x7002); purple_trie_add(trie, "cherry", (gpointer)0x7003); purple_trie_add(trie, "al", (gpointer)0x7004); /* not accepted */ in = "test alice bob test cherry alice"; out = purple_trie_find(trie, in, test_trie_find_cb, (gpointer)7); g_assert_cmpint(4, ==, out); g_assert_cmpint(2 * 1 + 2 + 3, ==, find_sum); test_trie_find_reset(void) { trie = purple_trie_new(); purple_trie_set_reset_on_match(trie, TRUE); purple_trie_add(trie, "alice", (gpointer)0x8001); purple_trie_add(trie, "ali", (gpointer)0x8002); purple_trie_add(trie, "al", (gpointer)0x8003); out = purple_trie_find(trie, in, test_trie_find_cb, (gpointer)8); g_assert_cmpint(3, ==, out); g_assert_cmpint(3 * 3, ==, find_sum); test_trie_find_noreset(void) { trie = purple_trie_new(); purple_trie_set_reset_on_match(trie, FALSE); purple_trie_add(trie, "alice", (gpointer)0x9001); purple_trie_add(trie, "ali", (gpointer)0x9002); purple_trie_add(trie, "al", (gpointer)0x9003); out = purple_trie_find(trie, in, test_trie_find_cb, (gpointer)9); g_assert_cmpint(6, ==, out); g_assert_cmpint(3 * 3 + 2 * 2 + 1, ==, find_sum); test_trie_multi_find(void) { PurpleTrie *trie1, *trie2, *trie3; trie1 = purple_trie_new(); trie2 = purple_trie_new(); trie3 = purple_trie_new(); purple_trie_set_reset_on_match(trie1, FALSE); purple_trie_set_reset_on_match(trie2, TRUE); purple_trie_set_reset_on_match(trie3, FALSE); /* appending is not efficient, but we have only 3 elements */ tries = g_slist_append(tries, trie1); tries = g_slist_append(tries, trie2); tries = g_slist_append(tries, trie3); purple_trie_add(trie1, "test", (gpointer)0x10011); purple_trie_add(trie1, "trie1", (gpointer)0x10012); purple_trie_add(trie1, "Alice", (gpointer)0x10013); purple_trie_add(trie2, "test", (gpointer)0x10021); purple_trie_add(trie2, "trie2", (gpointer)0x10022); purple_trie_add(trie2, "example", (gpointer)0x10023); purple_trie_add(trie2, "Ali", (gpointer)0x10024); /* "tester" without last (accepting) letter of "test" */ purple_trie_add(trie3, "teser", (gpointer)0x10031); purple_trie_add(trie3, "trie3", (gpointer)0x10032); purple_trie_add(trie3, "tester", (gpointer)0x10033); purple_trie_add(trie3, "example", (gpointer)0x10034); purple_trie_add(trie3, "Al", (gpointer)0x10035); in = "test tester trie trie1 trie2 trie3 example Alice"; out = purple_trie_multi_find(tries, in, test_trie_find_cb, (gpointer)0x10); g_assert_cmpint(9, ==, out); g_assert_cmpint(2 * 0x11 + 0x33 + 0x12 + 0x22 + 0x32 + 0x23 + 0x35 + 0x13, ==, find_sum); g_slist_free_full(tries, g_object_unref); main(gint argc, gchar **argv) { g_test_init(&argc, &argv, NULL); g_test_add_func("/trie/replace/normal", test_trie_replace_normal); g_test_add_func("/trie/replace/whole", test_trie_replace_whole); g_test_add_func("/trie/replace/inner", test_trie_replace_inner); g_test_add_func("/trie/replace/empty", test_trie_replace_empty); g_test_add_func("/trie/multi_replace", test_trie_multi_replace); g_test_add_func("/trie/remove", g_test_add_func("/trie/find/normal", g_test_add_func("/trie/find/reset", g_test_add_func("/trie/find/noreset", g_test_add_func("/trie/multi_find",