109 lines
4.4 KiB
C++
109 lines
4.4 KiB
C++
#include "MetaCore/engine/editor_core/CommandService.h"
|
|
#include "MetaCore/engine/editor_core/EditorSession.h"
|
|
#include "MetaCore/engine/editor_core/SceneCommands.h"
|
|
#include "MetaCore/engine/editor_core/SelectionService.h"
|
|
#include "MetaCore/engine/editor_core/ViewportService.h"
|
|
#include "MetaCore/engine/scene/Project.h"
|
|
#include "MetaCore/engine/scene/Scene.h"
|
|
#include "MetaCore/engine/scene/SceneSerializer.h"
|
|
|
|
#include <cstdlib>
|
|
#include <filesystem>
|
|
#include <iostream>
|
|
|
|
namespace {
|
|
|
|
void expect(const bool condition, const char* message) {
|
|
if (!condition) {
|
|
std::cerr << "Test failed: " << message << '\n';
|
|
std::exit(1);
|
|
}
|
|
}
|
|
|
|
} // namespace
|
|
|
|
int main() {
|
|
namespace fs = std::filesystem;
|
|
using metacore::engine::editor_core::Command;
|
|
using metacore::engine::editor_core::CommandService;
|
|
using metacore::engine::editor_core::EditorSession;
|
|
using metacore::engine::editor_core::SceneCommands;
|
|
using metacore::engine::editor_core::SelectionService;
|
|
using metacore::engine::editor_core::ViewportService;
|
|
using metacore::engine::scene::Project;
|
|
using metacore::engine::scene::ProjectService;
|
|
using metacore::engine::scene::Scene;
|
|
using metacore::engine::scene::SceneSerializer;
|
|
using metacore::engine::scene::SceneService;
|
|
|
|
const fs::path root = "D:/MetaCore/TestProject";
|
|
fs::remove_all(root);
|
|
|
|
ProjectService project_service;
|
|
expect(project_service.create_project(root, "MetaCoreTest"), "project should be created");
|
|
|
|
Project project;
|
|
expect(project_service.load_project(root / "MetaCore.project.json", project), "project should load");
|
|
expect(project.name == "MetaCoreTest", "project name should persist");
|
|
|
|
SceneService scene_service;
|
|
Scene scene = scene_service.create_default_scene();
|
|
auto& cube = scene_service.create_object(scene, "Cube");
|
|
cube.has_mesh_renderer = true;
|
|
cube.mesh_renderer.mesh_asset_id = "mesh.cube";
|
|
|
|
SceneSerializer serializer;
|
|
expect(serializer.save_scene(root / "Scenes" / "Test.mcscene.json", scene), "scene should save");
|
|
|
|
Scene loaded_scene;
|
|
expect(serializer.load_scene(root / "Scenes" / "Test.mcscene.json", loaded_scene), "scene should load");
|
|
expect(loaded_scene.objects.size() == scene.objects.size(), "scene object count should match");
|
|
|
|
int value = 0;
|
|
CommandService commands;
|
|
commands.execute(Command{
|
|
"increment",
|
|
[&value]() { value += 1; },
|
|
[&value]() { value -= 1; }
|
|
});
|
|
expect(value == 1, "command should execute");
|
|
commands.undo();
|
|
expect(value == 0, "command should undo");
|
|
commands.redo();
|
|
expect(value == 1, "command should redo");
|
|
|
|
EditorSession session;
|
|
SelectionService selection;
|
|
ViewportService viewport;
|
|
SceneCommands::create_empty_object(commands, session, selection, scene_service, loaded_scene, "Test Node");
|
|
expect(selection.has_selection(), "selection should exist after object creation");
|
|
SceneCommands::rename_selected_object(commands, session, selection, scene_service, loaded_scene, "Renamed Node");
|
|
expect(scene_service.find_object(loaded_scene, *selection.selection())->get().name == "Renamed Node", "rename should persist");
|
|
metacore::engine::scene::TransformComponent edited_transform;
|
|
edited_transform.position = {1.0F, 2.0F, 3.0F};
|
|
edited_transform.rotation = {10.0F, 20.0F, 30.0F};
|
|
edited_transform.scale = {2.0F, 2.0F, 2.0F};
|
|
SceneCommands::apply_transform_to_selected_object(commands, session, selection, scene_service, loaded_scene, edited_transform);
|
|
expect(
|
|
scene_service.find_object(loaded_scene, *selection.selection())->get().transform.position[0] == 1.0F,
|
|
"transform apply should persist"
|
|
);
|
|
commands.undo();
|
|
expect(
|
|
scene_service.find_object(loaded_scene, *selection.selection())->get().transform.position[0] == 0.0F,
|
|
"transform undo should restore"
|
|
);
|
|
commands.redo();
|
|
expect(
|
|
scene_service.find_object(loaded_scene, *selection.selection())->get().transform.position[0] == 1.0F,
|
|
"transform redo should reapply"
|
|
);
|
|
SceneCommands::focus_selected_object(session, selection, viewport);
|
|
expect(viewport.focus_target().has_value(), "focus target should be set");
|
|
SceneCommands::delete_selected_object(commands, session, selection, scene_service, loaded_scene);
|
|
expect(!selection.has_selection(), "selection should clear on delete");
|
|
|
|
std::cout << "MetaCoreTests passed\n";
|
|
return 0;
|
|
}
|