pebble/tests/fw/ui/recognizer/test_recognizer_impl.c
2025-01-27 11:38:16 -08:00

112 lines
3.5 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 "test_recognizer_impl.h"
#include "clar_asserts.h"
#include "applib/ui/recognizer/recognizer.h"
#include "applib/ui/recognizer/recognizer_impl.h"
static const int TEST_PATTERN = 0xA5A5A5A5;
static RecognizerImpl s_test_impl;
static void prv_handle_touch_event(Recognizer *recognizer, const TouchEvent *touch_event) {
TestImplData *data = recognizer_get_impl_data(recognizer, &s_test_impl);
cl_assert_equal_i(data->test, TEST_PATTERN);
if (data->last_touch_event) {
*data->last_touch_event = *touch_event;
}
if (data->handled) {
*data->handled = true;
}
if(data->new_state && (*data->new_state != RecognizerState_Possible)) {
cl_assert(data->updated);
cl_assert_equal_p(*data->updated, false);
*data->updated = true;
recognizer_transition_state(recognizer, *data->new_state);
}
}
static bool prv_cancel(Recognizer *recognizer) {
TestImplData *data = recognizer_get_impl_data(recognizer, &s_test_impl);
cl_assert_equal_i(data->test, TEST_PATTERN);
if (data->cancelled) {
cl_assert_equal_b(*data->cancelled, false);
*data->cancelled = true;
}
return true;
}
static void prv_reset(Recognizer *recognizer) {
TestImplData *data = recognizer_get_impl_data(recognizer, &s_test_impl);
cl_assert_equal_i(data->test, TEST_PATTERN);
if (data->reset) {
cl_assert_equal_b(*data->reset, false);
*data->reset = true;
}
}
static void prv_on_destroy(Recognizer *recognizer) {
TestImplData *data = recognizer_get_impl_data(recognizer, &s_test_impl);
cl_assert_equal_i(data->test, TEST_PATTERN);
if (data->destroyed) {
cl_assert_equal_b(*data->destroyed, false);
*data->destroyed = true;
}
}
static void prv_on_fail(Recognizer *recognizer) {
TestImplData *data = recognizer_get_impl_data(recognizer, &s_test_impl);
cl_assert_equal_i(data->test, TEST_PATTERN);
if (data->failed) {
cl_assert_equal_b(*data->failed, false);
*data->failed = true;
}
}
static void prv_sub_event_handler(const Recognizer *recognizer, RecognizerEvent event) {
RecognizerEvent *event_type = recognizer_get_user_data(recognizer);
if (event_type) {
*event_type = event;
}
}
Recognizer *test_recognizer_create(TestImplData *test_impl_data, void *user_data) {
s_test_impl = (RecognizerImpl) {
.handle_touch_event = prv_handle_touch_event,
.cancel = prv_cancel,
.reset = prv_reset,
.on_fail = prv_on_fail
};
test_impl_data->test = TEST_PATTERN;
return recognizer_create_with_data(&s_test_impl, test_impl_data,
sizeof(*test_impl_data), prv_sub_event_handler,
user_data);
}
void test_recognizer_enable_on_destroy(void) {
s_test_impl.on_destroy = prv_on_destroy;
}
void test_recognizer_destroy(Recognizer **recognizer) {
recognizer_destroy(*recognizer);
}
void *test_recognizer_get_data(Recognizer *recognizer) {
return recognizer_get_impl_data(recognizer, &s_test_impl);
}