File indexing completed on 2025-06-01 04:02:27

0001 from .. import base
0002 from lottie import objects
0003 from lottie.nvector import NVector
0004 
0005 
0006 class TestMultiDimensional(base.TestCase):
0007     def test_zero(self):
0008         md = objects.MultiDimensional(NVector(0, 0))
0009         self.assertDictEqual(
0010             md.to_dict(),
0011             {
0012                 "a": 0,
0013                 "k": [0, 0]
0014             }
0015         )
0016 
0017     def test_value(self):
0018         md = objects.MultiDimensional(NVector(0, 0))
0019         md.value = NVector(1, 2)
0020         self.assertDictEqual(
0021             md.to_dict(),
0022             {
0023                 "a": 0,
0024                 "k": [1, 2]
0025             }
0026         )
0027 
0028     def test_keyframes(self):
0029         md = objects.MultiDimensional(NVector(0, 0))
0030         md.add_keyframe(0, NVector(1, 2))
0031         md.add_keyframe(3, NVector(4, 5))
0032         self.assertDictEqual(
0033             md.to_dict(),
0034             {
0035                 "a": 1,
0036                 "k": [
0037                     {
0038                         "t": 0,
0039                         "s": [1, 2],
0040                         "e": [4, 5],
0041                         "i": {"x": [1], "y": [1]},
0042                         "o": {"x": [0], "y": [0]},
0043                     },
0044                     {
0045                         "t": 3,
0046                         "s": [4, 5],
0047                     }
0048                 ]
0049             }
0050         )
0051 
0052     def test_clear(self):
0053         md = objects.MultiDimensional(NVector(0, 0))
0054         md.add_keyframe(0, NVector(1, 2))
0055         md.add_keyframe(3, NVector(4, 5))
0056         md.clear_animation(NVector(6, 7))
0057         self.assertDictEqual(
0058             md.to_dict(),
0059             {
0060                 "a": 0,
0061                 "k": [6, 7]
0062             }
0063         )
0064 
0065     def test_get_value_noanim(self):
0066         md = objects.MultiDimensional(NVector(0, 0))
0067         md.value = NVector(1, 2)
0068         self.assertEqual(md.get_value(),  NVector(1, 2))
0069         self.assertEqual(md.get_value(0), NVector(1, 2))
0070         self.assertEqual(md.get_value(3), NVector(1, 2))
0071         self.assertEqual(md.get_value(4), NVector(1, 2))
0072 
0073     def test_get_value_anim(self):
0074         md = objects.MultiDimensional(NVector(0, 0))
0075         md.add_keyframe(0, NVector(1, 2))
0076         md.add_keyframe(3, NVector(4, 5))
0077         self.assertEqual(md.get_value(),  NVector(1, 2))
0078         self.assertEqual(md.get_value(0), NVector(1, 2))
0079         self.assertEqual(md.get_value(3), NVector(4, 5))
0080         self.assertEqual(md.get_value(4), NVector(4, 5))
0081 
0082     def test_get_value_anim_nonestart(self):
0083         md = objects.MultiDimensional(NVector(0, 0))
0084         md.add_keyframe(0, NVector(1, 2))
0085         md.add_keyframe(3, NVector(4, 5))
0086         md.keyframes[-1].start = None # bodymovin exports them like this
0087         self.assertEqual(md.get_value(),  NVector(1, 2))
0088         self.assertEqual(md.get_value(0), NVector(1, 2))
0089         self.assertEqual(md.get_value(3), NVector(4, 5))
0090         self.assertEqual(md.get_value(4), NVector(4, 5))
0091 
0092     def test_get_value_inconsistent(self):
0093         md = objects.MultiDimensional(NVector(0, 0))
0094         md.value = NVector(1, 2)
0095         md.animated = True
0096         self.assertEqual(md.get_value(),  None)
0097         self.assertEqual(md.get_value(0), None)
0098         self.assertEqual(md.get_value(3), None)
0099         self.assertEqual(md.get_value(4), None)
0100 
0101     def test_load_noanim(self):
0102         md = objects.MultiDimensional.load({
0103             "a": 0,
0104             "k": [1, 2],
0105         })
0106         self.assertIs(md.animated, False)
0107         self.assertIsNone(md.keyframes)
0108         self.assertEqual(md.value, NVector(1, 2))
0109 
0110     def test_load_anim(self):
0111         md = objects.MultiDimensional.load({
0112                 "a": 1,
0113                 "k": [
0114                     {
0115                         "t": 0,
0116                         "s": [1, 2],
0117                         "e": [4, 5],
0118                         "i": {"x": [6], "y": [7]},
0119                         "o": {"x": [8], "y": [9]},
0120                     },
0121                     {
0122                         "t": 3,
0123                         "s": [4, 5],
0124                     }
0125                 ]
0126         })
0127         self.assertIs(md.animated, True)
0128         self.assertIsNone(md.value)
0129         self.assertEqual(len(md.keyframes), 2)
0130 
0131         self.assertEqual(md.keyframes[0].time, 0)
0132         self.assertEqual(md.keyframes[0].start, NVector(1, 2))
0133         self.assertEqual(md.keyframes[0].end, NVector(4, 5))
0134         self.assertEqual(md.keyframes[0].in_value.x, 6)
0135         self.assertEqual(md.keyframes[0].in_value.y, 7)
0136         self.assertEqual(md.keyframes[0].out_value.x, 8)
0137         self.assertEqual(md.keyframes[0].out_value.y, 9)
0138 
0139         self.assertEqual(md.keyframes[1].time, 3)
0140         self.assertEqual(md.keyframes[1].start, NVector(4, 5))
0141         self.assertEqual(md.keyframes[1].end, None)
0142         self.assertEqual(md.keyframes[1].in_value, None)
0143         self.assertEqual(md.keyframes[1].out_value, None)
0144 
0145     def test_load_anim_nolist(self):
0146         md = objects.MultiDimensional.load({
0147                 "a": 1,
0148                 "k": [
0149                     {
0150                         "t": 0,
0151                         "s": [1, 2],
0152                         "e": [4, 5],
0153                         "i": {"x": 6, "y": 7},
0154                         "o": {"x": 8, "y": 9},
0155                     },
0156                     {
0157                         "t": 3,
0158                         "s": [4, 5],
0159                     }
0160                 ]
0161         })
0162         self.assertIs(md.animated, True)
0163         self.assertIsNone(md.value)
0164         self.assertEqual(len(md.keyframes), 2)
0165 
0166         self.assertEqual(md.keyframes[0].time, 0)
0167         self.assertEqual(md.keyframes[0].start, NVector(1, 2))
0168         self.assertEqual(md.keyframes[0].end, NVector(4, 5))
0169         self.assertEqual(md.keyframes[0].in_value.x, 6)
0170         self.assertEqual(md.keyframes[0].in_value.y, 7)
0171         self.assertEqual(md.keyframes[0].out_value.x, 8)
0172         self.assertEqual(md.keyframes[0].out_value.y, 9)
0173 
0174         self.assertEqual(md.keyframes[1].time, 3)
0175         self.assertEqual(md.keyframes[1].start, NVector(4, 5))
0176         self.assertEqual(md.keyframes[1].end, None)
0177         self.assertEqual(md.keyframes[1].in_value, None)
0178         self.assertEqual(md.keyframes[1].out_value, None)