Skip to content

Commit edfdc61

Browse files
committed
Update itest so that duplicate() copies Rust properties
Additionally test `#[var(usage_flags = [STORAGE])]`, as well as basic `#[var]` which is ignored. Remove Area2D from codegen again.
1 parent c7e5bd1 commit edfdc61

File tree

3 files changed

+48
-53
lines changed

3 files changed

+48
-53
lines changed

godot-codegen/src/special_cases/codegen_special_cases.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,4 @@ const SELECTED_CLASSES: &[&str] = &[
190190
"Time", // usage: enum_test.enum_hash()
191191
"HTTPRequest",
192192
"ResourceFormatLoader", // TODO: replace?
193-
//
194-
// Collision
195-
"CollisionObject2D",
196-
"Area2D",
197193
];

itest/rust/src/object_tests/property_template_test.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ fn property_template_test(ctx: &TestContext) {
107107
"mismatch in property {name}:\n GDScript: {gdscript_prop:?}\n Rust: {rust_prop:?}"
108108
));
109109
}
110+
/*else { // Keep around for debugging.
111+
println!(
112+
"good property {name}:\n GDScript: {gdscript_prop:?}\n Rust: {rust_prop:?}"
113+
);
114+
}*/
110115
}
111116

112117
rust_properties.free();

itest/rust/src/object_tests/property_test.rs

Lines changed: 43 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
66
*/
77

8-
use godot::builtin::{dict, Color, Dictionary, GString, StringName, Variant, VariantType};
9-
use godot::classes::{Area2D, INode, IRefCounted, Node, Object, RefCounted, Resource, Texture};
8+
use godot::builtin::{dict, Color, Dictionary, GString, Variant, VariantType};
9+
use godot::classes::{INode, IRefCounted, Node, Object, RefCounted, Resource, Texture};
1010
use godot::global::{PropertyHint, PropertyUsageFlags};
1111
use godot::meta::{GodotConvert, PropertyHintInfo, ToGodot};
1212
use godot::obj::{Base, EngineBitfield, EngineEnum, Gd, NewAlloc, NewGd, OnEditor};
@@ -538,66 +538,60 @@ fn test_var_with_renamed_funcs() {
538538
obj.free();
539539
}
540540

541+
// ----------------------------------------------------------------------------------------------------------------------------------------------
542+
541543
#[derive(GodotClass)]
542544
#[class(init, base=Node)]
543-
struct SomeDuplicator {
544-
#[var]
545-
int_val: i32,
545+
struct Duplicator {
546+
// #[export] would also make tests pass, but #[export(storage)] additionally hides the properties from the editor.
547+
// See https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_exports.html#export-storage.
548+
#[export(storage)]
549+
int_export: i32,
546550

551+
// Low-level #[var] should also work.
552+
#[var(usage_flags = [STORAGE])]
553+
int_var: i32,
554+
555+
// Not copied because not marked as serialize ("storage").
547556
#[var]
557+
int_ignored: i32,
558+
559+
#[export(storage)]
548560
optional_node: Option<Gd<Node>>,
549561

550-
#[export]
562+
#[export(storage)]
551563
oneditor_node: OnEditor<Gd<Node>>,
552-
553-
#[export]
554-
oneditor_area: OnEditor<Gd<Area2D>>,
555564
}
556565

557566
#[itest]
558-
fn test_some_duplicator() {
559-
let mut obj = SomeDuplicator::new_alloc();
560-
obj.bind_mut().int_val = 5;
561-
562-
let some_node = Node::new_alloc();
563-
obj.bind_mut().optional_node = Some(some_node.clone());
564-
565-
let mut editor_node = Node::new_alloc();
566-
editor_node.set_name("test");
567-
obj.bind_mut().oneditor_node.init(editor_node);
568-
569-
let mut some_area = Area2D::new_alloc();
570-
some_area.set_collision_layer(1);
571-
some_area.set_collision_mask(1);
572-
obj.bind_mut().oneditor_area.init(some_area);
573-
assert_eq!(obj.bind().oneditor_area.get_collision_layer(), 1);
574-
assert_eq!(obj.bind().oneditor_area.get_collision_mask(), 1);
567+
fn test_duplicate_retains_properties() {
568+
let optional_node = Node::new_alloc();
569+
let oneditor_node = Node::new_alloc();
575570

576-
let duplicated_obj = obj.duplicate();
577-
let duplicated_obj: Gd<SomeDuplicator> = duplicated_obj.unwrap().cast();
571+
// Set up original node.
572+
let mut original = Duplicator::new_alloc();
573+
{
574+
let mut original = original.bind_mut();
575+
original.int_export = 5;
576+
original.int_var = 7;
577+
original.int_ignored = 9; // Will not be copied.
578+
original.optional_node = Some(optional_node.clone());
579+
original.oneditor_node.init(oneditor_node.clone());
580+
}
578581

582+
// Create duplicate and verify all properties are copied correctly.
583+
let duplicated: Gd<Duplicator> = original.duplicate().unwrap().cast();
579584
{
580-
let duplicated = duplicated_obj.bind();
581-
assert_eq!(duplicated.int_val, 5);
582-
assert_eq!(
583-
duplicated.optional_node.as_ref().unwrap().instance_id(),
584-
some_node.instance_id()
585-
);
586-
assert_eq!(
587-
duplicated.optional_node.as_ref().unwrap().get_name(),
588-
StringName::from("renamed")
589-
);
590-
591-
assert_eq!(
592-
duplicated.oneditor_node.get_name(),
593-
StringName::from("test")
594-
);
595-
596-
assert_eq!(duplicated.oneditor_area.get_collision_layer(), 1);
597-
assert_eq!(duplicated.oneditor_area.get_collision_mask(), 1);
585+
let duplicated = duplicated.bind();
586+
assert_eq!(duplicated.int_export, 5);
587+
assert_eq!(duplicated.int_var, 7);
588+
assert_eq!(duplicated.int_ignored, 0); // Not copied.
589+
assert_eq!(duplicated.optional_node.as_ref().unwrap(), &optional_node);
590+
assert_eq!(&*duplicated.oneditor_node, &oneditor_node);
598591
}
599592

600-
some_node.free();
601-
duplicated_obj.free();
602-
obj.free();
593+
optional_node.free();
594+
oneditor_node.free();
595+
duplicated.free();
596+
original.free();
603597
}

0 commit comments

Comments
 (0)