Files
game-cards/addons/gut/test/unit/test_utils.gd
2026-05-29 09:16:10 +08:00

229 lines
6.7 KiB
GDScript

extends 'res://addons/gut/test.gd'
const INNER_CLASSES_PATH = 'res://test/resources/doubler_test_objects/inner_classes.gd'
var InnerClasses = load(INNER_CLASSES_PATH)
var Utils = load('res://addons/gut/utils.gd')
func test_can_make_one():
assert_not_null(autofree(Utils.new()))
func test_is_double_returns_false_for_non_doubles():
assert_false(GutUtils.is_double(autofree(Node.new())))
func test_is_double_returns_true_for_doubles():
var d = double(Node).new()
assert_true(GutUtils.is_double(d))
func test_is_double_returns_false_for_primitives():
assert_false(GutUtils.is_double('hello'), 'string')
assert_false(GutUtils.is_double(1), 'int')
assert_false(GutUtils.is_double(1.0), 'float')
assert_false(GutUtils.is_double([]), 'array')
assert_false(GutUtils.is_double({}), 'dictionary')
# that's probably enough spot checking
class OverloadsGet:
var a = []
@warning_ignore("native_method_override")
func get(index):
return a[index]
func test_is_double_works_with_classes_that_overload_get():
var og = autofree(OverloadsGet.new())
assert_false(GutUtils.is_double(og))
func test_is_instance_false_for_classes():
assert_false(GutUtils.is_instance(Node2D))
func test_is_instance_true_for_new():
var n = autofree(Node.new())
assert_true(GutUtils.is_instance(n))
func test_is_instance_false_for_instanced_things():
var i = load('res://test/resources/SceneNoScript.tscn')
assert_false(GutUtils.is_instance(i))
func test_get_native_class_name_does_not_generate_orphans():
var _n = GutUtils.get_native_class_name(Node2D)
assert_no_new_orphans()
func test_get_native_class_name_does_not_free_references():
var _n = GutUtils.get_native_class_name(InputEventKey)
pass_test("we got here")
func test_is_native_class_returns_true_for_native_classes():
assert_true(GutUtils.is_native_class(Node))
func test_is_inner_class_true_for_inner_classes():
assert_true(GutUtils.is_inner_class(InnerClasses.InnerA))
func test_is_inner_class_false_for_base_scripts():
assert_false(GutUtils.is_inner_class(InnerClasses))
func test_is_inner_class_false_for_non_objs():
assert_false(GutUtils.is_inner_class('foo'))
func test_make_install_check_text_contains_missing_tempalte_text_when_function_template_missing():
var template_paths = GutUtils.DOUBLE_TEMPLATES.duplicate()
template_paths.FUNCTION = 'res://does_not_exist.txt'
var text = GutUtils.make_install_check_text(template_paths)
assert_string_contains(text, 'template files are missing', false)
func test_make_install_check_text_contains_missing_tempalte_text_when_init_template_missing():
var template_paths = GutUtils.DOUBLE_TEMPLATES.duplicate()
template_paths.INIT = 'res://does_not_exist.txt'
var text = GutUtils.make_install_check_text(template_paths)
assert_string_contains(text, 'template files are missing', false)
func test_make_install_check_text_contains_missing_tempalte_text_when_script_template_missing():
var template_paths = GutUtils.DOUBLE_TEMPLATES.duplicate()
template_paths.SCRIPT = 'res://does_not_exist.txt'
var text = GutUtils.make_install_check_text(template_paths)
assert_string_contains(text, 'template files are missing', false)
#func test_make_install_check_text_contains_text_about_no_configured_directories():
#pending()
class TestGetSceneScript:
extends 'res://addons/gut/test.gd'
class MockSceneState:
# ------------------------------
# Tools for faking out SceneState functionality
# ------------------------------
var nodes = []
func add_node(path):
var to_add = {
node_path = NodePath(path),
props = []
}
nodes.append(to_add)
return nodes.size() -1
func add_node_prop(index, name, value):
nodes[index].props.append({name = name, value = value})
# ------------------------------
# Mocked SceneState methods
# ------------------------------
func get_node_count():
return nodes.size()
func get_node_path(index):
return nodes[index].node_path
func get_node_property_name(index, prop_index):
return nodes[index].props[prop_index].name
func get_node_property_value(index, prop_index):
return nodes[index].props[prop_index].value
func get_node_property_count(index):
return nodes[index].props.size()
class MockScene:
var state = MockSceneState.new()
func get_state():
return state
func test_gets_scene_script_when_script_is_first_property():
var mock_scene = MockScene.new()
mock_scene.state.add_node('.')
mock_scene.state.add_node_prop(0, 'script', 'foo')
var result = GutUtils.get_scene_script_object(mock_scene)
assert_eq(result, 'foo')
func test_gets_scene_script_when_script_is_second_property():
var mock_scene = MockScene.new()
mock_scene.state.add_node('.')
mock_scene.state.add_node_prop(0, 'something', 'else')
mock_scene.state.add_node_prop(0, 'script', 'foo')
var result = GutUtils.get_scene_script_object(mock_scene)
assert_eq(result, 'foo')
func test_gets_scene_script_when_root_node_is_not_first_node():
var mock_scene = MockScene.new()
mock_scene.state.add_node('/some/path')
mock_scene.state.add_node('.')
mock_scene.state.add_node_prop(1, 'something', 'else')
mock_scene.state.add_node_prop(1, 'script', 'foo')
var result = GutUtils.get_scene_script_object(mock_scene)
assert_eq(result, 'foo')
class TestGetEnumValue:
extends GutTest
enum TEST1{
ZERO,
ONE,
TWO,
THREE,
TWENTY_ONE
}
func test_returns_index_when_given_index():
var val = GutUtils.get_enum_value(0, TEST1)
assert_eq(val, 0)
func test_returns_null_when_invalid_index():
var val = GutUtils.get_enum_value(99, TEST1)
assert_eq(val, null)
func test_returns_value_when_given_string():
var val = GutUtils.get_enum_value('TWO', TEST1)
assert_eq(val, 2)
func test_returns_value_when_given_lowercase_string():
var val = GutUtils.get_enum_value('three', TEST1)
assert_eq(val, 3)
func test_replaces_spaces_with_underscores():
var val = GutUtils.get_enum_value('twenty ONE', TEST1)
assert_eq(val, TEST1.TWENTY_ONE)
func test_returns_null_if_string_not_a_key():
var val = GutUtils.get_enum_value('not a key', TEST1)
assert_null(val)
func test_can_provide_default_value():
var val = GutUtils.get_enum_value('not a key', TEST1, 'asdf')
assert_eq(val, 'asdf')
func test_when_int_passed_as_string_it_converts_it():
var val = GutUtils.get_enum_value('1', TEST1, 999)
assert_eq(val, 1)
func test_with_double_strategy():
var val = GutUtils.get_enum_value(
0, GutUtils.DOUBLE_STRATEGY,
999)
assert_eq(val, 0)
func test_with_double_strategy2():
var val = GutUtils.get_enum_value(
1, GutUtils.DOUBLE_STRATEGY,
999)
assert_eq(val, 1)
func test_converts_floats_to_int():
var val = GutUtils.get_enum_value(1.0, TEST1, 9999)
assert_eq(val, 1)
func test_does_not_round_floats():
var val = GutUtils.get_enum_value(2.9, TEST1, 9999)
assert_eq(val, 2)