/** * @file llheteromap_test.cpp * @author Nat Goodspeed * @date 2016-10-12 * @brief Test for llheteromap. * * $LicenseInfo:firstyear=2016&license=viewerlgpl$ * Copyright (c) 2016, Linden Research, Inc. * $/LicenseInfo$ */ // Precompiled header #include "linden_common.h" // associated header #include "llheteromap.h" // STL headers #include // std headers // external library headers // (pacify clang) std::ostream& operator<<(std::ostream& out, const std::set& strset); // other Linden headers #include "../test/lltut.h" static std::string clog; static std::set dlog; // want to be able to use ensure_equals() on a set std::ostream& operator<<(std::ostream& out, const std::set& strset) { out << '{'; const char* delim = ""; for (std::set::const_iterator si(strset.begin()), se(strset.end()); si != se; ++si) { out << delim << '"' << *si << '"'; delim = ", "; } out << '}'; return out; } // unrelated test classes struct Chalk { int dummy; std::string name; Chalk(): dummy(0) { clog.append("a"); } ~Chalk() { dlog.insert("a"); } private: Chalk(const Chalk&); // no implementation }; struct Cheese { std::string name; Cheese() { clog.append("e"); } ~Cheese() { dlog.insert("e"); } private: Cheese(const Cheese&); // no implementation }; struct Chowdah { char displace[17]; std::string name; Chowdah() { displace[0] = '\0'; clog.append("o"); } ~Chowdah() { dlog.insert("o"); } private: Chowdah(const Chowdah&); // no implementation }; /***************************************************************************** * TUT *****************************************************************************/ namespace tut { struct llheteromap_data { llheteromap_data() { clog.erase(); dlog.clear(); } }; typedef test_group llheteromap_group; typedef llheteromap_group::object object; llheteromap_group llheteromapgrp("llheteromap"); template<> template<> void object::test<1>() { set_test_name("create, get, delete"); { LLHeteroMap map; { // create each instance Chalk& chalk = map.obtain(); chalk.name = "Chalk"; Cheese& cheese = map.obtain(); cheese.name = "Cheese"; Chowdah& chowdah = map.obtain(); chowdah.name = "Chowdah"; } // refs go out of scope { // verify each instance Chalk& chalk = map.obtain(); ensure_equals(chalk.name, "Chalk"); Cheese& cheese = map.obtain(); ensure_equals(cheese.name, "Cheese"); Chowdah& chowdah = map.obtain(); ensure_equals(chowdah.name, "Chowdah"); } } // destroy map // Chalk, Cheese and Chowdah should have been created in specific order ensure_equals(clog, "aeo"); // We don't care what order they're destroyed in, as long as each is // appropriately destroyed. std::set dtorset; for (const char* cp = "aeo"; *cp; ++cp) dtorset.insert(std::string(1, *cp)); ensure_equals(dlog, dtorset); } } // namespace tut