diff options
| author | Sophia Pearson <codergal89@gmail.com> | 2022-05-20 00:45:25 +0200 |
|---|---|---|
| committer | Sophia Pearson <codergal89@gmail.com> | 2022-05-20 18:56:04 +0200 |
| commit | 05d29ccce1898ed89c0b650c77242c2fa2805128 (patch) | |
| tree | e8ee3bcb570fa6f3d9d96273c2bf4d4c8618d08b /addons/gut/diff_tool.gd | |
| download | texty-05d29ccce1898ed89c0b650c77242c2fa2805128.tar.xz texty-05d29ccce1898ed89c0b650c77242c2fa2805128.zip | |
texty: initial commit
Diffstat (limited to 'addons/gut/diff_tool.gd')
| -rw-r--r-- | addons/gut/diff_tool.gd | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/addons/gut/diff_tool.gd b/addons/gut/diff_tool.gd new file mode 100644 index 0000000..daef7ed --- /dev/null +++ b/addons/gut/diff_tool.gd @@ -0,0 +1,162 @@ +extends 'res://addons/gut/compare_result.gd' +const INDENT = ' ' +enum { + DEEP, + SHALLOW, + SIMPLE +} + +var _utils = load('res://addons/gut/utils.gd').get_instance() +var _strutils = _utils.Strutils.new() +var _compare = _utils.Comparator.new() +var DiffTool = load('res://addons/gut/diff_tool.gd') + +var _value_1 = null +var _value_2 = null +var _total_count = 0 +var _diff_type = null +var _brackets = null +var _valid = true +var _desc_things = 'somethings' + +# -------- comapre_result.gd "interface" --------------------- +func set_are_equal(val): + _block_set('are_equal', val) + +func get_are_equal(): + return are_equal() + +func set_summary(val): + _block_set('summary', val) + +func get_summary(): + return summarize() + +func get_different_count(): + return differences.size() + +func get_total_count(): + return _total_count + +func get_short_summary(): + var text = str(_strutils.truncate_string(str(_value_1), 50), + ' ', _compare.get_compare_symbol(are_equal()), ' ', + _strutils.truncate_string(str(_value_2), 50)) + if(!are_equal()): + text += str(' ', get_different_count(), ' of ', get_total_count(), + ' ', _desc_things, ' do not match.') + return text + +func get_brackets(): + return _brackets +# -------- comapre_result.gd "interface" --------------------- + + +func _invalidate(): + _valid = false + differences = null + + +func _init(v1, v2, diff_type=DEEP): + _value_1 = v1 + _value_2 = v2 + _diff_type = diff_type + _compare.set_should_compare_int_to_float(false) + _find_differences(_value_1, _value_2) + + +func _find_differences(v1, v2): + if(_utils.are_datatypes_same(v1, v2)): + if(typeof(v1) == TYPE_ARRAY): + _brackets = {'open':'[', 'close':']'} + _desc_things = 'indexes' + _diff_array(v1, v2) + elif(typeof(v2) == TYPE_DICTIONARY): + _brackets = {'open':'{', 'close':'}'} + _desc_things = 'keys' + _diff_dictionary(v1, v2) + else: + _invalidate() + _utils.get_logger().error('Only Arrays and Dictionaries are supported.') + else: + _invalidate() + _utils.get_logger().error('Only Arrays and Dictionaries are supported.') + + +func _diff_array(a1, a2): + _total_count = max(a1.size(), a2.size()) + for i in range(a1.size()): + var result = null + if(i < a2.size()): + if(_diff_type == DEEP): + result = _compare.deep(a1[i], a2[i]) + else: + result = _compare.simple(a1[i], a2[i]) + else: + result = _compare.simple(a1[i], _compare.MISSING, 'index') + + if(!result.are_equal): + differences[i] = result + + if(a1.size() < a2.size()): + for i in range(a1.size(), a2.size()): + differences[i] = _compare.simple(_compare.MISSING, a2[i], 'index') + + +func _diff_dictionary(d1, d2): + var d1_keys = d1.keys() + var d2_keys = d2.keys() + + # Process all the keys in d1 + _total_count += d1_keys.size() + for key in d1_keys: + if(!d2.has(key)): + differences[key] = _compare.simple(d1[key], _compare.MISSING, 'key') + else: + d2_keys.remove(d2_keys.find(key)) + + var result = null + if(_diff_type == DEEP): + result = _compare.deep(d1[key], d2[key]) + else: + result = _compare.simple(d1[key], d2[key]) + + if(!result.are_equal): + differences[key] = result + + # Process all the keys in d2 that didn't exist in d1 + _total_count += d2_keys.size() + for i in range(d2_keys.size()): + differences[d2_keys[i]] = _compare.simple(_compare.MISSING, d2[d2_keys[i]], 'key') + + +func summarize(): + var summary = '' + + if(are_equal()): + summary = get_short_summary() + else: + var formatter = load('res://addons/gut/diff_formatter.gd').new() + formatter.set_max_to_display(max_differences) + summary = formatter.make_it(self) + + return summary + + +func are_equal(): + if(!_valid): + return null + else: + return differences.size() == 0 + + +func get_diff_type(): + return _diff_type + + +func get_value_1(): + return _value_1 + + +func get_value_2(): + return _value_2
\ No newline at end of file |
