summaryrefslogtreecommitdiff
path: root/TAO/tests/Sequence_Unit_Tests/value_sequence_tester.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/Sequence_Unit_Tests/value_sequence_tester.hpp')
-rw-r--r--TAO/tests/Sequence_Unit_Tests/value_sequence_tester.hpp269
1 files changed, 269 insertions, 0 deletions
diff --git a/TAO/tests/Sequence_Unit_Tests/value_sequence_tester.hpp b/TAO/tests/Sequence_Unit_Tests/value_sequence_tester.hpp
new file mode 100644
index 00000000000..02e88aad88e
--- /dev/null
+++ b/TAO/tests/Sequence_Unit_Tests/value_sequence_tester.hpp
@@ -0,0 +1,269 @@
+#ifndef guard_value_sequence_tester_hpp
+#define guard_value_sequence_tester_hpp
+/**
+ * @file
+ *
+ * @brief Helper class to implement tests for *_value_sequence
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan
+ */
+#include "tao/Basic_Types.h"
+
+#include <boost/test/unit_test.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class tested_sequence,
+ class tested_allocation_traits>
+struct value_sequence_tester
+{
+ typedef typename tested_sequence::value_type value_type;
+ typedef typename tested_sequence::const_value_type const_value_type;
+
+ void test_default_constructor()
+ {
+ expected_calls a(tested_allocation_traits::allocbuf_calls);
+ expected_calls f(tested_allocation_traits::freebuf_calls);
+ {
+ tested_sequence x;
+
+ BOOST_CHECK_EQUAL(
+ CORBA::ULong(tested_allocation_traits::default_maximum()),
+ x.maximum());
+ BOOST_CHECK_EQUAL(CORBA::ULong(0), x.length());
+ BOOST_CHECK_EQUAL(true, x.release());
+ }
+ BOOST_CHECK_MESSAGE(a.expect(0), a);
+ BOOST_CHECK_MESSAGE(f.expect(1), f);
+ }
+
+
+ void test_copy_constructor_from_default()
+ {
+ expected_calls a(tested_allocation_traits::allocbuf_calls);
+ expected_calls f(tested_allocation_traits::freebuf_calls);
+ {
+ tested_sequence x;
+ BOOST_CHECK_MESSAGE(a.expect(0), a);
+ BOOST_CHECK_EQUAL(
+ CORBA::ULong(tested_allocation_traits::default_maximum()),
+ x.maximum());
+ BOOST_CHECK_EQUAL(CORBA::ULong(0), x.length());
+ BOOST_CHECK_EQUAL(true, x.release());
+
+ tested_sequence y(x);
+ BOOST_CHECK_MESSAGE(a.expect(1), a);
+ BOOST_CHECK_EQUAL(x.maximum(), y.maximum());
+ BOOST_CHECK_EQUAL(x.length(), y.length());
+ BOOST_CHECK_EQUAL(x.release(), y.release());
+ }
+ BOOST_CHECK_MESSAGE(f.expect(2), f);
+ }
+
+ void test_index_accessor()
+ {
+ tested_sequence x;
+ x.length(8);
+
+ tested_sequence const & y = x;
+ const_value_type & z = y[4];
+ BOOST_CHECK_EQUAL(z, y[4]);
+ }
+
+ void test_index_modifier()
+ {
+ tested_sequence x;
+ x.length(8);
+
+ tested_sequence const & y = x;
+ const_value_type & z = y[4];
+ x[4] = 4;
+ BOOST_CHECK_EQUAL(4, x[4]);
+ BOOST_CHECK_EQUAL(4, y[4]);
+ BOOST_CHECK_EQUAL(4, z);
+ }
+
+ void test_index_checking()
+ {
+ tested_sequence x;
+ x.length(8);
+
+ tested_sequence const & y = x;
+ int z = 0;
+
+ BOOST_CHECK_THROW(z = y[32], std::range_error);
+ BOOST_CHECK_THROW(x[32] = z, std::range_error);
+ }
+
+ void test_copy_constructor_values()
+ {
+ tested_sequence a;
+ a.length(16);
+ for(CORBA::ULong i = 0; i != 16; ++i) a[i] = i*i;
+
+ tested_sequence b(a);
+ BOOST_CHECK_EQUAL(a.length(), b.length());
+ for(CORBA::ULong i = 0; i != a.length(); ++i)
+ {
+ BOOST_CHECK_MESSAGE(a[i] == b[i],
+ "Mismatched elements at index " << i);
+ }
+ }
+
+ void test_assignment_from_default()
+ {
+ expected_calls a(tested_allocation_traits::allocbuf_calls);
+ expected_calls f(tested_allocation_traits::freebuf_calls);
+ {
+ tested_sequence x;
+ BOOST_CHECK_MESSAGE(a.expect(0), a);
+ BOOST_CHECK_EQUAL(
+ CORBA::ULong(tested_allocation_traits::default_maximum()),
+ x.maximum());
+ BOOST_CHECK_EQUAL(CORBA::ULong(0), x.length());
+ BOOST_CHECK_EQUAL(true, x.release());
+
+ tested_sequence y;
+ BOOST_CHECK_MESSAGE(a.expect(0), a);
+
+ y = x;
+ BOOST_CHECK_MESSAGE(a.expect(1), a);
+ BOOST_CHECK_MESSAGE(f.expect(1), f);
+ BOOST_CHECK_EQUAL(x.maximum(), y.maximum());
+ BOOST_CHECK_EQUAL(x.length(), y.length());
+ BOOST_CHECK_EQUAL(x.release(), y.release());
+ }
+ BOOST_CHECK_MESSAGE(f.expect(2), f);
+ }
+
+ void test_assignment_values()
+ {
+ tested_sequence a;
+ a.length(16);
+ for(CORBA::ULong i = 0; i != 16; ++i) a[i] = i*i;
+
+ tested_sequence b;
+ b = a;
+ BOOST_CHECK_EQUAL(a.maximum(), b.maximum());
+ BOOST_CHECK_EQUAL(a.length(), b.length());
+ BOOST_CHECK_EQUAL(a.release(), b.release());
+ for(CORBA::ULong i = 0; i != a.length(); ++i)
+ {
+ BOOST_CHECK_MESSAGE(a[i] == b[i],
+ "Mismatched elements at index " << i);
+ }
+ }
+
+ void test_exception_in_copy_constructor()
+ {
+ expected_calls f(tested_allocation_traits::freebuf_calls);
+ {
+ tested_sequence x; x.length(8);
+ f.reset();
+
+ expected_calls a(tested_allocation_traits::allocbuf_calls);
+ tested_allocation_traits::allocbuf_calls.failure_countdown(1);
+ BOOST_CHECK_THROW(tested_sequence y(x), testing_exception);
+ BOOST_CHECK_MESSAGE(a.expect(1), a);
+ }
+ BOOST_CHECK_MESSAGE(f.expect(1), f);
+ }
+
+ void test_exception_in_assignment()
+ {
+ expected_calls f(tested_allocation_traits::freebuf_calls);
+ {
+ tested_sequence x; x.length(2);
+
+ tested_sequence y; y.length(3);
+
+ expected_calls a(tested_allocation_traits::allocbuf_calls);
+ f.reset();
+ tested_allocation_traits::allocbuf_calls.failure_countdown(1);
+ BOOST_CHECK_THROW(y = x, testing_exception);
+
+ BOOST_CHECK_MESSAGE(a.expect(1), a);
+ BOOST_CHECK_MESSAGE(f.expect(0), f);
+
+ BOOST_CHECK_EQUAL(CORBA::ULong(3), y.length());
+ }
+ BOOST_CHECK_MESSAGE(f.expect(2), f);
+ }
+
+ void test_get_buffer_const()
+ {
+ tested_sequence a; a.length(4);
+ tested_sequence const & b = a;
+
+ value_type const * buffer = b.get_buffer();
+ a[0] = 1; a[1] = 4; a[2] = 9; a[3] = 16;
+
+ BOOST_CHECK_EQUAL(1, buffer[0]);
+ BOOST_CHECK_EQUAL(4, buffer[1]);
+ BOOST_CHECK_EQUAL(9, buffer[2]);
+ BOOST_CHECK_EQUAL(16, buffer[3]);
+ }
+
+ void add_all(boost::unit_test_framework::test_suite * ts)
+ {
+ boost::shared_ptr<value_sequence_tester> shared_this(self_);
+
+ ts->add(BOOST_CLASS_TEST_CASE(
+ &value_sequence_tester::test_default_constructor,
+ shared_this));
+
+ ts->add(BOOST_CLASS_TEST_CASE(
+ &value_sequence_tester::test_copy_constructor_from_default,
+ shared_this));
+ ts->add(BOOST_CLASS_TEST_CASE(
+ &value_sequence_tester::test_index_accessor,
+ shared_this));
+ ts->add(BOOST_CLASS_TEST_CASE(
+ &value_sequence_tester::test_index_modifier,
+ shared_this));
+ ts->add(BOOST_CLASS_TEST_CASE(
+ &value_sequence_tester::test_index_checking,
+ shared_this));
+ ts->add(BOOST_CLASS_TEST_CASE(
+ &value_sequence_tester::test_copy_constructor_values,
+ shared_this));
+ ts->add(BOOST_CLASS_TEST_CASE(
+ &value_sequence_tester::test_assignment_from_default,
+ shared_this));
+ ts->add(BOOST_CLASS_TEST_CASE(
+ &value_sequence_tester::test_assignment_values,
+ shared_this));
+
+ ts->add(BOOST_CLASS_TEST_CASE(
+ &value_sequence_tester::test_exception_in_copy_constructor,
+ shared_this));
+ ts->add(BOOST_CLASS_TEST_CASE(
+ &value_sequence_tester::test_exception_in_assignment,
+ shared_this));
+
+ ts->add(BOOST_CLASS_TEST_CASE(
+ &value_sequence_tester::test_get_buffer_const,
+ shared_this));
+ }
+
+ static boost::shared_ptr<value_sequence_tester> allocate()
+ {
+ boost::shared_ptr<value_sequence_tester> ptr(
+ new value_sequence_tester);
+ ptr->self_ = ptr;
+
+ return ptr;
+ }
+
+private:
+ value_sequence_tester() {}
+
+ boost::weak_ptr<value_sequence_tester> self_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+#endif // guard_value_sequence_tester_hpp