/* Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. 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; version 2 of the License. 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 St, Fifth Floor, Boston, MA 02110-1301 USA */ // First include (the generated) my_config.h, to get correct platform defines. #include "my_config.h" #include #include "sql_plist.h" #include "test_utils.h" namespace sql_plist_unittest { // A simple helper function to insert values into a List. template void insert_values(T (&array)[size], L *list) { uint ix, elements= list->elements(); for (ix= 0; ix < size; ++ix) list->push_back(&array[ix]); EXPECT_EQ(ix + elements, list->elements()); } /* The fixture for testing the MySQL List and List_iterator classes. A fresh instance of this class will be created for each of the TEST_F functions below. */ class IPListTest : public ::testing::Test { protected: IPListTest() : m_int_list(), m_int_list_iter(m_int_list) { } public: template struct I_P_ListTestValue { V value; I_P_ListTestValue(V val) : value(val) {} bool operator == (const I_P_ListTestValue &obj) const { return value == obj.value; } struct I_P_ListTestValue *next; struct I_P_ListTestValue **prev; }; protected: template struct I_P_ListCountedPushBack { typedef I_P_ListTestValue Value; typedef I_P_List, I_P_List_counter, I_P_List_fast_push_back > Type; }; I_P_ListCountedPushBack::Type m_int_list; I_P_ListCountedPushBack::Type::Iterator m_int_list_iter; private: // Declares (but does not define) copy constructor and assignment operator. GTEST_DISALLOW_COPY_AND_ASSIGN_(IPListTest); }; // Allow construction of test messages via the << operator. template std::ostream &operator<< (std::ostream &s, const IPListTest::I_P_ListTestValue &v) { return s << v.value; } // Tests that we can construct and destruct lists. TEST_F(IPListTest, ConstructAndDestruct) { EXPECT_TRUE(m_int_list.is_empty()); I_P_ListCountedPushBack::Type *p_int_list; p_int_list= new I_P_ListCountedPushBack::Type; EXPECT_TRUE(p_int_list->is_empty()); delete p_int_list; } // Tests basic operations push and remove. TEST_F(IPListTest, BasicOperations) { I_P_ListTestValue v1(1), v2(2), v3(3); m_int_list.push_front(&v1); m_int_list.insert_after(&v1, &v2); m_int_list.push_back(&v3); EXPECT_FALSE(m_int_list.is_empty()); EXPECT_EQ(3U, m_int_list.elements()); EXPECT_EQ(&v1, m_int_list.front()); m_int_list.remove(&v1); EXPECT_EQ(&v2, m_int_list.front()); m_int_list.remove(&v2); EXPECT_EQ(&v3, m_int_list.front()); m_int_list.remove(&v3); EXPECT_TRUE(m_int_list.is_empty()) << "The list should be empty now!"; } // Tests that we can iterate over values. TEST_F(IPListTest, Iterate) { I_P_ListTestValue values[]= {3, 2, 1}; insert_values(values, &m_int_list); m_int_list_iter.init(m_int_list); for (int ix= 0; ix < array_size(values); ++ix) { EXPECT_EQ(values[ix], *m_int_list_iter++); } m_int_list_iter.init(m_int_list); I_P_ListTestValue *value; int value_number= 0; while ((value= m_int_list_iter++)) { EXPECT_EQ(values[value_number++], value->value); } } } // namespace