Improve test coverage for guththila_stack
diff --git a/guththila/tests/Makefile.am b/guththila/tests/Makefile.am
index 366bc48..ac32c34 100644
--- a/guththila/tests/Makefile.am
+++ b/guththila/tests/Makefile.am
@@ -12,9 +12,9 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-TESTS = test_guththila test_attribute
-noinst_PROGRAMS = test_guththila test_attribute
-check_PROGRAMS = test_guththila test_attribute
+TESTS = test_guththila test_attribute test_stack
+noinst_PROGRAMS = test_guththila test_attribute test_stack
+check_PROGRAMS = test_guththila test_attribute test_stack
 SUBDIRS =
 
 test_guththila_SOURCES = test_guththila.cc
@@ -36,3 +36,11 @@
 				 ../../util/src/libaxutil.la \
 				 $(top_builddir)/$(GTEST)/libgtest.a \
 				 $(top_builddir)/$(GTEST)/libgtest_main.a
+
+test_stack_SOURCES = test_stack.cc
+
+test_stack_LDADD = \
+				 $(top_builddir)/src/libguththila.la \
+				 ../../util/src/libaxutil.la \
+				 $(top_builddir)/$(GTEST)/libgtest.a \
+				 $(top_builddir)/$(GTEST)/libgtest_main.a
diff --git a/guththila/tests/test_stack.cc b/guththila/tests/test_stack.cc
new file mode 100644
index 0000000..f5888ef
--- /dev/null
+++ b/guththila/tests/test_stack.cc
@@ -0,0 +1,98 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#include <gtest/gtest.h>
+
+#include <guththila.h>
+
+
+class TestStack: public ::testing::Test
+{
+
+    protected:
+        void SetUp()
+        {
+            m_allocator = axutil_allocator_init(NULL);
+            ASSERT_NE(m_allocator, nullptr);
+            m_env = axutil_env_create(m_allocator);
+            ASSERT_NE(m_env, nullptr);
+            m_stack = (guththila_stack_t*) AXIS2_MALLOC(m_allocator, sizeof(guththila_stack_t));
+            ASSERT_NE(m_stack, nullptr);
+        }
+
+        void TearDown()
+        {
+            guththila_stack_free(m_stack, m_env);
+            axutil_env_free(m_env);
+        }
+
+        axutil_allocator_t *m_allocator;
+        axutil_env_t *m_env;
+        guththila_stack_t *m_stack;
+};
+
+
+TEST_F(TestStack, test_stack) {
+
+
+    int status;
+
+    status = guththila_stack_init(m_stack, m_env);
+    ASSERT_EQ(status, GUTHTHILA_SUCCESS);
+
+    ASSERT_TRUE(guththila_stack_is_empty(m_stack, m_env));
+
+    /* default max is 16 elements, so this will force a reallocation */
+    const char * abc = "abcdefghijklmnopqrstuvwxyz";
+    const char * p;
+    for (p = abc; *p != 0; ++p)
+    {
+        status = guththila_stack_push(m_stack, (void*)p, m_env);
+        /* push returns the index of the top element */
+        ASSERT_EQ(status, p-abc);
+    }
+
+    ASSERT_FALSE(guththila_stack_is_empty(m_stack, m_env));
+    ASSERT_EQ((char*)guththila_stack_peek(m_stack, m_env), (p-1));
+
+    status = guththila_stack_del_top(m_stack, m_env);
+    ASSERT_EQ(status, GUTHTHILA_SUCCESS);
+    ASSERT_EQ((char*)guththila_stack_peek(m_stack, m_env), (p-2));
+
+    status = guththila_stack_del_top(m_stack, m_env);
+    ASSERT_EQ(status, GUTHTHILA_SUCCESS);
+    ASSERT_EQ((char*)guththila_stack_peek(m_stack, m_env), (p-3));
+
+    ASSERT_EQ((char*)guththila_stack_get_by_index(m_stack, 0, m_env), abc);
+    ASSERT_EQ((char*)guththila_stack_get_by_index(m_stack, 10, m_env), abc+10);
+    ASSERT_EQ((char*)guththila_stack_get_by_index(m_stack, 23, m_env), p-3);
+
+
+    for (p = p-3; p >= abc; --p)
+    {
+        ASSERT_EQ((char*)guththila_stack_pop(m_stack, m_env), p);
+    }
+
+    ASSERT_TRUE(guththila_stack_is_empty(m_stack, m_env));
+
+
+    /* Test that un_init/re_init */
+    guththila_stack_un_init(m_stack, m_env);
+    status = guththila_stack_init(m_stack, m_env);
+    ASSERT_EQ(status, GUTHTHILA_SUCCESS);
+
+}