Added unit test for Packer.strategise()
This commit is contained in:
parent
ccdccd69cf
commit
01a9392fc1
@ -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)))
|
||||
|
||||
117
tests/test_pack.py
Normal file
117
tests/test_pack.py
Normal file
@ -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)
|
||||
Loading…
x
Reference in New Issue
Block a user