From 01a9392fc166b30905b02dc1a189a4dc2d083e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 8 Mar 2018 11:00:02 +0100 Subject: [PATCH] Added unit test for Packer.strategise() --- blender_asset_tracer/tracer/result.py | 16 ++++ tests/test_pack.py | 117 ++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 tests/test_pack.py diff --git a/blender_asset_tracer/tracer/result.py b/blender_asset_tracer/tracer/result.py index da68350..c489b4b 100644 --- a/blender_asset_tracer/tracer/result.py +++ b/blender_asset_tracer/tracer/result.py @@ -1,3 +1,4 @@ +import functools import logging import pathlib import typing @@ -9,6 +10,7 @@ from . import file_sequence log = logging.getLogger(__name__) +@functools.total_ordering class BlockUsage: """Represents the use of an asset by a data block. @@ -125,3 +127,17 @@ class BlockUsage: return self._abspath abspath = property(__fspath__) + + def __lt__(self, other: 'BlockUsage'): + """Allow sorting for repeatable and predictable unit tests.""" + if not isinstance(other, BlockUsage): + raise NotImplemented() + return self.block_name < other.block_name and self.block < other.block + + def __eq__(self, other: 'BlockUsage'): + if not isinstance(other, BlockUsage): + return False + return self.block_name == other.block_name and self.block == other.block + + def __hash__(self): + return hash((self.block_name, hash(self.block))) diff --git a/tests/test_pack.py b/tests/test_pack.py new file mode 100644 index 0000000..15335b7 --- /dev/null +++ b/tests/test_pack.py @@ -0,0 +1,117 @@ +import collections +import logging +import pathlib +import sys +import tempfile +import typing + +from blender_asset_tracer import blendfile, pack +from blender_asset_tracer.blendfile import dna +from abstract_test import AbstractBlendFileTest + + +class AbstractPackTest(AbstractBlendFileTest): + @classmethod + def setUpClass(cls): + super().setUpClass() + logging.getLogger('blender_asset_tracer.pack').setLevel(logging.DEBUG) + + def setUp(self): + super().setUp() + self.tdir = tempfile.TemporaryDirectory() + self.tpath = pathlib.Path(self.tdir.name) + + def tearDown(self): + self.tdir.cleanup() + + def test_strategise_no_rewrite_required(self): + infile = self.blendfiles / 'doubly_linked.blend' + + packer = pack.Packer(infile, self.blendfiles, self.tpath) + packer.strategise() + + packed_files = ( + 'doubly_linked.blend', + 'linked_cube.blend', + 'basic_file.blend', + 'material_textures.blend', + 'textures/Bricks/brick_dotted_04-bump.jpg', + 'textures/Bricks/brick_dotted_04-color.jpg', + ) + self.assertEqual({self.blendfiles / fn: self.tpath / fn + for fn in packed_files}, + packer._packed_paths) + + for pf in packed_files: + path = self.blendfiles / pf + act = packer._actions[path] + self.assertEqual(pack.PathAction.KEEP_PATH, act.path_action, 'for %s' % pf) + self.assertEqual(self.tpath / pf, act.new_path, 'for %s' % pf) + + self.assertEqual({}, packer._rewrites) + + def test_strategise_rewrite(self): + ppath = self.blendfiles / 'subdir' + infile = ppath / 'doubly_linked_up.blend' + + packer = pack.Packer(infile, ppath, self.tpath) + packer.strategise() + + external_files = ( + 'linked_cube.blend', + 'basic_file.blend', + 'material_textures.blend', + 'textures/Bricks/brick_dotted_04-bump.jpg', + 'textures/Bricks/brick_dotted_04-color.jpg', + ) + self.assertEqual(self.tpath / 'doubly_linked_up.blend', + packer._packed_paths[ppath / 'doubly_linked_up.blend']) + + # /tmp/target + /workspace/bat/tests/blendfiles → /tmp/target/workspace/bat/tests/blendfiles + extpath = pathlib.Path(self.tpath, '_outside_project', *self.blendfiles.parts[1:]) + for fn in external_files: + self.assertEqual(extpath / fn, + packer._packed_paths[self.blendfiles / fn], + 'for %s' % fn) + + act = packer._actions[ppath / 'doubly_linked_up.blend'] + self.assertEqual(pack.PathAction.KEEP_PATH, act.path_action, 'for doubly_linked_up.blend') + self.assertEqual(self.tpath / 'doubly_linked_up.blend', act.new_path, + 'for doubly_linked_up.blend') + for fn in external_files: + path = self.blendfiles / fn + act = packer._actions[path] + self.assertEqual(pack.PathAction.FIND_NEW_LOCATION, act.path_action, 'for %s' % fn) + self.assertEqual(extpath / fn, act.new_path, 'for %s' % fn) + + to_rewrite = ( + 'linked_cube.blend', + 'material_textures.blend', + 'subdir/doubly_linked_up.blend', + ) + self.assertEqual([self.blendfiles / fn for fn in to_rewrite], + sorted(packer._rewrites.keys())) + + # Library link referencing basic_file.blend should (maybe) be rewritten. + rw_linked_cube = packer._rewrites[self.blendfiles / 'linked_cube.blend'] + self.assertEqual(1, len(rw_linked_cube)) + self.assertEqual(b'LILib', rw_linked_cube[0].block_name) + self.assertEqual(b'//basic_file.blend', rw_linked_cube[0].asset_path) + + # Texture links to image assets should (maybe) be rewritten. + rw_mattex = packer._rewrites[self.blendfiles / 'material_textures.blend'] + self.assertEqual(2, len(rw_mattex)) + rw_mattex.sort() # for repeatable tests + self.assertEqual(b'IMbrick_dotted_04-bump', rw_mattex[0].block_name) + self.assertEqual(b'//textures/Bricks/brick_dotted_04-bump.jpg', rw_mattex[0].asset_path) + self.assertEqual(b'IMbrick_dotted_04-color', rw_mattex[1].block_name) + self.assertEqual(b'//textures/Bricks/brick_dotted_04-color.jpg', rw_mattex[1].asset_path) + + # Library links from doubly_linked_up.blend to the above to blend files should be rewritten. + rw_dbllink = packer._rewrites[self.blendfiles / 'subdir/doubly_linked_up.blend'] + self.assertEqual(2, len(rw_dbllink)) + rw_dbllink.sort() # for repeatable tests + self.assertEqual(b'LILib', rw_dbllink[0].block_name) + self.assertEqual(b'//../linked_cube.blend', rw_dbllink[0].asset_path) + self.assertEqual(b'LILib.002', rw_dbllink[1].block_name) + self.assertEqual(b'//../material_textures.blend', rw_dbllink[1].asset_path)