summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSzilárd Pfeiffer <mailbox@pfeifferszilard.hu>2010-01-05 22:39:23 -0600
committerJonathon Jongsma <jonathon@quotidian.org>2010-01-05 23:04:28 -0600
commit4bef4ef6c946ce662e79ba18efb16e01c8e9fedc (patch)
tree5ee7ae8647260945c0a0f8b969ca12fd4c3fb032 /tests
parentc405a82133cf464bbb190c67cc07958bc0f7228e (diff)
downloadglibmm-4bef4ef6c946ce662e79ba18efb16e01c8e9fedc.tar.gz
Implement GTree wrapper
Also add some tests for the new class
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/glibmm_btree/Makefile.am7
-rw-r--r--tests/glibmm_btree/main.cc230
3 files changed, 239 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 6be23469..af6ccb28 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -20,6 +20,7 @@ AUTOMAKE_OPTIONS = subdir-objects
check_PROGRAMS = \
giomm_ioerror/test \
giomm_simple/test \
+ glibmm_btree/test \
glibmm_date/test \
glibmm_nodetree/test \
glibmm_ustring_compose/test \
@@ -44,6 +45,7 @@ giomm_ioerror_test_LDADD = $(giomm_ldadd)
giomm_simple_test_SOURCES = giomm_simple/main.cc
giomm_simple_test_LDADD = $(giomm_ldadd)
+glibmm_btree_test_SOURCES = glibmm_btree/main.cc
glibmm_date_test_SOURCES = glibmm_date/main.cc
glibmm_nodetree_test_SOURCES = glibmm_nodetree/main.cc
glibmm_ustring_compose_test_SOURCES = glibmm_ustring_compose/main.cc
diff --git a/tests/glibmm_btree/Makefile.am b/tests/glibmm_btree/Makefile.am
new file mode 100644
index 00000000..d0e58bd4
--- /dev/null
+++ b/tests/glibmm_btree/Makefile.am
@@ -0,0 +1,7 @@
+include $(top_srcdir)/tests/Makefile.am_fragment
+
+noinst_PROGRAMS = test
+test_SOURCES = main.cc
+
+
+
diff --git a/tests/glibmm_btree/main.cc b/tests/glibmm_btree/main.cc
new file mode 100644
index 00000000..6cf091a3
--- /dev/null
+++ b/tests/glibmm_btree/main.cc
@@ -0,0 +1,230 @@
+#include <glibmm.h>
+
+typedef Glib::ustring type_key_value;
+typedef type_key_value* type_p_key_value;
+
+static int
+my_search(const type_key_value& key_a, const type_key_value& key_b)
+{
+ return key_b.compare(key_a);
+}
+
+static bool
+my_traverse(const type_key_value& /*key*/, const type_key_value& value)
+{
+ g_assert(value.size() == 1 && value[0] > 0);
+ return false;
+}
+
+const type_key_value str(
+ "0123456789"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz");
+
+const type_key_value str2(
+ "0123456789"
+ "abcdefghijklmnopqrstuvwxyz");
+
+static bool
+check_order(const type_key_value& key,
+ const type_key_value& /*value*/,
+ type_key_value::const_iterator& i)
+{
+ g_assert(key == type_key_value(1, *(i++)));
+ return false;
+}
+
+static int
+my_p_search(const type_p_key_value& key_a, const type_p_key_value& key_b)
+{
+ return my_search(*key_a, *key_b);
+}
+
+static bool
+my_p_traverse(const type_p_key_value& key, const type_p_key_value& value)
+{
+ return my_traverse(*key, *value);
+}
+
+
+std::vector<type_p_key_value> pstr;
+std::vector<type_p_key_value> pstr2;
+
+static bool
+check_p_order(const type_p_key_value& key,
+ const type_p_key_value& /*value*/,
+ std::vector<type_p_key_value>::const_iterator& i)
+{
+ g_assert(*key == **(i++));
+ return false;
+}
+
+static int
+my_p_key_compare(const type_p_key_value& key_a, const type_p_key_value& key_b)
+{
+ if(*key_a < *key_b)
+ return -1;
+
+ if(*key_a > *key_b)
+ return 1;
+
+ return 0;
+}
+
+int
+main()
+{
+ type_key_value::const_iterator i;
+ Glib::RefPtr< Glib::BalancedTree<type_key_value, type_key_value> > tree = Glib::BalancedTree<type_key_value, type_key_value>::create();
+
+ for (type_key_value::size_type i = 0; i < str.size(); ++i)
+ tree->insert(str.substr(i, 1), str.substr(i, 1));
+
+ tree->foreach(sigc::ptr_fun(my_traverse));
+
+ g_assert(tree->nnodes() == gint(str.size()));
+ g_assert(tree->height() == 6);
+
+ tree->foreach(sigc::bind(sigc::ptr_fun(check_order), str.begin()));
+
+ for (type_key_value::size_type i = 0; i < 26; i++)
+ g_assert(tree->remove(str.substr(i + 10, 1)));
+
+ g_assert(!tree->remove(""));
+
+ tree->foreach(sigc::ptr_fun(my_traverse));
+
+ g_assert(tree->nnodes() == gint(str2.size()));
+ g_assert(tree->height() == 6);
+
+ tree->foreach(sigc::bind(sigc::ptr_fun(check_order), str2.begin()));
+
+ for (int i = 25; i >= 0; i--)
+ tree->insert(str.substr(i + 10, 1), str.substr(i + 10, 1));
+
+ tree->foreach(sigc::bind(sigc::ptr_fun(check_order), str.begin()));
+
+ type_key_value *value;
+
+ value = tree->lookup("0");
+ g_assert(value && *value == "0");
+ value = tree->lookup("A");
+ g_assert(value && *value == "A");
+ value = tree->lookup("a");
+ g_assert(value && *value == "a");
+ value = tree->lookup("z");
+ g_assert(value && *value == "z");
+
+ value = tree->lookup("!");
+ g_assert(value == NULL);
+ value = tree->lookup("=");
+ g_assert(value == NULL);
+ value = tree->lookup("|");
+ g_assert(value == NULL);
+
+ value = tree->search(sigc::ptr_fun(my_search), "0");
+ g_assert(value && *value == "0");
+ value = tree->search(sigc::ptr_fun(my_search), "A");
+ g_assert(value && *value == "A");
+ value = tree->search(sigc::ptr_fun(my_search), "a");
+ g_assert(value && *value == "a");
+ value = tree->search(sigc::ptr_fun(my_search), "z");
+ g_assert(value && *value == "z");
+
+ value = tree->search(sigc::ptr_fun(my_search), "!");
+ g_assert(value == NULL);
+ value = tree->search(sigc::ptr_fun(my_search), "=");
+ g_assert(value == NULL);
+ value = tree->search(sigc::ptr_fun(my_search), "|");
+ g_assert(value == NULL);
+
+ Glib::RefPtr< Glib::BalancedTree<type_p_key_value, type_p_key_value> > ptree = Glib::BalancedTree<type_p_key_value, type_p_key_value>::create(sigc::ptr_fun(my_p_key_compare));
+
+ for (type_key_value::size_type i = 0; i < str.size(); ++i)
+ pstr.push_back(new type_key_value(str.substr(i, 1)));
+ for (type_key_value::size_type i = 0; i < str2.size(); ++i)
+ pstr2.push_back(new type_key_value(str2.substr(i, 1)));
+
+ for (type_key_value::size_type i = 0; i < str.size(); ++i)
+ ptree->insert(pstr[i], pstr[i]);
+
+ ptree->foreach(sigc::ptr_fun(my_p_traverse));
+
+ g_assert(ptree->nnodes() == gint(pstr.size()));
+ g_assert(ptree->height() == 6);
+
+ std::vector<type_p_key_value>::const_iterator j = pstr.begin();
+ ptree->foreach(sigc::bind(sigc::ptr_fun(check_p_order), j));
+
+ g_assert(ptree->lookup(new Glib::ustring("l")));
+
+ for (std::vector<type_p_key_value>::size_type i = 0; i < 26; i++)
+ g_assert(ptree->remove(pstr[i + 10]));
+
+ Glib::ustring pstr3("");
+ g_assert(!ptree->remove(&pstr3));
+
+ ptree->foreach(sigc::ptr_fun(my_p_traverse));
+
+ g_assert(ptree->nnodes() == gint(str2.size()));
+ g_assert(ptree->height() == 6);
+
+ j = pstr2.begin();
+ ptree->foreach(sigc::bind(sigc::ptr_fun(check_p_order), j));
+
+ for (int i = 25; i >= 0; i--)
+ ptree->insert(pstr[i + 10], pstr[i + 10]);
+
+ j = pstr.begin();
+ ptree->foreach(sigc::bind(sigc::ptr_fun(check_p_order), j));
+
+ type_p_key_value *pvalue;
+
+ pstr3 = "0";
+ pvalue = ptree->lookup(&pstr3);
+ g_assert(pvalue && **pvalue == "0");
+ pstr3 = "A";
+ pvalue = ptree->lookup(&pstr3);
+ g_assert(pvalue && **pvalue == "A");
+ pstr3 = "a";
+ pvalue = ptree->lookup(&pstr3);
+ g_assert(pvalue && **pvalue == "a");
+ pstr3 = "z";
+ pvalue = ptree->lookup(&pstr3);
+ g_assert(pvalue && **pvalue == "z");
+
+ pstr3 = "!";
+ pvalue = ptree->lookup(&pstr3);
+ g_assert(pvalue == NULL);
+ pstr3 = "=";
+ pvalue = ptree->lookup(&pstr3);
+ g_assert(pvalue == NULL);
+ pstr3 = "|";
+ pvalue = ptree->lookup(&pstr3);
+ g_assert(pvalue == NULL);
+
+ pstr3 = "0";
+ pvalue = ptree->search(sigc::ptr_fun(my_p_search), &pstr3);
+ g_assert(pvalue && **pvalue == "0");
+ pstr3 = "A";
+ pvalue = ptree->search(sigc::ptr_fun(my_p_search), &pstr3);
+ g_assert(pvalue && **pvalue == "A");
+ pstr3 = "a";
+ pvalue = ptree->search(sigc::ptr_fun(my_p_search), &pstr3);
+ g_assert(pvalue && **pvalue == "a");
+ pstr3 = "z";
+ pvalue = ptree->search(sigc::ptr_fun(my_p_search), &pstr3);
+ g_assert(pvalue && **pvalue == "z");
+
+ pstr3 = "!";
+ pvalue = ptree->search(sigc::ptr_fun(my_p_search), &pstr3);
+ g_assert(pvalue == NULL);
+ pstr3 = "=";
+ pvalue = ptree->search(sigc::ptr_fun(my_p_search), &pstr3);
+ g_assert(pvalue == NULL);
+ pstr3 = "|";
+ pvalue = ptree->search(sigc::ptr_fun(my_p_search), &pstr3);
+ g_assert(pvalue == NULL);
+
+ return 0;
+}