// This does the tests
int test_main(int /* argc */, char * /* argv */[])
{

    // Both Sub
    boost::shared_ptr<Sub> tc1_sp(new Sub(10));
    boost::weak_ptr<Sub> tc1_wp(tc1_sp);
    shared_weak(tc1_sp, tc1_wp);
    weak_shared(tc1_wp, tc1_sp);
    tc1_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Sub and Base1
    boost::shared_ptr<Sub> tc2_sp(new Sub(10));
    boost::weak_ptr<Base1> tc2_wp(tc2_sp);
    shared_weak(tc2_sp, tc2_wp);
    weak_shared(tc2_wp, tc2_sp);
    tc2_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Sub and Base2
    boost::shared_ptr<Sub> tc3_sp(new Sub(10));
    boost::weak_ptr<Base2> tc3_wp(tc3_sp);
    shared_weak(tc3_sp, tc3_wp);
    weak_shared(tc3_wp, tc3_sp);
    tc3_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Sub and Base3
    boost::shared_ptr<Sub> tc4_sp(new Sub(10));
    boost::weak_ptr<Base3> tc4_wp(tc4_sp);
    shared_weak(tc4_sp, tc4_wp);
    weak_shared(tc4_wp, tc4_sp);
    tc4_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Base1 and Base2
    boost::shared_ptr<Sub> tc5_sp_tmp(new Sub(10));
    boost::shared_ptr<Base1> tc5_sp(tc5_sp_tmp);
    boost::weak_ptr<Base2> tc5_wp(tc5_sp_tmp);
    tc5_sp_tmp.reset();
    shared_weak(tc5_sp, tc5_wp);
    weak_shared(tc5_wp, tc5_sp);
    tc5_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Base2 and Base3
    boost::shared_ptr<Sub> tc6_sp_tmp(new Sub(10));
    boost::shared_ptr<Base2> tc6_sp(tc6_sp_tmp);
    boost::weak_ptr<Base3> tc6_wp(tc6_sp_tmp);
    tc6_sp_tmp.reset();
    shared_weak(tc6_sp, tc6_wp);
    weak_shared(tc6_wp, tc6_sp);
    tc6_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Base3 and Base1
    boost::shared_ptr<Sub> tc7_sp_tmp(new Sub(10));
    boost::shared_ptr<Base3> tc7_sp(tc7_sp_tmp);
    boost::weak_ptr<Base1> tc7_wp(tc7_sp_tmp);
    tc7_sp_tmp.reset();
    shared_weak(tc7_sp, tc7_wp);
    weak_shared(tc7_wp, tc7_sp);
    tc7_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    return EXIT_SUCCESS;
}
bool test(){
    // Both Sub
    SPT<Sub> tc1_sp(new Sub(10));
    WPT<Sub> tc1_wp(tc1_sp);
    shared_weak(tc1_sp, tc1_wp);
    weak_shared(tc1_wp, tc1_sp);
    tc1_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Sub and Base1
    SPT<Sub> tc2_sp(new Sub(10));
    WPT<Base1> tc2_wp(tc2_sp);
    shared_weak(tc2_sp, tc2_wp);
    weak_shared(tc2_wp, tc2_sp);
    tc2_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Sub and Base2
    SPT<Sub> tc3_sp(new Sub(10));
    WPT<Base2> tc3_wp(tc3_sp);
    shared_weak(tc3_sp, tc3_wp);
    weak_shared(tc3_wp, tc3_sp);
    tc3_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Sub and Base3
    SPT<Sub> tc4_sp(new Sub(10));
    WPT<Base3> tc4_wp(tc4_sp);
    shared_weak(tc4_sp, tc4_wp);
    weak_shared(tc4_wp, tc4_sp);
    tc4_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Base1 and Base2
    SPT<Sub> tc5_sp_tmp(new Sub(10));
    SPT<Base1> tc5_sp(tc5_sp_tmp);
    WPT<Base2> tc5_wp(tc5_sp_tmp);
    tc5_sp_tmp.reset();
    shared_weak(tc5_sp, tc5_wp);
    weak_shared(tc5_wp, tc5_sp);
    tc5_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Base2 and Base3
    SPT<Sub> tc6_sp_tmp(new Sub(10));
    SPT<Base2> tc6_sp(tc6_sp_tmp);
    WPT<Base3> tc6_wp(tc6_sp_tmp);
    tc6_sp_tmp.reset();
    shared_weak(tc6_sp, tc6_wp);
    weak_shared(tc6_wp, tc6_sp);
    tc6_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    // Base3 and Base1
    SPT<Sub> tc7_sp_tmp(new Sub(10));
    SPT<Base3> tc7_sp(tc7_sp_tmp);
    WPT<Base1> tc7_wp(tc7_sp_tmp);
    tc7_sp_tmp.reset();
    shared_weak(tc7_sp, tc7_wp);
    weak_shared(tc7_wp, tc7_sp);
    tc7_sp.reset();
    BOOST_CHECK(0 == Sub::count);

    return true;
}