From f246efd6ad93c813bcee0d225258f5316048a78e Mon Sep 17 00:00:00 2001 From: Kirill Date: Sun, 20 Sep 2026 23:55:38 +0300 Subject: [PATCH] Add unit tests for action value formatting and distribution - Implemented a new test script `test_action_values.gd` to verify the precision of fractional action amounts and the distinctiveness of adjacent values. - Added checks to ensure that action values are correctly formatted and that the distribution of actions preserves distinct requests. - Included validation for rendered button labels to confirm they are distinguishable. --- main_menu/Owniverse.png | 3 + main_menu/Sound/SoundRunner.png | 3 + main_menu/Sound/SoundSlider_active.png | 3 + main_menu/Sound/SoundSlider_passive.png | 3 + main_menu/en/Achievements.png | 3 + main_menu/en/CreateUniverse.png | 3 + main_menu/en/Credits.png | 3 + main_menu/en/EnglishActive.png | 3 + main_menu/en/LeaveReality.png | 3 + main_menu/en/MusicActive.png | 3 + main_menu/en/MusicNonActive.png | 3 + main_menu/en/Russian.png | 3 + main_menu/en/SoundActive.png | 3 + main_menu/en/SoundNonActive.png | 3 + main_menu/en/Tutorial.png | 3 + main_menu/ru/Achievements.png | 3 + main_menu/ru/CreateUniverse.png | 3 + main_menu/ru/Credits.png | 3 + main_menu/ru/English.png | 3 + main_menu/ru/LeaveReality.png | 3 + main_menu/ru/MusicActive.png | 3 + main_menu/ru/MusicNonActive.png | 3 + main_menu/ru/RussianActive.png | 3 + main_menu/ru/SoundActive.png | 3 + main_menu/ru/SoundNonActive.png | 3 + main_menu/ru/Tutorial.png | 3 + tests/test_action_values.gd | 29 +++++++ tests/test_action_values.gd.uid | 1 + ui/actions/actions.gd | 14 +++- world/world.tscn | 100 ++++++++++++++++++++++++ 30 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 main_menu/Owniverse.png create mode 100644 main_menu/Sound/SoundRunner.png create mode 100644 main_menu/Sound/SoundSlider_active.png create mode 100644 main_menu/Sound/SoundSlider_passive.png create mode 100644 main_menu/en/Achievements.png create mode 100644 main_menu/en/CreateUniverse.png create mode 100644 main_menu/en/Credits.png create mode 100644 main_menu/en/EnglishActive.png create mode 100644 main_menu/en/LeaveReality.png create mode 100644 main_menu/en/MusicActive.png create mode 100644 main_menu/en/MusicNonActive.png create mode 100644 main_menu/en/Russian.png create mode 100644 main_menu/en/SoundActive.png create mode 100644 main_menu/en/SoundNonActive.png create mode 100644 main_menu/en/Tutorial.png create mode 100644 main_menu/ru/Achievements.png create mode 100644 main_menu/ru/CreateUniverse.png create mode 100644 main_menu/ru/Credits.png create mode 100644 main_menu/ru/English.png create mode 100644 main_menu/ru/LeaveReality.png create mode 100644 main_menu/ru/MusicActive.png create mode 100644 main_menu/ru/MusicNonActive.png create mode 100644 main_menu/ru/RussianActive.png create mode 100644 main_menu/ru/SoundActive.png create mode 100644 main_menu/ru/SoundNonActive.png create mode 100644 main_menu/ru/Tutorial.png create mode 100644 tests/test_action_values.gd create mode 100644 tests/test_action_values.gd.uid diff --git a/main_menu/Owniverse.png b/main_menu/Owniverse.png new file mode 100644 index 0000000..be6bfb3 --- /dev/null +++ b/main_menu/Owniverse.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:510e8c833b66549366e5eb41af337b56b70cf9e859e75d3107c9d03aca71e3c8 +size 36287 diff --git a/main_menu/Sound/SoundRunner.png b/main_menu/Sound/SoundRunner.png new file mode 100644 index 0000000..c4eac59 --- /dev/null +++ b/main_menu/Sound/SoundRunner.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21b17623ba25c0b7ee8e0c21bd4997c9c1eb226e5e867873aceac471bae8ec83 +size 3495 diff --git a/main_menu/Sound/SoundSlider_active.png b/main_menu/Sound/SoundSlider_active.png new file mode 100644 index 0000000..a142473 --- /dev/null +++ b/main_menu/Sound/SoundSlider_active.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9196d78693afc4c529c91f3b00cbef1aba1524909587ec07b3c3a9d34c2ebcc8 +size 276 diff --git a/main_menu/Sound/SoundSlider_passive.png b/main_menu/Sound/SoundSlider_passive.png new file mode 100644 index 0000000..9503317 --- /dev/null +++ b/main_menu/Sound/SoundSlider_passive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:477f24178bdf764277fbc5016c1ead2a91993d26d7fa0363fba9b16f2c0a0877 +size 278 diff --git a/main_menu/en/Achievements.png b/main_menu/en/Achievements.png new file mode 100644 index 0000000..6c4328d --- /dev/null +++ b/main_menu/en/Achievements.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb120a767d71791a0ce0f0b2b9057c803ec32ccb0aa4af94c30db6201ebbf84b +size 24475 diff --git a/main_menu/en/CreateUniverse.png b/main_menu/en/CreateUniverse.png new file mode 100644 index 0000000..2907267 --- /dev/null +++ b/main_menu/en/CreateUniverse.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfa774a50bce3cca52d5f6bb2f5a880bb3204efe191b8633496c066249972903 +size 26365 diff --git a/main_menu/en/Credits.png b/main_menu/en/Credits.png new file mode 100644 index 0000000..e872bc5 --- /dev/null +++ b/main_menu/en/Credits.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c2f2afcce704af0f1181e3ce6fcc75a76adf597eab9e3aa6558d364dc3b13e4 +size 14813 diff --git a/main_menu/en/EnglishActive.png b/main_menu/en/EnglishActive.png new file mode 100644 index 0000000..b682602 --- /dev/null +++ b/main_menu/en/EnglishActive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f293f0070eb7eea2dd8df66ae5cad8a7e22876a0e1b67bfecfb75158cfb71d53 +size 17701 diff --git a/main_menu/en/LeaveReality.png b/main_menu/en/LeaveReality.png new file mode 100644 index 0000000..48b9438 --- /dev/null +++ b/main_menu/en/LeaveReality.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50142bc84f6241ebdb3bc89ebc65f295b6d65bbed438aec6aa2e8541ba55e825 +size 22986 diff --git a/main_menu/en/MusicActive.png b/main_menu/en/MusicActive.png new file mode 100644 index 0000000..b88666c --- /dev/null +++ b/main_menu/en/MusicActive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a68693c6e1565fdf2072ea2e73a8712051994d890fd784e319784900898a9aa7 +size 17395 diff --git a/main_menu/en/MusicNonActive.png b/main_menu/en/MusicNonActive.png new file mode 100644 index 0000000..50fd9d1 --- /dev/null +++ b/main_menu/en/MusicNonActive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1929d422a503e5a610e55fdd08c814e458566c8dc4962e91668f13d8490d93bf +size 11109 diff --git a/main_menu/en/Russian.png b/main_menu/en/Russian.png new file mode 100644 index 0000000..6a52099 --- /dev/null +++ b/main_menu/en/Russian.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9239e0e54ee3e4a3e7d9747d49814878436e349d787f131933a129bfc34f6b7 +size 15232 diff --git a/main_menu/en/SoundActive.png b/main_menu/en/SoundActive.png new file mode 100644 index 0000000..bed3769 --- /dev/null +++ b/main_menu/en/SoundActive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7b1dbcad8fc8d94421f88fbf6dda1dcb02db029b387e653eff96239135e44f7 +size 18756 diff --git a/main_menu/en/SoundNonActive.png b/main_menu/en/SoundNonActive.png new file mode 100644 index 0000000..74c3645 --- /dev/null +++ b/main_menu/en/SoundNonActive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af7f92a7c4fb6d605e2fe00ce57b7405823d2244f27e20f980ddd54b13b8f50c +size 12036 diff --git a/main_menu/en/Tutorial.png b/main_menu/en/Tutorial.png new file mode 100644 index 0000000..46d663a --- /dev/null +++ b/main_menu/en/Tutorial.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40bde26faa3696dcf4ad29ac0880fde2b95c173bb85a85557ef7e84c959c7bf7 +size 11631 diff --git a/main_menu/ru/Achievements.png b/main_menu/ru/Achievements.png new file mode 100644 index 0000000..a59eace --- /dev/null +++ b/main_menu/ru/Achievements.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80385bc4baa1ed0355fd21feddbc5ab4bec141970b14397c2ba54e11c4f9cb9d +size 20345 diff --git a/main_menu/ru/CreateUniverse.png b/main_menu/ru/CreateUniverse.png new file mode 100644 index 0000000..dcca4ff --- /dev/null +++ b/main_menu/ru/CreateUniverse.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:384a5ae20bb3a60fe9c08a30f26f75940ec253af3e5b7794ad1fd2d7939ea2aa +size 31954 diff --git a/main_menu/ru/Credits.png b/main_menu/ru/Credits.png new file mode 100644 index 0000000..39b0e43 --- /dev/null +++ b/main_menu/ru/Credits.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3398cfca232416fa4b5c2e7ab79b2c325120d96de5508580bef6baa9b2884d04 +size 13842 diff --git a/main_menu/ru/English.png b/main_menu/ru/English.png new file mode 100644 index 0000000..74c0081 --- /dev/null +++ b/main_menu/ru/English.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7e5b297cfe365b72b4bbcf1e951329537b676c462e18c592d536b4e570b2f27 +size 11917 diff --git a/main_menu/ru/LeaveReality.png b/main_menu/ru/LeaveReality.png new file mode 100644 index 0000000..3af3d03 --- /dev/null +++ b/main_menu/ru/LeaveReality.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67e47ac17d7a2502dd15b6d212f14e606c63a609842d8164b7759046ed26372a +size 29640 diff --git a/main_menu/ru/MusicActive.png b/main_menu/ru/MusicActive.png new file mode 100644 index 0000000..75a5fa2 --- /dev/null +++ b/main_menu/ru/MusicActive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:398be45c79ee142b0ed3eb360691d7048f6a6614ccc87ac0462fa7c9b131c4a9 +size 24012 diff --git a/main_menu/ru/MusicNonActive.png b/main_menu/ru/MusicNonActive.png new file mode 100644 index 0000000..666b25a --- /dev/null +++ b/main_menu/ru/MusicNonActive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:651cb0bfb57e0f3ec44c77b894a45a97b6ec8118ef38f229235c38b811a274c8 +size 14851 diff --git a/main_menu/ru/RussianActive.png b/main_menu/ru/RussianActive.png new file mode 100644 index 0000000..1ff79e7 --- /dev/null +++ b/main_menu/ru/RussianActive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee851e4f15b0aaaac598fc6c4cf1c02e1d2b6014a835112228f75598e143fa75 +size 20516 diff --git a/main_menu/ru/SoundActive.png b/main_menu/ru/SoundActive.png new file mode 100644 index 0000000..8b5ecdc --- /dev/null +++ b/main_menu/ru/SoundActive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59ac682b12722eccadff55fc1b7d1777b45fffe6aec74f2073c2a7fc855d0eb6 +size 18059 diff --git a/main_menu/ru/SoundNonActive.png b/main_menu/ru/SoundNonActive.png new file mode 100644 index 0000000..de12c0e --- /dev/null +++ b/main_menu/ru/SoundNonActive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75cab520132fc5f7f3a85e42dbe87063d7e5a300c60e8f7d52bc8ec2699e34b7 +size 11289 diff --git a/main_menu/ru/Tutorial.png b/main_menu/ru/Tutorial.png new file mode 100644 index 0000000..cf05262 --- /dev/null +++ b/main_menu/ru/Tutorial.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39168c6e5378754aa017311ff4ce6daffea6c51fdf5ecf4af754e1168e631973 +size 19473 diff --git a/tests/test_action_values.gd b/tests/test_action_values.gd new file mode 100644 index 0000000..c8ab69f --- /dev/null +++ b/tests/test_action_values.gd @@ -0,0 +1,29 @@ +extends SceneTree + +var failures: int = 0 +var checks: int = 0 + +func _initialize() -> void: + call_deferred("run") + +func check(value: bool, message: String) -> void: + checks += 1 + if not value: + failures += 1 + push_error(message) + +func run() -> void: + var actions = load("res://ui/actions/actions.tscn").instantiate() + root.add_child(actions) + var values: Array = [0.1, 0.01, 0.001, 1.0, 10.0] + var labels: Array = [] + for value in values: + labels.append(actions._format_action_value(value)) + check(labels == ["0.10", "0.010", "0.0010", "1", "10"], "Fractional action amounts retain precision") + check(labels[0] != labels[1] and labels[1] != labels[2], "Adjacent fractional amounts are distinguishable") + actions.set_actions("test", 123.0) + check(actions.action_values[0] == 1.0 and actions.action_values[1] == 10.0, "Distribution preserves distinct requests") + check(actions.action_labels[0].text != actions.action_labels[1].text, "Rendered adjacent buttons are distinct") + actions.queue_free() + print("Action values: %d checks, %d failures" % [checks, failures]) + quit(0 if failures == 0 else 1) diff --git a/tests/test_action_values.gd.uid b/tests/test_action_values.gd.uid new file mode 100644 index 0000000..344518d --- /dev/null +++ b/tests/test_action_values.gd.uid @@ -0,0 +1 @@ +uid://dilbcphuku6k1 diff --git a/ui/actions/actions.gd b/ui/actions/actions.gd index 3723bdf..0d7360e 100644 --- a/ui/actions/actions.gd +++ b/ui/actions/actions.gd @@ -47,9 +47,21 @@ func _set_action_values(values: Array, displayed: Array) -> void: for ind in range(0, 5): action_values[ind] = values[ind] # Keep the original request for execution; show the exact planned output. - var text: String = Global.format_number(displayed[ind]) if displayed[ind] > 0 else "" + var text: String = _format_action_value(displayed[ind]) if action_labels[ind].text != text: action_labels[ind].text = text + + +func _format_action_value(value: float) -> String: + if value <= 0.0 or not is_finite(value): + return "" + if value >= 1.0: + return Global.format_number(value) + # Global's default is intended for object counts. Action values may be + # fractional, so retain enough precision to keep adjacent buttons distinct. + var exponent: int = int(floor(log(value) / log(10.0))) + var digits: int = clampi(-exponent + 1, 2, 6) + return Global.format_number(value, digits) func _on_action_button_pressed(button_id: int) -> void: diff --git a/world/world.tscn b/world/world.tscn index 86c1607..42eb587 100644 --- a/world/world.tscn +++ b/world/world.tscn @@ -42,9 +42,25 @@ [ext_resource type="Texture2D" uid="uid://bwqmmmg6w7dho" path="res://ui/indicators/trends/trend_icon_4.png" id="39_jms70"] [ext_resource type="Texture2D" uid="uid://4tpbmpe6tbk0" path="res://ui/indicators/trends/trend_bar5.png" id="40_50rdj"] [ext_resource type="Texture2D" uid="uid://cnf3ml5gj2cvl" path="res://ui/indicators/trends/trend_icon_5.png" id="41_mi6gc"] +[ext_resource type="Texture2D" uid="uid://drcoll8tlms5s" path="res://main_menu/Owniverse.png" id="43_58wjt"] +[ext_resource type="Texture2D" uid="uid://dcpavg1u7gne7" path="res://main_menu/en/CreateUniverse.png" id="43_k83x5"] +[ext_resource type="Texture2D" uid="uid://c7osivfr1yusc" path="res://main_menu/en/Tutorial.png" id="44_b8tmp"] +[ext_resource type="Texture2D" uid="uid://cq3ho84qxa2wj" path="res://main_menu/en/Achievements.png" id="45_vu62d"] +[ext_resource type="Texture2D" uid="uid://clifqlkiqlp7s" path="res://main_menu/en/Russian.png" id="46_58wjt"] +[ext_resource type="Texture2D" uid="uid://bp7fwgt6kwnwa" path="res://main_menu/ru/English.png" id="47_bfrib"] +[ext_resource type="Texture2D" uid="uid://c15y3813cpwtd" path="res://main_menu/en/SoundNonActive.png" id="47_dp8ul"] +[ext_resource type="Texture2D" uid="uid://cj0qbxoddsnjv" path="res://main_menu/en/EnglishActive.png" id="48_mip0j"] +[ext_resource type="Texture2D" uid="uid://cbpds0flysd4i" path="res://main_menu/en/SoundActive.png" id="48_o7xkw"] +[ext_resource type="Texture2D" uid="uid://dxh4l2ovvmrk1" path="res://main_menu/en/MusicNonActive.png" id="49_bfrib"] +[ext_resource type="Texture2D" uid="uid://so06vth6le3b" path="res://main_menu/ru/RussianActive.png" id="50_l6135"] +[ext_resource type="Texture2D" uid="uid://bamh6ko30ljb7" path="res://main_menu/en/MusicActive.png" id="50_mip0j"] +[ext_resource type="Texture2D" uid="uid://bhfva6xtyij4k" path="res://main_menu/en/Credits.png" id="51_l6135"] +[ext_resource type="Texture2D" uid="uid://dwqpcm1pryw44" path="res://main_menu/en/LeaveReality.png" id="52_uvuuk"] [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ifjjt"] +[sub_resource type="ButtonGroup" id="ButtonGroup_58wjt"] + [node name="World" type="Node2D" unique_id=1392592456] [node name="Background" type="Node2D" parent="." unique_id=1988758765] @@ -868,6 +884,90 @@ theme_override_styles/panel = SubResource("StyleBoxEmpty_ifjjt") [node name="Border" parent="Stage/StageRows" unique_id=145801370 instance=ExtResource("12_58wjt")] layout_mode = 2 +[node name="MainMenu" type="VBoxContainer" parent="Stage" unique_id=731440017] +visible = false +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 +theme_override_constants/separation = 32 + +[node name="TopMenu" type="HBoxContainer" parent="Stage/MainMenu" unique_id=252548655] +layout_mode = 2 + +[node name="BurgerButton" type="TextureButton" parent="Stage/MainMenu/TopMenu" unique_id=1685450387] +custom_minimum_size = Vector2(128, 128) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +texture_normal = ExtResource("4_b8tmp") +texture_pressed = ExtResource("5_en1oy") + +[node name="Logo" type="TextureRect" parent="Stage/MainMenu" unique_id=1181845167] +custom_minimum_size = Vector2(1080, 256) +layout_mode = 2 +texture = ExtResource("43_58wjt") + +[node name="CreateOwniverse" type="TextureButton" parent="Stage/MainMenu" unique_id=1568939047] +custom_minimum_size = Vector2(1024, 128) +layout_mode = 2 +texture_normal = ExtResource("43_k83x5") + +[node name="Tutorial" type="TextureButton" parent="Stage/MainMenu" unique_id=663512289] +custom_minimum_size = Vector2(1024, 128) +layout_mode = 2 +texture_normal = ExtResource("44_b8tmp") + +[node name="Achievements" type="TextureButton" parent="Stage/MainMenu" unique_id=141361251] +custom_minimum_size = Vector2(1024, 128) +layout_mode = 2 +texture_normal = ExtResource("45_vu62d") + +[node name="Language" type="HBoxContainer" parent="Stage/MainMenu" unique_id=2100638475] +layout_mode = 2 + +[node name="English" type="TextureButton" parent="Stage/MainMenu/Language" unique_id=1495557975] +custom_minimum_size = Vector2(512, 128) +layout_mode = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_58wjt") +texture_normal = ExtResource("47_bfrib") +texture_pressed = ExtResource("48_mip0j") + +[node name="Russian" type="TextureButton" parent="Stage/MainMenu/Language" unique_id=2024992008] +custom_minimum_size = Vector2(512, 128) +layout_mode = 2 +toggle_mode = true +button_group = SubResource("ButtonGroup_58wjt") +texture_normal = ExtResource("46_58wjt") +texture_pressed = ExtResource("50_l6135") + +[node name="Media" type="HBoxContainer" parent="Stage/MainMenu" unique_id=583896501] +layout_mode = 2 + +[node name="Sound" type="TextureButton" parent="Stage/MainMenu/Media" unique_id=116977198] +custom_minimum_size = Vector2(512, 128) +layout_mode = 2 +toggle_mode = true +texture_normal = ExtResource("47_dp8ul") +texture_pressed = ExtResource("48_o7xkw") + +[node name="Music" type="TextureButton" parent="Stage/MainMenu/Media" unique_id=953224171] +custom_minimum_size = Vector2(512, 128) +layout_mode = 2 +toggle_mode = true +texture_normal = ExtResource("49_bfrib") +texture_pressed = ExtResource("50_mip0j") + +[node name="Credits" type="TextureButton" parent="Stage/MainMenu" unique_id=44726060] +custom_minimum_size = Vector2(1024, 128) +layout_mode = 2 +texture_normal = ExtResource("51_l6135") + +[node name="LeaveReality" type="TextureButton" parent="Stage/MainMenu" unique_id=2139602731] +custom_minimum_size = Vector2(1024, 128) +layout_mode = 2 +texture_normal = ExtResource("52_uvuuk") + [node name="ItemAmountUpdate" type="Timer" parent="Stage" unique_id=1953928024] wait_time = 0.2 autostart = true