diff --git a/.gitignore b/.gitignore index 5eddfc5f..9a6e3c10 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,7 @@ msg2pdf test-mu-cmd test-mu-cmd-cfind test-mu-contacts +test-mu-container test-mu-date test-mu-flags test-mu-maildir diff --git a/lib/mu-container.c b/lib/mu-container.c index fbe612ff..7722b64a 100644 --- a/lib/mu-container.c +++ b/lib/mu-container.c @@ -275,8 +275,6 @@ mu_container_splice_children (MuContainer *c, MuContainer *sibling) children = sibling->child; sibling->child = NULL; - c = mu_container_remove_sibling (c, sibling); - return mu_container_append_siblings (c, children); } @@ -292,8 +290,6 @@ mu_container_splice_grandchildren (MuContainer *parent, MuContainer *child) newchild = child->child; child->child=NULL; - mu_container_remove_child (parent, child); - return mu_container_append_children (parent, newchild); } diff --git a/lib/mu-container.h b/lib/mu-container.h index 9f2686a8..5bc268b9 100644 --- a/lib/mu-container.h +++ b/lib/mu-container.h @@ -128,21 +128,19 @@ MuContainer* mu_container_remove_child (MuContainer *c, MuContainer *child); MuContainer* mu_container_remove_sibling (MuContainer *c, MuContainer *sibling); /** - * promote sibling's children to be this container's siblings and - * remove the sibling + * promote sibling's children to be this container's siblings * * @param c a container instance * @param sibling a sibling of this container * - * @return the container with the sibling's children promoted and the - * sibling itself removed + * @return the container with the sibling's children promoted */ MuContainer* mu_container_splice_children (MuContainer *c, MuContainer *sibling); /** - * promote child's children to be parent's children and remove child + * promote child's children to be parent's children * * @param parent a container instance * @param child a child of this container diff --git a/lib/mu-threader.c b/lib/mu-threader.c index c42e166c..d32bbe7a 100644 --- a/lib/mu-threader.c +++ b/lib/mu-threader.c @@ -385,10 +385,12 @@ prune_maybe (MuContainer *c) MuContainer *cur; for (cur = c->child; cur; cur = cur->next) { - if (cur->flags & MU_CONTAINER_FLAG_DELETE) + if (cur->flags & MU_CONTAINER_FLAG_DELETE) { c = mu_container_remove_child (c, cur); - else if (cur->flags & MU_CONTAINER_FLAG_SPLICE) + } else if (cur->flags & MU_CONTAINER_FLAG_SPLICE) { c = mu_container_splice_grandchildren (c, cur); + c = mu_container_remove_child (c, cur); + } } g_return_val_if_fail (c, FALSE); @@ -433,10 +435,12 @@ prune_empty_containers (MuContainer *root_set) /* and prune the root_set itself... */ for (cur = root_set; cur; cur = cur->next) { - if (cur->flags & MU_CONTAINER_FLAG_DELETE) + if (cur->flags & MU_CONTAINER_FLAG_DELETE) { root_set = mu_container_remove_sibling (root_set, cur); - else if (cur->flags & MU_CONTAINER_FLAG_SPLICE) + } else if (cur->flags & MU_CONTAINER_FLAG_SPLICE) { root_set = mu_container_splice_children (root_set, cur); + root_set = mu_container_remove_sibling (root_set, cur); + } } return root_set; diff --git a/lib/tests/Makefile.am b/lib/tests/Makefile.am index 8125c8fc..46ff7345 100644 --- a/lib/tests/Makefile.am +++ b/lib/tests/Makefile.am @@ -70,6 +70,10 @@ TEST_PROGS += test-mu-flags test_mu_flags_SOURCES= test-mu-flags.c dummy.cc test_mu_flags_LDADD= libtestmucommon.la +TEST_PROGS += test-mu-container +test_mu_container_SOURCES= test-mu-container.c dummy.cc +test_mu_container_LDADD= libtestmucommon.la + # we need to use dummy.cc to enforce c++ linking... BUILT_SOURCES= \ dummy.cc diff --git a/lib/tests/test-mu-container.c b/lib/tests/test-mu-container.c new file mode 100644 index 00000000..475e3026 --- /dev/null +++ b/lib/tests/test-mu-container.c @@ -0,0 +1,83 @@ +/* -*-mode: c; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-*/ + +/* +** Copyright (C) 2014 Jakub Sitnicki +** +** 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 3, 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 02110-1301, USA. +** +*/ + +#if HAVE_CONFIG_H +#include "config.h" +#endif /*HAVE_CONFIG_H*/ + +#include + +#include "test-mu-common.h" +#include "mu-container.h" + +static gboolean +container_has_children (const MuContainer *c) +{ + return c && c->child; +} + +static gboolean +container_is_sibling_of (const MuContainer *c, const MuContainer *sibling) +{ + const MuContainer *cur; + + for (cur = c; cur; cur = cur->next) { + if (cur == sibling) + return TRUE; + } + + return container_is_sibling_of (sibling, c); +} + +static void +test_mu_container_splice_children_when_parent_has_no_siblings (void) +{ + MuContainer *child, *parent, *root_set; + + child = mu_container_new (NULL, 0, "child"); + parent = mu_container_new (NULL, 0, "parent"); + parent = mu_container_append_children (parent, child); + + root_set = parent; + root_set = mu_container_splice_children (root_set, parent); + + g_assert (root_set != NULL); + g_assert (!container_has_children(parent)); + g_assert (container_is_sibling_of (root_set, child)); + + mu_container_destroy(parent); + mu_container_destroy(child); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/mu-container/mu-container-splice-children-when-parent-has-no-siblings", + test_mu_container_splice_children_when_parent_has_no_siblings); + + g_log_set_handler (NULL, + G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION, + (GLogFunc)black_hole, NULL); + + return g_test_run (); +}