diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/scene/test_code_edit.h | 39 | ||||
-rw-r--r-- | tests/scene/test_image_texture_3d.h | 101 | ||||
-rw-r--r-- | tests/scene/test_node.h | 73 | ||||
-rw-r--r-- | tests/servers/test_navigation_server_3d.h | 6 | ||||
-rw-r--r-- | tests/test_main.cpp | 1 |
5 files changed, 219 insertions, 1 deletions
diff --git a/tests/scene/test_code_edit.h b/tests/scene/test_code_edit.h index c02830b6df..317dbe9ab9 100644 --- a/tests/scene/test_code_edit.h +++ b/tests/scene/test_code_edit.h @@ -3331,6 +3331,45 @@ TEST_CASE("[SceneTree][CodeEdit] folding") { CHECK_FALSE(code_edit->is_line_folded(1)); } + SUBCASE("[CodeEdit] actions unfold") { + // add_selection_for_next_occurrence unfolds. + code_edit->set_text("test\n\tline1 test\n\t\tline 2\ntest2"); + code_edit->select(0, 0, 0, 4); + code_edit->fold_line(0); + CHECK(code_edit->is_line_folded(0)); + code_edit->add_selection_for_next_occurrence(); + + CHECK(code_edit->get_caret_count() == 2); + CHECK(code_edit->has_selection(0)); + CHECK(code_edit->get_caret_line() == 0); + CHECK(code_edit->get_selection_origin_line() == 0); + CHECK(code_edit->get_caret_column() == 4); + CHECK(code_edit->get_selection_origin_column() == 0); + CHECK(code_edit->has_selection(1)); + CHECK(code_edit->get_caret_line(1) == 1); + CHECK(code_edit->get_selection_origin_line(1) == 1); + CHECK(code_edit->get_caret_column(1) == 11); + CHECK(code_edit->get_selection_origin_column(1) == 7); + CHECK_FALSE(code_edit->is_line_folded(0)); + code_edit->remove_secondary_carets(); + + // skip_selection_for_next_occurrence unfolds. + code_edit->select(0, 0, 0, 4); + code_edit->fold_line(0); + CHECK(code_edit->is_line_folded(0)); + code_edit->skip_selection_for_next_occurrence(); + + CHECK(code_edit->get_caret_count() == 1); + CHECK(code_edit->has_selection(0)); + CHECK(code_edit->get_caret_line() == 1); + CHECK(code_edit->get_selection_origin_line() == 1); + CHECK(code_edit->get_caret_column() == 11); + CHECK(code_edit->get_selection_origin_column() == 7); + CHECK_FALSE(code_edit->is_line_folded(0)); + code_edit->remove_secondary_carets(); + code_edit->deselect(); + } + SUBCASE("[CodeEdit] toggle folding carets") { code_edit->set_text("test\n\tline1\ntest2\n\tline2"); diff --git a/tests/scene/test_image_texture_3d.h b/tests/scene/test_image_texture_3d.h new file mode 100644 index 0000000000..f2a7abcf69 --- /dev/null +++ b/tests/scene/test_image_texture_3d.h @@ -0,0 +1,101 @@ +/**************************************************************************/ +/* test_image_texture_3d.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef TEST_IMAGE_TEXTURE_3D_H +#define TEST_IMAGE_TEXTURE_3D_H + +#include "core/io/image.h" +#include "scene/resources/image_texture.h" + +#include "tests/test_macros.h" +#include "tests/test_utils.h" + +namespace TestImageTexture3D { + +// [SceneTree] in a test case name enables initializing a mock render server, +// which ImageTexture3D is dependent on. +TEST_CASE("[SceneTree][ImageTexture3D] Constructor") { + Ref<ImageTexture3D> image_texture_3d = memnew(ImageTexture3D); + CHECK(image_texture_3d->get_format() == Image::FORMAT_L8); + CHECK(image_texture_3d->get_width() == 1); + CHECK(image_texture_3d->get_height() == 1); + CHECK(image_texture_3d->get_depth() == 1); + CHECK(image_texture_3d->has_mipmaps() == false); +} + +TEST_CASE("[SceneTree][ImageTexture3D] get_format") { + Ref<ImageTexture3D> image_texture_3d = memnew(ImageTexture3D); + CHECK(image_texture_3d->get_format() == Image::FORMAT_L8); +} + +TEST_CASE("[SceneTree][ImageTexture3D] get_width") { + Ref<ImageTexture3D> image_texture_3d = memnew(ImageTexture3D); + CHECK(image_texture_3d->get_width() == 1); +} + +TEST_CASE("[SceneTree][ImageTexture3D] get_height") { + Ref<ImageTexture3D> image_texture_3d = memnew(ImageTexture3D); + CHECK(image_texture_3d->get_height() == 1); +} + +TEST_CASE("[SceneTree][ImageTexture3D] get_depth") { + Ref<ImageTexture3D> image_texture_3d = memnew(ImageTexture3D); + CHECK(image_texture_3d->get_depth() == 1); +} + +TEST_CASE("[SceneTree][ImageTexture3D] has_mipmaps") { + const Vector<Ref<Image>> images = { memnew(Image(8, 8, false, Image::FORMAT_RGBA8)), memnew(Image(8, 8, false, Image::FORMAT_RGBA8)) }; + Ref<ImageTexture3D> image_texture_3d = memnew(ImageTexture3D); + CHECK(image_texture_3d->has_mipmaps() == false); // No mipmaps. + image_texture_3d->create(Image::FORMAT_RGBA8, 2, 2, 2, true, images); + CHECK(image_texture_3d->has_mipmaps() == true); // Mipmaps. +} + +TEST_CASE("[SceneTree][ImageTexture3D] create") { + const Vector<Ref<Image>> images = { memnew(Image(8, 8, false, Image::FORMAT_RGBA8)), memnew(Image(8, 8, false, Image::FORMAT_RGBA8)) }; + Ref<ImageTexture3D> image_texture_3d = memnew(ImageTexture3D); + CHECK(image_texture_3d->create(Image::FORMAT_RGBA8, 2, 2, 2, true, images) == OK); // Run create and check return value simultaneously. + CHECK(image_texture_3d->get_format() == Image::FORMAT_RGBA8); + CHECK(image_texture_3d->get_width() == 2); + CHECK(image_texture_3d->get_height() == 2); + CHECK(image_texture_3d->get_depth() == 2); + CHECK(image_texture_3d->has_mipmaps() == true); +} + +TEST_CASE("[SceneTree][ImageTexture3D] set_path") { + Ref<ImageTexture3D> image_texture_3d = memnew(ImageTexture3D); + String path = TestUtils::get_data_path("images/icon.png"); + image_texture_3d->set_path(path, true); + CHECK(image_texture_3d->get_path() == path); +} + +} //namespace TestImageTexture3D + +#endif // TEST_IMAGE_TEXTURE_3D_H diff --git a/tests/scene/test_node.h b/tests/scene/test_node.h index b3362b02a8..2b14be76e2 100644 --- a/tests/scene/test_node.h +++ b/tests/scene/test_node.h @@ -31,7 +31,9 @@ #ifndef TEST_NODE_H #define TEST_NODE_H +#include "core/object/class_db.h" #include "scene/main/node.h" +#include "scene/resources/packed_scene.h" #include "tests/test_macros.h" @@ -62,6 +64,12 @@ protected: } } + static void _bind_methods() { + ClassDB::bind_method(D_METHOD("set_exported_node", "node"), &TestNode::set_exported_node); + ClassDB::bind_method(D_METHOD("get_exported_node"), &TestNode::get_exported_node); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "exported_node", PROPERTY_HINT_NODE_TYPE, "Node"), "set_exported_node", "get_exported_node"); + } + private: void push_self() { if (callback_list) { @@ -75,7 +83,12 @@ public: int process_counter = 0; int physics_process_counter = 0; + Node *exported_node = nullptr; + List<Node *> *callback_list = nullptr; + + void set_exported_node(Node *p_node) { exported_node = p_node; } + Node *get_exported_node() const { return exported_node; } }; TEST_CASE("[SceneTree][Node] Testing node operations with a very simple scene tree") { @@ -478,6 +491,66 @@ TEST_CASE("[SceneTree][Node] Testing node operations with a more complex simple memdelete(node2); } +TEST_CASE("[SceneTree][Node]Exported node checks") { + TestNode *node = memnew(TestNode); + SceneTree::get_singleton()->get_root()->add_child(node); + + Node *child = memnew(Node); + child->set_name("Child"); + node->add_child(child); + child->set_owner(node); + + node->set("exported_node", child); + + SUBCASE("Property of duplicated node should point to duplicated child") { + GDREGISTER_CLASS(TestNode); + + TestNode *dup = Object::cast_to<TestNode>(node->duplicate()); + Node *new_exported = Object::cast_to<Node>(dup->get("exported_node")); + CHECK(new_exported == dup->get_child(0)); + + memdelete(dup); + } + + SUBCASE("Saving instance with exported node should not store the unchanged property") { + node->set_process_mode(Node::PROCESS_MODE_ALWAYS); + Ref<PackedScene> ps; + ps.instantiate(); + ps->pack(node); + + String scene_path = OS::get_singleton()->get_cache_path().path_join("test_scene.tscn"); + ps->set_path(scene_path); + + Node *root = memnew(Node); + + Node *sub_child = ps->instantiate(PackedScene::GEN_EDIT_STATE_MAIN); + root->add_child(sub_child); + sub_child->set_owner(root); + + Ref<PackedScene> ps2; + ps2.instantiate(); + ps2->pack(root); + + scene_path = OS::get_singleton()->get_cache_path().path_join("new_test_scene.tscn"); + ResourceSaver::save(ps2, scene_path); + memdelete(root); + + bool is_wrong = false; + Ref<FileAccess> fa = FileAccess::open(scene_path, FileAccess::READ); + while (!fa->eof_reached()) { + const String line = fa->get_line(); + if (line.begins_with("exported_node")) { + // The property was saved, while it shouldn't. + is_wrong = true; + break; + } + } + CHECK_FALSE(is_wrong); + } + + memdelete(node); +} + TEST_CASE("[Node] Processing checks") { Node *node = memnew(Node); diff --git a/tests/servers/test_navigation_server_3d.h b/tests/servers/test_navigation_server_3d.h index 8778ea86a6..cf6b89c330 100644 --- a/tests/servers/test_navigation_server_3d.h +++ b/tests/servers/test_navigation_server_3d.h @@ -697,12 +697,16 @@ TEST_SUITE("[Navigation]") { CHECK_NE(navigation_server->map_get_closest_point(map, Vector3(0, 0, 0)), Vector3(0, 0, 0)); CHECK_NE(navigation_server->map_get_closest_point_normal(map, Vector3(0, 0, 0)), Vector3()); CHECK(navigation_server->map_get_closest_point_owner(map, Vector3(0, 0, 0)).is_valid()); - // TODO: Test map_get_closest_point_to_segment() with p_use_collision=true as well. CHECK_NE(navigation_server->map_get_closest_point_to_segment(map, Vector3(0, 0, 0), Vector3(1, 1, 1), false), Vector3()); + CHECK_NE(navigation_server->map_get_closest_point_to_segment(map, Vector3(0, 0, 0), Vector3(1, 1, 1), true), Vector3()); CHECK_NE(navigation_server->map_get_path(map, Vector3(0, 0, 0), Vector3(10, 0, 10), true).size(), 0); CHECK_NE(navigation_server->map_get_path(map, Vector3(0, 0, 0), Vector3(10, 0, 10), false).size(), 0); } + SUBCASE("'map_get_closest_point_to_segment' with 'use_collision' should return default if segment doesn't intersect map") { + CHECK_EQ(navigation_server->map_get_closest_point_to_segment(map, Vector3(1, 2, 1), Vector3(1, 1, 1), true), Vector3()); + } + SUBCASE("Elaborate query with 'CORRIDORFUNNEL' post-processing should yield non-empty result") { Ref<NavigationPathQueryParameters3D> query_parameters = memnew(NavigationPathQueryParameters3D); query_parameters->set_map(map); diff --git a/tests/test_main.cpp b/tests/test_main.cpp index 041231888b..3c875797a4 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -111,6 +111,7 @@ #include "tests/scene/test_curve_3d.h" #include "tests/scene/test_gradient.h" #include "tests/scene/test_image_texture.h" +#include "tests/scene/test_image_texture_3d.h" #include "tests/scene/test_instance_placeholder.h" #include "tests/scene/test_node.h" #include "tests/scene/test_node_2d.h" |