blender/tests/python/ui_simulate/run_blender_setup.py
Hans Goudey 29f3d54e91 Cleanup: Grammar in comments
- it's self vs. itself
- boiler plate vs boilerplate
2023-11-21 09:42:39 -05:00

116 lines
2.8 KiB
Python

# SPDX-FileCopyrightText: 2019-2023 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
"""
Utility script, called by ``run.py`` to run inside Blender,
to avoid boilerplate code having to be added into each test.
"""
import os
import sys
def create_parser():
import argparse
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawTextHelpFormatter,
)
parser.add_argument(
"--keep-open",
dest="keep_open",
default=False,
action='store_true',
required=False,
help="Keep the Blender window open after running the test.",
)
parser.add_argument(
"--step-command-pre",
dest="step_command_pre",
default=None,
required=False,
help="See 'run.py'",
)
parser.add_argument(
"--step-command-post",
dest="step_command_post",
default=None,
required=False,
help="See 'run.py'",
)
parser.add_argument(
"--tests",
dest="tests",
nargs='+',
required=True,
metavar="TEST_ID",
help="Names of tests to run.",
)
return parser
def main():
directory = os.path.dirname(__file__)
sys.path.insert(0, directory)
if "bpy" not in sys.modules:
raise Exception("This must run inside Blender")
import bpy
parser = create_parser()
args = parser.parse_args(sys.argv[sys.argv.index("--") + 1:])
# Check if `bpy.app.use_event_simulate` has been enabled by the test itself.
# When writing tests, it's useful if the test can temporarily be set to keep the window open.
def on_error():
if not bpy.app.use_event_simulate:
args.keep_open = True
if not args.keep_open:
sys.exit(1)
def on_exit():
if not bpy.app.use_event_simulate:
args.keep_open = True
if not args.keep_open:
sys.exit(0)
else:
bpy.app.use_event_simulate = False
is_first = True
for test_id in args.tests:
if not is_first:
bpy.ops.wm.read_homefile()
is_first = False
mod_name, fn_name = test_id.partition(".")[0::2]
mod = __import__(mod_name)
test_fn = getattr(mod, fn_name)
from modules import easy_keys
# So we can get the operator ID's.
bpy.context.preferences.view.show_developer_ui = True
# Hack back in operator search.
easy_keys.setup_default_preferences(bpy.context.preferences)
easy_keys.run(
test_fn(),
on_error=on_error,
on_exit=on_exit,
# Optional.
on_step_command_pre=args.step_command_pre,
on_step_command_post=args.step_command_post,
)
if __name__ == "__main__":
main()