backend-infra-engineer: Post v0.3.9-hotfix7 snapshot (build cleanup)
This commit is contained in:
68
test/unit/editor/message/message_data_test.cc
Normal file
68
test/unit/editor/message/message_data_test.cc
Normal file
@@ -0,0 +1,68 @@
|
||||
#include "app/editor/message/message_data.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <fstream>
|
||||
#include <filesystem>
|
||||
|
||||
namespace yaze {
|
||||
namespace editor {
|
||||
namespace {
|
||||
|
||||
class MessageDataTest : public ::testing::Test {
|
||||
protected:
|
||||
void SetUp() override {
|
||||
// Create some dummy message data
|
||||
messages_.push_back(MessageData(0, 0x100, "Test Message 1", {}, "Test Message 1", {}));
|
||||
messages_.push_back(MessageData(1, 0x200, "Test Message 2", {}, "Test Message 2", {}));
|
||||
}
|
||||
|
||||
std::vector<MessageData> messages_;
|
||||
};
|
||||
|
||||
TEST_F(MessageDataTest, SerializeMessagesToJson) {
|
||||
nlohmann::json j = SerializeMessagesToJson(messages_);
|
||||
|
||||
ASSERT_TRUE(j.is_array());
|
||||
ASSERT_EQ(j.size(), 2);
|
||||
|
||||
EXPECT_EQ(j[0]["id"], 0);
|
||||
EXPECT_EQ(j[0]["address"], 0x100);
|
||||
EXPECT_EQ(j[0]["raw_string"], "Test Message 1");
|
||||
EXPECT_EQ(j[0]["parsed_string"], "Test Message 1");
|
||||
|
||||
EXPECT_EQ(j[1]["id"], 1);
|
||||
EXPECT_EQ(j[1]["address"], 0x200);
|
||||
EXPECT_EQ(j[1]["raw_string"], "Test Message 2");
|
||||
EXPECT_EQ(j[1]["parsed_string"], "Test Message 2");
|
||||
}
|
||||
|
||||
TEST_F(MessageDataTest, ExportMessagesToJson) {
|
||||
std::string test_file = "test_messages.json";
|
||||
|
||||
// Ensure file doesn't exist
|
||||
if (std::filesystem::exists(test_file)) {
|
||||
std::filesystem::remove(test_file);
|
||||
}
|
||||
|
||||
absl::Status status = ExportMessagesToJson(test_file, messages_);
|
||||
ASSERT_TRUE(status.ok());
|
||||
|
||||
ASSERT_TRUE(std::filesystem::exists(test_file));
|
||||
|
||||
// Read back and verify
|
||||
std::ifstream file(test_file);
|
||||
nlohmann::json j;
|
||||
file >> j;
|
||||
|
||||
ASSERT_TRUE(j.is_array());
|
||||
ASSERT_EQ(j.size(), 2);
|
||||
EXPECT_EQ(j[0]["raw_string"], "Test Message 1");
|
||||
|
||||
// Cleanup
|
||||
std::filesystem::remove(test_file);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace editor
|
||||
} // namespace yaze
|
||||
312
test/unit/editor/panel_system_test.cc
Normal file
312
test/unit/editor/panel_system_test.cc
Normal file
@@ -0,0 +1,312 @@
|
||||
#include "app/editor/system/editor_panel.h"
|
||||
#include "app/editor/system/resource_panel.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace yaze {
|
||||
namespace editor {
|
||||
namespace {
|
||||
|
||||
// =============================================================================
|
||||
// Mock Panel Implementations for Testing
|
||||
// =============================================================================
|
||||
|
||||
/**
|
||||
* @brief Mock panel for testing EditorPanel interface
|
||||
*/
|
||||
class MockEditorPanel : public EditorPanel {
|
||||
public:
|
||||
MockEditorPanel(const std::string& id, const std::string& name,
|
||||
const std::string& icon, const std::string& category)
|
||||
: id_(id), name_(name), icon_(icon), category_(category) {}
|
||||
|
||||
std::string GetId() const override { return id_; }
|
||||
std::string GetDisplayName() const override { return name_; }
|
||||
std::string GetIcon() const override { return icon_; }
|
||||
std::string GetEditorCategory() const override { return category_; }
|
||||
|
||||
void Draw(bool* p_open) override {
|
||||
draw_count_++;
|
||||
if (p_open && close_on_next_draw_) {
|
||||
*p_open = false;
|
||||
}
|
||||
}
|
||||
|
||||
void OnOpen() override { open_count_++; }
|
||||
void OnClose() override { close_count_++; }
|
||||
void OnFocus() override { focus_count_++; }
|
||||
|
||||
// Test helpers
|
||||
int draw_count_ = 0;
|
||||
int open_count_ = 0;
|
||||
int close_count_ = 0;
|
||||
int focus_count_ = 0;
|
||||
bool close_on_next_draw_ = false;
|
||||
|
||||
private:
|
||||
std::string id_;
|
||||
std::string name_;
|
||||
std::string icon_;
|
||||
std::string category_;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Mock panel with custom category behavior
|
||||
*/
|
||||
class MockPersistentPanel : public MockEditorPanel {
|
||||
public:
|
||||
using MockEditorPanel::MockEditorPanel;
|
||||
|
||||
PanelCategory GetPanelCategory() const override {
|
||||
return PanelCategory::Persistent;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Mock resource panel for testing ResourcePanel interface
|
||||
*/
|
||||
class MockResourcePanel : public ResourcePanel {
|
||||
public:
|
||||
MockResourcePanel(int resource_id, const std::string& resource_type,
|
||||
const std::string& category)
|
||||
: resource_id_(resource_id),
|
||||
resource_type_(resource_type),
|
||||
category_(category) {}
|
||||
|
||||
int GetResourceId() const override { return resource_id_; }
|
||||
std::string GetResourceType() const override { return resource_type_; }
|
||||
std::string GetIcon() const override { return "ICON_TEST"; }
|
||||
std::string GetEditorCategory() const override { return category_; }
|
||||
|
||||
void Draw(bool* p_open) override { draw_count_++; }
|
||||
|
||||
void OnResourceModified() override { modified_count_++; }
|
||||
void OnResourceDeleted() override { deleted_count_++; }
|
||||
|
||||
// Test helpers
|
||||
int draw_count_ = 0;
|
||||
int modified_count_ = 0;
|
||||
int deleted_count_ = 0;
|
||||
|
||||
private:
|
||||
int resource_id_;
|
||||
std::string resource_type_;
|
||||
std::string category_;
|
||||
};
|
||||
|
||||
// =============================================================================
|
||||
// EditorPanel Interface Tests
|
||||
// =============================================================================
|
||||
|
||||
class EditorPanelTest : public ::testing::Test {
|
||||
protected:
|
||||
void SetUp() override {
|
||||
panel_ = std::make_unique<MockEditorPanel>(
|
||||
"test.panel", "Test Panel", "ICON_MD_TEST", "Test");
|
||||
}
|
||||
|
||||
std::unique_ptr<MockEditorPanel> panel_;
|
||||
};
|
||||
|
||||
TEST_F(EditorPanelTest, IdentityMethods) {
|
||||
EXPECT_EQ(panel_->GetId(), "test.panel");
|
||||
EXPECT_EQ(panel_->GetDisplayName(), "Test Panel");
|
||||
EXPECT_EQ(panel_->GetIcon(), "ICON_MD_TEST");
|
||||
EXPECT_EQ(panel_->GetEditorCategory(), "Test");
|
||||
}
|
||||
|
||||
TEST_F(EditorPanelTest, DefaultBehavior) {
|
||||
// Default category is EditorBound
|
||||
EXPECT_EQ(panel_->GetPanelCategory(), PanelCategory::EditorBound);
|
||||
|
||||
// Default enabled state is true
|
||||
EXPECT_TRUE(panel_->IsEnabled());
|
||||
|
||||
// Default priority is 50
|
||||
EXPECT_EQ(panel_->GetPriority(), 50);
|
||||
|
||||
// Default shortcuts and tooltips are empty
|
||||
EXPECT_TRUE(panel_->GetShortcutHint().empty());
|
||||
EXPECT_TRUE(panel_->GetDisabledTooltip().empty());
|
||||
}
|
||||
|
||||
TEST_F(EditorPanelTest, LifecycleHooks) {
|
||||
EXPECT_EQ(panel_->open_count_, 0);
|
||||
EXPECT_EQ(panel_->close_count_, 0);
|
||||
EXPECT_EQ(panel_->focus_count_, 0);
|
||||
|
||||
panel_->OnOpen();
|
||||
EXPECT_EQ(panel_->open_count_, 1);
|
||||
|
||||
panel_->OnFocus();
|
||||
EXPECT_EQ(panel_->focus_count_, 1);
|
||||
|
||||
panel_->OnClose();
|
||||
EXPECT_EQ(panel_->close_count_, 1);
|
||||
}
|
||||
|
||||
TEST_F(EditorPanelTest, DrawMethod) {
|
||||
EXPECT_EQ(panel_->draw_count_, 0);
|
||||
|
||||
bool is_open = true;
|
||||
panel_->Draw(&is_open);
|
||||
EXPECT_EQ(panel_->draw_count_, 1);
|
||||
EXPECT_TRUE(is_open);
|
||||
|
||||
// Test closing via draw
|
||||
panel_->close_on_next_draw_ = true;
|
||||
panel_->Draw(&is_open);
|
||||
EXPECT_EQ(panel_->draw_count_, 2);
|
||||
EXPECT_FALSE(is_open);
|
||||
}
|
||||
|
||||
TEST_F(EditorPanelTest, RelationshipDefaults) {
|
||||
EXPECT_TRUE(panel_->GetParentPanelId().empty());
|
||||
EXPECT_FALSE(panel_->CascadeCloseChildren());
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// PanelCategory Tests
|
||||
// =============================================================================
|
||||
|
||||
TEST(PanelCategoryTest, PersistentPanel) {
|
||||
MockPersistentPanel panel("test.persistent", "Persistent Panel",
|
||||
"ICON_MD_PUSH_PIN", "Test");
|
||||
|
||||
EXPECT_EQ(panel.GetPanelCategory(), PanelCategory::Persistent);
|
||||
}
|
||||
|
||||
TEST(PanelCategoryTest, EditorBoundDefault) {
|
||||
MockEditorPanel panel("test.bound", "Bound Panel", "ICON_MD_LOCK", "Test");
|
||||
|
||||
EXPECT_EQ(panel.GetPanelCategory(), PanelCategory::EditorBound);
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// ResourcePanel Tests
|
||||
// =============================================================================
|
||||
|
||||
class ResourcePanelTest : public ::testing::Test {
|
||||
protected:
|
||||
void SetUp() override {
|
||||
panel_ = std::make_unique<MockResourcePanel>(42, "room", "Dungeon");
|
||||
}
|
||||
|
||||
std::unique_ptr<MockResourcePanel> panel_;
|
||||
};
|
||||
|
||||
TEST_F(ResourcePanelTest, ResourceIdentity) {
|
||||
EXPECT_EQ(panel_->GetResourceId(), 42);
|
||||
EXPECT_EQ(panel_->GetResourceType(), "room");
|
||||
}
|
||||
|
||||
TEST_F(ResourcePanelTest, GeneratedId) {
|
||||
// ID should be generated as "{category}.{type}_{id}"
|
||||
EXPECT_EQ(panel_->GetId(), "Dungeon.room_42");
|
||||
}
|
||||
|
||||
TEST_F(ResourcePanelTest, GeneratedDisplayName) {
|
||||
// Default display name is "{type} {id}"
|
||||
EXPECT_EQ(panel_->GetDisplayName(), "room 42");
|
||||
}
|
||||
|
||||
TEST_F(ResourcePanelTest, SessionSupport) {
|
||||
// Default session is 0
|
||||
EXPECT_EQ(panel_->GetSessionId(), 0);
|
||||
|
||||
// Can set session
|
||||
panel_->SetSessionId(1);
|
||||
EXPECT_EQ(panel_->GetSessionId(), 1);
|
||||
}
|
||||
|
||||
TEST_F(ResourcePanelTest, ResourceLifecycle) {
|
||||
EXPECT_EQ(panel_->modified_count_, 0);
|
||||
EXPECT_EQ(panel_->deleted_count_, 0);
|
||||
|
||||
panel_->OnResourceModified();
|
||||
EXPECT_EQ(panel_->modified_count_, 1);
|
||||
|
||||
panel_->OnResourceDeleted();
|
||||
EXPECT_EQ(panel_->deleted_count_, 1);
|
||||
}
|
||||
|
||||
TEST_F(ResourcePanelTest, AlwaysEditorBound) {
|
||||
// Resource panels are always EditorBound
|
||||
EXPECT_EQ(panel_->GetPanelCategory(), PanelCategory::EditorBound);
|
||||
}
|
||||
|
||||
TEST_F(ResourcePanelTest, AllowMultipleInstancesDefault) {
|
||||
EXPECT_TRUE(panel_->AllowMultipleInstances());
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// ResourcePanelLimits Tests
|
||||
// =============================================================================
|
||||
|
||||
TEST(ResourcePanelLimitsTest, DefaultLimits) {
|
||||
EXPECT_EQ(ResourcePanelLimits::kMaxRoomPanels, 8);
|
||||
EXPECT_EQ(ResourcePanelLimits::kMaxSongPanels, 4);
|
||||
EXPECT_EQ(ResourcePanelLimits::kMaxSheetPanels, 6);
|
||||
EXPECT_EQ(ResourcePanelLimits::kMaxMapPanels, 8);
|
||||
EXPECT_EQ(ResourcePanelLimits::kMaxTotalResourcePanels, 20);
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// Multiple Panel Types Tests
|
||||
// =============================================================================
|
||||
|
||||
TEST(MultiplePanelTest, DifferentResourceTypes) {
|
||||
MockResourcePanel room_panel(42, "room", "Dungeon");
|
||||
MockResourcePanel song_panel(5, "song", "Music");
|
||||
MockResourcePanel sheet_panel(100, "sheet", "Graphics");
|
||||
|
||||
EXPECT_EQ(room_panel.GetId(), "Dungeon.room_42");
|
||||
EXPECT_EQ(song_panel.GetId(), "Music.song_5");
|
||||
EXPECT_EQ(sheet_panel.GetId(), "Graphics.sheet_100");
|
||||
}
|
||||
|
||||
TEST(MultiplePanelTest, SameResourceDifferentSessions) {
|
||||
MockResourcePanel session0_room(42, "room", "Dungeon");
|
||||
MockResourcePanel session1_room(42, "room", "Dungeon");
|
||||
|
||||
session0_room.SetSessionId(0);
|
||||
session1_room.SetSessionId(1);
|
||||
|
||||
// Same resource ID and type
|
||||
EXPECT_EQ(session0_room.GetResourceId(), session1_room.GetResourceId());
|
||||
EXPECT_EQ(session0_room.GetResourceType(), session1_room.GetResourceType());
|
||||
|
||||
// But different sessions
|
||||
EXPECT_NE(session0_room.GetSessionId(), session1_room.GetSessionId());
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// Panel Collection Tests (for future PanelManager integration)
|
||||
// =============================================================================
|
||||
|
||||
TEST(PanelCollectionTest, PolymorphicStorage) {
|
||||
std::vector<std::unique_ptr<EditorPanel>> panels;
|
||||
|
||||
panels.push_back(std::make_unique<MockEditorPanel>(
|
||||
"test.static", "Static Panel", "ICON_1", "Test"));
|
||||
panels.push_back(
|
||||
std::make_unique<MockResourcePanel>(42, "room", "Dungeon"));
|
||||
|
||||
EXPECT_EQ(panels.size(), 2);
|
||||
EXPECT_EQ(panels[0]->GetId(), "test.static");
|
||||
EXPECT_EQ(panels[1]->GetId(), "Dungeon.room_42");
|
||||
|
||||
// Both can be drawn polymorphically
|
||||
for (auto& panel : panels) {
|
||||
bool open = true;
|
||||
panel->Draw(&open);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace editor
|
||||
} // namespace yaze
|
||||
Reference in New Issue
Block a user