mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-10-14 19:27:09 -04:00
* Fix runtime removal races and show removal progress * Bootstrap Steam from the selected client channel * Show runtime progress below its Setup row * Always stage current session helpers and verify APK assets * Initialize Steam UI scale once using the handheld default
99 lines
4.4 KiB
Python
99 lines
4.4 KiB
Python
from pathlib import Path
|
|
import runpy
|
|
import tempfile
|
|
import unittest
|
|
|
|
|
|
BIN = Path(__file__).resolve().parents[1] / 'linuxfs/overlay/usr/local/bin'
|
|
MODULE = runpy.run_path(str(BIN / 'bannerlator-steam-ui-scale'))
|
|
initialize = MODULE['initialize']
|
|
seed_text = MODULE['seed_text']
|
|
parse = MODULE['parse']
|
|
initial_scale = MODULE['initial_scale']
|
|
DISPLAY = MODULE['DISPLAY']
|
|
|
|
|
|
class SteamUiScaleTest(unittest.TestCase):
|
|
def setUp(self):
|
|
self.temp = tempfile.TemporaryDirectory()
|
|
self.addCleanup(self.temp.cleanup)
|
|
self.root = Path(self.temp.name)
|
|
self.config = self.root / 'config/config.vdf'
|
|
self.config.parent.mkdir()
|
|
self.marker = self.config.with_name('droiddeck-ui-scale-initialized')
|
|
|
|
def scale(self, text):
|
|
return parse(text).get('InstallConfigStore').get('UI').get('display').get(DISPLAY).get('ScaleFactor')
|
|
|
|
def test_matches_the_thor_setting_and_scales_with_session_resolution(self):
|
|
self.assertAlmostEqual(1.3281567096710205, initial_scale(1280, 720), places=6)
|
|
self.assertAlmostEqual(2 * initial_scale(1280, 720), initial_scale(2560, 1440))
|
|
|
|
def test_fresh_client_gets_native_display_setting(self):
|
|
self.assertTrue(initialize(self.root, 1280, 720))
|
|
self.assertAlmostEqual(1.328156709, float(self.scale(self.config.read_text())))
|
|
self.assertTrue(self.marker.exists())
|
|
|
|
def test_current_automatic_record_does_not_count_as_a_user_choice(self):
|
|
self.config.write_text('''"InstallConfigStore" {
|
|
"UI" { "display" { "Current" { "ScaleFactor" "0.948683321475982666" } } }
|
|
}''')
|
|
self.assertTrue(initialize(self.root, 1280, 720))
|
|
self.assertAlmostEqual(initial_scale(1280, 720), float(self.scale(self.config.read_text())))
|
|
|
|
def test_existing_manual_scale_is_preserved_exactly(self):
|
|
text = f'"InstallConfigStore" {{ "UI" {{ "display" {{ "{DISPLAY}" {{ "ScaleFactor" "1.7" }} }} }} }}'
|
|
self.config.write_text(text)
|
|
self.assertFalse(initialize(self.root, 1280, 720))
|
|
self.assertEqual(text, self.config.read_text())
|
|
self.assertTrue(self.marker.exists())
|
|
|
|
def test_user_changes_after_initialization_survive_restart_and_resolution_change(self):
|
|
initialize(self.root, 1280, 720)
|
|
text = self.config.read_text().replace(self.scale(self.config.read_text()), '1.6')
|
|
self.config.write_text(text)
|
|
self.assertFalse(initialize(self.root, 1920, 1080))
|
|
self.assertEqual(text, self.config.read_text())
|
|
|
|
def test_user_returning_to_auto_does_not_get_the_default_again(self):
|
|
initialize(self.root, 1280, 720)
|
|
text = '"InstallConfigStore" { "UI" { "display" { "Current" { "ScaleFactor" "0.95" } } } }'
|
|
self.config.write_text(text)
|
|
self.assertFalse(initialize(self.root, 1280, 720))
|
|
self.assertEqual(text, self.config.read_text())
|
|
|
|
def test_existing_choices_for_other_displays_are_also_preserved(self):
|
|
text = '"InstallConfigStore" { "UI" { "display" { "External: other" { "ScaleFactor" "-1" } } } }'
|
|
self.assertEqual((text, False), seed_text(text, 1.328))
|
|
|
|
def test_unrelated_settings_comments_and_escaped_strings_keep_their_bytes(self):
|
|
text = r'''// Keep this comment
|
|
"InstallConfigStore" {
|
|
"Software" { "Valve" { "Steam" { "keep" "quoted \"text\" and { braces }" } } }
|
|
"UI" { // comment inside UI
|
|
"other" "unchanged"
|
|
}
|
|
}'''
|
|
updated, changed = seed_text(text, 1.328)
|
|
self.assertTrue(changed)
|
|
self.assertAlmostEqual(1.328, float(self.scale(updated)))
|
|
self.assertIn('"other" "unchanged"', updated)
|
|
self.assertIn('"keep" "quoted \\\"text\\\" and { braces }"', updated)
|
|
self.assertIn('// comment inside UI', updated)
|
|
at = parse(text).get('InstallConfigStore').get('UI').end
|
|
self.assertEqual(text, updated[:at] + updated[at + len(updated) - len(text):])
|
|
|
|
def test_invalid_config_is_never_rewritten_or_marked_initialized(self):
|
|
for text in ('"InstallConfigStore" {', 'garbage', '"InstallConfigStore" { "UI" "bad" }'):
|
|
self.config.write_text(text)
|
|
with self.assertRaises(ValueError):
|
|
initialize(self.root, 1280, 720)
|
|
self.assertEqual(text, self.config.read_text())
|
|
self.assertFalse(self.marker.exists())
|
|
|
|
def test_invalid_output_size_is_rejected(self):
|
|
with self.assertRaises(ValueError):
|
|
initialize(self.root, 0, 720)
|
|
self.assertFalse(self.config.exists())
|
|
self.assertFalse(self.marker.exists())
|