aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test_scene.py67
1 files changed, 67 insertions, 0 deletions
diff --git a/tests/test_scene.py b/tests/test_scene.py
index 0e52216..13b80bb 100644
--- a/tests/test_scene.py
+++ b/tests/test_scene.py
@@ -123,3 +123,70 @@ class SceneTest(unittest.TestCase):
"rotation": [{"id": "x", "current_value": 30}]}]
_, err = load_quiet(self.duf({"nodes": nodes}))
self.assertIn("pose", err)
+
+ def root(self, rel, doc):
+ """Extra library root holding one hand-written file."""
+ root = self.dir / "extra"
+ p = root / rel
+ p.parent.mkdir(parents=True, exist_ok=True)
+ p.write_text(json.dumps(doc))
+ return root
+
+ def morph_doc(self, *mods):
+ return {"modifier_library": list(mods)}
+
+ def mod(self, ident, morph=None):
+ m = {"id": ident, "parent": "/data/Test/Fig/Fig.dsf#Fig",
+ "channel": {"id": "value", "value": 0}}
+ if morph:
+ m["morph"] = morph
+ return m
+
+ MORPHS = "data/Test/Fig/Morphs/Test/"
+
+ def test_file_loaded_once(self):
+ scene, _ = load_quiet(self.duf({"nodes": self.base_nodes(), "animations": [
+ {"url": "Fig:/data/Test/Fig/Morphs/Test/Tall.dsf#Tall?value", "keys": [[0, 1]]}],
+ "modifiers": [{"id": "Typo", "url": "/data/Test/Fig/Morphs/Test/Tall.dsf#Typo",
+ "parent": "#Fig", "channel": {"id": "value", "current_value": 0}}]}))
+ self.assertEqual(len(scene.graph.formulas["hip:hip?center_point/y"]), 1)
+ self.assertEqual(scene.graph.evaluate()["hip:hip?center_point/y"], 7)
+
+ def test_malformed_morph_file_is_fatal(self):
+ root = self.root(self.MORPHS + "NoId.dsf", {"modifier_library": [{"channel": {"value": 0}}]})
+ with self.assertRaisesRegex(Error, "NoId.dsf: malformed morph data"):
+ load_quiet(DATA / "scene.duf", [root])
+
+ def test_bad_deltas_fatal(self):
+ root = self.root(self.MORPHS + "BadDelta.dsf", self.morph_doc(
+ self.mod("BadDelta", {"vertex_count": 3, "deltas": {"values": [[7, 1, 1, 1]]}})))
+ with self.assertRaisesRegex(Error, "bad morph deltas"):
+ load_quiet(DATA / "scene.duf", [root])
+
+ def test_malformed_scene_data(self):
+ for scene in ({"nodes": self.base_nodes(), "animations": [
+ {"url": "Fig:#Tall?value", "keys": []}]}, {"nodes": None}):
+ with self.assertRaisesRegex(Error, "malformed scene data"):
+ load_quiet(self.duf(scene))
+
+ def test_dial_not_a_number(self):
+ with self.assertRaisesRegex(Error, "dial value is not a number"):
+ load_quiet(self.duf({"nodes": self.base_nodes(), "modifiers": [
+ {"id": "Tall", "url": "/data/Test/Fig/Morphs/Test/Tall.dsf#Tall",
+ "parent": "#Fig", "channel": {"id": "value", "current_value": "a"}}]}))
+
+ def test_hd_warning_once(self):
+ hd = {"vertex_count": 3, "hd_url": "x", "deltas": {"values": [[0, 1, 0, 0]]}}
+ root = self.root(self.MORPHS + "Hd.dsf", self.morph_doc(
+ self.mod("Hd1", hd), self.mod("Hd2", hd)))
+ _, err = load_quiet(DATA / "scene.duf", [root])
+ self.assertEqual(err.count("2 HD morphs"), 1)
+
+ def test_on_demand_morph_outside_morphs_dir(self):
+ root = self.root("data/Test/Extra/Bulk.dsf", self.morph_doc(
+ self.mod("Bulk", {"vertex_count": 3, "deltas": {"values": [[2, 0, 0, 1]]}})))
+ scene, _ = load_quiet(self.duf({"nodes": self.base_nodes(), "modifiers": [
+ {"id": "Bulk", "url": "/data/Test/Extra/Bulk.dsf#Bulk", "parent": "#Fig",
+ "channel": {"id": "value", "current_value": 1}}]}), [root])
+ self.assertIn("Fig:Bulk?value", scene.figure.morphs)
+ self.assertEqual(scene.graph.props["Fig:Bulk?value"].value, 1)