diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test_scene.py | 67 |
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) |
