mirror of
https://github.com/Heretek-AI/GDevelop.git
synced 2026-07-22 01:55:25 -04:00
154 lines
5.5 KiB
C++
154 lines
5.5 KiB
C++
/*
|
|
* GDevelop Core
|
|
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
|
* reserved. This project is released under the MIT License.
|
|
*/
|
|
#include "GDCore/Events/Parsers/ExpressionParser2NodePrinter.h"
|
|
#include "DummyPlatform.h"
|
|
#include "GDCore/Events/Parsers/ExpressionParser2.h"
|
|
#include "GDCore/Extensions/Platform.h"
|
|
#include "GDCore/Extensions/PlatformExtension.h"
|
|
#include "GDCore/IDE/Events/ExpressionValidator.h"
|
|
#include "GDCore/Project/Layout.h"
|
|
#include "GDCore/Project/Project.h"
|
|
#include "catch.hpp"
|
|
|
|
TEST_CASE("ExpressionParser2NodePrinter", "[common][events]") {
|
|
gd::Project project;
|
|
gd::Platform platform;
|
|
SetupProjectWithDummyPlatform(project, platform);
|
|
auto &layout1 = project.InsertNewLayout("Layout1", 0);
|
|
layout1.InsertNewObject(project, "MyExtension::Sprite", "MySpriteObject", 0);
|
|
|
|
gd::ExpressionParser2 parser(platform, project, layout1);
|
|
|
|
auto testPrinter = [&parser](const gd::String &type,
|
|
const gd::String &expression,
|
|
const gd::String &expectedOutput = "") {
|
|
auto node = parser.ParseExpression(type, expression);
|
|
REQUIRE(node != nullptr);
|
|
gd::ExpressionParser2NodePrinter printer;
|
|
node->Visit(printer);
|
|
if (expectedOutput.empty()) {
|
|
REQUIRE(printer.GetOutput() == expression);
|
|
} else {
|
|
REQUIRE(printer.GetOutput() == expectedOutput);
|
|
}
|
|
};
|
|
|
|
SECTION("Valid texts") {
|
|
testPrinter("string", "\"hello world\"");
|
|
testPrinter("string", "\"\"");
|
|
testPrinter("string", "\"hello \\\"world\\\"\"");
|
|
}
|
|
SECTION("Invalid texts") {
|
|
testPrinter("string", "");
|
|
testPrinter("string", "abcd");
|
|
testPrinter("string", "abcd efgh");
|
|
testPrinter("string", "abcd + efgh");
|
|
testPrinter("string", "123");
|
|
testPrinter("string", "123.5");
|
|
testPrinter("string", "\"", "\"\"");
|
|
testPrinter("string", "\"hello world", "\"hello world\"");
|
|
testPrinter("string", "\"\"\"", "\"\" \"\"");
|
|
testPrinter("number", "");
|
|
}
|
|
|
|
SECTION("Invalid parenthesis") {
|
|
testPrinter("string", "((\"hello\"", "((\"hello\"))");
|
|
}
|
|
|
|
SECTION("Invalid text operators") {
|
|
testPrinter("string", "\"Hello \" - \"World\"");
|
|
}
|
|
|
|
SECTION("Valid numbers") {
|
|
testPrinter("number", "123");
|
|
testPrinter("number", "-123");
|
|
testPrinter("number", "+123", "123");
|
|
testPrinter("number", "3.14159");
|
|
testPrinter("number", ".14159");
|
|
testPrinter("number", "-123.2");
|
|
testPrinter("number", "3.");
|
|
}
|
|
|
|
SECTION("Invalid numbers") {
|
|
testPrinter("number", "abcd");
|
|
testPrinter("number", "\"hello world\"");
|
|
testPrinter("number", "123 456");
|
|
testPrinter("number", "3..14", "3. .14");
|
|
}
|
|
|
|
SECTION("Invalid number operators") {
|
|
testPrinter("number", "123 % 456");
|
|
testPrinter("number", "123 ? 456");
|
|
testPrinter("number", "123 < 456");
|
|
testPrinter("number", "123 > 456");
|
|
testPrinter("number", "123 ! 456");
|
|
testPrinter("number", "123 @ 456");
|
|
testPrinter("number", "123 [ 456");
|
|
testPrinter("number", "123 ] 456");
|
|
testPrinter("number", "123 { 456");
|
|
testPrinter("number", "123 } 456");
|
|
testPrinter("number", "123 | 456");
|
|
testPrinter("number", "123 ; 456");
|
|
testPrinter("number", "1 / /2");
|
|
testPrinter("number", "123 ;; 456");
|
|
testPrinter("number", "123 ?? 456", "123 ? ? 456");
|
|
testPrinter("number", "123 << 456", "123 < < 456");
|
|
testPrinter("number", "123 >> 456", "123 > > 456");
|
|
testPrinter("number", "123 !!! 456");
|
|
}
|
|
|
|
SECTION("Numbers and texts mismatchs") {
|
|
testPrinter("number", "123 + \"hello world\"");
|
|
testPrinter("string", "\"hello world\" + 123");
|
|
}
|
|
SECTION("Numbers and texts mismatchs with parenthesis") {
|
|
testPrinter("number", "((123)) + (\"hello world\")");
|
|
testPrinter("string", "((\"hello world\") + (123))");
|
|
}
|
|
|
|
SECTION("Valid identifiers") {
|
|
testPrinter("identifier", "HelloWorld1");
|
|
testPrinter("identifier", "Hello World 1 ", "Hello World 1");
|
|
}
|
|
SECTION("Invalid identifiers") {
|
|
testPrinter("identifier", "Hello + World1");
|
|
}
|
|
SECTION("Valid function calls") {
|
|
testPrinter("number", "MyExtension::GetNumber()");
|
|
testPrinter("number",
|
|
"MyExtension::GetNumberWith2Params(12, \"hello world\")");
|
|
testPrinter("number",
|
|
"MyExtension::GetNumberWith3Params(12, \"hello world\")");
|
|
testPrinter("number",
|
|
"MyExtension::GetNumberWith3Params(12, \"hello world\", 34)");
|
|
testPrinter("number", "MySpriteObject.GetObjectNumber()");
|
|
}
|
|
SECTION("Invalid function calls") {
|
|
testPrinter("number", "Idontexist(12)");
|
|
testPrinter("number", "MyExtension::GetNumber(12)");
|
|
testPrinter("number", "MyExtension::GetNumberWith2Params(12)");
|
|
testPrinter(
|
|
"number",
|
|
"MyExtension::GetNumberWith3Params(12, \"hello world\", 34, blabla)");
|
|
testPrinter("number", "MySpriteObject.GetObjectNumber(extraparameter)");
|
|
}
|
|
SECTION("Unterminated function calls") {
|
|
testPrinter("number", "Idontexist(12", "Idontexist(12)");
|
|
testPrinter("number", "Idontexist(12, 34, \"56\" + 2 ", "Idontexist(12, 34, \"56\" + 2)");
|
|
}
|
|
|
|
SECTION("Valid variables") {
|
|
testPrinter("scenevar", "myVariable");
|
|
testPrinter("scenevar", "myVariable.myChild");
|
|
testPrinter("scenevar",
|
|
"myVariable[ \"My named children\" ]",
|
|
"myVariable[\"My named children\"]");
|
|
testPrinter("scenevar",
|
|
"myVariable[ \"My named children\" ].grandChild",
|
|
"myVariable[\"My named children\"].grandChild");
|
|
}
|
|
}
|