2019-02-25 14:48:22 +01:00
|
|
|
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
#include "config/configcompiler.hpp"
|
2014-11-30 23:32:13 +01:00
|
|
|
#include "base/exception.hpp"
|
2016-09-07 08:20:51 +02:00
|
|
|
#include <BoostTestTargetConfig.h>
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
using namespace icinga;
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_SUITE(config_ops)
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(simple)
|
|
|
|
{
|
2018-01-03 10:19:24 +01:00
|
|
|
ScriptFrame frame(true);
|
2017-12-15 05:34:46 +01:00
|
|
|
std::unique_ptr<Expression> expr;
|
2014-11-23 09:53:28 +01:00
|
|
|
Dictionary::Ptr dict;
|
|
|
|
|
2014-11-23 12:35:13 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == Empty);
|
2014-11-23 12:35:13 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "\n3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
|
2014-11-23 12:35:13 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "{ 3\n\n5 }");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
|
2014-11-23 12:35:13 +01:00
|
|
|
|
2014-11-23 09:53:28 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "1 + 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 4);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "3 - 1");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "5m * 10");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3000);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "5m / 5");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 60);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "7 & 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "2 | 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "true && false");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(!expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "true || false");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "3 < 5");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "3 > 5");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(!expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "3 <= 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "3 >= 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "2 + 3 * 4");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 14);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "(2 + 3) * 4");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 20);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
2014-11-23 23:19:46 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "2 * - 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == -6);
|
2014-11-23 23:19:46 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "-(2 + 3)");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == -5);
|
2014-11-23 23:19:46 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "- 2 * 2 - 2 * 3 - 4 * - 5");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 10);
|
2014-11-23 23:19:46 +01:00
|
|
|
|
2014-11-23 09:53:28 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "!0 == true");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
2014-11-23 12:35:13 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "~0");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == (double)~(long)0);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "4 << 8");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 1024);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "1024 >> 4");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 64);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "2 << 3 << 4");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 256);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "256 >> 4 >> 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
2018-01-04 08:59:00 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", R"("hello" == "hello")");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
2018-01-04 08:59:00 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", R"("hello" != "hello")");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(!expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
2018-01-04 08:59:00 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", R"("foo" in [ "foo", "bar" ])");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
2018-01-04 08:59:00 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", R"("foo" in [ "bar", "baz" ])");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(!expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "\"foo\" in null");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(!expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
2018-01-04 08:59:00 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", R"("foo" in "bar")");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
2018-01-04 08:59:00 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", R"("foo" !in [ "bar", "baz" ])");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
2018-01-04 08:59:00 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", R"("foo" !in [ "foo", "bar" ])");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(!expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in null");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-11-23 09:53:28 +01:00
|
|
|
|
2018-01-04 08:59:00 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", R"("foo" !in "bar")");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
|
2014-11-23 09:53:28 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "{ a += 3 }");
|
2015-02-19 12:57:52 +01:00
|
|
|
dict = expr->Evaluate(frame).GetValue();
|
2014-11-23 09:53:28 +01:00
|
|
|
BOOST_CHECK(dict->GetLength() == 1);
|
|
|
|
BOOST_CHECK(dict->Get("a") == 3);
|
|
|
|
|
2014-11-23 12:35:13 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "test");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
|
2014-11-25 12:26:49 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "null + 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
|
2014-11-25 12:26:49 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "3 + null");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
|
2014-11-25 12:26:49 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "\"test\" + 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == "test3");
|
2015-01-07 13:26:10 +01:00
|
|
|
|
2018-01-04 08:59:00 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", R"("\"te\\st")");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == "\"te\\st");
|
2015-01-07 13:26:10 +01:00
|
|
|
|
2018-01-04 08:59:00 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", R"("\'test")");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
|
2015-09-23 16:37:21 +02:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "({ a = 3\nb = 3 })");
|
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue().IsObjectType<Dictionary>());
|
2014-11-23 12:35:13 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(advanced)
|
|
|
|
{
|
2018-01-03 10:19:24 +01:00
|
|
|
ScriptFrame frame(true);
|
2017-12-15 05:34:46 +01:00
|
|
|
std::unique_ptr<Expression> expr;
|
2015-02-03 14:02:32 +01:00
|
|
|
Function::Ptr func;
|
2014-11-23 12:35:13 +01:00
|
|
|
|
2018-01-04 08:59:00 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", R"(regex("^Hello", "Hello World"))");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-11-23 12:35:13 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "__boost_test()");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
|
2014-11-23 12:35:13 +01:00
|
|
|
|
|
|
|
Object::Ptr self = new Object();
|
2018-01-03 10:19:24 +01:00
|
|
|
ScriptFrame frame2(true, self);
|
2014-11-23 12:35:13 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "this");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame2).GetValue() == Value(self));
|
2014-11-23 12:35:13 +01:00
|
|
|
|
2014-12-16 10:37:21 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "var v = 7; v");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-11-23 12:35:13 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "{ a = 3 }.a");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
|
2014-11-23 12:35:13 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "[ 2, 3 ][1]");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
|
2014-11-23 12:35:13 +01:00
|
|
|
|
2014-12-16 10:37:21 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "var v = { a = 3}; v.a");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
|
2014-11-23 12:35:13 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "a = 3 b = 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
|
2014-11-24 00:04:26 +01:00
|
|
|
|
2014-12-11 13:25:06 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "function() { 3 }()");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
|
2014-11-24 00:04:26 +01:00
|
|
|
|
2014-12-11 13:25:06 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "function() { return 3, 5 }()");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
|
2014-12-08 11:03:50 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "typeof([]) == Array");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-08 11:03:50 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "typeof({}) == Dictionary");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-09 16:46:29 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "typeof(3) == Number");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-09 16:46:29 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "typeof(\"test\") == String");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-09 20:48:19 +01:00
|
|
|
|
2015-02-02 12:35:07 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "(7 | 8) == 15");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-09 20:48:19 +01:00
|
|
|
|
2015-02-02 12:35:07 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) == 15");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-09 20:48:19 +01:00
|
|
|
|
2015-02-02 12:35:07 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "(7 & 15) == 7");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-09 20:48:19 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "7 in [7] == true");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-09 20:48:19 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "7 !in [7] == false");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-09 20:48:19 +01:00
|
|
|
|
2015-02-02 12:35:07 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "(7 | 8) > 14");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-09 20:48:19 +01:00
|
|
|
|
2015-02-02 12:35:07 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) > 14");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-09 20:48:19 +01:00
|
|
|
|
2015-02-02 12:35:07 +01:00
|
|
|
expr = ConfigCompiler::CompileText("<test>", "(7 & 15) > 6");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue());
|
2014-12-14 11:55:44 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "\"a\" = 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
|
2014-12-14 11:55:44 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "3 = 3");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
|
2014-12-15 16:42:34 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "var e; e");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue().IsEmpty());
|
2014-12-15 16:42:34 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "var e = 3; e");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
|
2014-12-15 17:23:18 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "Array.x");
|
2015-02-19 12:57:52 +01:00
|
|
|
BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
|
2015-02-03 14:02:32 +01:00
|
|
|
|
|
|
|
expr = ConfigCompiler::CompileText("<test>", "{{ 3 }}");
|
2015-02-19 12:57:52 +01:00
|
|
|
func = expr->Evaluate(frame).GetValue();
|
2015-02-03 14:02:32 +01:00
|
|
|
BOOST_CHECK(func->Invoke() == 3);
|
2014-11-23 09:53:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|