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)