# 'Deforum' plugin for Automatic1111's Stable Diffusion WebUI. # Copyright (C) 2023 Artem Khrapov (kabachuha) and Deforum team listed in AUTHORS.md # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # Contact the dev team: https://discord.gg/deforum ## # From /scripts directory, run like: python -m unittest deforum_helpers.parseq_adapter_test ## import unittest from .parseq_adapter import ParseqAnimKeys from .animation_key_frames import DeformAnimKeys from unittest.mock import patch from unittest.mock import MagicMock, PropertyMock from types import SimpleNamespace class TestParseqAnimKeys(unittest.TestCase): @patch('deforum_helpers.parseq_adapter.DeformAnimKeys') def test_withprompt(self, mock_deformanimkeys): parseq_args = SimpleNamespace(parseq_use_deltas=True, parseq_manifest=""" { "options": { "output_fps": 30 }, "rendered_frames": [ { "frame": 0, "deforum_prompt": "blah" }, { "frame": 1, "deforum_prompt": "blah" } ] } """) anim_args = SimpleNamespace(max_frames=2) video_args = SimpleNamespace(fps=30) parseq_anim_keys = ParseqAnimKeys(parseq_args, anim_args, video_args) self.assertTrue(parseq_anim_keys.manages_prompts()) @patch('deforum_helpers.parseq_adapter.DeformAnimKeys') def test_withoutprompt(self, mock_deformanimkeys): parseq_args = SimpleNamespace(parseq_use_deltas=True, parseq_manifest=""" { "options": { "output_fps": 30 }, "rendered_frames": [ { "frame": 0 }, { "frame": 1 } ] } """) anim_args = SimpleNamespace(max_frames=2) video_args = SimpleNamespace(fps=30) parseq_anim_keys = ParseqAnimKeys(parseq_args, anim_args, video_args) self.assertFalse(parseq_anim_keys.manages_prompts()) @patch('deforum_helpers.parseq_adapter.DeformAnimKeys') def test_usedelta(self, mock_deformanimkeys): parseq_args = SimpleNamespace(parseq_use_deltas=True, parseq_manifest=""" { "options": { "output_fps": 30 }, "rendered_frames": [ { "frame": 0, "angle": 90, "angle_delta": 90 }, { "frame": 1, "angle": 180, "angle_delta": 90 } ] } """) anim_args = SimpleNamespace(max_frames=2) video_args = SimpleNamespace(fps=30) parseq_anim_keys = ParseqAnimKeys(parseq_args, anim_args, video_args) self.assertEqual(parseq_anim_keys.angle_series[1], 90) @patch('deforum_helpers.parseq_adapter.DeformAnimKeys') def test_usenondelta(self, mock_deformanimkeys): parseq_args = SimpleNamespace(parseq_use_deltas=False, parseq_manifest=""" { "options": { "output_fps": 30 }, "rendered_frames": [ { "frame": 0, "angle": 90, "angle_delta": 90 }, { "frame": 1, "angle": 180, "angle_delta": 90 } ] } """) anim_args = SimpleNamespace(max_frames=2) video_args = SimpleNamespace(fps=30) parseq_anim_keys = ParseqAnimKeys(parseq_args, anim_args, video_args) self.assertEqual(parseq_anim_keys.angle_series[1], 180) @patch('deforum_helpers.parseq_adapter.DeformAnimKeys') def test_fallbackonundefined(self, mock_deformanimkeys): parseq_args = SimpleNamespace(parseq_use_deltas=False, parseq_manifest=""" { "options": { "output_fps": 30 }, "rendered_frames": [ { "frame": 0 }, { "frame": 1 } ] } """) anim_args = SimpleNamespace(max_frames=1) video_args = SimpleNamespace(fps=20) parseq_anim_keys = ParseqAnimKeys(parseq_args, anim_args, video_args) #TODO - this is a hacky check to make sure we're falling back to the mock. #There must be a better way to inject an expected value via patch and check for that... self.assertRegex(str(parseq_anim_keys.angle_series[0]), r'MagicMock') if __name__ == '__main__': unittest.main()