/* Ousía Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel 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 3 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, see . */ /* * This file contains generic tests for JavaScript script engines. JavaScript * script engine bindings should have their own test project in which the * GENERIC_JS_TEST_NAME, GENERIC_JS_TEST_SCOPE macros are defined and this * file is included. * * TODO: The macros are more of a dirty hack -- probably use gtest fixtures and * templates here. */ #ifndef _GENERIC_JS_SCRIPT_ENGINE_TEST_HPP_ #define _GENERIC_JS_SCRIPT_ENGINE_TEST_HPP_ #ifndef GENERIC_JS_TEST_NAME #error "Macro GENERIC_JS_TEST_NAME is not set!" #endif /* GENERIC_JS_TEST_NAME */ #ifndef GENERIC_JS_TEST_SCOPE #error "Macro GENERIC_JS_TEST_SCOPE is not set!" #endif /* GENERIC_JS_TEST_SCOPE */ TEST(GENERIC_JS_TEST_NAME, returnNull) { GENERIC_JS_TEST_SCOPE Variant res = scope->run("null;"); ASSERT_EQ(VariantType::null, res.getType()); } TEST(GENERIC_JS_TEST_NAME, returnBoolean) { GENERIC_JS_TEST_SCOPE Variant res = scope->run("true;"); ASSERT_EQ(VariantType::boolean, res.getType()); ASSERT_TRUE(res.getBooleanValue()); } TEST(GENERIC_JS_TEST_NAME, returnInteger) { GENERIC_JS_TEST_SCOPE Variant res = scope->run("42;"); ASSERT_EQ(VariantType::integer, res.getType()); ASSERT_EQ(42, res.getIntegerValue()); } TEST(GENERIC_JS_TEST_NAME, returnNumber) { GENERIC_JS_TEST_SCOPE Variant res = scope->run("42.5;"); ASSERT_EQ(VariantType::number, res.getType()); ASSERT_EQ(42.5, res.getNumberValue()); } TEST(GENERIC_JS_TEST_NAME, returnString) { GENERIC_JS_TEST_SCOPE Variant res = scope->run("\"Hello World\";"); ASSERT_EQ(VariantType::string, res.getType()); ASSERT_EQ("Hello World", res.getStringValue()); } TEST(GENERIC_JS_TEST_NAME, returnArray) { GENERIC_JS_TEST_SCOPE Variant res = scope->run("[42, \"Hello World\", false];"); ASSERT_EQ(VariantType::array, res.getType()); std::vector a = res.getArrayValue(); ASSERT_EQ(3, a.size()); ASSERT_EQ(VariantType::integer, a[0].getType()); ASSERT_EQ(42, a[0].getIntegerValue()); ASSERT_EQ(VariantType::string, a[1].getType()); ASSERT_EQ("Hello World", a[1].getStringValue()); ASSERT_EQ(VariantType::boolean, a[2].getType()); ASSERT_FALSE(a[2].getBooleanValue()); } TEST(GENERIC_JS_TEST_NAME, returnObject) { GENERIC_JS_TEST_SCOPE Variant res = scope->run( "({\"key1\": 42, \"key2\": \"Hello World\", \"key3\": false})"); ASSERT_EQ(VariantType::map, res.getType()); std::map m = res.getMapValue(); ASSERT_EQ(3, m.size()); ASSERT_TRUE(m.find("key1") != m.end()); ASSERT_TRUE(m.find("key2") != m.end()); ASSERT_TRUE(m.find("key3") != m.end()); ASSERT_EQ(VariantType::integer, m["key1"].getType()); ASSERT_EQ(42, m["key1"].getIntegerValue()); ASSERT_EQ(VariantType::string, m["key2"].getType()); ASSERT_EQ("Hello World", m["key2"].getStringValue()); ASSERT_EQ(VariantType::boolean, m["key3"].getType()); ASSERT_FALSE(m["key3"].getBooleanValue()); } TEST(GENERIC_JS_TEST_NAME, returnFunction) { GENERIC_JS_TEST_SCOPE Variant res = scope->run("(function () {return \"Hello World\";})"); ASSERT_EQ(VariantType::function, res.getType()); Variant fres = res.getFunctionValue()->call(); ASSERT_EQ(VariantType::string, fres.getType()); ASSERT_EQ("Hello World", fres.getStringValue()); } TEST(GENERIC_JS_TEST_NAME, exchangeNull) { GENERIC_JS_TEST_SCOPE scope->setVariable("test", Variant::Null); { Variant res = scope->run("test"); ASSERT_EQ(VariantType::null, res.getType()); } { Variant res = scope->getVariable("test"); ASSERT_EQ(VariantType::null, res.getType()); } } TEST(GENERIC_JS_TEST_NAME, exchangeBoolean) { GENERIC_JS_TEST_SCOPE scope->setVariable("test", Variant{false}); { Variant res = scope->run("test"); ASSERT_EQ(VariantType::boolean, res.getType()); ASSERT_FALSE(res.getBooleanValue()); } { Variant res = scope->getVariable("test"); ASSERT_EQ(VariantType::boolean, res.getType()); ASSERT_FALSE(res.getBooleanValue()); } } TEST(GENERIC_JS_TEST_NAME, exchangeInteger) { GENERIC_JS_TEST_SCOPE scope->setVariable("test", Variant{(int64_t)42}); { Variant res = scope->run("test"); ASSERT_EQ(VariantType::integer, res.getType()); ASSERT_EQ(42, res.getIntegerValue()); } { Variant res = scope->getVariable("test"); ASSERT_EQ(VariantType::integer, res.getType()); ASSERT_EQ(42, res.getIntegerValue()); } } TEST(GENERIC_JS_TEST_NAME, exchangeNumber) { GENERIC_JS_TEST_SCOPE scope->setVariable("test", Variant{42.5}); { Variant res = scope->run("test"); ASSERT_EQ(VariantType::number, res.getType()); ASSERT_EQ(42.5, res.getNumberValue()); } { Variant res = scope->getVariable("test"); ASSERT_EQ(VariantType::number, res.getType()); ASSERT_EQ(42.5, res.getNumberValue()); } } TEST(GENERIC_JS_TEST_NAME, exchangeString) { GENERIC_JS_TEST_SCOPE scope->setVariable("test", Variant{"Hello World!"}); { Variant res = scope->run("test"); ASSERT_EQ(VariantType::string, res.getType()); ASSERT_EQ("Hello World!", res.getStringValue()); } { Variant res = scope->getVariable("test"); ASSERT_EQ(VariantType::string, res.getType()); ASSERT_EQ("Hello World!", res.getStringValue()); } } TEST(GENERIC_JS_TEST_NAME, exchangeArray) { GENERIC_JS_TEST_SCOPE scope->setVariable("test", Variant{{"Hello World!", (int64_t)42, false}}); { Variant res = scope->run("test"); ASSERT_EQ(VariantType::array, res.getType()); std::vector a = res.getArrayValue(); ASSERT_EQ(3, a.size()); ASSERT_EQ(VariantType::string, a[0].getType()); ASSERT_EQ("Hello World!", a[0].getStringValue()); ASSERT_EQ(VariantType::integer, a[1].getType()); ASSERT_EQ(42, a[1].getIntegerValue()); ASSERT_EQ(VariantType::boolean, a[2].getType()); ASSERT_FALSE(a[2].getBooleanValue()); } { Variant res = scope->getVariable("test"); ASSERT_EQ(VariantType::array, res.getType()); std::vector a = res.getArrayValue(); ASSERT_EQ(3, a.size()); ASSERT_EQ(VariantType::string, a[0].getType()); ASSERT_EQ("Hello World!", a[0].getStringValue()); ASSERT_EQ(VariantType::integer, a[1].getType()); ASSERT_EQ(42, a[1].getIntegerValue()); ASSERT_EQ(VariantType::boolean, a[2].getType()); ASSERT_FALSE(a[2].getBooleanValue()); } } TEST(GENERIC_JS_TEST_NAME, exchangeMap) { GENERIC_JS_TEST_SCOPE scope->setVariable( "test", Variant{{{"key1", "s1"}, {"key2", (int64_t)42}, {"key3", true}}}); { Variant res = scope->run("test"); ASSERT_EQ(VariantType::map, res.getType()); std::map m = res.getMapValue(); ASSERT_EQ(3, m.size()); ASSERT_TRUE(m.find("key1") != m.end()); ASSERT_TRUE(m.find("key2") != m.end()); ASSERT_TRUE(m.find("key3") != m.end()); ASSERT_EQ(VariantType::string, m["key1"].getType()); ASSERT_EQ("s1", m["key1"].getStringValue()); ASSERT_EQ(VariantType::integer, m["key2"].getType()); ASSERT_EQ(42, m["key2"].getIntegerValue()); ASSERT_EQ(VariantType::boolean, m["key3"].getType()); ASSERT_TRUE(m["key3"].getBooleanValue()); } { Variant res = scope->getVariable("test"); ASSERT_EQ(VariantType::map, res.getType()); std::map m = res.getMapValue(); ASSERT_EQ(3, m.size()); ASSERT_TRUE(m.find("key1") != m.end()); ASSERT_TRUE(m.find("key2") != m.end()); ASSERT_TRUE(m.find("key3") != m.end()); ASSERT_EQ(VariantType::string, m["key1"].getType()); ASSERT_EQ("s1", m["key1"].getStringValue()); ASSERT_EQ(VariantType::integer, m["key2"].getType()); ASSERT_EQ(42, m["key2"].getIntegerValue()); ASSERT_EQ(VariantType::boolean, m["key3"].getType()); ASSERT_TRUE(m["key3"].getBooleanValue()); } } static HostFunction cat{[](const std::vector &args, void *data) { std::stringstream ss; for (unsigned i = 0; i < args.size(); i++) { ss << args[i].getStringValue(); if (i + 1 < args.size()) { ss << ' '; } } return Variant{ss.str().c_str()}; }}; TEST(GENERIC_JS_TEST_NAME, hostFunction) { GENERIC_JS_TEST_SCOPE Variant f{&cat}; scope->setVariable("cat", f); Variant res = scope->run("cat('Hello', 'World');"); ASSERT_EQ(VariantType::string, res.getType()); ASSERT_EQ("Hello World", res.getStringValue()); } #endif /* _GENERIC_JS_SCRIPT_ENGINE_TEST_HPP_ */