From 4e9d8d1e189c51d6c40e95ead9494147afd10f08 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Mon, 4 Sep 2023 12:02:29 +0200 Subject: [PATCH] Add tests for BTAwaitAnimation --- tests/test_await_animation.h | 94 ++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 tests/test_await_animation.h diff --git a/tests/test_await_animation.h b/tests/test_await_animation.h new file mode 100644 index 0000000..5066929 --- /dev/null +++ b/tests/test_await_animation.h @@ -0,0 +1,94 @@ +/** + * test_await_animation.h + * ============================================================================= + * Copyright 2021-2023 Serhii Snitsaruk + * + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + * ============================================================================= + */ + +#ifndef TEST_AWAIT_ANIMATION_H +#define TEST_AWAIT_ANIMATION_H + +#include "core/os/memory.h" +#include "limbo_test.h" + +#include "modules/limboai/blackboard/blackboard.h" +#include "modules/limboai/bt/tasks/bt_task.h" +#include "modules/limboai/bt/tasks/scene/bt_await_animation.h" + +#include "scene/main/window.h" +#include "scene/resources/animation.h" +#include "scene/resources/animation_library.h" + +namespace TestAwaitAnimation { + +TEST_CASE("[SceneTree][LimboAI] BTAwaitAnimation") { + AnimationPlayer *player = memnew(AnimationPlayer); + SceneTree::get_singleton()->get_root()->add_child(player); + player->set_process_callback(AnimationPlayer::AnimationProcessCallback::ANIMATION_PROCESS_IDLE); + + Ref anim_lib = memnew(AnimationLibrary); + Ref anim = memnew(Animation); + anim->set_name("test"); + anim->set_length(0.1); + anim->set_loop_mode(Animation::LOOP_NONE); + REQUIRE(anim_lib->add_animation("test", anim) == OK); + REQUIRE(player->add_animation_library("", anim_lib) == OK); + REQUIRE(player->has_animation("test")); + + Ref awa = memnew(BTAwaitAnimation); + Node *dummy = memnew(Node); + SceneTree::get_singleton()->get_root()->add_child(dummy); + Ref bb = memnew(Blackboard); + + awa->set_animation_name("test"); + Ref player_param = memnew(BBNode); + awa->set_animation_player(player_param); + + SUBCASE("When AnimationPlayer doesn't exist") { + player_param->set_saved_value(NodePath("./NotFound")); + ERR_PRINT_OFF; + awa->initialize(dummy, bb); + CHECK(awa->execute(0.01666) == BTTask::FAILURE); + ERR_PRINT_ON; + } + SUBCASE("When AnimationPlayer exists") { + player_param->set_saved_value(player->get_path()); + awa->initialize(dummy, bb); + + SUBCASE("When AnimationPlayer is not playing") { + REQUIRE_FALSE(player->is_playing()); + CHECK(awa->execute(0.01666) == BTTask::SUCCESS); + } + SUBCASE("When AnimationPlayer is playing") { + player->play("test"); + REQUIRE(player->is_playing()); + REQUIRE(player->get_current_animation() == "test"); + CHECK(awa->execute(0.01666) == BTTask::RUNNING); + + SUBCASE("When exceeding max wait time") { + awa->set_max_time(1.0); + ERR_PRINT_OFF; + CHECK(awa->execute(1.0) == BTTask::SUCCESS); + ERR_PRINT_ON; + } + SUBCASE("When animation finishes playing") { + player->seek(888.0, true); + player->notification(Node::NOTIFICATION_INTERNAL_PROCESS); + CHECK_FALSE(player->is_playing()); + CHECK_FALSE(player->get_current_animation() == "test"); + CHECK(awa->execute(0.01666) == BTTask::SUCCESS); + } + } + } + + memdelete(dummy); + memdelete(player); +} + +} //namespace TestAwaitAnimation + +#endif // TEST_AWAIT_ANIMATION_H