Unittest: Extend and basic linking tests and add basic append tests.

We could check many more things still, but this should already cover
most basic common cases.
This commit is contained in:
Bastien Montagne 2021-08-31 17:45:08 +02:00
parent e04631f44a
commit 8355e3fc77
1 changed files with 225 additions and 18 deletions

View File

@ -9,44 +9,251 @@ sys.path.append(os.path.dirname(os.path.realpath(__file__)))
from bl_blendfile_utils import TestHelper
class TestBlendLibLinkSaveLoadBasic(TestHelper):
class TestBlendLibLinkHelper(TestHelper):
def __init__(self, args):
self.args = args
@staticmethod
def reset_blender():
bpy.ops.wm.read_homefile(use_empty=True, use_factory_startup=True)
bpy.data.orphans_purge(do_recursive=True)
def unique_blendfile_name(self, base_name):
return base_name + self.__class__.__name__ + ".blend"
def init_lib_data_basic(self):
self.reset_blender()
me = bpy.data.meshes.new("LibMesh")
ob = bpy.data.objects.new("LibMesh", me)
coll = bpy.data.collections.new("LibMesh")
coll.objects.link(ob)
bpy.context.scene.collection.children.link(coll)
output_dir = self.args.output_dir
self.ensure_path(output_dir)
# Take care to keep the name unique so multiple test jobs can run at once.
output_lib_path = os.path.join(output_dir, self.unique_blendfile_name("blendlib"))
bpy.ops.wm.save_as_mainfile(filepath=output_lib_path, check_existing=False, compress=False)
return output_lib_path
class TestBlendLibLinkSaveLoadBasic(TestBlendLibLinkHelper):
def __init__(self, args):
self.args = args
def test_link_save_load(self):
bpy.ops.wm.read_homefile(use_empty=True, use_factory_startup=True)
me = bpy.data.meshes.new("LibMesh")
me.use_fake_user = True
output_dir = self.args.output_dir
self.ensure_path(output_dir)
# Take care to keep the name unique so multiple test jobs can run at once.
output_path = os.path.join(output_dir, "blendlib.blend")
output_lib_path = self.init_lib_data_basic()
bpy.ops.wm.save_as_mainfile(filepath=output_path, check_existing=False, compress=False)
# Simple link of a single ObData.
self.reset_blender()
bpy.ops.wm.read_homefile(use_empty=True, use_factory_startup=True)
bpy.data.orphans_purge()
link_dir = os.path.join(output_lib_path, "Mesh")
bpy.ops.wm.link(directory=link_dir, filename="LibMesh", instance_object_data=False)
link_dir = os.path.join(output_path, "Mesh")
bpy.ops.wm.link(directory=link_dir, filename="LibMesh")
assert(len(bpy.data.meshes) == 1)
assert(len(bpy.data.objects) == 0)
assert(len(bpy.data.collections) == 0) # Scene's master collection is not listed here
orig_data = self.blender_data_to_tuple(bpy.data, "orig_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)
output_work_path = os.path.join(output_dir, self.unique_blendfile_name("blendfile"))
bpy.ops.wm.save_as_mainfile(filepath=output_work_path, check_existing=False, compress=False)
bpy.ops.wm.open_mainfile(filepath=output_work_path, load_ui=False)
read_data = self.blender_data_to_tuple(bpy.data, "read_data")
# Since there is no usage of linked mesh, it is lost during save/reload.
assert(len(bpy.data.meshes) == 0)
assert(orig_data != read_data)
# Simple link of a single ObData with obdata instanciation.
self.reset_blender()
link_dir = os.path.join(output_lib_path, "Mesh")
bpy.ops.wm.link(directory=link_dir, filename="LibMesh", instance_object_data=True)
assert(len(bpy.data.meshes) == 1)
assert(len(bpy.data.objects) == 1) # Instance created for the mesh ObData.
assert(len(bpy.data.collections) == 0) # Scene's master collection is not listed here
orig_data = self.blender_data_to_tuple(bpy.data, "orig_data")
bpy.ops.wm.save_as_mainfile(filepath=output_work_path, check_existing=False, compress=False)
bpy.ops.wm.open_mainfile(filepath=output_work_path, load_ui=False)
read_data = self.blender_data_to_tuple(bpy.data, "read_data")
assert(orig_data == read_data)
# Simple link of a single Object.
self.reset_blender()
link_dir = os.path.join(output_lib_path, "Object")
bpy.ops.wm.link(directory=link_dir, filename="LibMesh")
assert(len(bpy.data.meshes) == 1)
assert(len(bpy.data.objects) == 1)
assert(len(bpy.data.collections) == 0) # Scene's master collection is not listed here
orig_data = self.blender_data_to_tuple(bpy.data, "orig_data")
bpy.ops.wm.save_as_mainfile(filepath=output_work_path, check_existing=False, compress=False)
bpy.ops.wm.open_mainfile(filepath=output_work_path, load_ui=False)
read_data = self.blender_data_to_tuple(bpy.data, "read_data")
assert(orig_data == read_data)
# Simple link of a single Collection, with Empty-instanciation.
self.reset_blender()
link_dir = os.path.join(output_lib_path, "Collection")
bpy.ops.wm.link(directory=link_dir, filename="LibMesh", instance_collections=True)
assert(len(bpy.data.meshes) == 1)
assert(len(bpy.data.objects) == 2) # linked object and local empty instancing the collection
assert(len(bpy.data.collections) == 1) # Scene's master collection is not listed here
orig_data = self.blender_data_to_tuple(bpy.data, "orig_data")
bpy.ops.wm.save_as_mainfile(filepath=output_work_path, check_existing=False, compress=False)
bpy.ops.wm.open_mainfile(filepath=output_work_path, load_ui=False)
read_data = self.blender_data_to_tuple(bpy.data, "read_data")
assert(orig_data == read_data)
# Simple link of a single Collection, with ViewLayer-instanciation.
self.reset_blender()
link_dir = os.path.join(output_lib_path, "Collection")
bpy.ops.wm.link(directory=link_dir, filename="LibMesh", instance_collections=False)
assert(len(bpy.data.meshes) == 1)
assert(len(bpy.data.objects) == 1)
assert(len(bpy.data.collections) == 1) # Scene's master collection is not listed here
# Linked collection should have been added to the scene's master collection children.
assert(bpy.data.collections[0] in set(bpy.data.scenes[0].collection.children))
orig_data = self.blender_data_to_tuple(bpy.data, "orig_data")
bpy.ops.wm.save_as_mainfile(filepath=output_work_path, check_existing=False, compress=False)
bpy.ops.wm.open_mainfile(filepath=output_work_path, load_ui=False)
read_data = self.blender_data_to_tuple(bpy.data, "read_data")
assert(orig_data == read_data)
class TestBlendLibAppendBasic(TestBlendLibLinkHelper):
def __init__(self, args):
self.args = args
def test_append(self):
output_dir = self.args.output_dir
output_lib_path = self.init_lib_data_basic()
# Simple append of a single ObData.
self.reset_blender()
link_dir = os.path.join(output_lib_path, "Mesh")
bpy.ops.wm.append(directory=link_dir, filename="LibMesh",
instance_object_data=False, set_fake=False, use_recursive=False)
assert(len(bpy.data.meshes) == 1)
assert(bpy.data.meshes[0].library is None)
assert(bpy.data.meshes[0].use_fake_user is False)
assert(bpy.data.meshes[0].users == 0)
assert(len(bpy.data.objects) == 0)
assert(len(bpy.data.collections) == 0) # Scene's master collection is not listed here
# Simple append of a single ObData with obdata instanciation.
self.reset_blender()
link_dir = os.path.join(output_lib_path, "Mesh")
bpy.ops.wm.append(directory=link_dir, filename="LibMesh",
instance_object_data=True, set_fake=False, use_recursive=False)
assert(len(bpy.data.meshes) == 1)
assert(bpy.data.meshes[0].library is None)
assert(bpy.data.meshes[0].use_fake_user is False)
assert(bpy.data.meshes[0].users == 1)
assert(len(bpy.data.objects) == 1) # Instance created for the mesh ObData.
assert(bpy.data.objects[0].library is None)
assert(len(bpy.data.collections) == 0) # Scene's master collection is not listed here
# Simple append of a single ObData with fake user.
self.reset_blender()
link_dir = os.path.join(output_lib_path, "Mesh")
bpy.ops.wm.append(directory=link_dir, filename="LibMesh",
instance_object_data=False, set_fake=True, use_recursive=False)
assert(len(bpy.data.meshes) == 1)
assert(bpy.data.meshes[0].library is None)
assert(bpy.data.meshes[0].use_fake_user is True)
assert(bpy.data.meshes[0].users == 1)
assert(len(bpy.data.objects) == 0)
assert(len(bpy.data.collections) == 0) # Scene's master collection is not listed here
# Simple append of a single Object.
self.reset_blender()
link_dir = os.path.join(output_lib_path, "Object")
bpy.ops.wm.append(directory=link_dir, filename="LibMesh",
instance_object_data=False, set_fake=False, use_recursive=False)
assert(len(bpy.data.meshes) == 1)
# This one fails currently, for unclear reasons.
# ~ assert(bpy.data.meshes[0].library is not None)
assert(bpy.data.meshes[0].users == 1)
assert(len(bpy.data.objects) == 1)
assert(bpy.data.objects[0].library is None)
assert(bpy.data.objects[0].users == 1)
assert(len(bpy.data.collections) == 0) # Scene's master collection is not listed here
# Simple recursive append of a single Object.
self.reset_blender()
link_dir = os.path.join(output_lib_path, "Object")
bpy.ops.wm.append(directory=link_dir, filename="LibMesh",
instance_object_data=False, set_fake=False, use_recursive=True)
assert(len(bpy.data.meshes) == 1)
assert(bpy.data.meshes[0].library is None)
assert(bpy.data.meshes[0].users == 1)
assert(len(bpy.data.objects) == 1)
assert(bpy.data.objects[0].library is None)
assert(bpy.data.objects[0].users == 1)
assert(len(bpy.data.collections) == 0) # Scene's master collection is not listed here
# Simple recursive append of a single Collection.
self.reset_blender()
link_dir = os.path.join(output_lib_path, "Collection")
bpy.ops.wm.append(directory=link_dir, filename="LibMesh",
instance_object_data=False, set_fake=False, use_recursive=True)
assert(bpy.data.meshes[0].library is None)
assert(bpy.data.meshes[0].users == 1)
assert(len(bpy.data.objects) == 1)
assert(bpy.data.objects[0].library is None)
assert(bpy.data.objects[0].users == 1)
assert(len(bpy.data.collections) == 1) # Scene's master collection is not listed here
assert(bpy.data.collections[0].library is None)
assert(bpy.data.collections[0].users == 1)
TESTS = (
TestBlendLibLinkSaveLoadBasic,
TestBlendLibAppendBasic,
)