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()