Files
yaze/test/unit/zelda3/dungeon/room_layer_manager_test.cc

169 lines
6.6 KiB
C++

#include "gtest/gtest.h"
#include "zelda3/dungeon/room_layer_manager.h"
namespace yaze {
namespace zelda3 {
class RoomLayerManagerTest : public ::testing::Test {
protected:
RoomLayerManager manager_;
};
// =============================================================================
// Layer Visibility Tests
// =============================================================================
TEST_F(RoomLayerManagerTest, DefaultVisibilityAllLayersVisible) {
EXPECT_TRUE(manager_.IsLayerVisible(LayerType::BG1_Layout));
EXPECT_TRUE(manager_.IsLayerVisible(LayerType::BG1_Objects));
EXPECT_TRUE(manager_.IsLayerVisible(LayerType::BG2_Layout));
EXPECT_TRUE(manager_.IsLayerVisible(LayerType::BG2_Objects));
}
TEST_F(RoomLayerManagerTest, SetLayerVisibleWorks) {
manager_.SetLayerVisible(LayerType::BG1_Objects, false);
EXPECT_FALSE(manager_.IsLayerVisible(LayerType::BG1_Objects));
EXPECT_TRUE(manager_.IsLayerVisible(LayerType::BG1_Layout)); // Others unchanged
manager_.SetLayerVisible(LayerType::BG1_Objects, true);
EXPECT_TRUE(manager_.IsLayerVisible(LayerType::BG1_Objects));
}
TEST_F(RoomLayerManagerTest, ResetRestoresDefaults) {
manager_.SetLayerVisible(LayerType::BG1_Layout, false);
manager_.SetLayerVisible(LayerType::BG2_Objects, false);
manager_.SetLayerBlendMode(LayerType::BG2_Layout, LayerBlendMode::Translucent);
manager_.Reset();
EXPECT_TRUE(manager_.IsLayerVisible(LayerType::BG1_Layout));
EXPECT_TRUE(manager_.IsLayerVisible(LayerType::BG2_Objects));
EXPECT_EQ(manager_.GetLayerBlendMode(LayerType::BG2_Layout), LayerBlendMode::Normal);
}
// =============================================================================
// Blend Mode Tests
// =============================================================================
TEST_F(RoomLayerManagerTest, DefaultBlendModeIsNormal) {
EXPECT_EQ(manager_.GetLayerBlendMode(LayerType::BG1_Layout), LayerBlendMode::Normal);
EXPECT_EQ(manager_.GetLayerBlendMode(LayerType::BG2_Layout), LayerBlendMode::Normal);
}
TEST_F(RoomLayerManagerTest, SetBlendModeUpdatesAlpha) {
manager_.SetLayerBlendMode(LayerType::BG2_Layout, LayerBlendMode::Normal);
EXPECT_EQ(manager_.GetLayerAlpha(LayerType::BG2_Layout), 255);
manager_.SetLayerBlendMode(LayerType::BG2_Layout, LayerBlendMode::Translucent);
EXPECT_EQ(manager_.GetLayerAlpha(LayerType::BG2_Layout), 180);
manager_.SetLayerBlendMode(LayerType::BG2_Layout, LayerBlendMode::Off);
EXPECT_EQ(manager_.GetLayerAlpha(LayerType::BG2_Layout), 0);
}
// =============================================================================
// Draw Order Tests
// =============================================================================
TEST_F(RoomLayerManagerTest, DefaultDrawOrderBG2First) {
manager_.SetBG2OnTop(false);
auto order = manager_.GetDrawOrder();
// BG2 should be drawn first (background)
EXPECT_EQ(order[0], LayerType::BG2_Layout);
EXPECT_EQ(order[1], LayerType::BG2_Objects);
EXPECT_EQ(order[2], LayerType::BG1_Layout);
EXPECT_EQ(order[3], LayerType::BG1_Objects);
}
TEST_F(RoomLayerManagerTest, BG2OnTopDrawOrderBG1First) {
manager_.SetBG2OnTop(true);
auto order = manager_.GetDrawOrder();
// BG1 should be drawn first when BG2 is on top
EXPECT_EQ(order[0], LayerType::BG1_Layout);
EXPECT_EQ(order[1], LayerType::BG1_Objects);
EXPECT_EQ(order[2], LayerType::BG2_Layout);
EXPECT_EQ(order[3], LayerType::BG2_Objects);
}
// =============================================================================
// Per-Object Translucency Tests
// =============================================================================
TEST_F(RoomLayerManagerTest, DefaultObjectsNotTranslucent) {
EXPECT_FALSE(manager_.IsObjectTranslucent(0));
EXPECT_FALSE(manager_.IsObjectTranslucent(10));
EXPECT_EQ(manager_.GetObjectAlpha(0), 255);
}
TEST_F(RoomLayerManagerTest, SetObjectTranslucencyWorks) {
manager_.SetObjectTranslucency(5, true, 128);
EXPECT_TRUE(manager_.IsObjectTranslucent(5));
EXPECT_EQ(manager_.GetObjectAlpha(5), 128);
// Other objects unaffected
EXPECT_FALSE(manager_.IsObjectTranslucent(4));
EXPECT_EQ(manager_.GetObjectAlpha(4), 255);
}
TEST_F(RoomLayerManagerTest, ClearObjectTranslucencyWorks) {
manager_.SetObjectTranslucency(5, true, 128);
manager_.SetObjectTranslucency(10, true, 64);
manager_.ClearObjectTranslucency();
EXPECT_FALSE(manager_.IsObjectTranslucent(5));
EXPECT_FALSE(manager_.IsObjectTranslucent(10));
}
// =============================================================================
// LayerMergeType Integration Tests
// =============================================================================
TEST_F(RoomLayerManagerTest, ApplyLayerMergingNormal) {
// LayerMergeType(id, name, see, top, trans)
// "Normal" mode: visible=true, on_top=false, translucent=false
LayerMergeType merge{0x06, "Normal", true, false, false};
manager_.ApplyLayerMerging(merge);
EXPECT_FALSE(manager_.IsBG2OnTop()); // Normal has Layer2OnTop=false
EXPECT_EQ(manager_.GetLayerBlendMode(LayerType::BG2_Layout), LayerBlendMode::Normal);
}
TEST_F(RoomLayerManagerTest, ApplyLayerMergingTranslucent) {
LayerMergeType merge{0x04, "Translucent", true, true, true};
manager_.ApplyLayerMerging(merge);
EXPECT_TRUE(manager_.IsBG2OnTop());
EXPECT_EQ(manager_.GetLayerBlendMode(LayerType::BG2_Layout), LayerBlendMode::Translucent);
EXPECT_EQ(manager_.GetLayerBlendMode(LayerType::BG2_Objects), LayerBlendMode::Translucent);
}
TEST_F(RoomLayerManagerTest, ApplyLayerMergingOff) {
LayerMergeType merge{0x00, "Off", false, false, false};
manager_.ApplyLayerMerging(merge);
EXPECT_EQ(manager_.GetLayerBlendMode(LayerType::BG2_Layout), LayerBlendMode::Off);
EXPECT_EQ(manager_.GetLayerBlendMode(LayerType::BG2_Objects), LayerBlendMode::Off);
}
// =============================================================================
// Static Helper Tests
// =============================================================================
TEST_F(RoomLayerManagerTest, GetLayerNameReturnsCorrectStrings) {
EXPECT_STREQ(RoomLayerManager::GetLayerName(LayerType::BG1_Layout), "BG1 Layout");
EXPECT_STREQ(RoomLayerManager::GetLayerName(LayerType::BG1_Objects), "BG1 Objects");
EXPECT_STREQ(RoomLayerManager::GetLayerName(LayerType::BG2_Layout), "BG2 Layout");
EXPECT_STREQ(RoomLayerManager::GetLayerName(LayerType::BG2_Objects), "BG2 Objects");
}
TEST_F(RoomLayerManagerTest, GetBlendModeNameReturnsCorrectStrings) {
EXPECT_STREQ(RoomLayerManager::GetBlendModeName(LayerBlendMode::Normal), "Normal");
EXPECT_STREQ(RoomLayerManager::GetBlendModeName(LayerBlendMode::Translucent), "Translucent");
EXPECT_STREQ(RoomLayerManager::GetBlendModeName(LayerBlendMode::Off), "Off");
}
} // namespace zelda3
} // namespace yaze