|
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, Variant, VariantType}; |
9 |
| -use godot::classes::{INode, IRefCounted, Node, Object, RefCounted, Resource, Texture}; |
| 8 | +use godot::builtin::{dict, Color, Dictionary, GString, StringName, Variant, VariantType}; |
| 9 | +use godot::classes::{Area2D, 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};
|
@@ -537,3 +537,67 @@ fn test_var_with_renamed_funcs() {
|
537 | 537 |
|
538 | 538 | obj.free();
|
539 | 539 | }
|
| 540 | + |
| 541 | +#[derive(GodotClass)] |
| 542 | +#[class(init, base=Node)] |
| 543 | +struct SomeDuplicator { |
| 544 | + #[var] |
| 545 | + int_val: i32, |
| 546 | + |
| 547 | + #[var] |
| 548 | + optional_node: Option<Gd<Node>>, |
| 549 | + |
| 550 | + #[export] |
| 551 | + oneditor_node: OnEditor<Gd<Node>>, |
| 552 | + |
| 553 | + #[export] |
| 554 | + oneditor_area: OnEditor<Gd<Area2D>>, |
| 555 | +} |
| 556 | + |
| 557 | +#[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); |
| 575 | + |
| 576 | + let duplicated_obj = obj.duplicate(); |
| 577 | + let duplicated_obj: Gd<SomeDuplicator> = duplicated_obj.unwrap().cast(); |
| 578 | + |
| 579 | + { |
| 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); |
| 598 | + } |
| 599 | + |
| 600 | + some_node.free(); |
| 601 | + duplicated_obj.free(); |
| 602 | + obj.free(); |
| 603 | +} |
0 commit comments