diff --git a/src/game/engine/scenes/world_map/tile_info_panel.tscn b/src/game/engine/scenes/world_map/tile_info_panel.tscn index d573298e..03947fc5 100644 --- a/src/game/engine/scenes/world_map/tile_info_panel.tscn +++ b/src/game/engine/scenes/world_map/tile_info_panel.tscn @@ -8,7 +8,7 @@ anchor_left = 0.0 anchor_top = 1.0 anchor_right = 1.0 anchor_bottom = 1.0 -offset_top = -64.0 +offset_top = -84.0 grow_horizontal = 2 grow_vertical = 0 script = ExtResource("1") @@ -16,59 +16,81 @@ script = ExtResource("1") [node name="MarginContainer" type="MarginContainer" parent="."] layout_mode = 2 theme_override_constants/margin_left = 12 -theme_override_constants/margin_top = 6 +theme_override_constants/margin_top = 5 theme_override_constants/margin_right = 12 -theme_override_constants/margin_bottom = 6 +theme_override_constants/margin_bottom = 5 -[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 3 + +[node name="Row1" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] layout_mode = 2 theme_override_constants/separation = 20 -[node name="TerrainName" type="Label" parent="MarginContainer/HBoxContainer"] +[node name="BiomeName" type="Label" parent="MarginContainer/VBoxContainer/Row1"] unique_name_in_owner = true layout_mode = 2 custom_minimum_size = Vector2(120, 0) theme_override_font_sizes/font_size = 15 -[node name="MoveCost" type="Label" parent="MarginContainer/HBoxContainer"] +[node name="MoveCost" type="Label" parent="MarginContainer/VBoxContainer/Row1"] unique_name_in_owner = true layout_mode = 2 theme_override_font_sizes/font_size = 13 theme_override_colors/font_color = Color(0.7, 0.7, 0.7, 1) -[node name="DefenseBonus" type="Label" parent="MarginContainer/HBoxContainer"] +[node name="DefenseBonus" type="Label" parent="MarginContainer/VBoxContainer/Row1"] unique_name_in_owner = true layout_mode = 2 theme_override_font_sizes/font_size = 13 theme_override_colors/font_color = Color(0.5, 0.8, 0.5, 1) -[node name="FoodYield" type="Label" parent="MarginContainer/HBoxContainer"] +[node name="FoodYield" type="Label" parent="MarginContainer/VBoxContainer/Row1"] unique_name_in_owner = true layout_mode = 2 theme_override_font_sizes/font_size = 13 theme_override_colors/font_color = Color(0.5, 0.85, 0.4, 1) -[node name="ProductionYield" type="Label" parent="MarginContainer/HBoxContainer"] +[node name="ProductionYield" type="Label" parent="MarginContainer/VBoxContainer/Row1"] unique_name_in_owner = true layout_mode = 2 theme_override_font_sizes/font_size = 13 theme_override_colors/font_color = Color(0.85, 0.5, 0.2, 1) -[node name="TradeYield" type="Label" parent="MarginContainer/HBoxContainer"] +[node name="TradeYield" type="Label" parent="MarginContainer/VBoxContainer/Row1"] unique_name_in_owner = true layout_mode = 2 theme_override_font_sizes/font_size = 13 theme_override_colors/font_color = Color(0.9, 0.82, 0.2, 1) -[node name="ResourceLabel" type="Label" parent="MarginContainer/HBoxContainer"] +[node name="ResourceLabel" type="Label" parent="MarginContainer/VBoxContainer/Row1"] unique_name_in_owner = true layout_mode = 2 theme_override_font_sizes/font_size = 13 theme_override_colors/font_color = Color(0.8, 0.65, 0.9, 1) visible = false -[node name="PositionLabel" type="Label" parent="MarginContainer/HBoxContainer"] +[node name="PositionLabel" type="Label" parent="MarginContainer/VBoxContainer/Row1"] unique_name_in_owner = true layout_mode = 2 theme_override_font_sizes/font_size = 11 theme_override_colors/font_color = Color(0.4, 0.4, 0.4, 1) + +[node name="Row2" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="CollectiblesLabel" type="Label" parent="MarginContainer/VBoxContainer/Row2"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 12 +theme_override_colors/font_color = Color(0.75, 0.82, 0.6, 1) +visible = false + +[node name="WorkedYieldLabel" type="Label" parent="MarginContainer/VBoxContainer/Row2"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 12 +theme_override_colors/font_color = Color(0.6, 0.78, 0.9, 1) +visible = false diff --git a/src/game/engine/tests/unit/test_tile_tooltip.gd b/src/game/engine/tests/unit/test_tile_tooltip.gd new file mode 100644 index 00000000..331eeedd --- /dev/null +++ b/src/game/engine/tests/unit/test_tile_tooltip.gd @@ -0,0 +1,66 @@ +extends GutTest +## Tests for tile_info_panel collectibles display logic. +## Uses the static build_collectibles_text helper — no scene tree required. + +const TileInfoPanelScript: GDScript = preload( + "res://engine/scenes/world_map/tile_info_panel.gd" +) + + +func before_all() -> void: + DataLoader.load_theme("age-of-dwarves") + DataLoader.load_world("earth") + ThemeVocabulary.load_vocabulary("age-of-dwarves") + + +func test_empty_entries_returns_empty_string() -> void: + var result: String = TileInfoPanelScript.build_collectibles_text([]) + assert_eq(result, "", "empty entry array must produce empty string") + + +func test_single_collectible_appears_in_text() -> void: + var entries: Array = [{"resource": "wild_game", "base_quantity": 3, "quality_range": [1, 3]}] + var result: String = TileInfoPanelScript.build_collectibles_text(entries) + assert_true( + "Wild Game" in result or "wild_game" in result, + "collectibles text must contain the resource name" + ) + + +func test_multiple_collectibles_all_appear() -> void: + var entries: Array = [ + {"resource": "iron_ore", "base_quantity": 2, "quality_range": [1, 4]}, + {"resource": "bog_mushrooms", "base_quantity": 3, "quality_range": [1, 3]}, + ] + var result: String = TileInfoPanelScript.build_collectibles_text(entries) + assert_true( + "Iron Ore" in result or "iron_ore" in result, + "iron_ore must appear in collectibles text" + ) + assert_true( + "Bog Mushrooms" in result or "bog_mushrooms" in result, + "bog_mushrooms must appear in collectibles text" + ) + + +func test_entry_missing_resource_key_is_skipped() -> void: + var entries: Array = [ + {"base_quantity": 3}, + {"resource": "grain_fields", "base_quantity": 4}, + ] + var result: String = TileInfoPanelScript.build_collectibles_text(entries) + assert_true( + "Grain Fields" in result or "grain_fields" in result, + "valid entry must appear despite malformed sibling" + ) + + +func test_dataloader_get_biome_collectibles_returns_array() -> void: + var entries: Array = DataLoader.get_biome_collectibles("temperate_forest") + assert_true(entries is Array, "get_biome_collectibles must return an Array") + assert_gt(entries.size(), 0, "temperate_forest must have collectibles loaded") + + +func test_unknown_biome_returns_empty_array() -> void: + var entries: Array = DataLoader.get_biome_collectibles("void_realm_does_not_exist") + assert_eq(entries.size(), 0, "unknown biome must return empty array")