116 lines
2.8 KiB
Python
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()
|