// Copyright 2005 The Trustees of Indiana University. // Use, modification and distribution is subject to 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) // // dynamic_properties_test.cpp - test cases for the dynamic property maps. // // Author: Ronald Garcia #include // For Borland, act like BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS is defined #if defined (__BORLANDC__) && (__BORLANDC__ <= 0x570) && !defined(BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS) # define BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS #endif #include #include #include #include #include #include #include #include // generate a dynamic_property_map that maps strings to strings // WARNING: This code leaks memory. For testing purposes only! // WARNING: This code uses library internals. For testing purposes only! boost::shared_ptr string2string_gen(const std::string& name, const boost::any&, const boost::any&) { typedef std::map map_t; typedef boost::associative_property_map< std::map > property_t; map_t* mymap = new map_t(); // hint: leaky memory here! property_t property_map(*mymap); boost::shared_ptr pm( new boost::detail::dynamic_property_map_adaptor(property_map)); return pm; } int test_main(int,char**) { // build property maps using associative_property_map std::map string2int; std::map double2string; boost::associative_property_map< std::map > int_map(string2int); boost::associative_property_map< std::map > dbl_map(double2string); // add key-value information string2int["one"] = 1; string2int["five"] = 5; double2string[5.3] = "five point three"; double2string[3.14] = "pi"; // build and populate dynamic interface boost::dynamic_properties properties; properties.property("int",int_map); properties.property("double",dbl_map); using boost::get; using boost::put; using boost::type; // Get tests { BOOST_CHECK(get("int",properties,std::string("one")) == "1"); #ifndef BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS BOOST_CHECK(boost::get("int",properties,std::string("one")) == 1); #endif BOOST_CHECK(get("int",properties,std::string("one"), type()) == 1); BOOST_CHECK(get("double",properties,5.3) == "five point three"); } // Put tests { put("int",properties,std::string("five"),6); BOOST_CHECK(get("int",properties,std::string("five")) == "6"); put("int",properties,std::string("five"),std::string("5")); #ifndef BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS BOOST_CHECK(get("int",properties,std::string("five")) == 5); #endif BOOST_CHECK(get("int",properties,std::string("five"),type()) == 5); put("double",properties,3.14,std::string("3.14159")); BOOST_CHECK(get("double",properties,3.14) == "3.14159"); put("double",properties,3.14,std::string("pi")); #ifndef BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS BOOST_CHECK(get("double",properties,3.14) == "pi"); #endif BOOST_CHECK(get("double",properties,3.14,type()) == "pi"); } // Nonexistent property { try { get("nope",properties,3.14); BOOST_ERROR("No exception thrown."); } catch (boost::dynamic_get_failure&) { } try { put("nada",properties,3.14,std::string("3.14159")); BOOST_ERROR("No exception thrown."); } catch (boost::property_not_found&) { } } // Nonexistent property gets generated { boost::dynamic_properties props(&string2string_gen); put("nada",props,std::string("3.14"),std::string("pi")); BOOST_CHECK(get("nada",props,std::string("3.14")) == "pi"); } // Use the ignore_other_properties generator { boost::dynamic_properties props(&boost::ignore_other_properties); bool value = put("nada",props,std::string("3.14"),std::string("pi")); BOOST_CHECK(value == false); } return boost::exit_success; }