mirror of
https://github.com/kovidgoyal/kitty
synced 2026-06-06 01:05:48 +02:00
Add test for multiple function handling
This commit is contained in:
@@ -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[] = {
|
||||
|
||||
@@ -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)'):
|
||||
|
||||
Reference in New Issue
Block a user