/* * Boost.Extension / construction test case * * (C) Copyright Jeremy Pack 2007 * 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) * * See http://www.boost.org/ for latest version. */ #include #include #define BOOST_TEST_MAIN #include #include #include using namespace boost::extensions; class Automobile { public: virtual ~Automobile() {} Automobile(int speed1, float speed2) : speed_(speed1 * speed2) {} virtual float getSpeed() {return speed_;} protected: float speed_; }; class Van : virtual public Automobile { public: virtual ~Van() {} Van(int speed1, float speed2) : Automobile(speed1, speed2) {} virtual float getSpeed() {return speed_ / 2;} }; class PickupTruck : virtual public Automobile { public: virtual ~PickupTruck() {} PickupTruck(int speed1, float speed2) : Automobile(speed1, speed2) {} virtual float getSpeed() {return speed_ / 3;} }; class Racecar : virtual public Automobile { public: virtual ~Racecar() {} Racecar(int speed1, float speed2) : Automobile(speed1, speed2) {} virtual float getSpeed() {return 3 * speed_;} }; class RacingVan : public Racecar, public Van { public: virtual ~RacingVan() {} RacingVan(int speed1, float speed2) : Automobile(speed1, speed2), Racecar(speed1, speed2), Van(speed1, speed2) {} virtual float getSpeed() {return 2 * speed_;} }; BOOST_AUTO_TEST_CASE(factory_argless) { factory f; f.set(); BOOST_CHECK(f.is_valid()); std::auto_ptr pickup(f.create(45, 2.0f)); BOOST_CHECK_EQUAL(pickup->getSpeed(), 30.0f); } BOOST_AUTO_TEST_CASE(map_argless) { std::map > m; m["A van"].set(); m["A basic automobile"].set(); m["A pickup truck"].set(); std::auto_ptr van(m["A van"].create(10, 3.0f)); BOOST_CHECK_EQUAL(van->getSpeed(), 15.0f); BOOST_CHECK_EQUAL (m["An unloaded car!"].create(30, 1.5f), (Automobile*)0); } /* namespace boost { namespace extensions { namespace impl { template <> Automobile * create_function::create() { return new Racecar(25, 2.0f); } }}} // namespace boost::extensions::impl */ BOOST_AUTO_TEST_CASE(factory_template) { factory f; f.set(); BOOST_CHECK(f.is_valid()); std::auto_ptr racecar(f.create(20, 3.0f)); BOOST_CHECK_EQUAL(racecar->getSpeed(), 180.0f); } BOOST_AUTO_TEST_CASE(factory_map_single_param) { factory_map m; m.get()["A pickup truck"] .set(); m.get()["A racing van!"] .set(); std::auto_ptr pickup (m.get()["A pickup truck"] .create(30, 2.0f)); BOOST_CHECK_EQUAL(pickup->getSpeed(), 20); std::auto_ptr racingVan (m.get()["A racing van!"] .create(20, 3.0f)); BOOST_CHECK_EQUAL(racingVan->getSpeed(), 120); std::auto_ptr car_ptr (m.get()["A nonexistent car!"] .create(30, 1.2f)); BOOST_CHECK_EQUAL(car_ptr.get(), (Automobile*)0); }