test_instance_placeholder.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. /**************************************************************************/
  2. /* test_instance_placeholder.h */
  3. /**************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /**************************************************************************/
  8. /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
  9. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /**************************************************************************/
  30. #pragma once
  31. #include "scene/main/instance_placeholder.h"
  32. #include "scene/resources/packed_scene.h"
  33. #include "tests/test_macros.h"
  34. class _TestInstancePlaceholderNode : public Node {
  35. GDCLASS(_TestInstancePlaceholderNode, Node);
  36. protected:
  37. static void _bind_methods() {
  38. ClassDB::bind_method(D_METHOD("set_int_property", "int_property"), &_TestInstancePlaceholderNode::set_int_property);
  39. ClassDB::bind_method(D_METHOD("get_int_property"), &_TestInstancePlaceholderNode::get_int_property);
  40. ADD_PROPERTY(PropertyInfo(Variant::INT, "int_property"), "set_int_property", "get_int_property");
  41. ClassDB::bind_method(D_METHOD("set_reference_property", "reference_property"), &_TestInstancePlaceholderNode::set_reference_property);
  42. ClassDB::bind_method(D_METHOD("get_reference_property"), &_TestInstancePlaceholderNode::get_reference_property);
  43. ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "reference_property", PROPERTY_HINT_NODE_TYPE), "set_reference_property", "get_reference_property");
  44. ClassDB::bind_method(D_METHOD("set_reference_array_property", "reference_array_property"), &_TestInstancePlaceholderNode::set_reference_array_property);
  45. ClassDB::bind_method(D_METHOD("get_reference_array_property"), &_TestInstancePlaceholderNode::get_reference_array_property);
  46. // The hint string value "24/34:Node" is determined from existing PackedScenes with typed Array properties.
  47. ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "reference_array_property", PROPERTY_HINT_TYPE_STRING, "24/34:Node"), "set_reference_array_property", "get_reference_array_property");
  48. }
  49. public:
  50. int int_property = 0;
  51. void set_int_property(int p_int) {
  52. int_property = p_int;
  53. }
  54. int get_int_property() const {
  55. return int_property;
  56. }
  57. Variant reference_property;
  58. void set_reference_property(const Variant &p_node) {
  59. reference_property = p_node;
  60. }
  61. Variant get_reference_property() const {
  62. return reference_property;
  63. }
  64. Array reference_array_property;
  65. void set_reference_array_property(const Array &p_array) {
  66. reference_array_property = p_array;
  67. }
  68. Array get_reference_array_property() const {
  69. return reference_array_property;
  70. }
  71. _TestInstancePlaceholderNode() {
  72. reference_array_property.set_typed(Variant::OBJECT, "Node", Variant());
  73. }
  74. };
  75. namespace TestInstancePlaceholder {
  76. TEST_CASE("[SceneTree][InstancePlaceholder] Instantiate from placeholder with no overrides") {
  77. GDREGISTER_CLASS(_TestInstancePlaceholderNode);
  78. SUBCASE("with non-node values") {
  79. InstancePlaceholder *ip = memnew(InstancePlaceholder);
  80. ip->set_name("TestScene");
  81. Node *root = memnew(Node);
  82. SceneTree::get_singleton()->get_root()->add_child(root);
  83. root->add_child(ip);
  84. // Create a scene to instance.
  85. _TestInstancePlaceholderNode *scene = memnew(_TestInstancePlaceholderNode);
  86. scene->set_int_property(12);
  87. // Pack the scene.
  88. PackedScene *packed_scene = memnew(PackedScene);
  89. const Error err = packed_scene->pack(scene);
  90. REQUIRE(err == OK);
  91. // Instantiate the scene.
  92. _TestInstancePlaceholderNode *created = Object::cast_to<_TestInstancePlaceholderNode>(ip->create_instance(true, packed_scene));
  93. REQUIRE(created != nullptr);
  94. CHECK(created->get_name() == "TestScene");
  95. CHECK(created->get_int_property() == 12);
  96. root->queue_free();
  97. memdelete(scene);
  98. }
  99. SUBCASE("with node value") {
  100. InstancePlaceholder *ip = memnew(InstancePlaceholder);
  101. ip->set_name("TestScene");
  102. Node *root = memnew(Node);
  103. SceneTree::get_singleton()->get_root()->add_child(root);
  104. root->add_child(ip);
  105. // Create a scene to instance.
  106. _TestInstancePlaceholderNode *scene = memnew(_TestInstancePlaceholderNode);
  107. Node *referenced = memnew(Node);
  108. scene->add_child(referenced);
  109. referenced->set_owner(scene);
  110. scene->set_reference_property(referenced);
  111. // Pack the scene.
  112. PackedScene *packed_scene = memnew(PackedScene);
  113. const Error err = packed_scene->pack(scene);
  114. REQUIRE(err == OK);
  115. // Instantiate the scene.
  116. _TestInstancePlaceholderNode *created = Object::cast_to<_TestInstancePlaceholderNode>(ip->create_instance(true, packed_scene));
  117. REQUIRE(created != nullptr);
  118. CHECK(created->get_name() == "TestScene");
  119. CHECK(created->get_child_count() == 1);
  120. CHECK(created->get_reference_property().identity_compare(created->get_child(0, false)));
  121. CHECK_FALSE(created->get_reference_property().identity_compare(referenced));
  122. root->queue_free();
  123. memdelete(scene);
  124. }
  125. SUBCASE("with node-array value") {
  126. InstancePlaceholder *ip = memnew(InstancePlaceholder);
  127. ip->set_name("TestScene");
  128. Node *root = memnew(Node);
  129. SceneTree::get_singleton()->get_root()->add_child(root);
  130. root->add_child(ip);
  131. // Create a scene to instance.
  132. _TestInstancePlaceholderNode *scene = memnew(_TestInstancePlaceholderNode);
  133. Node *referenced1 = memnew(Node);
  134. Node *referenced2 = memnew(Node);
  135. scene->add_child(referenced1);
  136. scene->add_child(referenced2);
  137. referenced1->set_owner(scene);
  138. referenced2->set_owner(scene);
  139. Array node_array;
  140. node_array.set_typed(Variant::OBJECT, "Node", Variant());
  141. node_array.push_back(referenced1);
  142. node_array.push_back(referenced2);
  143. scene->set_reference_array_property(node_array);
  144. // Pack the scene.
  145. PackedScene *packed_scene = memnew(PackedScene);
  146. const Error err = packed_scene->pack(scene);
  147. REQUIRE(err == OK);
  148. // Instantiate the scene.
  149. _TestInstancePlaceholderNode *created = Object::cast_to<_TestInstancePlaceholderNode>(ip->create_instance(true, packed_scene));
  150. REQUIRE(created != nullptr);
  151. CHECK(created->get_name() == "TestScene");
  152. CHECK(created->get_child_count() == 2);
  153. Array created_array = created->get_reference_array_property();
  154. REQUIRE(created_array.size() == node_array.size());
  155. REQUIRE(created_array.size() == created->get_child_count());
  156. // Iterate over all nodes, since the ordering is not guaranteed.
  157. for (int i = 0; i < node_array.size(); i++) {
  158. bool node_found = false;
  159. for (int j = 0; j < created->get_child_count(); j++) {
  160. if (created_array[i].identity_compare(created->get_child(j, true))) {
  161. node_found = true;
  162. }
  163. }
  164. CHECK(node_found);
  165. }
  166. root->queue_free();
  167. memdelete(scene);
  168. }
  169. }
  170. TEST_CASE("[SceneTree][InstancePlaceholder] Instantiate from placeholder with overrides") {
  171. GDREGISTER_CLASS(_TestInstancePlaceholderNode);
  172. SUBCASE("with non-node values") {
  173. InstancePlaceholder *ip = memnew(InstancePlaceholder);
  174. Node *root = memnew(Node);
  175. SceneTree::get_singleton()->get_root()->add_child(root);
  176. root->add_child(ip);
  177. ip->set_name("TestScene");
  178. ip->set("int_property", 45);
  179. // Create a scene to pack.
  180. _TestInstancePlaceholderNode *scene = memnew(_TestInstancePlaceholderNode);
  181. scene->set_int_property(12);
  182. // Pack the scene.
  183. PackedScene *packed_scene = memnew(PackedScene);
  184. packed_scene->pack(scene);
  185. // Instantiate the scene.
  186. _TestInstancePlaceholderNode *created = Object::cast_to<_TestInstancePlaceholderNode>(ip->create_instance(true, packed_scene));
  187. REQUIRE(created != nullptr);
  188. CHECK(created->get_int_property() == 45);
  189. root->queue_free();
  190. memdelete(scene);
  191. }
  192. SUBCASE("with node values") {
  193. InstancePlaceholder *ip = memnew(InstancePlaceholder);
  194. ip->set_name("TestScene");
  195. Node *root = memnew(Node);
  196. Node *overriding = memnew(Node);
  197. SceneTree::get_singleton()->get_root()->add_child(root);
  198. root->add_child(ip);
  199. root->add_child(overriding);
  200. ip->set("reference_property", overriding);
  201. // Create a scene to instance.
  202. _TestInstancePlaceholderNode *scene = memnew(_TestInstancePlaceholderNode);
  203. Node *referenced = memnew(Node);
  204. scene->add_child(referenced);
  205. referenced->set_owner(scene);
  206. scene->set_reference_property(referenced);
  207. // Pack the scene.
  208. PackedScene *packed_scene = memnew(PackedScene);
  209. const Error err = packed_scene->pack(scene);
  210. REQUIRE(err == OK);
  211. // Instantiate the scene.
  212. _TestInstancePlaceholderNode *created = Object::cast_to<_TestInstancePlaceholderNode>(ip->create_instance(true, packed_scene));
  213. REQUIRE(created != nullptr);
  214. CHECK(created->get_name() == "TestScene");
  215. CHECK(created->get_child_count() == 1);
  216. CHECK(created->get_reference_property().identity_compare(overriding));
  217. CHECK_FALSE(created->get_reference_property().identity_compare(referenced));
  218. root->queue_free();
  219. memdelete(scene);
  220. }
  221. SUBCASE("with node-array value") {
  222. InstancePlaceholder *ip = memnew(InstancePlaceholder);
  223. ip->set_name("TestScene");
  224. Node *root = memnew(Node);
  225. SceneTree::get_singleton()->get_root()->add_child(root);
  226. Node *override1 = memnew(Node);
  227. Node *override2 = memnew(Node);
  228. Node *override3 = memnew(Node);
  229. root->add_child(ip);
  230. root->add_child(override1);
  231. root->add_child(override2);
  232. root->add_child(override3);
  233. Array override_node_array;
  234. override_node_array.set_typed(Variant::OBJECT, "Node", Variant());
  235. override_node_array.push_back(override1);
  236. override_node_array.push_back(override2);
  237. override_node_array.push_back(override3);
  238. ip->set("reference_array_property", override_node_array);
  239. // Create a scene to instance.
  240. _TestInstancePlaceholderNode *scene = memnew(_TestInstancePlaceholderNode);
  241. Node *referenced1 = memnew(Node);
  242. Node *referenced2 = memnew(Node);
  243. scene->add_child(referenced1);
  244. scene->add_child(referenced2);
  245. referenced1->set_owner(scene);
  246. referenced2->set_owner(scene);
  247. Array referenced_array;
  248. referenced_array.set_typed(Variant::OBJECT, "Node", Variant());
  249. referenced_array.push_back(referenced1);
  250. referenced_array.push_back(referenced2);
  251. scene->set_reference_array_property(referenced_array);
  252. // Pack the scene.
  253. PackedScene *packed_scene = memnew(PackedScene);
  254. const Error err = packed_scene->pack(scene);
  255. REQUIRE(err == OK);
  256. // Instantiate the scene.
  257. _TestInstancePlaceholderNode *created = Object::cast_to<_TestInstancePlaceholderNode>(ip->create_instance(true, packed_scene));
  258. REQUIRE(created != nullptr);
  259. CHECK(created->get_name() == "TestScene");
  260. CHECK(created->get_child_count() == 2);
  261. Array created_array = created->get_reference_array_property();
  262. REQUIRE_FALSE(created_array.size() == referenced_array.size());
  263. REQUIRE(created_array.size() == override_node_array.size());
  264. REQUIRE_FALSE(created_array.size() == created->get_child_count());
  265. // Iterate over all nodes, since the ordering is not guaranteed.
  266. for (int i = 0; i < override_node_array.size(); i++) {
  267. bool node_found = false;
  268. for (int j = 0; j < created_array.size(); j++) {
  269. if (override_node_array[i].identity_compare(created_array[j])) {
  270. node_found = true;
  271. }
  272. }
  273. CHECK(node_found);
  274. }
  275. root->queue_free();
  276. memdelete(scene);
  277. }
  278. }
  279. #ifdef TOOLS_ENABLED
  280. TEST_CASE("[SceneTree][InstancePlaceholder] Instance a PackedScene containing an InstancePlaceholder with no overrides") {
  281. GDREGISTER_CLASS(_TestInstancePlaceholderNode);
  282. // Create the internal scene.
  283. _TestInstancePlaceholderNode *internal = memnew(_TestInstancePlaceholderNode);
  284. internal->set_name("InternalNode");
  285. Node *referenced = memnew(Node);
  286. referenced->set_name("OriginalReference");
  287. internal->add_child(referenced);
  288. referenced->set_owner(internal);
  289. internal->set_reference_property(referenced);
  290. // Pack the internal scene.
  291. PackedScene *internal_scene = memnew(PackedScene);
  292. Error err = internal_scene->pack(internal);
  293. REQUIRE(err == OK);
  294. const String internal_path = TestUtils::get_temp_path("instance_placeholder_test_internal.tscn");
  295. err = ResourceSaver::save(internal_scene, internal_path);
  296. REQUIRE(err == OK);
  297. Ref<PackedScene> internal_scene_loaded = ResourceLoader::load(internal_path, "PackedScene", ResourceFormatLoader::CacheMode::CACHE_MODE_IGNORE, &err);
  298. REQUIRE(err == OK);
  299. // Create the main scene.
  300. Node *root = memnew(Node);
  301. root->set_name("MainNode");
  302. Node *overriding = memnew(Node);
  303. overriding->set_name("OverridingReference");
  304. _TestInstancePlaceholderNode *internal_created = Object::cast_to<_TestInstancePlaceholderNode>(internal_scene_loaded->instantiate(PackedScene::GEN_EDIT_STATE_MAIN_INHERITED));
  305. internal_created->set_scene_instance_load_placeholder(true);
  306. root->add_child(internal_created);
  307. internal_created->set_owner(root);
  308. root->add_child(overriding);
  309. overriding->set_owner(root);
  310. // Here we introduce an error, we override the property with an internal node to the instance placeholder.
  311. // The InstancePlaceholder is now forced to properly resolve the Node.
  312. internal_created->set("reference_property", NodePath("OriginalReference"));
  313. // Pack the main scene.
  314. PackedScene *main_scene = memnew(PackedScene);
  315. err = main_scene->pack(root);
  316. REQUIRE(err == OK);
  317. const String main_path = TestUtils::get_temp_path("instance_placeholder_test_main.tscn");
  318. err = ResourceSaver::save(main_scene, main_path);
  319. REQUIRE(err == OK);
  320. // // Instantiate the scene.
  321. Ref<PackedScene> main_scene_loaded = ResourceLoader::load(main_path, "PackedScene", ResourceFormatLoader::CacheMode::CACHE_MODE_IGNORE, &err);
  322. REQUIRE(err == OK);
  323. Node *instanced_main_node = main_scene_loaded->instantiate();
  324. REQUIRE(instanced_main_node != nullptr);
  325. SceneTree::get_singleton()->get_root()->add_child(instanced_main_node);
  326. CHECK(instanced_main_node->get_name() == "MainNode");
  327. REQUIRE(instanced_main_node->get_child_count() == 2);
  328. InstancePlaceholder *instanced_placeholder = Object::cast_to<InstancePlaceholder>(instanced_main_node->get_child(0, true));
  329. REQUIRE(instanced_placeholder != nullptr);
  330. _TestInstancePlaceholderNode *final_node = Object::cast_to<_TestInstancePlaceholderNode>(instanced_placeholder->create_instance(true));
  331. REQUIRE(final_node != nullptr);
  332. REQUIRE(final_node->get_child_count() == 1);
  333. REQUIRE(final_node->get_reference_property().identity_compare(final_node->get_child(0, true)));
  334. instanced_main_node->queue_free();
  335. memdelete(overriding);
  336. memdelete(root);
  337. memdelete(internal);
  338. DirAccess::remove_file_or_error(internal_path);
  339. DirAccess::remove_file_or_error(main_path);
  340. }
  341. TEST_CASE("[SceneTree][InstancePlaceholder] Instance a PackedScene containing an InstancePlaceholder with overrides") {
  342. GDREGISTER_CLASS(_TestInstancePlaceholderNode);
  343. // Create the internal scene.
  344. _TestInstancePlaceholderNode *internal = memnew(_TestInstancePlaceholderNode);
  345. internal->set_name("InternalNode");
  346. Node *referenced = memnew(Node);
  347. referenced->set_name("OriginalReference");
  348. internal->add_child(referenced);
  349. referenced->set_owner(internal);
  350. internal->set_reference_property(referenced);
  351. Node *array_ref1 = memnew(Node);
  352. array_ref1->set_name("ArrayRef1");
  353. internal->add_child(array_ref1);
  354. array_ref1->set_owner(internal);
  355. Node *array_ref2 = memnew(Node);
  356. array_ref2->set_name("ArrayRef2");
  357. internal->add_child(array_ref2);
  358. array_ref2->set_owner(internal);
  359. Array referenced_array;
  360. referenced_array.set_typed(Variant::OBJECT, "Node", Variant());
  361. referenced_array.push_back(array_ref1);
  362. referenced_array.push_back(array_ref2);
  363. internal->set_reference_array_property(referenced_array);
  364. // Pack the internal scene.
  365. PackedScene *internal_scene = memnew(PackedScene);
  366. Error err = internal_scene->pack(internal);
  367. REQUIRE(err == OK);
  368. const String internal_path = TestUtils::get_temp_path("instance_placeholder_test_internal_override.tscn");
  369. err = ResourceSaver::save(internal_scene, internal_path);
  370. REQUIRE(err == OK);
  371. Ref<PackedScene> internal_scene_loaded = ResourceLoader::load(internal_path, "PackedScene", ResourceFormatLoader::CacheMode::CACHE_MODE_IGNORE, &err);
  372. REQUIRE(err == OK);
  373. // Create the main scene.
  374. Node *root = memnew(Node);
  375. root->set_name("MainNode");
  376. Node *overriding = memnew(Node);
  377. overriding->set_name("OverridingReference");
  378. Node *array_ext = memnew(Node);
  379. array_ext->set_name("ExternalArrayMember");
  380. _TestInstancePlaceholderNode *internal_created = Object::cast_to<_TestInstancePlaceholderNode>(internal_scene_loaded->instantiate(PackedScene::GEN_EDIT_STATE_MAIN_INHERITED));
  381. internal_created->set_scene_instance_load_placeholder(true);
  382. root->add_child(internal_created);
  383. internal_created->set_owner(root);
  384. root->add_child(overriding);
  385. overriding->set_owner(root);
  386. root->add_child(array_ext);
  387. array_ext->set_owner(root);
  388. // Here we introduce an error, we override the property with an internal node to the instance placeholder.
  389. // The InstancePlaceholder is now forced to properly resolve the Node.
  390. internal_created->set_reference_property(overriding);
  391. Array internal_array = internal_created->get_reference_array_property();
  392. Array override_array;
  393. override_array.set_typed(Variant::OBJECT, "Node", Variant());
  394. for (int i = 0; i < internal_array.size(); i++) {
  395. override_array.push_back(internal_array[i]);
  396. }
  397. override_array.push_back(array_ext);
  398. internal_created->set_reference_array_property(override_array);
  399. // Pack the main scene.
  400. PackedScene *main_scene = memnew(PackedScene);
  401. err = main_scene->pack(root);
  402. REQUIRE(err == OK);
  403. const String main_path = TestUtils::get_temp_path("instance_placeholder_test_main_override.tscn");
  404. err = ResourceSaver::save(main_scene, main_path);
  405. REQUIRE(err == OK);
  406. // // Instantiate the scene.
  407. Ref<PackedScene> main_scene_loaded = ResourceLoader::load(main_path, "PackedScene", ResourceFormatLoader::CacheMode::CACHE_MODE_IGNORE, &err);
  408. REQUIRE(err == OK);
  409. Node *instanced_main_node = main_scene_loaded->instantiate();
  410. REQUIRE(instanced_main_node != nullptr);
  411. SceneTree::get_singleton()->get_root()->add_child(instanced_main_node);
  412. CHECK(instanced_main_node->get_name() == "MainNode");
  413. REQUIRE(instanced_main_node->get_child_count() == 3);
  414. InstancePlaceholder *instanced_placeholder = Object::cast_to<InstancePlaceholder>(instanced_main_node->get_child(0, true));
  415. REQUIRE(instanced_placeholder != nullptr);
  416. _TestInstancePlaceholderNode *final_node = Object::cast_to<_TestInstancePlaceholderNode>(instanced_placeholder->create_instance(true));
  417. REQUIRE(final_node != nullptr);
  418. REQUIRE(final_node->get_child_count() == 3);
  419. REQUIRE(final_node->get_reference_property().identity_compare(instanced_main_node->get_child(1, true)));
  420. Array final_array = final_node->get_reference_array_property();
  421. REQUIRE(final_array.size() == 3);
  422. Array wanted_node_array = {
  423. instanced_main_node->get_child(2, true), // ExternalArrayMember
  424. final_node->get_child(1, true), // ArrayRef1
  425. final_node->get_child(2, true) // ArrayRef2
  426. };
  427. // Iterate over all nodes, since the ordering is not guaranteed.
  428. for (int i = 0; i < wanted_node_array.size(); i++) {
  429. bool node_found = false;
  430. for (int j = 0; j < final_array.size(); j++) {
  431. if (wanted_node_array[i].identity_compare(final_array[j])) {
  432. node_found = true;
  433. }
  434. }
  435. CHECK(node_found);
  436. }
  437. instanced_main_node->queue_free();
  438. memdelete(array_ext);
  439. memdelete(overriding);
  440. memdelete(root);
  441. memdelete(internal);
  442. DirAccess::remove_file_or_error(internal_path);
  443. DirAccess::remove_file_or_error(main_path);
  444. }
  445. #endif // TOOLS_ENABLED
  446. } //namespace TestInstancePlaceholder