Files
Modernization-Tool/tests/test_dxvk_fps_limit.py
T

144 lines
5.1 KiB
Python

import os
import tempfile
import unittest
from unittest import mock
import dxvk_fps
import setup_tool_dynamic
import setup_tool_responsive
class FakeVar:
def __init__(self, value):
self.value = value
def get(self):
return self.value
def set(self, value):
self.value = value
class DxvkFpsLimitTests(unittest.TestCase):
def write_config(self, root, text):
path = os.path.join(root, "dxvk.conf")
with open(path, "w", encoding="utf-8", newline="\n") as handle:
handle.write(text)
return path
def read_config(self, path):
with open(path, "r", encoding="utf-8") as handle:
return handle.read()
def test_enable_replaces_bundled_commented_value_and_preserves_other_options(self):
with tempfile.TemporaryDirectory() as root:
path = self.write_config(
root,
"# DXVK configuration\n"
"# d3d9.maxFrameRate = 1000\n"
"dxvk.allowFse = False\n",
)
dxvk_fps.apply_dxvk_fps_limit(path, True, 165)
updated = self.read_config(path)
self.assertIn("d3d9.maxFrameRate = 165\n", updated)
self.assertNotIn("# d3d9.maxFrameRate = 1000", updated)
self.assertIn("dxvk.allowFse = False\n", updated)
self.assertEqual(updated.count("d3d9.maxFrameRate"), 1)
self.assertEqual(dxvk_fps.read_dxvk_fps_limit(path), (True, 165))
def test_disable_comments_the_setting(self):
with tempfile.TemporaryDirectory() as root:
path = self.write_config(
root,
"d3d9.maxFrameRate = 144\n"
"dxvk.numCompilerThreads = 4\n",
)
dxvk_fps.apply_dxvk_fps_limit(path, False, 144)
updated = self.read_config(path)
self.assertIn("# d3d9.maxFrameRate = 144\n", updated)
self.assertNotIn("\nd3d9.maxFrameRate = 144\n", "\n" + updated)
self.assertEqual(dxvk_fps.read_dxvk_fps_limit(path), (False, 144))
def test_duplicate_limit_lines_are_collapsed_to_one(self):
with tempfile.TemporaryDirectory() as root:
path = self.write_config(
root,
"d3d9.maxFrameRate = 60\n"
"# d3d9.maxFrameRate = 120\n"
"dxvk.allowFse = False\n",
)
dxvk_fps.apply_dxvk_fps_limit(path, True, 240)
updated = self.read_config(path)
self.assertEqual(updated.count("d3d9.maxFrameRate"), 1)
self.assertIn("d3d9.maxFrameRate = 240\n", updated)
self.assertIn("dxvk.allowFse = False\n", updated)
def test_missing_limit_line_is_appended(self):
with tempfile.TemporaryDirectory() as root:
path = self.write_config(root, "dxvk.allowFse = False\n")
dxvk_fps.apply_dxvk_fps_limit(path, True, 75)
updated = self.read_config(path)
self.assertIn("dxvk.allowFse = False\n", updated)
self.assertTrue(updated.endswith("d3d9.maxFrameRate = 75\n"))
def test_invalid_values_are_rejected_without_modifying_file(self):
with tempfile.TemporaryDirectory() as root:
original = "# d3d9.maxFrameRate = 1000\n"
path = self.write_config(root, original)
with self.assertRaises(ValueError):
dxvk_fps.apply_dxvk_fps_limit(path, True, 0)
self.assertEqual(self.read_config(path), original)
def test_refresh_detection_always_returns_a_positive_integer(self):
detected = dxvk_fps.detect_max_refresh_rate(default=77)
self.assertIsInstance(detected, int)
self.assertGreater(detected, 0)
@mock.patch.object(setup_tool_dynamic.ModernWowSetupTool, "configure_dxvk")
@mock.patch("setup_tool_responsive.dxvk_fps.apply_dxvk_fps_limit")
def test_directx9_never_applies_fps_config(self, apply_limit, parent_configure):
tool = setup_tool_responsive.ResponsiveModernWowSetupTool.__new__(
setup_tool_responsive.ResponsiveModernWowSetupTool
)
tool.rendering_mode = FakeVar("directx9")
tool.limit_dxvk_fps = FakeVar(True)
tool.dxvk_fps_limit = FakeVar(165)
tool.configure_dxvk("C:/WoW")
parent_configure.assert_called_once_with("C:/WoW")
apply_limit.assert_not_called()
@mock.patch.object(setup_tool_dynamic.ModernWowSetupTool, "configure_dxvk")
@mock.patch("setup_tool_responsive.dxvk_fps.apply_dxvk_fps_limit")
def test_dxvk_applies_selected_fps_value(self, apply_limit, parent_configure):
tool = setup_tool_responsive.ResponsiveModernWowSetupTool.__new__(
setup_tool_responsive.ResponsiveModernWowSetupTool
)
tool.rendering_mode = FakeVar("dxvk")
tool.limit_dxvk_fps = FakeVar(True)
tool.dxvk_fps_limit = FakeVar(144)
tool.configure_dxvk("C:/WoW")
parent_configure.assert_called_once_with("C:/WoW")
apply_limit.assert_called_once_with(
os.path.join("C:/WoW", "dxvk.conf"),
True,
144,
)
if __name__ == "__main__":
unittest.main()