summaryrefslogtreecommitdiff
path: root/addons/gut/logger.gd
diff options
context:
space:
mode:
authorSophia Pearson <codergal89@gmail.com>2022-05-20 00:45:25 +0200
committerSophia Pearson <codergal89@gmail.com>2022-05-20 18:56:04 +0200
commit05d29ccce1898ed89c0b650c77242c2fa2805128 (patch)
treee8ee3bcb570fa6f3d9d96273c2bf4d4c8618d08b /addons/gut/logger.gd
downloadtexty-05d29ccce1898ed89c0b650c77242c2fa2805128.tar.xz
texty-05d29ccce1898ed89c0b650c77242c2fa2805128.zip
texty: initial commit
Diffstat (limited to 'addons/gut/logger.gd')
-rw-r--r--addons/gut/logger.gd348
1 files changed, 348 insertions, 0 deletions
diff --git a/addons/gut/logger.gd b/addons/gut/logger.gd
new file mode 100644
index 0000000..900b928
--- /dev/null
+++ b/addons/gut/logger.gd
@@ -0,0 +1,348 @@
+# ##############################################################################
+#(G)odot (U)nit (T)est class
+#
+# ##############################################################################
+# The MIT License (MIT)
+# =====================
+#
+# Copyright (c) 2020 Tom "Butch" Wesley
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+# ##############################################################################
+# This class wraps around the various printers and supplies formatting for the
+# various message types (error, warning, etc).
+# ##############################################################################
+var types = {
+ debug = 'debug',
+ deprecated = 'deprecated',
+ error = 'error',
+ failed = 'failed',
+ info = 'info',
+ normal = 'normal',
+ orphan = 'orphan',
+ passed = 'passed',
+ pending = 'pending',
+ warn ='warn',
+}
+
+var fmts = {
+ red = 'red',
+ yellow = 'yellow',
+ green = 'green',
+
+ bold = 'bold',
+ underline = 'underline',
+
+ none = null
+}
+
+var _type_data = {
+ types.debug: {disp='DEBUG', enabled=true, fmt=fmts.none},
+ types.deprecated: {disp='DEPRECATED', enabled=true, fmt=fmts.none},
+ types.error: {disp='ERROR', enabled=true, fmt=fmts.red},
+ types.failed: {disp='Failed', enabled=true, fmt=fmts.red},
+ types.info: {disp='INFO', enabled=true, fmt=fmts.bold},
+ types.normal: {disp='NORMAL', enabled=true, fmt=fmts.none},
+ types.orphan: {disp='Orphans', enabled=true, fmt=fmts.yellow},
+ types.passed: {disp='Passed', enabled=true, fmt=fmts.green},
+ types.pending: {disp='Pending', enabled=true, fmt=fmts.yellow},
+ types.warn: {disp='WARNING', enabled=true, fmt=fmts.yellow},
+}
+
+var _logs = {
+ types.warn: [],
+ types.error: [],
+ types.info: [],
+ types.debug: [],
+ types.deprecated: [],
+}
+
+var _printers = {
+ terminal = null,
+ gui = null,
+ console = null
+}
+
+var _gut = null
+var _utils = null
+var _indent_level = 0
+var _indent_string = ' '
+var _skip_test_name_for_testing = false
+var _less_test_names = false
+var _yield_calls = 0
+var _last_yield_text = ''
+
+
+func _init():
+ _utils = load('res://addons/gut/utils.gd').get_instance()
+ _printers.terminal = _utils.Printers.TerminalPrinter.new()
+ _printers.console = _utils.Printers.ConsolePrinter.new()
+ # There were some problems in the timing of disabling this at the right
+ # time in gut_cmdln so it is disabled by default. This is enabled
+ # by plugin_control.gd based on settings.
+ _printers.console.set_disabled(true)
+
+func get_indent_text():
+ var pad = ''
+ for i in range(_indent_level):
+ pad += _indent_string
+
+ return pad
+
+func _indent_text(text):
+ var to_return = text
+ var ending_newline = ''
+
+ if(text.ends_with("\n")):
+ ending_newline = "\n"
+ to_return = to_return.left(to_return.length() -1)
+
+ var pad = get_indent_text()
+ to_return = to_return.replace("\n", "\n" + pad)
+ to_return += ending_newline
+
+ return pad + to_return
+
+func _should_print_to_printer(key_name):
+ return _printers[key_name] != null and !_printers[key_name].get_disabled()
+
+func _print_test_name():
+ if(_gut == null):
+ return
+ var cur_test = _gut.get_current_test_object()
+ if(cur_test == null):
+ return false
+
+ if(!cur_test.has_printed_name):
+ _output('* ' + cur_test.name + "\n")
+ cur_test.has_printed_name = true
+
+func _output(text, fmt=null):
+ for key in _printers:
+ if(_should_print_to_printer(key)):
+ var info = ''#str(self, ':', key, ':', _printers[key], '| ')
+ _printers[key].send(info + text, fmt)
+
+func _log(text, fmt=fmts.none):
+ _print_test_name()
+ var indented = _indent_text(text)
+ _output(indented, fmt)
+
+# ---------------
+# Get Methods
+# ---------------
+func get_warnings():
+ return get_log_entries(types.warn)
+
+func get_errors():
+ return get_log_entries(types.error)
+
+func get_infos():
+ return get_log_entries(types.info)
+
+func get_debugs():
+ return get_log_entries(types.debug)
+
+func get_deprecated():
+ return get_log_entries(types.deprecated)
+
+func get_count(log_type=null):
+ var count = 0
+ if(log_type == null):
+ for key in _logs:
+ count += _logs[key].size()
+ else:
+ count = _logs[log_type].size()
+ return count
+
+func get_log_entries(log_type):
+ return _logs[log_type]
+
+# ---------------
+# Log methods
+# ---------------
+func _output_type(type, text):
+ var td = _type_data[type]
+ if(!td.enabled):
+ return
+
+ _print_test_name()
+ if(type != types.normal):
+ if(_logs.has(type)):
+ _logs[type].append(text)
+
+ var start = str('[', td.disp, ']')
+ if(text != null and text != ''):
+ start += ': '
+ else:
+ start += ' '
+ var indented_start = _indent_text(start)
+ var indented_end = _indent_text(text)
+ indented_end = indented_end.lstrip(_indent_string)
+ _output(indented_start, td.fmt)
+ _output(indented_end + "\n")
+
+func debug(text):
+ _output_type(types.debug, text)
+
+# supply some text or the name of the deprecated method and the replacement.
+func deprecated(text, alt_method=null):
+ var msg = text
+ if(alt_method):
+ msg = str('The method ', text, ' is deprecated, use ', alt_method , ' instead.')
+ return _output_type(types.deprecated, msg)
+
+func error(text):
+ _output_type(types.error, text)
+
+func failed(text):
+ _output_type(types.failed, text)
+
+func info(text):
+ _output_type(types.info, text)
+
+func orphan(text):
+ _output_type(types.orphan, text)
+
+func passed(text):
+ _output_type(types.passed, text)
+
+func pending(text):
+ _output_type(types.pending, text)
+
+func warn(text):
+ _output_type(types.warn, text)
+
+func log(text='', fmt=fmts.none):
+ end_yield()
+ if(text == ''):
+ _output("\n")
+ else:
+ _log(text + "\n", fmt)
+ return null
+
+func lograw(text, fmt=fmts.none):
+ return _output(text, fmt)
+
+# Print the test name if we aren't skipping names of tests that pass (basically
+# what _less_test_names means))
+func log_test_name():
+ # suppress output if we haven't printed the test name yet and
+ # what to print is the test name.
+ if(!_less_test_names):
+ _print_test_name()
+
+# ---------------
+# Misc
+# ---------------
+func get_gut():
+ return _gut
+
+func set_gut(gut):
+ _gut = gut
+ if(_gut == null):
+ _printers.gui = null
+ else:
+ if(_printers.gui == null):
+ _printers.gui = _utils.Printers.GutGuiPrinter.new()
+ _printers.gui.set_gut(gut)
+
+func get_indent_level():
+ return _indent_level
+
+func set_indent_level(indent_level):
+ _indent_level = indent_level
+
+func get_indent_string():
+ return _indent_string
+
+func set_indent_string(indent_string):
+ _indent_string = indent_string
+
+func clear():
+ for key in _logs:
+ _logs[key].clear()
+
+func inc_indent():
+ _indent_level += 1
+
+func dec_indent():
+ _indent_level = max(0, _indent_level -1)
+
+func is_type_enabled(type):
+ return _type_data[type].enabled
+
+func set_type_enabled(type, is_enabled):
+ _type_data[type].enabled = is_enabled
+
+func get_less_test_names():
+ return _less_test_names
+
+func set_less_test_names(less_test_names):
+ _less_test_names = less_test_names
+
+func disable_printer(name, is_disabled):
+ _printers[name].set_disabled(is_disabled)
+
+func is_printer_disabled(name):
+ return _printers[name].get_disabled()
+
+func disable_formatting(is_disabled):
+ for key in _printers:
+ _printers[key].set_format_enabled(!is_disabled)
+
+func get_printer(printer_key):
+ return _printers[printer_key]
+
+func _yield_text_terminal(text):
+ var printer = _printers['terminal']
+ if(_yield_calls != 0):
+ printer.clear_line()
+ printer.back(_last_yield_text.length())
+ printer.send(text, fmts.yellow)
+
+func _end_yield_terminal():
+ var printer = _printers['terminal']
+ printer.clear_line()
+ printer.back(_last_yield_text.length())
+
+func _yield_text_gui(text):
+ var lbl = _gut.get_gui().get_waiting_label()
+ lbl.visible = true
+ lbl.set_bbcode('[color=yellow]' + text + '[/color]')
+
+func _end_yield_gui():
+ var lbl = _gut.get_gui().get_waiting_label()
+ lbl.visible = false
+ lbl.set_text('')
+
+func yield_text(text):
+ _yield_text_terminal(text)
+ _yield_text_gui(text)
+ _last_yield_text = text
+ _yield_calls += 1
+
+func end_yield():
+ if(_yield_calls == 0):
+ return
+ _end_yield_terminal()
+ _end_yield_gui()
+ _yield_calls = 0
+ _last_yield_text = ''