123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- // Boost.TypeErasure library
- //
- // Copyright 2011 Steven Watanabe
- //
- // Distributed under the Boost Software License Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- //
- // $Id$
- #include <boost/type_erasure/any.hpp>
- #include <boost/type_erasure/tuple.hpp>
- #include <boost/type_erasure/builtin.hpp>
- #include <boost/type_erasure/operators.hpp>
- #include <boost/type_erasure/any_cast.hpp>
- #include <boost/type_erasure/tuple.hpp>
- #include <boost/mpl/vector.hpp>
- #include <sstream>
- #define BOOST_TEST_MAIN
- #include <boost/test/unit_test.hpp>
- using namespace boost::type_erasure;
- BOOST_AUTO_TEST_CASE(test_output_int)
- {
- typedef ostreamable<_a, int> test_concept;
- std::ostringstream ss;
- any<test_concept, _a&> x(ss);
- x << 17;
- BOOST_CHECK_EQUAL(ss.str(), "17");
- }
- BOOST_AUTO_TEST_CASE(test_output_int_wide)
- {
- typedef ostreamable<_a, int> test_concept;
- std::wostringstream ss;
- any<test_concept, _a&> x(ss);
- x << 17;
- BOOST_CHECK(ss.str() == L"17");
- }
- BOOST_AUTO_TEST_CASE(test_output_int_any)
- {
- typedef boost::mpl::vector<ostreamable<>, copy_constructible<> > test_concept;
- std::ostringstream ss;
- any<test_concept> x(10);
- ss << x;
- BOOST_CHECK_EQUAL(ss.str(), "10");
- }
- BOOST_AUTO_TEST_CASE(test_output_int_any_wide)
- {
- typedef boost::mpl::vector<ostreamable<std::wostream>, copy_constructible<> > test_concept;
- std::wostringstream ss;
- any<test_concept> x(10);
- ss << x;
- BOOST_CHECK(ss.str() == L"10");
- }
- BOOST_AUTO_TEST_CASE(test_output_both_any)
- {
- typedef boost::mpl::vector<ostreamable<_a>, copy_constructible<> > test_concept;
- std::ostringstream ss;
- int val = 19;
- tuple<test_concept, _a&, _self> t(ss, val);
- get<0>(t) << get<1>(t);
- BOOST_CHECK_EQUAL(ss.str(), "19");
- }
- BOOST_AUTO_TEST_CASE(test_output_both_any_wide)
- {
- typedef boost::mpl::vector<ostreamable<_a>, copy_constructible<> > test_concept;
- std::wostringstream ss;
- int val = 19;
- tuple<test_concept, _a&, _self> t(ss, val);
- get<0>(t) << get<1>(t);
- BOOST_CHECK(ss.str() == L"19");
- }
- BOOST_AUTO_TEST_CASE(test_output_overload_all)
- {
- typedef boost::mpl::vector<
- ostreamable<_a>,
- ostreamable<_a, int>,
- ostreamable<_b>,
- ostreamable<_b, int>,
- ostreamable<>,
- ostreamable<std::wostream>,
- copy_constructible<>
- > test_concept;
- {
- std::ostringstream ss;
- std::wostringstream wss;
- int val = 2;
- tuple<test_concept, _a&, _b&, _self> t(ss, wss, val);
- get<0>(t) << get<2>(t);
- get<1>(t) << get<2>(t);
- BOOST_CHECK_EQUAL(ss.str(), "2");
- BOOST_CHECK(wss.str() == L"2");
- }
- {
- std::ostringstream ss;
- std::wostringstream wss;
- int val = 2;
- tuple<test_concept, _a&, _b&, _self> t(ss, wss, val);
- get<0>(t) << 3;
- get<1>(t) << 3;
- BOOST_CHECK_EQUAL(ss.str(), "3");
- BOOST_CHECK(wss.str() == L"3");
- }
- {
- std::ostringstream ss;
- std::wostringstream wss;
- int val = 5;
- tuple<test_concept, _a&, _b&, _self> t(ss, wss, val);
- ss << get<2>(t);
- wss << get<2>(t);
- BOOST_CHECK_EQUAL(ss.str(), "5");
- BOOST_CHECK(wss.str() == L"5");
- }
- {
- std::ostringstream ss;
- std::wostringstream wss;
- int val = 5;
- tuple<test_concept, _a&, _b&, _self> t(ss, wss, val);
- // we can't do anything with these, but it should
- // still compile.
- any<test_concept, const _a&> os(get<0>(t));
- any<test_concept, const _b&> wos(get<1>(t));
- }
- }
- BOOST_AUTO_TEST_CASE(test_input_int)
- {
- typedef istreamable<_a, int> test_concept;
- std::istringstream ss("17");
- int i;
- any<test_concept, _a&> x(ss);
- x >> i;
- BOOST_CHECK_EQUAL(i, 17);
- }
- BOOST_AUTO_TEST_CASE(test_input_int_wide)
- {
- typedef istreamable<_a, int> test_concept;
- std::wistringstream ss(L"17");
- int i;
- any<test_concept, _a&> x(ss);
- x >> i;
- BOOST_CHECK_EQUAL(i, 17);
- }
- BOOST_AUTO_TEST_CASE(test_input_int_any)
- {
- typedef istreamable<> test_concept;
- std::istringstream ss("10");
- int i;
- any<test_concept, _self&> x(i);
- ss >> x;
- BOOST_CHECK_EQUAL(i, 10);
- }
- BOOST_AUTO_TEST_CASE(test_input_int_any_wide)
- {
- typedef istreamable<std::wistream> test_concept;
- std::wistringstream ss(L"10");
- int i;
- any<test_concept, _self&> x(i);
- ss >> x;
- BOOST_CHECK_EQUAL(i, 10);
- }
- BOOST_AUTO_TEST_CASE(test_input_both_any)
- {
- typedef istreamable<_a> test_concept;
- std::istringstream ss("19");
- int i;
- tuple<test_concept, _a&, _self&> t(ss, i);
- get<0>(t) >> get<1>(t);
- BOOST_CHECK_EQUAL(i, 19);
- }
- BOOST_AUTO_TEST_CASE(test_input_both_any_wide)
- {
- typedef istreamable<_a> test_concept;
- std::wistringstream ss(L"19");
- int i;
- tuple<test_concept, _a&, _self&> t(ss, i);
- get<0>(t) >> get<1>(t);
- BOOST_CHECK_EQUAL(i, 19);
- }
- BOOST_AUTO_TEST_CASE(test_input_overload_all)
- {
- typedef boost::mpl::vector<
- istreamable<_a>,
- istreamable<_a, int>,
- istreamable<_b>,
- istreamable<_b, int>,
- istreamable<>,
- istreamable<std::wistream>
- > test_concept;
- {
- std::istringstream ss("2");
- std::wistringstream wss(L"3");
- int i = 0;
- tuple<test_concept, _a&, _b&, _self&> t(ss, wss, i);
- get<0>(t) >> get<2>(t);
- BOOST_CHECK_EQUAL(i, 2);
- get<1>(t) >> get<2>(t);
- BOOST_CHECK_EQUAL(i, 3);
- }
- {
- std::istringstream ss("5");
- std::wistringstream wss(L"7");
- int i = 0;
- tuple<test_concept, _a&, _b&, _self&> t(ss, wss, i);
- get<0>(t) >> i;
- BOOST_CHECK_EQUAL(i, 5);
- get<1>(t) >> i;
- BOOST_CHECK_EQUAL(i, 7);
- }
- {
- std::istringstream ss("11");
- std::wistringstream wss(L"13");
- int i = 0;
- tuple<test_concept, _a&, _b&, _self&> t(ss, wss, i);
- ss >> get<2>(t);
- BOOST_CHECK_EQUAL(i, 11);
- wss >> get<2>(t);
- BOOST_CHECK_EQUAL(i, 13);
- }
- {
- std::istringstream ss;
- std::wistringstream wss;
- int val = 5;
- tuple<test_concept, _a&, _b&, _self&> t(ss, wss, val);
- // we can't do anything with these, but it should
- // still compile.
- any<test_concept, const _a&> is(get<0>(t));
- any<test_concept, const _b&> wis(get<1>(t));
- }
- }
|