From 21e19a90f4a3b3989a1485614e381976d93281c1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 17 Jul 2024 21:23:29 +0530 Subject: [PATCH] Add test for multiple function handling --- kitty/animation.c | 13 ++++++++----- kitty_tests/options.py | 6 ++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/kitty/animation.c b/kitty/animation.c index f90775b80..303534954 100644 --- a/kitty/animation.c +++ b/kitty/animation.c @@ -179,7 +179,7 @@ apply_easing_curve(const Animation *a, double val, monotonic_t duration) { if (!a->count) return val; size_t idx = MIN((size_t)(val * a->count), a->count - 1); animation_function *f = a->functions + idx; - double interval_size = 1. / a->count, interval_start = val - idx * interval_size; + double interval_size = 1. / a->count, interval_start = idx * interval_size; val = (val - interval_start) / interval_size; double ans = f->curve(&f->params, val, duration); return f->y_at_start + unit_value(ans) * f->y_size; @@ -282,11 +282,14 @@ test_cursor_blink_easing_function(PyObject *self UNUSED, PyObject *args) { PyErr_SetString(PyExc_RuntimeError, "must set a cursor blink animation on the global options object first"); return NULL; } - double t, duration_s = 0.5; - if (!PyArg_ParseTuple(args, "d|d", &t, &duration_s)) return NULL; + double t, duration_s = 0.5; int only_single = 1; + if (!PyArg_ParseTuple(args, "d|pd", &t, &only_single, &duration_s)) return NULL; monotonic_t duration = s_double_to_monotonic_t(duration_s); - animation_function f = a->functions[0]; - return PyFloat_FromDouble(f.curve(f.params, t, duration)); + if (only_single) { + animation_function f = a->functions[0]; + return PyFloat_FromDouble(f.curve(f.params, t, duration)); + } + return PyFloat_FromDouble(apply_easing_curve(a, t, duration)); } static PyMethodDef module_methods[] = { diff --git a/kitty_tests/options.py b/kitty_tests/options.py index 43a5bd206..2193515a0 100644 --- a/kitty_tests/options.py +++ b/kitty_tests/options.py @@ -157,14 +157,16 @@ class TestConfParsing(BaseTest): cb('linear(0, 0.25 25% 75%, 1)', first=EasingFunction('linear', linear_x=(0.0, 0.25, 0.75, 1.0), linear_y=(0, 0.25, 0.25, 1.0))) # test that easing functions give expected values - def ef(spec, tests, duration=0.5, accuracy=0): + def ef(spec, tests, only_single=True, duration=0.5, accuracy=0): cfv = p('cursor_blink_interval ' + spec).cursor_blink_interval self.set_options({'cursor_blink_interval': cfv}) for t, expected in tests.items(): - actual = test_cursor_blink_easing_function(t, duration) + actual = test_cursor_blink_easing_function(t, only_single, duration) if abs(actual - expected) > accuracy: self.ae(expected, actual, f'Failed for {spec=} with {t=}: {expected} != {actual}') + ef('linear', {0:1, 0.25: 0.5, 0.5: 0, 0.75: 0.5, 1: 1}, only_single=False) + ef('linear(0, 0.25 25% 75%, 1)', {0: 0, 0.25: 0.25, 0.3: 0.25, 0.75: 0.25, 1:1}) linear_vals = {0: 0, 1: 1, 0.1234: 0.1234, 0.6453: 0.6453} for spec in ('linear', 'linear(0, 1)', 'cubic-bezier(0, 0, 1, 1)', 'cubic-bezier(0.2, 0.2, 0.7, 0.7)'):