Reorganize startup + complete logger rewrite
I reorganized everything previously in _ready() into multiple functions, should make the code more readable.
The logger is now fully rewritten too, this commit improves the logger from 46f83c8683
even more.
This commit is contained in:
parent
46f83c8683
commit
6479b02a46
2 changed files with 98 additions and 57 deletions
|
@ -3,11 +3,12 @@ extends Control
|
||||||
# Configuration for the configuration
|
# Configuration for the configuration
|
||||||
var config: Node = Node.new()
|
var config: Node = Node.new()
|
||||||
const config_path: String = "res://addons/besseretests_config.gd"
|
const config_path: String = "res://addons/besseretests_config.gd"
|
||||||
const config_keys: Dictionary = { "test_directory": TYPE_STRING, "loglevel": TYPE_INT, "print_orphan_nodes": TYPE_BOOL }
|
const config_keys: Dictionary = { "test_directory": TYPE_STRING, "log_level": TYPE_INT, "log_format": TYPE_STRING, "print_orphan_nodes": TYPE_BOOL }
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
var config_test_directory: String = "res://tests"
|
var config_test_directory: String = "res://tests"
|
||||||
var config_loglevel: int = 2
|
var config_log_level: int = 2
|
||||||
|
var config_log_format: String = "%color_start%%level% %origin%: %message%%color_end%"
|
||||||
var config_print_orphan_nodes: bool = false
|
var config_print_orphan_nodes: bool = false
|
||||||
|
|
||||||
# Statistics <3 & results
|
# Statistics <3 & results
|
||||||
|
@ -23,10 +24,30 @@ var stats_unknown: int = 0
|
||||||
# To stop any still running test
|
# To stop any still running test
|
||||||
var crashed: bool = false
|
var crashed: bool = false
|
||||||
|
|
||||||
|
# +++ initialization +++
|
||||||
|
# Startup function
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
|
|
||||||
# Load configuration
|
await load_config()
|
||||||
|
update_window_properties()
|
||||||
|
await perform_checks()
|
||||||
|
|
||||||
|
# Run test suites
|
||||||
|
for suite in DirAccess.get_files_at(config_test_directory):
|
||||||
|
if crashed: return
|
||||||
|
await run_suite(suite.replace(".gd", ""))
|
||||||
|
if crashed: return # Check if crashed
|
||||||
|
|
||||||
|
await print_results()
|
||||||
|
|
||||||
|
# Shutdown
|
||||||
|
if stats_all == stats_ok + stats_skip: terminate(0)
|
||||||
|
elif stats_all == stats_ok + stats_warn + stats_skip: terminate(1)
|
||||||
|
else: terminate(2)
|
||||||
|
|
||||||
|
# Load configuration
|
||||||
|
func load_config() -> void:
|
||||||
if FileAccess.file_exists(config_path):
|
if FileAccess.file_exists(config_path):
|
||||||
config.set_script(load(config_path))
|
config.set_script(load(config_path))
|
||||||
for config_key in config_keys:
|
for config_key in config_keys:
|
||||||
|
@ -35,7 +56,8 @@ func _ready() -> void:
|
||||||
ldiag("Configuration update: Key \"" + config_key + "\" has been updated")
|
ldiag("Configuration update: Key \"" + config_key + "\" has been updated")
|
||||||
set("config_" + config_key, config.get(config_key))
|
set("config_" + config_key, config.get(config_key))
|
||||||
|
|
||||||
# Update window properties
|
# Update window properties
|
||||||
|
func update_window_properties() -> void:
|
||||||
DisplayServer.window_set_size(Vector2i(960, 540))
|
DisplayServer.window_set_size(Vector2i(960, 540))
|
||||||
DisplayServer.window_set_title("Running tests")
|
DisplayServer.window_set_title("Running tests")
|
||||||
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED)
|
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED)
|
||||||
|
@ -48,17 +70,13 @@ func _ready() -> void:
|
||||||
DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_TRANSPARENT, false)
|
DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_TRANSPARENT, false)
|
||||||
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
|
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
|
||||||
|
|
||||||
|
# Perform startup checks
|
||||||
|
func perform_checks() -> void:
|
||||||
# Check for testing directory
|
# Check for testing directory
|
||||||
if !DirAccess.dir_exists_absolute(config_test_directory): await lcrash("Testing directory \"" + config_test_directory + "\" does not exist")
|
if !DirAccess.dir_exists_absolute(config_test_directory): await lcrash("Testing directory \"" + config_test_directory + "\" does not exist")
|
||||||
|
|
||||||
# Run test suites
|
# Print test results
|
||||||
for suite in DirAccess.get_files_at(config_test_directory):
|
func print_results() -> void:
|
||||||
if crashed: return
|
|
||||||
await run_suite(suite.replace(".gd", ""))
|
|
||||||
|
|
||||||
if crashed: return
|
|
||||||
|
|
||||||
# Print test results
|
|
||||||
lresu("")
|
lresu("")
|
||||||
lresu("Test results:")
|
lresu("Test results:")
|
||||||
for test in results:
|
for test in results:
|
||||||
|
@ -105,11 +123,69 @@ func _ready() -> void:
|
||||||
else: lerror(" -> " + str(stats_unknown) + " tests have an unknown status (fix that!)")
|
else: lerror(" -> " + str(stats_unknown) + " tests have an unknown status (fix that!)")
|
||||||
lresu("")
|
lresu("")
|
||||||
|
|
||||||
# Shutdown
|
# +++ logging +++
|
||||||
if stats_all == stats_ok + stats_skip: terminate(0)
|
# Main logging function
|
||||||
elif stats_all == stats_ok + stats_warn + stats_skip: terminate(1)
|
func _log(message: String, origin: String, level: int, sanitize: bool = true, level_name: String = "", level_color_start: String = "", level_color_end: String = "") -> void:
|
||||||
else: terminate(2)
|
if level >= config_log_level:
|
||||||
|
var format: String = config_log_format
|
||||||
|
|
||||||
|
# Replace common placeholders
|
||||||
|
format = format.replace("%time_us", str(Time.get_ticks_usec()))
|
||||||
|
format = format.replace("%time_ms%", str(Time.get_ticks_msec()))
|
||||||
|
format = format.replace("%time%", Time.get_time_string_from_system(true))
|
||||||
|
format = format.replace("%origin%", origin)
|
||||||
|
format = format.replace("%message%", message)
|
||||||
|
format = format.replace("%color%", "no!") # no!
|
||||||
|
if level != NAN: # except when level is not a number
|
||||||
|
format = format.replace("%color_start%", "[color=%color%]")
|
||||||
|
format = format.replace("%color_end%", "[/color]")
|
||||||
|
|
||||||
|
# Replace level-specific placeholders
|
||||||
|
match(level):
|
||||||
|
0:
|
||||||
|
format = format.replace("%level%", "DIAG")
|
||||||
|
format = format.replace("%color%", "gray")
|
||||||
|
1:
|
||||||
|
format = format.replace("%level%", "VERB")
|
||||||
|
format = format.replace("%color%", "gray")
|
||||||
|
2:
|
||||||
|
format = format.replace("%level%", "INFO")
|
||||||
|
format = format.replace("%color%", "white")
|
||||||
|
3:
|
||||||
|
format = format.replace("%level%", "WARN")
|
||||||
|
format = format.replace("%color%", "yellow")
|
||||||
|
4:
|
||||||
|
format = format.replace("%level%", "ERR!")
|
||||||
|
format = format.replace("%color%", "red")
|
||||||
|
NAN:
|
||||||
|
format = format.replace("%level%", level_name)
|
||||||
|
format = format.replace("%color_start%", level_color_start)
|
||||||
|
format = format.replace("%color_end%", level_color_end)
|
||||||
|
_:
|
||||||
|
assert(true, "Invalid level '" + str(level) + "' (message='" + message + "')")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Print message
|
||||||
|
print_rich(format)
|
||||||
|
|
||||||
|
# Crash
|
||||||
|
func lcrash(message: String, origin: String = "Bessere Tests") -> void:
|
||||||
|
crashed = true
|
||||||
|
_log(message, origin, NAN, true, "CRSH", "[color=red][b]", "[/b][/color]")
|
||||||
|
await terminate(69)
|
||||||
|
|
||||||
|
# Self explanitory
|
||||||
|
func lresu(message: String, origin: String = "Bessere Tests") -> void: _log(message, origin, NAN, false, "RESU", "[color=white]", "[/color]")
|
||||||
|
func ldiag(message: String, origin: String = "Bessere Tests") -> void: _log(message, origin, 0)
|
||||||
|
func lverb(message: String, origin: String = "Bessere Tests") -> void: _log(message, origin, 1)
|
||||||
|
func linfo(message: String, origin: String = "Bessere Tests") -> void: _log(message, origin, 2)
|
||||||
|
func lwarn(message: String, origin: String = "Bessere Tests") -> void: _log(message, origin, 3)
|
||||||
|
func lerror(message: String, origin: String = "Bessere Tests") -> void: _log(message, origin, 4)
|
||||||
|
|
||||||
|
# Message sanitization
|
||||||
|
func lsanitize(message: String) -> String: return message.replace("[", "[lb]").replace("]", "[rb]").replace("[lb[rb]", "[lb]").replace("\n", "\\n")
|
||||||
|
|
||||||
|
# +++ /etc/ +++
|
||||||
# Runs a test suite
|
# Runs a test suite
|
||||||
func run_suite(suite: String) -> void:
|
func run_suite(suite: String) -> void:
|
||||||
linfo("Running suite \"" + suite + "\"")
|
linfo("Running suite \"" + suite + "\"")
|
||||||
|
@ -162,43 +238,6 @@ func run_suite(suite: String) -> void:
|
||||||
# Remove suite node
|
# Remove suite node
|
||||||
get_tree().root.remove_child(suite_node)
|
get_tree().root.remove_child(suite_node)
|
||||||
suite_node.queue_free()
|
suite_node.queue_free()
|
||||||
|
|
||||||
# Logging
|
|
||||||
func _log(message: String, origin: String, level: int) -> void:
|
|
||||||
if level >= config_loglevel:
|
|
||||||
var level_name: String
|
|
||||||
var level_color: String
|
|
||||||
match(level):
|
|
||||||
0:
|
|
||||||
level_name = "DIAG"
|
|
||||||
level_color = "gray"
|
|
||||||
1:
|
|
||||||
level_name = "VERB"
|
|
||||||
level_color = "gray"
|
|
||||||
2:
|
|
||||||
level_name = "INFO"
|
|
||||||
level_color = "white"
|
|
||||||
3:
|
|
||||||
level_name = "WARN"
|
|
||||||
level_color = "yellow"
|
|
||||||
4:
|
|
||||||
level_name = "ERR!"
|
|
||||||
level_color = "red"
|
|
||||||
print_rich("[color=" + level_color + "]" + level_name + " " + origin + ": " + message.replace("\n", "\\n") + "[/color]")
|
|
||||||
func lresu(message: String, origin: String = "Bessere Tests") -> void: print_rich("[color=white]RESU " + origin + ": " + message + "[/color]")
|
|
||||||
func ldiag(message: String, origin: String = "Bessere Tests") -> void: _log(message, origin, 0)
|
|
||||||
func lverb(message: String, origin: String = "Bessere Tests") -> void: _log(message, origin, 1)
|
|
||||||
func linfo(message: String, origin: String = "Bessere Tests") -> void: _log(message, origin, 2)
|
|
||||||
func lwarn(message: String, origin: String = "Bessere Tests") -> void: _log(message, origin, 3)
|
|
||||||
func lerror(message: String, origin: String = "Bessere Tests") -> void: _log(message, origin, 4)
|
|
||||||
func lcrash(message: String, origin: String = "Bessere Tests") -> void:
|
|
||||||
crashed = true
|
|
||||||
print_rich("[color=red][b]CRSH " + origin + ": " + message + "[/b][/color]")
|
|
||||||
await terminate(69)
|
|
||||||
|
|
||||||
# Log message sanitization
|
|
||||||
func lsanitize(message: String) -> String: return message.replace("[", "[lb]").replace("]", "[rb]").replace("[lb[rb]", "[lb]").replace("\n", "\\n")
|
|
||||||
|
|
||||||
# Terminates the engine
|
# Terminates the engine
|
||||||
func terminate(exit_code: int = 0) -> void:
|
func terminate(exit_code: int = 0) -> void:
|
||||||
config.queue_free()
|
config.queue_free()
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
var test_directory: String = "res://addons/besseretests/examples/"
|
var test_directory: String = "res://addons/besseretests/examples/"
|
||||||
|
var log_level: int = 0
|
||||||
|
var log_format = null
|
||||||
var print_orphan_nodes: bool = true
|
var print_orphan_nodes: bool = true
|
||||||
|
|
Loading…
Reference in a new issue