Add initial, very basic save/open & library linking blendfile tests.
Do not do much for now, but would have been enough to catch the crash introduced the other day in linking code...
This commit is contained in:
parent
dadabf5cf3
commit
d46273563e
|
@ -127,6 +127,20 @@ add_blender_test(
|
|||
--python ${CMAKE_CURRENT_LIST_DIR}/bl_id_management.py
|
||||
)
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# BLEND IO & LINKING
|
||||
|
||||
add_blender_test(
|
||||
blendfile_io
|
||||
--python ${CMAKE_CURRENT_LIST_DIR}/bl_blendfile_io.py --
|
||||
--output-dir ${TEST_OUT_DIR}/blendfile_io/
|
||||
)
|
||||
|
||||
add_blender_test(
|
||||
blendfile_liblink
|
||||
--python ${CMAKE_CURRENT_LIST_DIR}/bl_blendfile_liblink.py
|
||||
)
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# MODELING TESTS
|
||||
add_blender_test(
|
||||
|
|
|
@ -0,0 +1,110 @@
|
|||
# Apache License, Version 2.0
|
||||
|
||||
# ./blender.bin --background -noaudio --python tests/python/bl_blendfile_io.py
|
||||
import bpy
|
||||
import os
|
||||
import pprint
|
||||
|
||||
|
||||
class TestHelper:
|
||||
|
||||
@staticmethod
|
||||
def id_to_uid(id_data):
|
||||
return (type(id_data).__name__,
|
||||
id_data.name,
|
||||
id_data.users,
|
||||
id_data.library.filepath if id_data.library else None)
|
||||
|
||||
@classmethod
|
||||
def blender_data_to_tuple(cls, bdata):
|
||||
return sorted(tuple((cls.id_to_uid(k), sorted(tuple(cls.id_to_uid(vv) for vv in v)))
|
||||
for k, v in bdata.user_map().items()))
|
||||
|
||||
@staticmethod
|
||||
def ensure_path(path):
|
||||
if not os.path.exists(path):
|
||||
os.makedirs(path)
|
||||
|
||||
def run_all_tests(self):
|
||||
for inst_attr_id in dir(self):
|
||||
if not inst_attr_id.startswith("test_"):
|
||||
continue
|
||||
inst_attr = getattr(self, inst_attr_id)
|
||||
if callable(inst_attr):
|
||||
inst_attr()
|
||||
|
||||
|
||||
class TestBlendFileSaveLoadBasic(TestHelper):
|
||||
|
||||
def __init__(self, args):
|
||||
self.args = args
|
||||
|
||||
def test_save_load(self):
|
||||
bpy.ops.wm.read_factory_settings()
|
||||
bpy.data.meshes.new("OrphanedMesh")
|
||||
|
||||
output_dir = self.args.output_dir
|
||||
self.ensure_path(output_dir)
|
||||
output_path = os.path.join(output_dir, "blendfile.blend")
|
||||
|
||||
orig_data = self.blender_data_to_tuple(bpy.data)
|
||||
|
||||
bpy.ops.wm.save_as_mainfile(filepath=output_path, check_existing=False, compress=False)
|
||||
bpy.ops.wm.open_mainfile(filepath=output_path, load_ui=False)
|
||||
|
||||
read_data = self.blender_data_to_tuple(bpy.data)
|
||||
|
||||
# We have orphaned data, which should be removed by file reading, so there should not be equality here.
|
||||
assert(orig_data != read_data)
|
||||
|
||||
bpy.data.orphans_purge()
|
||||
|
||||
orig_data = self.blender_data_to_tuple(bpy.data)
|
||||
|
||||
bpy.ops.wm.save_as_mainfile(filepath=output_path, check_existing=False, compress=False)
|
||||
bpy.ops.wm.open_mainfile(filepath=output_path, load_ui=False)
|
||||
|
||||
read_data = self.blender_data_to_tuple(bpy.data)
|
||||
|
||||
assert(orig_data == read_data)
|
||||
|
||||
|
||||
|
||||
TESTS = (
|
||||
TestBlendFileSaveLoadBasic,
|
||||
)
|
||||
|
||||
|
||||
def argparse_create():
|
||||
import argparse
|
||||
|
||||
# When --help or no args are given, print this help
|
||||
description = "Test basic IO of blend file."
|
||||
parser = argparse.ArgumentParser(description=description)
|
||||
parser.add_argument(
|
||||
"--output-dir",
|
||||
dest="output_dir",
|
||||
default=".",
|
||||
help="Where to output temp saved blendfiles",
|
||||
required=False,
|
||||
)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
def main():
|
||||
args = argparse_create().parse_args()
|
||||
|
||||
for Test in TESTS:
|
||||
Test(args).run_all_tests()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [])
|
||||
try:
|
||||
main()
|
||||
except:
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
|
@ -0,0 +1,108 @@
|
|||
# Apache License, Version 2.0
|
||||
|
||||
# ./blender.bin --background -noaudio --python tests/python/bl_blendfile_liblink.py
|
||||
import bpy
|
||||
import os
|
||||
import pprint
|
||||
|
||||
|
||||
class TestHelper:
|
||||
|
||||
@staticmethod
|
||||
def id_to_uid(id_data):
|
||||
return (type(id_data).__name__,
|
||||
id_data.name,
|
||||
id_data.users,
|
||||
id_data.library.filepath if id_data.library else None)
|
||||
|
||||
@classmethod
|
||||
def blender_data_to_tuple(cls, bdata):
|
||||
return sorted(tuple((cls.id_to_uid(k), sorted(tuple(cls.id_to_uid(vv) for vv in v)))
|
||||
for k, v in bdata.user_map().items()))
|
||||
|
||||
@staticmethod
|
||||
def ensure_path(path):
|
||||
if not os.path.exists(path):
|
||||
os.makedirs(path)
|
||||
|
||||
def run_all_tests(self):
|
||||
for inst_attr_id in dir(self):
|
||||
if not inst_attr_id.startswith("test_"):
|
||||
continue
|
||||
inst_attr = getattr(self, inst_attr_id)
|
||||
if callable(inst_attr):
|
||||
inst_attr()
|
||||
|
||||
|
||||
class TestBlendLibLinkSaveLoadBasic(TestHelper):
|
||||
|
||||
def __init__(self, args):
|
||||
self.args = args
|
||||
|
||||
def test_link_save_load(self):
|
||||
bpy.ops.wm.read_factory_settings()
|
||||
me = bpy.data.meshes.new("LibMesh")
|
||||
me.use_fake_user = True
|
||||
|
||||
output_dir = self.args.output_dir
|
||||
self.ensure_path(output_dir)
|
||||
output_path = os.path.join(output_dir, "blendlib.blend")
|
||||
|
||||
bpy.ops.wm.save_as_mainfile(filepath=output_path, check_existing=False, compress=False)
|
||||
|
||||
bpy.ops.wm.read_factory_settings()
|
||||
bpy.data.orphans_purge()
|
||||
|
||||
link_dir = os.path.join(output_path, "Mesh")
|
||||
bpy.ops.wm.link(directory=link_dir, filename="LibMesh")
|
||||
|
||||
orig_data = self.blender_data_to_tuple(bpy.data)
|
||||
|
||||
output_path = os.path.join(output_dir, "blendfile.blend")
|
||||
bpy.ops.wm.save_as_mainfile(filepath=output_path, check_existing=False, compress=False)
|
||||
bpy.ops.wm.open_mainfile(filepath=output_path, load_ui=False)
|
||||
|
||||
read_data = self.blender_data_to_tuple(bpy.data)
|
||||
|
||||
assert(orig_data == read_data)
|
||||
|
||||
|
||||
|
||||
TESTS = (
|
||||
TestBlendLibLinkSaveLoadBasic,
|
||||
)
|
||||
|
||||
|
||||
def argparse_create():
|
||||
import argparse
|
||||
|
||||
# When --help or no args are given, print this help
|
||||
description = "Test basic IO of blend file."
|
||||
parser = argparse.ArgumentParser(description=description)
|
||||
parser.add_argument(
|
||||
"--output-dir",
|
||||
dest="output_dir",
|
||||
default=".",
|
||||
help="Where to output temp saved blendfiles",
|
||||
required=False,
|
||||
)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
def main():
|
||||
args = argparse_create().parse_args()
|
||||
|
||||
for Test in TESTS:
|
||||
Test(args).run_all_tests()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [])
|
||||
try:
|
||||
main()
|
||||
except:
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
Loading…
Reference in New Issue