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

0001 from unittest import mock
0002 from ..base import TestCase
0003 from lottie.objects import base
0004 from lottie import NVector
0005 from lottie.objects.shapes import Rect
0006 
0007 
0008 class TestEnum(base.LottieEnum):
0009     Foo = 1
0010     Bar = 2
0011 
0012 
0013 class TestLottieBase(TestCase):
0014     def test_unimplemented(self):
0015         lottie = base.LottieBase()
0016         self.assertRaises(NotImplementedError, lottie.to_dict)
0017         self.assertRaises(NotImplementedError, lottie.load, {})
0018 
0019     def test_enum(self):
0020         self.assertIsInstance(TestEnum.Foo, base.LottieBase)
0021         self.assertIsInstance(TestEnum.Foo.to_dict(), int)
0022         self.assertEqual(TestEnum.Foo.to_dict(), 1)
0023         self.assertEqual(TestEnum.load(2), TestEnum.Bar)
0024 
0025 
0026 class TestLottieValueConverter(TestCase):
0027     def test_p2l(self):
0028         self.assertIsInstance(base.PseudoBool.py_to_lottie(True), int)
0029         self.assertEqual(base.PseudoBool.py_to_lottie(True), 1)
0030         self.assertEqual(base.PseudoBool.py_to_lottie(False), 0)
0031 
0032         self.assertIsInstance(base.PseudoBool.lottie_to_py(1), bool)
0033         self.assertEqual(base.PseudoBool.py_to_lottie(1), True)
0034         self.assertEqual(base.PseudoBool.py_to_lottie(0), False)
0035 
0036         self.assertEqual(base.PseudoBool.__name__, base.PseudoBool.name)
0037 
0038 
0039 class TestLottieProp(TestCase):
0040     def test_get(self):
0041         prop = base.LottieProp("foo", "f")
0042         obj = mock.MagicMock()
0043         self.assertEqual(obj.foo, prop.get(obj))
0044 
0045     def test_set(self):
0046         prop = base.LottieProp("foo", "f")
0047         obj = mock.MagicMock()
0048         prop.set(obj, 123)
0049         self.assertEqual(obj.foo, 123)
0050 
0051     def test_load_scalar_lottie(self):
0052         prop = base.LottieProp("foo", "f", TestEnum)
0053         v = prop._load_scalar(1)
0054         self.assertIsInstance(v, TestEnum)
0055         self.assertEqual(v, TestEnum.Foo)
0056 
0057     def test_load_scalar_type_same(self):
0058         prop = base.LottieProp("foo", "f", mock.MagicMock)
0059         sv = mock.MagicMock()
0060         v = prop._load_scalar(sv)
0061         self.assertIsInstance(v, mock.MagicMock)
0062         self.assertEqual(v, sv)
0063         self.assertIs(v, sv)
0064 
0065     def test_load_scalar_type_convert(self):
0066         prop = base.LottieProp("foo", "f", float)
0067         v = prop._load_scalar(1)
0068         self.assertIsInstance(v, float)
0069         self.assertEqual(v, 1.0)
0070 
0071     def test_load_scalar_converter(self):
0072         prop = base.LottieProp("foo", "f", base.PseudoBool)
0073         v = prop._load_scalar(1)
0074         self.assertIsInstance(v, bool)
0075         self.assertEqual(v, True)
0076 
0077     def test_load_scalar_nvector(self):
0078         prop = base.LottieProp("foo", "f", NVector)
0079         v = prop._load_scalar([1,2,3])
0080         self.assertIsInstance(v, NVector)
0081         self.assertEqual(v, NVector(1, 2, 3))
0082 
0083     def test_load_nolist(self):
0084         prop = base.LottieProp("foo", "f", mock.MagicMock)
0085         sv = mock.MagicMock()
0086         v = prop.load(sv)
0087         self.assertIsInstance(v, mock.MagicMock)
0088         self.assertEqual(v, sv)
0089         self.assertIs(v, sv)
0090 
0091     def test_load_pseudolist_scalar(self):
0092         prop = base.LottieProp("foo", "f", mock.MagicMock, base.PseudoList)
0093         sv = mock.MagicMock()
0094         v = prop.load(sv)
0095         self.assertIsInstance(v, mock.MagicMock)
0096         self.assertEqual(v, sv)
0097         self.assertIs(v, sv)
0098 
0099     def test_load_pseudolist_list(self):
0100         prop = base.LottieProp("foo", "f", mock.MagicMock, base.PseudoList)
0101         sv = mock.MagicMock()
0102         v = prop.load([sv])
0103         self.assertIsInstance(v, mock.MagicMock)
0104         self.assertEqual(v, sv)
0105         self.assertIs(v, sv)
0106 
0107     def test_load_list(self):
0108         prop = base.LottieProp("foo", "f", mock.MagicMock, True)
0109         sv = [mock.MagicMock(), mock.MagicMock(), mock.MagicMock()]
0110         v = prop.load(sv)
0111         self.assertIsInstance(v, list)
0112         self.assertEqual(v, sv)
0113 
0114     def test_basic_to_dict_enum(self):
0115         prop = base.LottieProp("foo", "f", TestEnum)
0116         v = prop._basic_to_dict(TestEnum.Foo)
0117         self.assertIsInstance(v, int)
0118         self.assertEqual(v, 1)
0119 
0120     def test_basic_to_dict_nvector(self):
0121         prop = base.LottieProp("foo", "f", NVector)
0122         v = prop._basic_to_dict(NVector(1, 2, 3))
0123         self.assertIsInstance(v, list)
0124         self.assertEqual(v, [1, 2, 3])
0125 
0126     def test_basic_to_dict_list(self):
0127         prop = base.LottieProp("foo", "f", TestEnum)
0128         v = prop._basic_to_dict([TestEnum.Foo, TestEnum.Bar])
0129         self.assertIsInstance(v, list)
0130         self.assertEqual(v, [1, 2])
0131 
0132     def test_basic_to_dict_simple(self):
0133         prop = base.LottieProp("foo", "f", int)
0134         v = prop._basic_to_dict(2)
0135         self.assertIsInstance(v, int)
0136         self.assertEqual(v, 2)
0137 
0138     def test_basic_to_dict_float_int(self):
0139         prop = base.LottieProp("foo", "f", float)
0140         v = prop._basic_to_dict(2.0)
0141         self.assertIsInstance(v, int)
0142         self.assertEqual(v, 2)
0143 
0144     # TODO test stripper
0145     #def test_basic_to_dict_float_round(self):
0146         #prop = base.LottieProp("foo", "f", float)
0147         #v = prop._basic_to_dict(0.3333333)
0148         #self.assertIsInstance(v, float)
0149         #self.assertEqual(v, 0.333)
0150 
0151     def test_basic_to_dict_unknown(self):
0152         prop = base.LottieProp("foo", "f", mock.MagicMock)
0153         self.assertRaises(Exception, prop._basic_to_dict, mock.MagicMock)
0154 
0155     def test_repr(self):
0156         prop = base.LottieProp("foo", "bar")
0157         self.assertIn("foo", repr(prop))
0158         self.assertIn("bar", repr(prop))
0159 
0160 
0161 class MockObject(base.LottieObject):
0162     _props = [
0163         base.LottieProp("foo", "f", None, True),
0164         base.LottieProp("bar", "b"),
0165         base.LottieProp("name", "nm", str),
0166     ]
0167 
0168     def __init__(self, foo=None, bar=None, name=None):
0169         self.foo = foo
0170         self.bar = bar
0171         self.name = name
0172 
0173 
0174 MockObject._props[0].type = MockObject
0175 
0176 
0177 class Derived(MockObject):
0178     _props = [
0179         base.LottieProp("awoo", "ft", int)
0180     ]
0181 
0182 
0183 class TestLottieObject(TestCase):
0184     def test_to_dict(self):
0185         obj = MockObject([MockObject([], 456)], 123)
0186         self.assertDictEqual(obj.to_dict(), {"f": [{"f": [], "b": 456}], "b": 123})
0187 
0188     def test_load(self):
0189         obj = MockObject.load({"f": [{"f": [], "b": 456}], "b": 123})
0190         self.assertEqual(obj.bar, 123)
0191         self.assertEqual(len(obj.foo), 1)
0192         self.assertEqual(obj.foo[0].bar, 456)
0193         self.assertEqual(obj.foo[0].foo, [])
0194 
0195     def test_find_list(self):
0196         obj = MockObject([MockObject([], 456), MockObject([], 789, "foo")], 123)
0197         self.assertEqual(obj.find("foo").bar, 789)
0198 
0199     def test_find_not_found(self):
0200         obj = MockObject([MockObject([], 456), MockObject([], 789, "foo")], 123)
0201         self.assertIsNone(obj.find("bar"))
0202 
0203     def test_find_child(self):
0204         obj = MockObject([], MockObject([], 789, "foo"))
0205         self.assertEqual(obj.find("foo").bar, 789)
0206 
0207     def test_inherit_properties(self):
0208         obj = Derived([], 123)
0209         obj.awoo = 621
0210         self.assertDictEqual(obj.to_dict(), {"f": [], "b": 123, "ft": 621})
0211 
0212 
0213 class MyLottie(base.CustomObject):
0214     wrapped_lottie = Rect
0215     _props = [
0216         base.LottieProp("p1", "p1", NVector),
0217         base.LottieProp("p2", "p2", NVector),
0218     ]
0219     fullname = "%s.%s" % (__name__, "MyLottie")
0220 
0221     def __init__(self, p1=None, p2=None):
0222         super().__init__()
0223         self.p1 = p1 or NVector(0, 0)
0224         self.p2 = p2 or NVector(0, 0)
0225 
0226     def _build_wrapped(self):
0227         rect = Rect()
0228         rect.position.value = (self.p1 + self.p2) / 2
0229         rect.size.value = self.p2 - self.p1
0230         return rect
0231 
0232 
0233 class TestCustomObject(TestCase):
0234     def test_to_dict(self):
0235         obj = MyLottie(NVector(10, 20), NVector(20, 30))
0236         obj.refresh()
0237 
0238         self.assertDictEqual(
0239             obj.to_dict(),
0240             {
0241                 "ty": "rc",
0242                 "d": 0,
0243                 "p": {"a": 0, "k": [15, 25]},
0244                 "s": {"a": 0, "k": [10, 10]},
0245                 "r": {"a": 0, "k": 0},
0246                 "__pyclass": MyLottie.fullname,
0247                 "p1": [10, 20],
0248                 "p2": [20, 30],
0249             }
0250         )
0251 
0252     def test_load(self):
0253         obj = Rect.load({
0254             "ty": "rc",
0255             "d": 0,
0256             "p": {"a": 0, "k": [15, 25]},
0257             "s": {"a": 0, "k": [10, 10]},
0258             "r": {"a": 0, "k": 0},
0259             "__pyclass": MyLottie.fullname,
0260             "p1": [10, 20],
0261             "p2": [20, 30],
0262         })
0263         self.assertIsInstance(obj, MyLottie)
0264         self.assertEqual(obj.p1, NVector(10, 20))
0265         self.assertEqual(obj.p2, NVector(20, 30))
0266         self.assertEqual(obj.wrapped.position.value, NVector(15, 25))
0267 
0268     def test_load_norefresh(self):
0269         dic = {
0270             "ty": "rc",
0271             "d": 0,
0272             "p": {"a": 0, "k": [115, 125]},
0273             "s": {"a": 0, "k": [110, 110]},
0274             "r": {"a": 0, "k": 0},
0275             "__pyclass": MyLottie.fullname,
0276             "p1": [10, 20],
0277             "p2": [20, 30],
0278         }
0279         obj = Rect.load(dic)
0280         self.assertDictEqual(obj.to_dict(), dic)