|
5 | 5 | * file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
6 | 6 | */
|
7 | 7 |
|
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}; |
10 | 10 | use godot::global::{PropertyHint, PropertyUsageFlags};
|
11 | 11 | use godot::meta::{GodotConvert, PropertyHintInfo, ToGodot};
|
12 | 12 | use godot::obj::{Base, EngineBitfield, EngineEnum, Gd, NewAlloc, NewGd, OnEditor};
|
@@ -538,66 +538,60 @@ fn test_var_with_renamed_funcs() {
|
538 | 538 | obj.free();
|
539 | 539 | }
|
540 | 540 |
|
| 541 | +// ---------------------------------------------------------------------------------------------------------------------------------------------- |
| 542 | + |
541 | 543 | #[derive(GodotClass)]
|
542 | 544 | #[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, |
546 | 550 |
|
| 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"). |
547 | 556 | #[var]
|
| 557 | + int_ignored: i32, |
| 558 | + |
| 559 | + #[export(storage)] |
548 | 560 | optional_node: Option<Gd<Node>>,
|
549 | 561 |
|
550 |
| - #[export] |
| 562 | + #[export(storage)] |
551 | 563 | oneditor_node: OnEditor<Gd<Node>>,
|
552 |
| - |
553 |
| - #[export] |
554 |
| - oneditor_area: OnEditor<Gd<Area2D>>, |
555 | 564 | }
|
556 | 565 |
|
557 | 566 | #[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(); |
575 | 570 |
|
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 | + } |
578 | 581 |
|
| 582 | + // Create duplicate and verify all properties are copied correctly. |
| 583 | + let duplicated: Gd<Duplicator> = original.duplicate().unwrap().cast(); |
579 | 584 | {
|
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); |
598 | 591 | }
|
599 | 592 |
|
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(); |
603 | 597 | }
|
0 commit comments