Mercurial > malikania
diff tests/libmlk/util/main.cpp @ 193:209bdaa13a49
Tests: rename directories to match targets
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 27 Oct 2018 07:16:28 +0200 |
parents | tests/libcommon/util/main.cpp@3107ce017c3a |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/libmlk/util/main.cpp Sat Oct 27 07:16:28 2018 +0200 @@ -0,0 +1,468 @@ +/* + * main.cpp -- test util + * + * Copyright (c) 2013-2018 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#define BOOST_TEST_MODULE "Util" +#include <boost/test/unit_test.hpp> + +#include <malikania/util.hpp> +#include <malikania/size.hpp> + +using namespace mlk; +using namespace nlohmann; + +namespace nlohmann { + +namespace detail { + +auto operator<<(std::ostream& out, json::value_t type) -> std::ostream& +{ + out << json(type).type_name(); + return out; +} + +} // !detail + +} // !nlohmann + +/* + * util::clamp + * ------------------------------------------------------------------ + */ + +BOOST_AUTO_TEST_SUITE(clamp) + +BOOST_AUTO_TEST_CASE(normal) +{ + BOOST_REQUIRE_EQUAL(5, util::clamp(5, 0, 10)); +} + +BOOST_AUTO_TEST_CASE(minimum) +{ + BOOST_REQUIRE_EQUAL(0, util::clamp(0, 0, 10)); +} + +BOOST_AUTO_TEST_CASE(maximum) +{ + BOOST_REQUIRE_EQUAL(10, util::clamp(10, 0, 10)); +} + +BOOST_AUTO_TEST_CASE(less) +{ + BOOST_REQUIRE_EQUAL(0, util::clamp(-10, 0, 10)); +} + +BOOST_AUTO_TEST_CASE(higher) +{ + BOOST_REQUIRE_EQUAL(10, util::clamp(20, 0, 10)); +} + +BOOST_AUTO_TEST_SUITE_END() + +/* + * util::json::require + * ------------------------------------------------------------------ + */ + +BOOST_AUTO_TEST_SUITE(json_require) + +BOOST_AUTO_TEST_CASE(simple) +{ + json object{ + { "b", true }, + { "i", 123 }, + { "s", "blabla" } + }; + + BOOST_REQUIRE_EQUAL(util::json::require( + object, "/b"_json_pointer, json::value_t::boolean).type(), json::value_t::boolean); + BOOST_REQUIRE_EQUAL(util::json::require( + object, "/i"_json_pointer, json::value_t::number_integer).type(), json::value_t::number_integer); + BOOST_REQUIRE_EQUAL(util::json::require( + object, "/s"_json_pointer, json::value_t::string).type(), json::value_t::string); +} + +BOOST_AUTO_TEST_CASE(nonexistent) +{ + auto json = json::object(); + + try { + util::json::require(json, "/non-existent"_json_pointer, json::value_t::string); + BOOST_FAIL("exception expected"); + } catch (const util::json::property_error& ex) { + BOOST_REQUIRE_EQUAL(ex.type(), json::value_t::null); + BOOST_REQUIRE_EQUAL(ex.expected(), json::value_t::string); + } +} + +BOOST_AUTO_TEST_CASE(invalid) +{ + json object{ + { "not-string", 123 } + }; + + try { + util::json::require(object, "/not-string"_json_pointer, json::value_t::string); + BOOST_FAIL("exception expected"); + } catch (const util::json::property_error& ex) { + BOOST_REQUIRE_EQUAL(ex.type(), json::value_t::number_integer); + BOOST_REQUIRE_EQUAL(ex.expected(), json::value_t::string); + } +} + +BOOST_AUTO_TEST_SUITE_END() + +/* + * util::json::require_array + * ------------------------------------------------------------------ + */ + +BOOST_AUTO_TEST_SUITE(json_require_array) + +BOOST_AUTO_TEST_CASE(simple) +{ + json object{ + { "a", { 1, 2, 3 } }, + { "l1", { + { "l2", { 4, 5, 6 } } + } + } + }; + + auto a = util::json::require_array(object, "/a"_json_pointer); + auto l2 = util::json::require_array(object, "/l1/l2"_json_pointer); + + BOOST_REQUIRE(a.is_array()); + BOOST_REQUIRE(l2.is_array()); +} + +BOOST_AUTO_TEST_CASE(invalid) +{ + json object{ + { "not-array", 123 } + }; + + try { + util::json::require_array(object, "/not-array"_json_pointer); + BOOST_FAIL("exception expected"); + } catch (const util::json::property_error& ex) { + BOOST_REQUIRE_EQUAL(ex.type(), json::value_t::number_integer); + BOOST_REQUIRE_EQUAL(ex.expected(), json::value_t::array); + } +} + +BOOST_AUTO_TEST_SUITE_END() + +/* + * util::json::require_bool + * ------------------------------------------------------------------ + */ + +BOOST_AUTO_TEST_SUITE(json_require_bool) + +BOOST_AUTO_TEST_CASE(simple) +{ + json object{ + { "b", true } + }; + + BOOST_REQUIRE_EQUAL(util::json::require_bool(object, "/b"_json_pointer), true); +} + +BOOST_AUTO_TEST_CASE(invalid) +{ + json object{ + { "not-bool", 123 } + }; + + try { + util::json::require_bool(object, "/not-bool"_json_pointer); + BOOST_FAIL("exception expected"); + } catch (const util::json::property_error& ex) { + BOOST_REQUIRE_EQUAL(ex.type(), json::value_t::number_integer); + BOOST_REQUIRE_EQUAL(ex.expected(), json::value_t::boolean); + } +} + +BOOST_AUTO_TEST_SUITE_END() + +/* + * util::json::require_int + * ------------------------------------------------------------------ + */ + +BOOST_AUTO_TEST_SUITE(json_require_int) + +BOOST_AUTO_TEST_CASE(simple) +{ + json object{ + { "i", 123 } + }; + + BOOST_REQUIRE_EQUAL(util::json::require_int(object, "/i"_json_pointer), 123); +} + +BOOST_AUTO_TEST_CASE(invalid) +{ + json object{ + { "not-int", true } + }; + + try { + util::json::require_int(object, "/not-int"_json_pointer); + BOOST_FAIL("exception expected"); + } catch (const util::json::property_error& ex) { + BOOST_REQUIRE_EQUAL(ex.type(), json::value_t::boolean); + BOOST_REQUIRE_EQUAL(ex.expected(), json::value_t::number_integer); + } +} + +BOOST_AUTO_TEST_SUITE_END() + +/* + * util::json::require_object + * ------------------------------------------------------------------ + */ + +BOOST_AUTO_TEST_SUITE(json_require_object) + +BOOST_AUTO_TEST_CASE(simple) +{ + json object{ + { + "network", json::object({ + { "host", "localhost" }, + { "port", 9090 } + }) + } + }; + + BOOST_REQUIRE(util::json::require_object(object, "/network"_json_pointer).is_object()); +} + +BOOST_AUTO_TEST_CASE(invalid) +{ + json object{ + { "not-object", 123 } + }; + + try { + util::json::require_object(object, "/not-object"_json_pointer); + BOOST_FAIL("exception expected"); + } catch (const util::json::property_error& ex) { + BOOST_REQUIRE_EQUAL(ex.type(), json::value_t::number_integer); + BOOST_REQUIRE_EQUAL(ex.expected(), json::value_t::object); + } +} + +BOOST_AUTO_TEST_SUITE_END() + +/* + * util::json::require_string + * ------------------------------------------------------------------ + */ + +BOOST_AUTO_TEST_SUITE(json_require_string) + +BOOST_AUTO_TEST_CASE(simple) +{ + json object{ + { "s", "hello" } + }; + + BOOST_REQUIRE_EQUAL(util::json::require_string(object, "/s"_json_pointer), "hello"); +} + +BOOST_AUTO_TEST_CASE(invalid) +{ + json object{ + { "not-string", 123 } + }; + + try { + util::json::require_string(object, "/not-string"_json_pointer); + BOOST_FAIL("exception expected"); + } catch (const util::json::property_error& ex) { + BOOST_REQUIRE_EQUAL(ex.type(), json::value_t::number_integer); + BOOST_REQUIRE_EQUAL(ex.expected(), json::value_t::string); + } +} + +BOOST_AUTO_TEST_SUITE_END() + +/* + * util::json::require_uint + * ------------------------------------------------------------------ + */ + +BOOST_AUTO_TEST_SUITE(json_require_uint) + +BOOST_AUTO_TEST_CASE(simple) +{ + json object{ + { "u1", 123U } + }; + + BOOST_REQUIRE_EQUAL(util::json::require_uint(object, "/u1"_json_pointer), 123U); +} + +BOOST_AUTO_TEST_CASE(invalid) +{ + json object{ + { "not-uint", true } + }; + + try { + util::json::require_uint(object, "/not-uint"_json_pointer); + BOOST_FAIL("exception expected"); + } catch (const util::json::property_error& ex) { + BOOST_REQUIRE_EQUAL(ex.type(), json::value_t::boolean); + BOOST_REQUIRE_EQUAL(ex.expected(), json::value_t::number_unsigned); + } +} + +BOOST_AUTO_TEST_SUITE_END() + +BOOST_AUTO_TEST_SUITE(json_require_size) + +/* + * util::json::require_size + * ------------------------------------------------------------------ + */ + +BOOST_AUTO_TEST_CASE(simple) +{ + json object{ + { "size", { + { "width", 10 }, + { "height", 20 } + } + } + }; + + BOOST_TEST((util::json::require_size(object, "/size"_json_pointer) == mlk::size{10, 20})); +} + +BOOST_AUTO_TEST_CASE(not_object) +{ + json object{ + { "size", false } + }; + + try { + util::json::require_size(object, "/size"_json_pointer); + BOOST_FAIL("exception expected"); + } catch (const util::json::property_error& ex) { + BOOST_REQUIRE_EQUAL(ex.type(), json::value_t::null); + BOOST_REQUIRE_EQUAL(ex.expected(), json::value_t::number_unsigned); + } +} + +BOOST_AUTO_TEST_CASE(not_int_width) +{ + json object{ + { "size", { + { "width", "10" }, + { "height", 20 } + } + } + }; + + try { + util::json::require_size(object, "/size"_json_pointer); + BOOST_FAIL("exception expected"); + } catch (const util::json::property_error& ex) { + BOOST_REQUIRE_EQUAL(ex.type(), json::value_t::string); + BOOST_REQUIRE_EQUAL(ex.expected(), json::value_t::number_unsigned); + } +} + +BOOST_AUTO_TEST_CASE(not_int_height) +{ + json object{ + { "size", { + { "width", 10 }, + { "height", "20" } + } + } + }; + + try { + util::json::require_size(object, "/size"_json_pointer); + BOOST_FAIL("exception expected"); + } catch (const util::json::property_error& ex) { + BOOST_REQUIRE_EQUAL(ex.type(), json::value_t::string); + BOOST_REQUIRE_EQUAL(ex.expected(), json::value_t::number_unsigned); + } +} + +BOOST_AUTO_TEST_SUITE_END() + +BOOST_AUTO_TEST_SUITE(json_get_size) + +BOOST_AUTO_TEST_CASE(simple) +{ + json object{ + { "size", { + { "width", 10 }, + { "height", 20 } + } + } + }; + + BOOST_TEST((util::json::get_size(object, "/size"_json_pointer) == mlk::size{10, 20})); +} + +BOOST_AUTO_TEST_CASE(not_object) +{ + const json object{{ "size", false }}; + const mlk::size def{10, 20}; + + BOOST_TEST(util::json::get_size(object, "/size"_json_pointer, def) == def); +} + +BOOST_AUTO_TEST_CASE(not_int_width) +{ + const json object{ + { "size", { + { "width", "10" }, + { "height", 20 } + } + } + }; + + const mlk::size def{10, 20}; + + BOOST_TEST(util::json::get_size(object, "/size"_json_pointer, def) == def); +} + +BOOST_AUTO_TEST_CASE(not_int_height) +{ + const json object{ + { "size", { + { "width", 10 }, + { "height", "20" } + } + } + }; + + const mlk::size def{10, 20}; + + BOOST_TEST(util::json::get_size(object, "/size"_json_pointer, def) == def); +} + +BOOST_AUTO_TEST_SUITE_END()