mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00

* See more about using [JavaScript on this page](https://wiki.gdevelop.io/gdevelop5/events/js-code/javascript-in-extensions/#experimental-new-option-javascript-files-in-your-project). Only show in developer changelog
142 lines
5.2 KiB
C++
142 lines
5.2 KiB
C++
/*
|
|
* GDevelop Core
|
|
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
|
* reserved. This project is released under the MIT License.
|
|
*/
|
|
/**
|
|
* @file Tests covering common features of GDevelop Core.
|
|
*/
|
|
#include "GDCore/IDE/DependenciesAnalyzer.h"
|
|
#include "GDCore/Events/Builtin/LinkEvent.h"
|
|
#include "GDCore/Events/Event.h"
|
|
#include "GDCore/Project/ExternalEvents.h"
|
|
#include "GDCore/Project/Layout.h"
|
|
#include "GDCore/Project/Project.h"
|
|
#include "GDCore/Project/Variable.h"
|
|
#include "catch.hpp"
|
|
|
|
TEST_CASE("DependenciesAnalyzer", "[common]") {
|
|
SECTION("Can detect a simple scene dependency") {
|
|
gd::Project project;
|
|
auto& layout1 = project.InsertNewLayout("Layout1", 0);
|
|
auto& layout2 = project.InsertNewLayout("Layout2", 0);
|
|
|
|
gd::LinkEvent linkEvent1;
|
|
linkEvent1.SetTarget("Layout2");
|
|
layout1.GetEvents().InsertEvent(linkEvent1);
|
|
|
|
DependenciesAnalyzer analyzer(project, layout1);
|
|
analyzer.Analyze();
|
|
|
|
REQUIRE(analyzer.GetScenesDependencies().size() == 1);
|
|
REQUIRE(analyzer.GetScenesDependencies().find("Layout2") !=
|
|
analyzer.GetScenesDependencies().end());
|
|
REQUIRE(analyzer.GetExternalEventsDependencies().size() == 0);
|
|
}
|
|
|
|
SECTION("Can detect a simple external events dependency") {
|
|
gd::Project project;
|
|
auto& layout1 = project.InsertNewLayout("Layout1", 0);
|
|
auto& layout2 = project.InsertNewLayout("Layout2", 0);
|
|
auto& externalEvents1 =
|
|
project.InsertNewExternalEvents("ExternalEvents1", 0);
|
|
auto& externalEvents2 =
|
|
project.InsertNewExternalEvents("ExternalEvents2", 0);
|
|
|
|
gd::LinkEvent linkEvent1;
|
|
linkEvent1.SetTarget("ExternalEvents1");
|
|
layout1.GetEvents().InsertEvent(linkEvent1);
|
|
|
|
DependenciesAnalyzer analyzer(project, layout1);
|
|
analyzer.Analyze();
|
|
|
|
REQUIRE(analyzer.GetScenesDependencies().size() == 0);
|
|
REQUIRE(analyzer.GetExternalEventsDependencies().size() == 1);
|
|
REQUIRE(analyzer.GetExternalEventsDependencies().find("ExternalEvents1") !=
|
|
analyzer.GetExternalEventsDependencies().end());
|
|
}
|
|
|
|
SECTION("Can detect a transitive scene and external events dependency") {
|
|
gd::Project project;
|
|
auto& layout1 = project.InsertNewLayout("Layout1", 0);
|
|
auto& layout2 = project.InsertNewLayout("Layout2", 0);
|
|
auto& layout3 = project.InsertNewLayout("Layout3", 0);
|
|
auto& externalEvents1 =
|
|
project.InsertNewExternalEvents("ExternalEvents1", 0);
|
|
|
|
gd::LinkEvent linkEvent1;
|
|
linkEvent1.SetTarget("Layout2");
|
|
layout1.GetEvents().InsertEvent(linkEvent1);
|
|
gd::LinkEvent linkEvent2;
|
|
linkEvent2.SetTarget("ExternalEvents1");
|
|
layout2.GetEvents().InsertEvent(linkEvent2);
|
|
gd::LinkEvent linkEvent3;
|
|
linkEvent3.SetTarget("Layout3");
|
|
externalEvents1.GetEvents().InsertEvent(linkEvent3);
|
|
|
|
DependenciesAnalyzer analyzer(project, layout1);
|
|
analyzer.Analyze();
|
|
|
|
REQUIRE(analyzer.GetScenesDependencies().size() == 2);
|
|
REQUIRE(analyzer.GetScenesDependencies().find("Layout2") !=
|
|
analyzer.GetScenesDependencies().end());
|
|
REQUIRE(analyzer.GetScenesDependencies().find("Layout3") !=
|
|
analyzer.GetScenesDependencies().end());
|
|
REQUIRE(analyzer.GetExternalEventsDependencies().size() == 1);
|
|
REQUIRE(analyzer.GetExternalEventsDependencies().find("ExternalEvents1") !=
|
|
analyzer.GetExternalEventsDependencies().end());
|
|
}
|
|
|
|
SECTION("Can detect a (nested) circular dependency with scenes") {
|
|
gd::Project project;
|
|
auto& layout1 = project.InsertNewLayout("Layout1", 0);
|
|
auto& layout2 = project.InsertNewLayout("Layout2", 0);
|
|
auto& layout3 = project.InsertNewLayout("Layout3", 0);
|
|
|
|
gd::LinkEvent linkEvent1;
|
|
linkEvent1.SetTarget("Layout2");
|
|
layout1.GetEvents().InsertEvent(linkEvent1);
|
|
gd::LinkEvent linkEvent2;
|
|
linkEvent2.SetTarget("Layout3");
|
|
layout2.GetEvents().InsertEvent(linkEvent2);
|
|
gd::LinkEvent linkEvent3;
|
|
linkEvent3.SetTarget("Layout1");
|
|
layout3.GetEvents().InsertEvent(linkEvent3);
|
|
|
|
DependenciesAnalyzer analyzer(project, layout1);
|
|
REQUIRE(analyzer.Analyze() == false);
|
|
}
|
|
|
|
SECTION(
|
|
"Can detect a (nested) circular dependency with scenes and external "
|
|
"events") {
|
|
gd::Project project;
|
|
auto& layout1 = project.InsertNewLayout("Layout1", 0);
|
|
auto& layout2 = project.InsertNewLayout("Layout2", 0);
|
|
auto& layout3 = project.InsertNewLayout("Layout3", 0);
|
|
auto& externalEvents1 =
|
|
project.InsertNewExternalEvents("ExternalEvents1", 0);
|
|
auto& externalEvents2 =
|
|
project.InsertNewExternalEvents("ExternalEvents2", 0);
|
|
|
|
gd::LinkEvent linkEvent1;
|
|
linkEvent1.SetTarget("Layout2");
|
|
layout1.GetEvents().InsertEvent(linkEvent1);
|
|
gd::LinkEvent linkEvent2;
|
|
linkEvent2.SetTarget("ExternalEvents1");
|
|
layout2.GetEvents().InsertEvent(linkEvent2);
|
|
gd::LinkEvent linkEvent3;
|
|
linkEvent3.SetTarget("Layout3");
|
|
externalEvents1.GetEvents().InsertEvent(linkEvent3);
|
|
gd::LinkEvent linkEvent4;
|
|
linkEvent4.SetTarget("ExternalEvents2");
|
|
layout3.GetEvents().InsertEvent(linkEvent4);
|
|
gd::LinkEvent linkEvent5;
|
|
linkEvent5.SetTarget("Layout1");
|
|
externalEvents2.GetEvents().InsertEvent(linkEvent5);
|
|
|
|
DependenciesAnalyzer analyzer(project, layout3);
|
|
REQUIRE(analyzer.Analyze() == false);
|
|
}
|
|
}
|