diff --git a/vlib/log/log.v b/vlib/log/log.v index cfe49e17cc..f819b8c1d8 100644 --- a/vlib/log/log.v +++ b/vlib/log/log.v @@ -63,6 +63,7 @@ pub fn level_from_tag(tag string) ?Level { // Logger is an interface that describes a generic Logger pub interface Logger { +mut: fatal(s string) error(s string) warn(s string) diff --git a/vlib/log/log_test.v b/vlib/log/log_test.v new file mode 100644 index 0000000000..388eef7979 --- /dev/null +++ b/vlib/log/log_test.v @@ -0,0 +1,92 @@ +module log + +import time + +fn log_mutable_statements(mut log Log) { + println(@FN + ' start') + log.info('info') + log.warn('warn') + log.error('error') + log.debug('no output for debug') + log.set_level(.debug) + log.debug('debug now') + log.set_level(level_from_tag('INFO') or { Level.disabled }) + log.info('info again') + log.set_level(level_from_tag('') or { Level.disabled }) + log.error('no output anymore') + println(@FN + ' end') +} + +fn logger_mutable_statements(mut log Logger) { + println(@FN + ' start') + log.info('info') + log.warn('warn') + log.error('error') + log.debug('no output for debug') + // log.set_level(.debug) // not usable here because not part of Logger interface + println(@FN + ' end') +} + +fn delay() { + time.sleep(1 * time.second) +} + +// new_log create and return a new Log reference +pub fn new_log() &Log { + return &Log{ + level: .info + } // reference needed for its parallel usage +} + +// new_log_as_logger create and return a new Log reference as a generic Logger +pub fn new_log_as_logger() &Logger { + return &Log{ + level: .info + } // reference needed for its parallel usage +} + +fn test_log_mutable() { + println(@FN + ' start') + mut log := Log{} + log.set_level(.info) + log_mutable_statements(mut log) + assert true + println(@FN + ' end') +} + +/* +// TODO: with Logger methods requiring a mutable instance, now I get a compilation error: `l` is immutable, declare it with `mut` to make it mutable ... check if it's good the same now and/or what to do ... wip +fn test_log_not_mutable() { + println(@FN + ' start') + l := log.Log{} + + l.info('info') + l.warn('warn') + l.error('error') + l.debug('no output for debug') + + assert true + println(@FN + ' end') +} +*/ + +fn test_log_mutable_reference() { + println(@FN + ' start') + mut log := new_log() + assert typeof(log).name == '&log.Log' + go log_mutable_statements(mut log) + delay() // wait to finish + assert true + println(@FN + ' end') +} + +fn test_logger_mutable_reference() { + println(@FN + ' start') + // get log as Logger and use it + mut logger := new_log_as_logger() + assert typeof(logger).name == '&log.Logger' + go logger_mutable_statements(mut logger) + delay() // wait to finish + assert true + println(@FN + ' end') +}