mirror of
https://github.com/google/pebble.git
synced 2025-03-22 03:32:20 +00:00
136 lines
5.1 KiB
C
136 lines
5.1 KiB
C
/*
|
|
* Copyright 2024 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "applib/ui/animation_interpolate.h"
|
|
#include "applib/ui/animation.h"
|
|
#include "util/size.h"
|
|
|
|
#include "clar.h"
|
|
|
|
#include "stubs/stubs_logging.h"
|
|
#include "stubs/stubs_passert.h"
|
|
|
|
InterpolateInt64Function s_animation_private_current_interpolate_override;
|
|
|
|
InterpolateInt64Function animation_private_current_interpolate_override(void) {
|
|
return s_animation_private_current_interpolate_override;
|
|
}
|
|
|
|
void test_animation_interpolate__initialize(void) {
|
|
s_animation_private_current_interpolate_override = NULL;
|
|
}
|
|
|
|
void test_animation_interpolate__override_is_null(void) {
|
|
cl_assert_equal_i(-10000, interpolate_int16(0, -10000, 10000));
|
|
cl_assert_equal_i(10000, interpolate_int16(ANIMATION_NORMALIZED_MAX, -10000, 10000));
|
|
}
|
|
|
|
static AnimationProgress s_override_progress;
|
|
static int64_t s_override_from;
|
|
static int64_t s_override_to;
|
|
|
|
int64_t prv_override_capture_args(AnimationProgress p, int64_t a, int64_t b) {
|
|
s_override_progress = p;
|
|
s_override_from = a;
|
|
s_override_to = b;
|
|
return 1;
|
|
}
|
|
|
|
void test_animation_interpolate__override_gets_called(void) {
|
|
s_animation_private_current_interpolate_override = prv_override_capture_args;
|
|
cl_assert_equal_i(1, interpolate_int16(2, 3, 4));
|
|
cl_assert_equal_i(2, s_override_progress);
|
|
cl_assert_equal_i(3, s_override_from);
|
|
cl_assert_equal_i(4, s_override_to);
|
|
}
|
|
|
|
int64_t prv_override_times_two(AnimationProgress p, int64_t a, int64_t b) {
|
|
return interpolate_int64_linear(p, a, b) * 2;
|
|
}
|
|
|
|
void test_animation_interpolate__override_gets_clipped(void) {
|
|
s_animation_private_current_interpolate_override = prv_override_times_two;
|
|
|
|
cl_assert_equal_i(INT16_MIN, interpolate_int16(0, -20000, 20000));
|
|
cl_assert_equal_i(INT16_MAX, interpolate_int16(ANIMATION_NORMALIZED_MAX, -20000, 20000));
|
|
}
|
|
|
|
void test_animation_interpolate__moook(void) {
|
|
const int expected[] = {-20000, -19999, -19980, 20004, 20002, 20001, 20000};
|
|
const int num_frames = ARRAY_LENGTH(expected);
|
|
for (int i = 0; i < num_frames; i++) {
|
|
printf("frame: %d\n", i);
|
|
cl_assert_equal_i(interpolate_moook((i * ANIMATION_NORMALIZED_MAX) / num_frames,
|
|
-20000, 20000), expected[i]);
|
|
}
|
|
}
|
|
|
|
void test_animation_interpolate__moook_in(void) {
|
|
const int expected[] = {-20000, -19999, -19980};
|
|
const int num_frames = ARRAY_LENGTH(expected);
|
|
for (int i = 0; i < num_frames; i++) {
|
|
printf("frame: %d\n", i);
|
|
cl_assert_equal_i(interpolate_moook_in_only((i * ANIMATION_NORMALIZED_MAX) / num_frames,
|
|
-20000, 20000), expected[i]);
|
|
}
|
|
cl_assert_equal_i(interpolate_moook_in_only(ANIMATION_NORMALIZED_MAX,
|
|
-20000, 20000), 20000);
|
|
}
|
|
|
|
void test_animation_interpolate__moook_out(void) {
|
|
const int expected[] = {20004, 20002, 20001, 20000};
|
|
const int num_frames = ARRAY_LENGTH(expected);
|
|
for (int i = 0; i < num_frames; i++) {
|
|
printf("frame: %d\n", i);
|
|
cl_assert_equal_i(interpolate_moook_out((i * ANIMATION_NORMALIZED_MAX) / num_frames,
|
|
-20000, 20000, 0, true), expected[i]);
|
|
}
|
|
}
|
|
|
|
void test_animation_interpolate__moook_soft(void) {
|
|
const int32_t moook_num_soft_frames = 3;
|
|
cl_assert_equal_i(-20000, interpolate_moook_soft(0, -20000, 20000, moook_num_soft_frames));
|
|
|
|
// mid frame is closer to end due to more end frames
|
|
cl_assert_equal_i(6676, interpolate_moook_soft(ANIMATION_NORMALIZED_MAX / 2, -20000,
|
|
20000, moook_num_soft_frames));
|
|
|
|
cl_assert_equal_i(20000, interpolate_moook_soft(ANIMATION_NORMALIZED_MAX, -20000,
|
|
20000, moook_num_soft_frames));
|
|
}
|
|
|
|
static const int32_t s_custom_moook_in[] = {0, 2, 8};
|
|
static const int32_t s_custom_moook_out[] = {21, 9, 3, 0};
|
|
static const MoookConfig s_custom_moook = {
|
|
.frames_in = s_custom_moook_in,
|
|
.num_frames_in = ARRAY_LENGTH(s_custom_moook_in),
|
|
.frames_out = s_custom_moook_out,
|
|
.num_frames_out = ARRAY_LENGTH(s_custom_moook_out),
|
|
.num_frames_mid = 3,
|
|
};
|
|
|
|
void test_animation_interpolate__moook_custom(void) {
|
|
cl_assert_equal_i(330, interpolate_moook_custom_duration(&s_custom_moook));
|
|
|
|
cl_assert_equal_i(-20000, interpolate_moook_custom(0, -20000, 20000, &s_custom_moook));
|
|
|
|
// mid frame is closer to end due to more end frames
|
|
cl_assert_equal_i(6683, interpolate_moook_custom(ANIMATION_NORMALIZED_MAX / 2, -20000, 20000,
|
|
&s_custom_moook));
|
|
|
|
cl_assert_equal_i(20000, interpolate_moook_custom(ANIMATION_NORMALIZED_MAX, -20000, 20000,
|
|
&s_custom_moook));
|
|
}
|