From 8a5c60322a17e409500f240ac89b0a658c400ba9 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Wed, 30 Aug 2023 20:03:51 +0200 Subject: [PATCH] Add tests for BTForEach --- tests/test_for_each.h | 103 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 tests/test_for_each.h diff --git a/tests/test_for_each.h b/tests/test_for_each.h new file mode 100644 index 0000000..59e9594 --- /dev/null +++ b/tests/test_for_each.h @@ -0,0 +1,103 @@ +/** + * test_for_each.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_FOR_EACH_H +#define TEST_FOR_EACH_H + +#include "limbo_test.h" + +#include "modules/limboai/bt/tasks/bt_task.h" +#include "modules/limboai/bt/tasks/decorators/bt_for_each.h" + +namespace TestForEach { + +TEST_CASE("[Modules][LimboAI] BTForEach") { + Ref fe = memnew(BTForEach); + Node *dummy = memnew(Node); + Ref blackboard = memnew(Blackboard); + fe->initialize(dummy, blackboard); + + Array arr; + arr.append("apple"); + arr.append("raspberry"); + arr.append("mushroom"); + blackboard->set_var("array", arr); + + SUBCASE("When empty") { + ERR_PRINT_OFF; + CHECK(fe->execute(0.01666) == BTTask::FAILURE); + ERR_PRINT_ON; + } + + Ref task = memnew(BTTestAction(BTTask::SUCCESS)); + fe->add_child(task); + fe->set_array_var("array"); + fe->set_save_var("element"); + + SUBCASE("When child returns SUCCESS") { + CHECK(fe->execute(0.01666) == BTTask::RUNNING); + CHECK(task->get_status() == BTTask::SUCCESS); + CHECK_ENTRIES_TICKS_EXITS(task, 1, 1, 1); + CHECK(blackboard->get_var("element", "wetgoop") == "apple"); + + CHECK(fe->execute(0.01666) == BTTask::RUNNING); + CHECK(task->get_status() == BTTask::SUCCESS); + CHECK_ENTRIES_TICKS_EXITS(task, 2, 2, 2); + CHECK(blackboard->get_var("element", "wetgoop") == "raspberry"); + + CHECK(fe->execute(0.01666) == BTTask::SUCCESS); // * finished iterating - returning SUCCESS + CHECK(task->get_status() == BTTask::SUCCESS); + CHECK_ENTRIES_TICKS_EXITS(task, 3, 3, 3); + CHECK(blackboard->get_var("element", "wetgoop") == "mushroom"); + } + + SUBCASE("When child task takes more than one tick to finish") { + task->ret_status = BTTask::RUNNING; + CHECK(fe->execute(0.01666) == BTTask::RUNNING); + CHECK(task->get_status() == BTTask::RUNNING); + CHECK_ENTRIES_TICKS_EXITS(task, 1, 1, 0); + CHECK(blackboard->get_var("element", "wetgoop") == "apple"); + + task->ret_status = BTTask::SUCCESS; + CHECK(fe->execute(0.01666) == BTTask::RUNNING); + CHECK(task->get_status() == BTTask::SUCCESS); + CHECK_ENTRIES_TICKS_EXITS(task, 1, 2, 1); + CHECK(blackboard->get_var("element", "wetgoop") == "apple"); + + task->ret_status = BTTask::RUNNING; + CHECK(fe->execute(0.01666) == BTTask::RUNNING); + CHECK(task->get_status() == BTTask::RUNNING); + CHECK_ENTRIES_TICKS_EXITS(task, 2, 3, 1); + CHECK(blackboard->get_var("element", "wetgoop") == "raspberry"); + + task->ret_status = BTTask::SUCCESS; + CHECK(fe->execute(0.01666) == BTTask::RUNNING); + CHECK(task->get_status() == BTTask::SUCCESS); + CHECK_ENTRIES_TICKS_EXITS(task, 2, 4, 2); + CHECK(blackboard->get_var("element", "wetgoop") == "raspberry"); + + task->ret_status = BTTask::RUNNING; + CHECK(fe->execute(0.01666) == BTTask::RUNNING); + CHECK(task->get_status() == BTTask::RUNNING); + CHECK_ENTRIES_TICKS_EXITS(task, 3, 5, 2); + CHECK(blackboard->get_var("element", "wetgoop") == "mushroom"); + + task->ret_status = BTTask::SUCCESS; + CHECK(fe->execute(0.01666) == BTTask::SUCCESS); + CHECK(task->get_status() == BTTask::SUCCESS); + CHECK_ENTRIES_TICKS_EXITS(task, 3, 6, 3); + CHECK(blackboard->get_var("element", "wetgoop") == "mushroom"); + } +} + +} //namespace TestForEach + +#endif // TEST_FOR_EACH_H