summaryrefslogtreecommitdiff
path: root/addons/gdUnit4/src/extractors
diff options
context:
space:
mode:
Diffstat (limited to 'addons/gdUnit4/src/extractors')
-rw-r--r--addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd73
-rw-r--r--addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd.uid1
2 files changed, 74 insertions, 0 deletions
diff --git a/addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd b/addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd
new file mode 100644
index 0000000..124d3d4
--- /dev/null
+++ b/addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd
@@ -0,0 +1,73 @@
+# This class defines a value extractor by given function name and args
+class_name GdUnitFuncValueExtractor
+extends GdUnitValueExtractor
+
+var _func_names :PackedStringArray
+var _args :Array
+
+func _init(func_name :String, p_args :Array) -> void:
+ _func_names = func_name.split(".")
+ _args = p_args
+
+
+func func_names() -> PackedStringArray:
+ return _func_names
+
+
+func args() -> Array:
+ return _args
+
+
+# Extracts a value by given `func_name` and `args`,
+# Allows to use a chained list of functions setarated ba a dot.
+# e.g. "func_a.func_b.name"
+# do calls instance.func_a().func_b().name() and returns finally the name
+# If a function returns an array, all elements will by collected in a array
+# e.g. "get_children.get_name" checked a node
+# do calls node.get_children() for all childs get_name() and returns all names in an array
+#
+# if the value not a Object or not accesible be `func_name` the value is converted to `"n.a."`
+# expecing null values
+func extract_value(value: Variant) -> Variant:
+ if value == null:
+ return null
+ for func_name in func_names():
+ if GdArrayTools.is_array_type(value):
+ var values := Array()
+ @warning_ignore("unsafe_cast")
+ for element: Variant in (value as Array):
+ values.append(_call_func(element, func_name))
+ value = values
+ else:
+ value = _call_func(value, func_name)
+ var type := typeof(value)
+ if type == TYPE_STRING_NAME:
+ return str(value)
+ if type == TYPE_STRING and value == "n.a.":
+ return value
+ return value
+
+
+func _call_func(value :Variant, func_name :String) -> Variant:
+ # for array types we need to call explicit by function name, using funcref is only supported for Objects
+ # TODO extend to all array functions
+ if GdArrayTools.is_array_type(value) and func_name == "empty":
+ @warning_ignore("unsafe_cast")
+ return (value as Array).is_empty()
+
+ if is_instance_valid(value):
+ # extract from function
+ var obj_value: Object = value
+ if obj_value.has_method(func_name):
+ var extract := Callable(obj_value, func_name)
+ if extract.is_valid():
+ return obj_value.call(func_name) if args().is_empty() else obj_value.callv(func_name, args())
+ else:
+ # if no function exists than try to extract form parmeters
+ var parameter: Variant = obj_value.get(func_name)
+ if parameter != null:
+ return parameter
+ # nothing found than return 'n.a.'
+ if GdUnitSettings.is_verbose_assert_warnings():
+ push_warning("Extracting value from element '%s' by func '%s' failed! Converting to \"n.a.\"" % [value, func_name])
+ return "n.a."
diff --git a/addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd.uid b/addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd.uid
new file mode 100644
index 0000000..9c4c194
--- /dev/null
+++ b/addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd.uid
@@ -0,0 +1 @@
+uid://g7yhter46jh