You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MangoHud/tests/params.py

135 lines
5.5 KiB
Python

import re
import subprocess
class Test:
def __init__(self):
self.options = {}
self.error_count = 0
self.ignore_params = ["pci_dev", "mangoapp_steam", "fsr_steam_sharpness",
"blacklist", "media_player_format"]
# self.files_changed()
self.get_options()
self.get_param_defaults()
self.find_options_in_readme()
self.find_options_in_conf()
if self.error_count > 0:
print(f"number of errors: {self.error_count}")
exit(1)
def get_options(self):
regex = r"\((.*?)\)"
with open('../src/overlay_params.h') as f:
for line in f:
if ("OVERLAY_PARAM_BOOL" in line or "OVERLAY_PARAM_CUSTOM"
in line) and not "#" in line:
match = re.search(regex, line)
if match:
key = match.group(1)
if key in self.ignore_params:
continue
else:
self.options[key] = None
def find_options_in_readme(self):
with open("../README.md") as f:
file = f.read()
for option in self.options:
if not option in file:
self.error_count += 1
print(f"Option: {option} is not found in README.md")
def find_options_in_conf(self):
with open("../data/MangoHud.conf") as f:
file = f.read()
for option, val in self.options.items():
if not option in file:
self.error_count += 1
print(f"Option: {option} is not found in MangoHud.conf")
if option in file:
option = "# " + option
for line in file.splitlines():
if option in line:
line = line.strip().split("=")
if len(line) != 2:
continue
key = line[0].strip("#").strip()
if key not in self.options:
continue
value = line[1].strip()
if "," in value:
value = value.split(",")
if self.options[key] != value:
self.error_count += 1
print(f"Sample config: option: {key} value is not the same as default")
print(f"default: {self.options[key]}, config: {value}")
print("")
def get_param_defaults(self):
# Open the C++ file
with open('../src/overlay_params.cpp', 'r') as f:
# Read the contents of the file
contents = f.read()
# Define the name of the function to search for
function_name = 'set_param_defaults'
# Define a regular expression to match the function definition
function_regex = re.compile(r"void\s+" +
function_name + r"\s*\(([^)]*)\)\s*{(.+?)\s*}\s*\n",
re.MULTILINE | re.DOTALL)
# Find the match of the regular expression in the file contents
match = function_regex.search(contents)
# If the function is found, extract the contents
if match:
# Extract the contents of the function
function_contents = match.group(2)
for line in function_contents.splitlines():
# FIXME: Some variables get stored as string in a string
if not "enabled" in line:
line = line.replace("params->", "")
line = line.strip().strip(";").split("=")
if len(line) != 2:
continue
key = line[0].strip()
value = line[1].strip()
if key not in self.options:
continue
# convert to a list if it contains curly bracket
if "{" in value:
value = value.replace("{", "").replace("}", "").strip().split(", ")
# If option has color in it's name we can assume it's value is
# one or more colors and that they are in binary.
# We want to convert this from binary because the config
# will not be in this format
if "color" in key:
value = [hex[2:] for hex in value]
value = [string.upper() for string in value]
# same reasoning as above
if "color" in key and type(value) is str:
value = value[2:]
value = value.upper()
if "fps_sampling_period" in key:
value = re.sub(r';\s*/\*.*?\*/', '', value)
value = str(int(int(value) / 1000000))
# if value is a list, make sure we don't store str in str
if type(value) == list:
value = [element.strip('"') for element in value]
self.options[key] = value
Test()