X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=test%2Fbase-dictionary.cpp;h=cd074e1a990a80ffc8e3c112bb8fd461bbbbced7;hb=804c00ece54887c9b1e417290946ff8c1cba09e0;hp=3196b4dfbee1faa5e153a8aaa58bc54c7184b274;hpb=e6553a7140a9eb895ac99756d8dad1407820d90f;p=icinga2 diff --git a/test/base-dictionary.cpp b/test/base-dictionary.cpp index 3196b4dfb..cd074e1a9 100644 --- a/test/base-dictionary.cpp +++ b/test/base-dictionary.cpp @@ -1,25 +1,9 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the Free Software Foundation * - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ******************************************************************************/ - -#include "base/dictionary.h" -#include -#include +/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ + +#include "base/dictionary.hpp" +#include "base/objectlock.hpp" +#include "base/json.hpp" +#include using namespace icinga; @@ -27,16 +11,40 @@ BOOST_AUTO_TEST_SUITE(base_dictionary) BOOST_AUTO_TEST_CASE(construct) { - Dictionary::Ptr dictionary = boost::make_shared(); + Dictionary::Ptr dictionary = new Dictionary(); BOOST_CHECK(dictionary); } -BOOST_AUTO_TEST_CASE(getproperty) +BOOST_AUTO_TEST_CASE(initializer1) +{ + DictionaryData dict; + + dict.emplace_back("test1", "Gin-o-clock"); + + Dictionary::Ptr dictionary = new Dictionary(std::move(dict)); + + Value test1; + test1 = dictionary->Get("test1"); + BOOST_CHECK(test1 == "Gin-o-clock"); +} + +BOOST_AUTO_TEST_CASE(initializer2) { - Dictionary::Ptr dictionary = boost::make_shared(); + Dictionary::Ptr dictionary = new Dictionary({ {"test1", "Gin-for-the-win"} }); + + Value test1; + test1 = dictionary->Get("test1"); + BOOST_CHECK(test1 == "Gin-for-the-win"); +} + +BOOST_AUTO_TEST_CASE(get1) +{ + Dictionary::Ptr dictionary = new Dictionary(); dictionary->Set("test1", 7); dictionary->Set("test2", "hello world"); + BOOST_CHECK(dictionary->GetLength() == 2); + Value test1; test1 = dictionary->Get("test1"); BOOST_CHECK(test1 == 7); @@ -45,18 +53,21 @@ BOOST_AUTO_TEST_CASE(getproperty) test2 = dictionary->Get("test2"); BOOST_CHECK(test2 == "hello world"); + String key3 = "test3"; Value test3; - test3 = dictionary->Get("test3"); + test3 = dictionary->Get(key3); BOOST_CHECK(test3.IsEmpty()); } -BOOST_AUTO_TEST_CASE(getproperty_dict) +BOOST_AUTO_TEST_CASE(get2) { - Dictionary::Ptr dictionary = boost::make_shared(); - Dictionary::Ptr other = boost::make_shared(); + Dictionary::Ptr dictionary = new Dictionary(); + Dictionary::Ptr other = new Dictionary(); dictionary->Set("test1", other); + BOOST_CHECK(dictionary->GetLength() == 1); + Dictionary::Ptr test1 = dictionary->Get("test1"); BOOST_CHECK(other == test1); @@ -64,4 +75,112 @@ BOOST_AUTO_TEST_CASE(getproperty_dict) BOOST_CHECK(!test2); } +BOOST_AUTO_TEST_CASE(foreach) +{ + Dictionary::Ptr dictionary = new Dictionary(); + dictionary->Set("test1", 7); + dictionary->Set("test2", "hello world"); + + ObjectLock olock(dictionary); + + bool seen_test1 = false, seen_test2 = false; + + for (const Dictionary::Pair& kv : dictionary) { + BOOST_CHECK(kv.first == "test1" || kv.first == "test2"); + + if (kv.first == "test1") { + BOOST_CHECK(!seen_test1); + seen_test1 = true; + + BOOST_CHECK(kv.second == 7); + + continue; + } else if (kv.first == "test2") { + BOOST_CHECK(!seen_test2); + seen_test2 = true; + + BOOST_CHECK(kv.second == "hello world"); + } + } + + BOOST_CHECK(seen_test1); + BOOST_CHECK(seen_test2); +} + +BOOST_AUTO_TEST_CASE(remove) +{ + Dictionary::Ptr dictionary = new Dictionary(); + + dictionary->Set("test1", 7); + dictionary->Set("test2", "hello world"); + + BOOST_CHECK(dictionary->Contains("test1")); + BOOST_CHECK(dictionary->GetLength() == 2); + + dictionary->Set("test1", Empty); + + BOOST_CHECK(dictionary->Contains("test1")); + BOOST_CHECK(dictionary->GetLength() == 2); + + dictionary->Remove("test1"); + + BOOST_CHECK(!dictionary->Contains("test1")); + BOOST_CHECK(dictionary->GetLength() == 1); + + dictionary->Remove("test2"); + + BOOST_CHECK(!dictionary->Contains("test2")); + BOOST_CHECK(dictionary->GetLength() == 0); + + dictionary->Set("test1", 7); + dictionary->Set("test2", "hello world"); + + { + ObjectLock olock(dictionary); + + auto it = dictionary->Begin(); + dictionary->Remove(it); + } + + BOOST_CHECK(dictionary->GetLength() == 1); +} + +BOOST_AUTO_TEST_CASE(clone) +{ + Dictionary::Ptr dictionary = new Dictionary(); + + dictionary->Set("test1", 7); + dictionary->Set("test2", "hello world"); + + Dictionary::Ptr clone = dictionary->ShallowClone(); + + BOOST_CHECK(dictionary != clone); + + BOOST_CHECK(clone->GetLength() == 2); + BOOST_CHECK(clone->Get("test1") == 7); + BOOST_CHECK(clone->Get("test2") == "hello world"); + + clone->Set("test3", 5); + BOOST_CHECK(!dictionary->Contains("test3")); + BOOST_CHECK(dictionary->GetLength() == 2); + + clone->Set("test2", "test"); + BOOST_CHECK(dictionary->Get("test2") == "hello world"); +} + +BOOST_AUTO_TEST_CASE(json) +{ + Dictionary::Ptr dictionary = new Dictionary(); + + dictionary->Set("test1", 7); + dictionary->Set("test2", "hello world"); + + String json = JsonEncode(dictionary); + BOOST_CHECK(json.GetLength() > 0); + Dictionary::Ptr deserialized = JsonDecode(json); + BOOST_CHECK(deserialized->GetLength() == 2); + BOOST_CHECK(deserialized->Get("test1") == 7); + BOOST_CHECK(deserialized->Get("test2") == "hello world"); +} + BOOST_AUTO_TEST_SUITE_END()