var _utils = load("res://addons/gut/utils.gd").get_instance() var _strutils = _utils.Strutils.new() var _max_length = 100 var _should_compare_int_to_float = true const MISSING = "|__missing__gut__compare__value__|" const DICTIONARY_DISCLAIMER = "Dictionaries are compared-by-ref. See assert_eq in wiki." func _cannot_compare_text(v1, v2): return str( "Cannot compare ", _strutils.types[typeof(v1)], " with ", _strutils.types[typeof(v2)], "." ) func _make_missing_string(text): return "" func _create_missing_result(v1, v2, text): var to_return = null var v1_str = format_value(v1) var v2_str = format_value(v2) if typeof(v1) == TYPE_STRING and v1 == MISSING: v1_str = _make_missing_string(text) to_return = _utils.CompareResult.new() elif typeof(v2) == TYPE_STRING and v2 == MISSING: v2_str = _make_missing_string(text) to_return = _utils.CompareResult.new() if to_return != null: to_return.summary = str(v1_str, " != ", v2_str) to_return.are_equal = false return to_return func simple(v1, v2, missing_string = ""): var missing_result = _create_missing_result(v1, v2, missing_string) if missing_result != null: return missing_result var result = _utils.CompareResult.new() var cmp_str = null var extra = "" var tv1 = typeof(v1) var tv2 = typeof(v2) # print(tv1, '::', tv2, ' ', _strutils.types[tv1], '::', _strutils.types[tv2]) if ( _should_compare_int_to_float and [TYPE_INT, TYPE_FLOAT].has(tv1) and [TYPE_INT, TYPE_FLOAT].has(tv2) ): result.are_equal = v1 == v2 elif [TYPE_STRING, TYPE_STRING_NAME].has(tv1) and [TYPE_STRING, TYPE_STRING_NAME].has(tv2): result.are_equal = v1 == v2 elif _utils.are_datatypes_same(v1, v2): result.are_equal = v1 == v2 if typeof(v1) == TYPE_DICTIONARY: if result.are_equal: extra = ". Same dictionary ref. " else: extra = ". Different dictionary refs. " extra += DICTIONARY_DISCLAIMER if typeof(v1) == TYPE_ARRAY: var array_result = _utils.DiffTool.new(v1, v2, _utils.DIFF.SHALLOW) result.summary = array_result.get_short_summary() if !array_result.are_equal: extra = ".\n" + array_result.get_short_summary() else: cmp_str = "!=" result.are_equal = false extra = str(". ", _cannot_compare_text(v1, v2)) cmp_str = get_compare_symbol(result.are_equal) result.summary = str(format_value(v1), " ", cmp_str, " ", format_value(v2), extra) return result func shallow(v1, v2): var result = null if _utils.are_datatypes_same(v1, v2): if typeof(v1) in [TYPE_ARRAY, TYPE_DICTIONARY]: result = _utils.DiffTool.new(v1, v2, _utils.DIFF.SHALLOW) else: result = simple(v1, v2) else: result = simple(v1, v2) return result func deep(v1, v2): var result = null if _utils.are_datatypes_same(v1, v2): if typeof(v1) in [TYPE_ARRAY, TYPE_DICTIONARY]: result = _utils.DiffTool.new(v1, v2, _utils.DIFF.DEEP) else: result = simple(v1, v2) else: result = simple(v1, v2) return result func format_value(val, max_val_length = _max_length): return _strutils.truncate_string(_strutils.type2str(val), max_val_length) func compare(v1, v2, diff_type = _utils.DIFF.SIMPLE): var result = null if diff_type == _utils.DIFF.SIMPLE: result = simple(v1, v2) elif diff_type == _utils.DIFF.SHALLOW: result = shallow(v1, v2) elif diff_type == _utils.DIFF.DEEP: result = deep(v1, v2) return result func get_should_compare_int_to_float(): return _should_compare_int_to_float func set_should_compare_int_to_float(should_compare_int_float): _should_compare_int_to_float = should_compare_int_float func get_compare_symbol(is_equal): if is_equal: return "==" else: return "!="