/* Copyright 2016-2018 Michele Santullo * This file is part of "duckhandy". * * "duckhandy" 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 3 of the License, or * (at your option) any later version. * * "duckhandy" 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 "duckhandy". If not, see . */ #include "catch2/catch.hpp" #include "duckhandy/scapegoat_tree.hpp" TEST_CASE ("Insert values in a ScapegoatTree", "[Scapegoat][ScapegoatTree][containers]") { using duckmem::ScapegoatTree; ScapegoatTree tree; { auto it = tree.insert(25); CHECK(it.second == true); CHECK(it.first != tree.end()); CHECK(*it.first == 25); CHECK(tree.size() == 1); } { auto it = tree.insert(25); CHECK(tree.size() == 1); CHECK(it.second == false); CHECK(it.first != tree.end()); CHECK(*it.first == 25); } { auto it = tree.insert(26); CHECK(it.second == true); CHECK(it.first != tree.end()); CHECK(*it.first == 26); CHECK(tree.size() == 2); } { for (std::size_t z = 0; z < 100; ++z) { const int val = static_cast(z); auto it = tree.insert(val); if (z < 25) { CHECK(tree.size() == z + 2 + 1); CHECK(it.second == true); } else if (z < 26) { CHECK(tree.size() == z + 1 + 1); CHECK(it.second == false); } else if (z < 27) { CHECK(tree.size() == z + 1); CHECK(it.second == false); } else { CHECK(tree.size() == z + 1); CHECK(it.second == true); } CHECK(*it.first == val); } } { auto end = tree.end(); int val = 0; for (auto it = tree.begin(); it != end; ++it, ++val) { CHECK(val == *it); } CHECK(static_cast(tree.size()) == val); val = 75; for (auto it = tree.insert(val).first; it != end; ++it, ++val) { CHECK(val == *it); } CHECK(static_cast(tree.size()) == val); } }