summaryrefslogtreecommitdiff
path: root/addons/gdUnit4/src/core/GdUnitTestResourceLoader.gd
diff options
context:
space:
mode:
Diffstat (limited to 'addons/gdUnit4/src/core/GdUnitTestResourceLoader.gd')
-rw-r--r--addons/gdUnit4/src/core/GdUnitTestResourceLoader.gd97
1 files changed, 97 insertions, 0 deletions
diff --git a/addons/gdUnit4/src/core/GdUnitTestResourceLoader.gd b/addons/gdUnit4/src/core/GdUnitTestResourceLoader.gd
new file mode 100644
index 0000000..33b80e2
--- /dev/null
+++ b/addons/gdUnit4/src/core/GdUnitTestResourceLoader.gd
@@ -0,0 +1,97 @@
+class_name GdUnitTestResourceLoader
+extends RefCounted
+
+const GdUnitTools := preload("res://addons/gdUnit4/src/core/GdUnitTools.gd")
+
+enum {
+ GD_SUITE,
+ CS_SUITE
+}
+
+
+static func load_test_suite(resource_path: String, script_type := GD_SUITE) -> Node:
+ match script_type:
+ GD_SUITE:
+ return load_test_suite_gd(resource_path)
+ CS_SUITE:
+ return load_test_suite_cs(resource_path)
+ assert("type '%s' is not implemented" % script_type)
+ return null
+
+
+static func load_tests(resource_path: String) -> Dictionary:
+ var script := load_gd_script(resource_path)
+ var discovered_tests := {}
+ GdUnitTestDiscoverer.discover_tests(script, func(test: GdUnitTestCase) -> void:
+ discovered_tests[test.display_name] = test
+ )
+
+ return discovered_tests
+
+
+static func load_test_suite_gd(resource_path: String) -> GdUnitTestSuite:
+ var script := load_gd_script(resource_path)
+ var discovered_tests: Array[GdUnitTestCase] = []
+ GdUnitTestDiscoverer.discover_tests(script, func(test: GdUnitTestCase) -> void:
+ discovered_tests.append(test)
+ )
+ # complete test suite wiht parsed test cases
+ return GdUnitTestSuiteScanner.new().load_suite(script, discovered_tests)
+
+
+static func load_test_suite_cs(resource_path: String) -> Node:
+ if not GdUnit4CSharpApiLoader.is_api_loaded():
+ return null
+ var script :Script = ClassDB.instantiate("CSharpScript")
+ script.source_code = GdUnitFileAccess.resource_as_string(resource_path)
+ script.resource_path = resource_path
+ script.reload()
+ return null
+
+
+static func load_cs_script(resource_path: String, debug_write := false) -> Script:
+ if not GdUnit4CSharpApiLoader.is_api_loaded():
+ return null
+ var script :Script = ClassDB.instantiate("CSharpScript")
+ script.source_code = GdUnitFileAccess.resource_as_string(resource_path)
+ var script_resource_path := resource_path.replace(resource_path.get_extension(), "cs")
+ if debug_write:
+ script_resource_path = GdUnitFileAccess.create_temp_dir("test") + "/%s" % script_resource_path.get_file()
+ print_debug("save resource:", script_resource_path)
+ DirAccess.remove_absolute(script_resource_path)
+ var err := ResourceSaver.save(script, script_resource_path)
+ if err != OK:
+ print_debug("Can't save debug resource",script_resource_path, "Error:", error_string(err))
+ script.take_over_path(script_resource_path)
+ else:
+ script.take_over_path(resource_path)
+ script.reload()
+ return script
+
+
+static func load_gd_script(resource_path: String, debug_write := false) -> GDScript:
+ # grap current level
+ var unsafe_method_access: Variant = ProjectSettings.get_setting("debug/gdscript/warnings/unsafe_method_access")
+ # disable and load the script
+ ProjectSettings.set_setting("debug/gdscript/warnings/unsafe_method_access", 0)
+
+ var script := GDScript.new()
+ script.source_code = GdUnitFileAccess.resource_as_string(resource_path)
+ var script_resource_path := resource_path.replace(resource_path.get_extension(), "gd")
+ if debug_write:
+ script_resource_path = script_resource_path.replace("res://", GdUnitFileAccess.temp_dir() + "/")
+ #print_debug("save resource: ", script_resource_path)
+ DirAccess.remove_absolute(script_resource_path)
+ DirAccess.make_dir_recursive_absolute(script_resource_path.get_base_dir())
+ var err := ResourceSaver.save(script, script_resource_path, ResourceSaver.FLAG_REPLACE_SUBRESOURCE_PATHS)
+ if err != OK:
+ print_debug("Can't save debug resource", script_resource_path, "Error:", error_string(err))
+ script.take_over_path(script_resource_path)
+ else:
+ script.take_over_path(resource_path)
+ var error := script.reload()
+ if error != OK:
+ push_error("Errors on loading script %s. Error: %s" % [resource_path, error_string(error)])
+ ProjectSettings.set_setting("debug/gdscript/warnings/unsafe_method_access", unsafe_method_access)
+ return script
+ #@warning_ignore("unsafe_cast")