diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/project/example.gdextension | 2 | ||||
-rw-r--r-- | test/project/main.gd | 50 | ||||
-rw-r--r-- | test/project/project.godot | 2 | ||||
-rw-r--r-- | test/src/example.cpp | 62 | ||||
-rw-r--r-- | test/src/example.h | 15 |
5 files changed, 129 insertions, 2 deletions
diff --git a/test/project/example.gdextension b/test/project/example.gdextension index 90fd53a..99c1746 100644 --- a/test/project/example.gdextension +++ b/test/project/example.gdextension @@ -1,7 +1,7 @@ [configuration] entry_symbol = "example_library_init" -compatibility_minimum = 4.1 +compatibility_minimum = "4.1" [libraries] diff --git a/test/project/main.gd b/test/project/main.gd index cedd512..715b13e 100644 --- a/test/project/main.gd +++ b/test/project/main.gd @@ -23,6 +23,10 @@ func _ready(): # Property list. example.property_from_list = Vector3(100, 200, 300) assert_equal(example.property_from_list, Vector3(100, 200, 300)) + var prop_list = example.get_property_list() + for prop_info in prop_list: + if prop_info['name'] == 'mouse_filter': + assert_equal(prop_info['usage'], PROPERTY_USAGE_NO_EDITOR) # Call simple methods. example.simple_func() @@ -86,6 +90,9 @@ func _ready(): assert_equal(example.test_string_is_fourty_two("blah"), false) assert_equal(example.test_string_is_fourty_two("fourty two"), true) + # String::resize(). + assert_equal(example.test_string_resize("What"), "What!?") + # PackedArray iterators assert_equal(example.test_vector_ops(), 105) @@ -94,6 +101,49 @@ func _ready(): example.group_subgroup_custom_position = Vector2(50, 50) assert_equal(example.group_subgroup_custom_position, Vector2(50, 50)) + # Test Object::cast_to<>() and that correct wrappers are being used. + var control = Control.new() + var sprite = Sprite2D.new() + var example_ref = ExampleRef.new() + + assert_equal(example.test_object_cast_to_node(control), true) + assert_equal(example.test_object_cast_to_control(control), true) + assert_equal(example.test_object_cast_to_example(control), false) + + assert_equal(example.test_object_cast_to_node(example), true) + assert_equal(example.test_object_cast_to_control(example), true) + assert_equal(example.test_object_cast_to_example(example), true) + + assert_equal(example.test_object_cast_to_node(sprite), true) + assert_equal(example.test_object_cast_to_control(sprite), false) + assert_equal(example.test_object_cast_to_example(sprite), false) + + assert_equal(example.test_object_cast_to_node(example_ref), false) + assert_equal(example.test_object_cast_to_control(example_ref), false) + assert_equal(example.test_object_cast_to_example(example_ref), false) + + control.queue_free() + sprite.queue_free() + + # Test conversions to and from Variant. + assert_equal(example.test_variant_vector2i_conversion(Vector2i(1, 1)), Vector2i(1, 1)) + assert_equal(example.test_variant_vector2i_conversion(Vector2(1.0, 1.0)), Vector2i(1, 1)) + assert_equal(example.test_variant_int_conversion(10), 10) + assert_equal(example.test_variant_int_conversion(10.0), 10) + assert_equal(example.test_variant_float_conversion(10.0), 10.0) + assert_equal(example.test_variant_float_conversion(10), 10.0) + + # Test that ptrcalls from GDExtension to the engine are correctly encoding Object and RefCounted. + var new_node = Node.new() + example.test_add_child(new_node) + assert_equal(new_node.get_parent(), example) + + var new_tileset = TileSet.new() + var new_tilemap = TileMap.new() + example.test_set_tileset(new_tilemap, new_tileset) + assert_equal(new_tilemap.tile_set, new_tileset) + new_tilemap.queue_free() + # Constants. assert_equal(Example.FIRST, 0) assert_equal(Example.ANSWER_TO_EVERYTHING, 42) diff --git a/test/project/project.godot b/test/project/project.godot index eafcad3..3ed679b 100644 --- a/test/project/project.godot +++ b/test/project/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="GDExtension Test Project" run/main_scene="res://main.tscn" -config/features=PackedStringArray("4.1") +config/features=PackedStringArray("4.2") config/icon="res://icon.png" [native_extensions] diff --git a/test/src/example.cpp b/test/src/example.cpp index fb47dd8..dc471dd 100644 --- a/test/src/example.cpp +++ b/test/src/example.cpp @@ -117,6 +117,14 @@ bool Example::_property_get_revert(const StringName &p_name, Variant &r_property } }; +void Example::_validate_property(PropertyInfo &p_property) const { + String name = p_property.name; + // Test hiding the "mouse_filter" property from the editor. + if (name == "mouse_filter") { + p_property.usage = PROPERTY_USAGE_NO_EDITOR; + } +} + void Example::_bind_methods() { // Methods. ClassDB::bind_method(D_METHOD("simple_func"), &Example::simple_func); @@ -139,8 +147,20 @@ void Example::_bind_methods() { ClassDB::bind_method(D_METHOD("test_string_ops"), &Example::test_string_ops); ClassDB::bind_method(D_METHOD("test_str_utility"), &Example::test_str_utility); ClassDB::bind_method(D_METHOD("test_string_is_fourty_two"), &Example::test_string_is_fourty_two); + ClassDB::bind_method(D_METHOD("test_string_resize"), &Example::test_string_resize); ClassDB::bind_method(D_METHOD("test_vector_ops"), &Example::test_vector_ops); + ClassDB::bind_method(D_METHOD("test_object_cast_to_node", "object"), &Example::test_object_cast_to_node); + ClassDB::bind_method(D_METHOD("test_object_cast_to_control", "object"), &Example::test_object_cast_to_control); + ClassDB::bind_method(D_METHOD("test_object_cast_to_example", "object"), &Example::test_object_cast_to_example); + + ClassDB::bind_method(D_METHOD("test_variant_vector2i_conversion", "variant"), &Example::test_variant_vector2i_conversion); + ClassDB::bind_method(D_METHOD("test_variant_int_conversion", "variant"), &Example::test_variant_int_conversion); + ClassDB::bind_method(D_METHOD("test_variant_float_conversion", "variant"), &Example::test_variant_float_conversion); + + ClassDB::bind_method(D_METHOD("test_add_child", "node"), &Example::test_add_child); + ClassDB::bind_method(D_METHOD("test_set_tileset", "tilemap", "tileset"), &Example::test_set_tileset); + ClassDB::bind_method(D_METHOD("test_bitfield", "flags"), &Example::test_bitfield); ClassDB::bind_method(D_METHOD("test_rpc", "value"), &Example::test_rpc); @@ -304,6 +324,16 @@ bool Example::test_string_is_fourty_two(const String &p_string) const { return strcmp(p_string.utf8().ptr(), "fourty two") == 0; } +String Example::test_string_resize(String p_string) const { + int orig_len = p_string.length(); + p_string.resize(orig_len + 3); + char32_t *data = p_string.ptrw(); + data[orig_len + 0] = '!'; + data[orig_len + 1] = '?'; + data[orig_len + 2] = '\0'; + return p_string; +} + int Example::test_vector_ops() const { PackedInt32Array arr; arr.push_back(10); @@ -348,6 +378,38 @@ Example *Example::test_node_argument(Example *p_node) const { return p_node; } +bool Example::test_object_cast_to_node(Object *p_object) const { + return Object::cast_to<Node>(p_object) != nullptr; +} + +bool Example::test_object_cast_to_control(Object *p_object) const { + return Object::cast_to<Control>(p_object) != nullptr; +} + +bool Example::test_object_cast_to_example(Object *p_object) const { + return Object::cast_to<Example>(p_object) != nullptr; +} + +Vector2i Example::test_variant_vector2i_conversion(const Variant &p_variant) const { + return p_variant; +} + +int Example::test_variant_int_conversion(const Variant &p_variant) const { + return p_variant; +} + +float Example::test_variant_float_conversion(const Variant &p_variant) const { + return p_variant; +} + +void Example::test_add_child(Node *p_node) { + add_child(p_node); +} + +void Example::test_set_tileset(TileMap *p_tilemap, const Ref<TileSet> &p_tileset) const { + p_tilemap->set_tileset(p_tileset); +} + BitField<Example::Flags> Example::test_bitfield(BitField<Flags> flags) { return flags; } diff --git a/test/src/example.h b/test/src/example.h index a84efed..49d103e 100644 --- a/test/src/example.h +++ b/test/src/example.h @@ -18,6 +18,8 @@ #include <godot_cpp/classes/global_constants.hpp> #include <godot_cpp/classes/image.hpp> #include <godot_cpp/classes/input_event_key.hpp> +#include <godot_cpp/classes/tile_map.hpp> +#include <godot_cpp/classes/tile_set.hpp> #include <godot_cpp/classes/viewport.hpp> #include <godot_cpp/core/binder_common.hpp> @@ -63,6 +65,7 @@ protected: void _get_property_list(List<PropertyInfo> *p_list) const; bool _property_can_revert(const StringName &p_name) const; bool _property_get_revert(const StringName &p_name, Variant &r_property) const; + void _validate_property(PropertyInfo &p_property) const; String _to_string() const; @@ -118,8 +121,20 @@ public: String test_string_ops() const; String test_str_utility() const; bool test_string_is_fourty_two(const String &p_str) const; + String test_string_resize(String p_original) const; int test_vector_ops() const; + bool test_object_cast_to_node(Object *p_object) const; + bool test_object_cast_to_control(Object *p_object) const; + bool test_object_cast_to_example(Object *p_object) const; + + Vector2i test_variant_vector2i_conversion(const Variant &p_variant) const; + int test_variant_int_conversion(const Variant &p_variant) const; + float test_variant_float_conversion(const Variant &p_variant) const; + + void test_add_child(Node *p_node); + void test_set_tileset(TileMap *p_tilemap, const Ref<TileSet> &p_tileset) const; + BitField<Flags> test_bitfield(BitField<Flags> flags); // RPC |