diff --git a/tests/test_easing.py b/tests/test_easing.py new file mode 100644 index 000000000..abdfe0a70 --- /dev/null +++ b/tests/test_easing.py @@ -0,0 +1,741 @@ +""" +Test the easing functions by sampling the range [0, 1] uniformly in 21 points. +Then, a TypeScript script was used to sample all the original functions, +the data was collected, and is here tested against the Python implementation. +""" + +import pytest + +from textual._easing import EASING + + +POINTS = [ + 0.0, + 0.05, + 0.1, + 0.15, + 0.2, + 0.25, + 0.3, + 0.35, + 0.4, + 0.45, + 0.5, + 0.55, + 0.6, + 0.65, + 0.7, + 0.75, + 0.8, + 0.85, + 0.9, + 0.95, + 1.0, +] + +DATA = { + "none": [1] * len(POINTS), + "round": [0] * POINTS.index(0.5) + [1] * (len(POINTS) - POINTS.index(0.5)), + "linear": POINTS[::], + "in_sine": [ + 0, + 0.003082666266872036, + 0.01231165940486223, + 0.027630079602323443, + 0.04894348370484647, + 0.07612046748871326, + 0.1089934758116321, + 0.1473598356459077, + 0.19098300562505255, + 0.23959403439996907, + 0.2928932188134524, + 0.35055195166981645, + 0.41221474770752686, + 0.4775014352840511, + 0.5460095002604531, + 0.6173165676349102, + 0.6909830056250525, + 0.7665546361440945, + 0.843565534959769, + 0.921540904272155, + 0.9999999999999999, + ], + "out_sine": [ + 0, + 0.07845909572784494, + 0.15643446504023087, + 0.2334453638559054, + 0.3090169943749474, + 0.3826834323650898, + 0.45399049973954675, + 0.5224985647159488, + 0.5877852522924731, + 0.6494480483301837, + 0.7071067811865475, + 0.760405965600031, + 0.8090169943749475, + 0.8526401643540922, + 0.8910065241883678, + 0.9238795325112867, + 0.9510565162951535, + 0.9723699203976766, + 0.9876883405951378, + 0.996917333733128, + 1, + ], + "in_out_sine": [ + 0, + 0.006155829702431115, + 0.024471741852423234, + 0.05449673790581605, + 0.09549150281252627, + 0.1464466094067262, + 0.20610737385376343, + 0.27300475013022657, + 0.3454915028125263, + 0.4217827674798845, + 0.49999999999999994, + 0.5782172325201155, + 0.6545084971874737, + 0.7269952498697734, + 0.7938926261462365, + 0.8535533905932737, + 0.9045084971874737, + 0.9455032620941839, + 0.9755282581475768, + 0.9938441702975689, + 1, + ], + "in_quad": [ + 0, + 0.0025000000000000005, + 0.010000000000000002, + 0.0225, + 0.04000000000000001, + 0.0625, + 0.09, + 0.12249999999999998, + 0.16000000000000003, + 0.2025, + 0.25, + 0.30250000000000005, + 0.36, + 0.42250000000000004, + 0.48999999999999994, + 0.5625, + 0.6400000000000001, + 0.7224999999999999, + 0.81, + 0.9025, + 1, + ], + "out_quad": [ + 0, + 0.09750000000000003, + 0.18999999999999995, + 0.2775000000000001, + 0.3599999999999999, + 0.4375, + 0.51, + 0.5774999999999999, + 0.64, + 0.6975, + 0.75, + 0.7975000000000001, + 0.84, + 0.8775000000000001, + 0.9099999999999999, + 0.9375, + 0.96, + 0.9775, + 0.99, + 0.9974999999999999, + 1, + ], + "in_out_quad": [ + 0, + 0.005000000000000001, + 0.020000000000000004, + 0.045, + 0.08000000000000002, + 0.125, + 0.18, + 0.24499999999999997, + 0.32000000000000006, + 0.405, + 0.5, + 0.5950000000000001, + 0.6799999999999999, + 0.755, + 0.82, + 0.875, + 0.92, + 0.955, + 0.98, + 0.995, + 1, + ], + "in_cubic": [ + 0, + 0.00012500000000000003, + 0.0010000000000000002, + 0.003375, + 0.008000000000000002, + 0.015625, + 0.027, + 0.04287499999999999, + 0.06400000000000002, + 0.09112500000000001, + 0.125, + 0.16637500000000005, + 0.216, + 0.27462500000000006, + 0.3429999999999999, + 0.421875, + 0.5120000000000001, + 0.6141249999999999, + 0.7290000000000001, + 0.8573749999999999, + 1, + ], + "out_cubic": [ + 0, + 0.1426250000000001, + 0.2709999999999999, + 0.3858750000000001, + 0.4879999999999999, + 0.578125, + 0.657, + 0.7253749999999999, + 0.784, + 0.833625, + 0.875, + 0.908875, + 0.9359999999999999, + 0.957125, + 0.973, + 0.984375, + 0.992, + 0.996625, + 0.999, + 0.999875, + 1, + ], + "in_out_cubic": [ + 0, + 0.0005000000000000001, + 0.004000000000000001, + 0.0135, + 0.03200000000000001, + 0.0625, + 0.108, + 0.17149999999999996, + 0.25600000000000006, + 0.36450000000000005, + 0.5, + 0.6355000000000002, + 0.744, + 0.8285, + 0.8919999999999999, + 0.9375, + 0.968, + 0.9865, + 0.996, + 0.9994999999999999, + 1, + ], + "in_quart": [ + 0, + 0.000006250000000000002, + 0.00010000000000000003, + 0.00050625, + 0.0016000000000000005, + 0.00390625, + 0.0081, + 0.015006249999999995, + 0.025600000000000008, + 0.04100625000000001, + 0.0625, + 0.09150625000000004, + 0.1296, + 0.17850625000000006, + 0.24009999999999992, + 0.31640625, + 0.40960000000000013, + 0.5220062499999999, + 0.6561000000000001, + 0.8145062499999999, + 1, + ], + "out_quart": [ + 0, + 0.18549375, + 0.3438999999999999, + 0.4779937500000001, + 0.5903999999999998, + 0.68359375, + 0.7599, + 0.8214937499999999, + 0.8704000000000001, + 0.90849375, + 0.9375, + 0.95899375, + 0.9743999999999999, + 0.98499375, + 0.9919, + 0.99609375, + 0.9984, + 0.99949375, + 0.9999, + 0.99999375, + 1, + ], + "in_out_quart": [ + 0, + 0.000050000000000000016, + 0.0008000000000000003, + 0.00405, + 0.012800000000000004, + 0.03125, + 0.0648, + 0.12004999999999996, + 0.20480000000000007, + 0.32805000000000006, + 0.5, + 0.6719500000000002, + 0.7951999999999999, + 0.87995, + 0.9351999999999999, + 0.96875, + 0.9872, + 0.99595, + 0.9992, + 0.99995, + 1, + ], + "in_quint": [ + 0, + 3.1250000000000013e-7, + 0.000010000000000000004, + 0.0000759375, + 0.00032000000000000013, + 0.0009765625, + 0.00243, + 0.005252187499999998, + 0.010240000000000004, + 0.018452812500000006, + 0.03125, + 0.050328437500000024, + 0.07776, + 0.11602906250000004, + 0.16806999999999994, + 0.2373046875, + 0.32768000000000014, + 0.4437053124999999, + 0.5904900000000002, + 0.7737809374999999, + 1, + ], + "out_quint": [ + 0, + 0.2262190625, + 0.4095099999999998, + 0.5562946875000001, + 0.6723199999999998, + 0.7626953125, + 0.8319300000000001, + 0.8839709375, + 0.92224, + 0.9496715625, + 0.96875, + 0.9815471875, + 0.98976, + 0.9947478125, + 0.99757, + 0.9990234375, + 0.99968, + 0.9999240625, + 0.99999, + 0.9999996875, + 1, + ], + "in_out_quint": [ + 0, + 0.000005000000000000002, + 0.00016000000000000007, + 0.001215, + 0.005120000000000002, + 0.015625, + 0.03888, + 0.08403499999999997, + 0.16384000000000007, + 0.2952450000000001, + 0.5, + 0.7047550000000002, + 0.8361599999999999, + 0.915965, + 0.96112, + 0.984375, + 0.99488, + 0.998785, + 0.99984, + 0.999995, + 1, + ], + "in_expo": [ + 0, + 0.0013810679320049757, + 0.001953125, + 0.0027621358640099515, + 0.00390625, + 0.005524271728019903, + 0.0078125, + 0.011048543456039806, + 0.015625, + 0.02209708691207961, + 0.03125, + 0.04419417382415922, + 0.0625, + 0.08838834764831845, + 0.125, + 0.1767766952966369, + 0.25, + 0.3535533905932738, + 0.5, + 0.7071067811865476, + 1, + ], + "out_expo": [ + 0, + 0.2928932188134524, + 0.5, + 0.6464466094067263, + 0.75, + 0.8232233047033631, + 0.875, + 0.9116116523516815, + 0.9375, + 0.9558058261758408, + 0.96875, + 0.9779029130879204, + 0.984375, + 0.9889514565439602, + 0.9921875, + 0.99447572827198, + 0.99609375, + 0.99723786413599, + 0.998046875, + 0.998618932067995, + 1, + ], + "in_out_expo": [ + 0, + 0.0009765625, + 0.001953125, + 0.00390625, + 0.0078125, + 0.015625, + 0.03125, + 0.0625, + 0.125, + 0.25, + 0.5, + 0.75, + 0.875, + 0.9375, + 0.96875, + 0.984375, + 0.9921875, + 0.99609375, + 0.998046875, + 0.9990234375, + 1, + ], + "in_circ": [ + 0, + 0.0012507822280910519, + 0.005012562893380035, + 0.011314003335740508, + 0.020204102886728803, + 0.031754163448145745, + 0.04606079858305434, + 0.06325030024024025, + 0.08348486100883201, + 0.10697144502541245, + 0.1339745962155614, + 0.16483534557549673, + 0.19999999999999996, + 0.24006579232146685, + 0.285857157145715, + 0.3385621722338523, + 0.40000000000000013, + 0.473217312357363, + 0.5641101056459328, + 0.6877501000800801, + 1, + ], + "out_circ": [ + 0, + 0.31224989991991997, + 0.4358898943540673, + 0.526782687642637, + 0.5999999999999999, + 0.6614378277661477, + 0.714142842854285, + 0.7599342076785331, + 0.8, + 0.8351646544245033, + 0.8660254037844386, + 0.8930285549745877, + 0.916515138991168, + 0.9367496997597597, + 0.9539392014169457, + 0.9682458365518543, + 0.9797958971132712, + 0.9886859966642595, + 0.99498743710662, + 0.998749217771909, + 1, + ], + "in_out_circ": [ + 0, + 0.0025062814466900174, + 0.010102051443364402, + 0.02303039929152717, + 0.041742430504416006, + 0.0669872981077807, + 0.09999999999999998, + 0.1429285785728575, + 0.20000000000000007, + 0.2820550528229664, + 0.5, + 0.7179449471770338, + 0.7999999999999999, + 0.8570714214271424, + 0.8999999999999999, + 0.9330127018922193, + 0.958257569495584, + 0.9769696007084728, + 0.9898979485566356, + 0.9974937185533099, + 1, + ], + "in_back": [ + 0, + -0.003916252500000001, + -0.014314220000000004, + -0.029167717499999996, + -0.046450560000000016, + -0.06413656250000001, + -0.08019953999999999, + -0.09261330750000002, + -0.09935168000000005, + -0.09838847249999999, + -0.08769750000000004, + -0.06525257750000002, + -0.029027519999999973, + 0.023003857500000002, + 0.09286773999999975, + 0.18259031249999969, + 0.29419775999999986, + 0.4297162674999999, + 0.5911720200000001, + 0.7805912024999997, + 0.9999999999999998, + ], + "out_back": [ + 2.220446049250313e-16, + 0.21940879750000053, + 0.40882797999999987, + 0.5702837325000001, + 0.7058022400000001, + 0.8174096875000002, + 0.9071322600000001, + 0.9769961425, + 1.02902752, + 1.0652525775, + 1.0876975, + 1.0983884725, + 1.09935168, + 1.0926133075, + 1.08019954, + 1.0641365625, + 1.04645056, + 1.0291677175, + 1.01431422, + 1.0039162525, + 1, + ], + "in_out_back": [ + -0, + -0.011177092750000001, + -0.037518552000000004, + -0.06823964924999999, + -0.092555656, + -0.09968184375, + -0.07883348399999998, + -0.019225848250000063, + 0.0899257920000001, + 0.25940616525, + 0.5, + 0.7405938347500003, + 0.9100742079999999, + 1.01922584825, + 1.078833484, + 1.09968184375, + 1.092555656, + 1.06823964925, + 1.0375185519999999, + 1.0111770927500001, + 1, + ], + "in_elastic": [ + 0, + 0.0006905339660024924, + 0.001953125, + 0.0013810679320049725, + -0.0019531250000000126, + -0.005524271728019903, + -0.0039062499999999918, + 0.00552427172801992, + 0.015625, + 0.011048543456039785, + -0.015625000000000045, + -0.04419417382415922, + -0.031249999999999948, + 0.04419417382415934, + 0.125, + 0.08838834764831832, + -0.1250000000000001, + -0.3535533905932738, + -0.24999999999999986, + 0.353553390593274, + 1, + ], + "out_elastic": [ + 0, + 0.6464466094067263, + 1.25, + 1.3535533905932737, + 1.125, + 0.9116116523516816, + 0.875, + 0.9558058261758408, + 1.03125, + 1.0441941738241591, + 1.015625, + 0.9889514565439602, + 0.984375, + 0.99447572827198, + 1.00390625, + 1.00552427172802, + 1.001953125, + 0.998618932067995, + 0.998046875, + 0.9993094660339975, + 1, + ], + "in_out_elastic": [ + 0, + 0.0009765625, + 0.000339156597005722, + -0.0036706742999449557, + -0.0039062499999999935, + 0.011969444423734044, + 0.023938888847468056, + -0.03125000000000003, + -0.11746157759823853, + 0.04341204441673268, + 0.5, + 0.9565879555832674, + 1.1174615775982386, + 1.03125, + 0.9760611111525319, + 0.988030555576266, + 1.00390625, + 1.003670674299945, + 0.9996608434029943, + 0.9990234375, + 1, + ], + "in_bounce": [ + 0, + 0.015468750000000031, + 0.01187500000000008, + 0.05484375000000008, + 0.06000000000000005, + 0.02734375, + 0.06937499999999996, + 0.1673437499999999, + 0.22750000000000004, + 0.24984375000000003, + 0.234375, + 0.18109375000000005, + 0.09000000000000019, + 0.07359375000000024, + 0.31937499999999985, + 0.52734375, + 0.6975000000000001, + 0.82984375, + 0.9243750000000001, + 0.98109375, + 1, + ], + "out_bounce": [ + 0, + 0.018906250000000003, + 0.07562500000000001, + 0.17015624999999998, + 0.30250000000000005, + 0.47265625, + 0.6806249999999999, + 0.9264062499999998, + 0.9099999999999998, + 0.81890625, + 0.765625, + 0.75015625, + 0.7725, + 0.8326562500000001, + 0.930625, + 0.97265625, + 0.94, + 0.9451562499999999, + 0.9881249999999999, + 0.98453125, + 1, + ], + "in_out_bounce": [ + 0, + 0.00593750000000004, + 0.030000000000000027, + 0.03468749999999998, + 0.11375000000000002, + 0.1171875, + 0.045000000000000095, + 0.15968749999999993, + 0.34875000000000006, + 0.46218750000000003, + 0.5, + 0.5378125, + 0.6512499999999999, + 0.8403125, + 0.9550000000000001, + 0.8828125, + 0.88625, + 0.9653125, + 0.97, + 0.9940624999999998, + 1, + ], +} + + +def test_coverage(): + assert set(DATA.keys()) == set(EASING.keys()) + + +def test_easings(): + for name, values in DATA.items(): + func = EASING[name] + for point, value in zip(POINTS, values): + assert value == pytest.approx(func(point))