Skip to content

Commit fd6c1cb

Browse files
committed
Add active, write_to_console, pause, and resume actions for mp.logger.manager.
And clean up handling of default arguments for mp.logger constructor.
1 parent f61a449 commit fd6c1cb

4 files changed

Lines changed: 103 additions & 12 deletions

File tree

CHANGES.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Change history for MP-Test
55
since 8.1
66
---------
77

8-
#### 7/23/26
8+
#### 7/30/26
99
- Use recently added `mp_printf()` in place of `fprintf()` everywhere to
1010
allow redirecting of console output.
1111
- Add `mp.logger` class, and `mp_printf()` and `mp_disp()` functions

lib/+mp/logger.m

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,16 @@
104104

105105
%% set default inputs
106106
default_log_file_name = 'mp.logger_log.txt';
107-
if nargin < 4
107+
if nargin < 4 || isempty(write_to_console)
108108
write_to_console = false;
109-
if nargin < 3
110-
permission = 'a';
111-
end
112109
end
113-
if nargin < 2 || isempty(log_file_path)
114-
log_file_path = '.';
110+
if nargin < 3 || isempty(permission)
111+
permission = 'a';
112+
end
113+
if nargin < 2
114+
log_file_path = '';
115115
end
116-
if exist(log_file_path, 'dir')
116+
if isempty(log_file_path) || exist(log_file_path, 'dir')
117117
log_file_path = fullfile(log_file_path, default_log_file_name);
118118
end
119119

@@ -231,15 +231,24 @@
231231
% mp.logger.manager('init', log_file_path, permission, write_to_console);
232232
% logger = mp.logger.manager('get');
233233
% log_file_path = mp.logger.manager('path');
234+
% TorF = mp.logger.manager('write_to_console');
235+
% TorF = mp.logger.manager('active');
236+
% mp.logger.manager('pause');
237+
% mp.logger.manager('resume');
234238
% mp.logger.manager('clear');
235239
%
236240
% Inputs:
237241
% action (char array) : one of:
238242
%
239243
% - ``'init'`` - initialize logger object, after clearing any
240244
% existing one
245+
% - ``'active'`` - return true if a logger is active
241246
% - ``'get'`` - retreive logger object
242247
% - ``'clear'`` - clear logger object
248+
% - ``'write_to_console'`` - return true if logger writes
249+
% to console in addition to logging to file
250+
% - ``'pause'`` - pause (temporarily disable) logger
251+
% - ``'resume'`` - resume (re-enable) paused logger
243252
% - ``<other>`` - any other action, along with subsequent
244253
% input arguments is passed to the manage() method of the
245254
% logger object
@@ -260,9 +269,12 @@
260269
% manage() method determines the number and content of output
261270
% arguments
262271

263-
persistent logger; %% logger object (or empty)
272+
persistent logger; %% logger object (or empty)
273+
persistent logger_paused; %% inactive (paused) logger object (or empty)
264274

265275
switch lower(action)
276+
case 'active'
277+
[varargout{1:nargout}] = ~isempty(logger);
266278
case 'get'
267279
[varargout{1:nargout}] = logger;
268280
case 'init'
@@ -281,6 +293,32 @@
281293
logger.finalize();
282294
logger = [];
283295
end
296+
if ~isempty(logger_paused)
297+
logger_paused.finalize();
298+
logger_paused = [];
299+
end
300+
case 'write_to_console'
301+
if ~isempty(logger)
302+
if length(varargin) > 0
303+
logger.write_to_console = varargin{1} ~= 0;
304+
else
305+
[varargout{1:nargout}] = logger.write_to_console;
306+
end
307+
else
308+
if length(varargin) == 0
309+
[varargout{1:nargout}] = true;
310+
end
311+
end
312+
case 'pause'
313+
if ~isempty(logger) && isempty(logger_paused)
314+
logger_paused = logger;
315+
logger = [];
316+
end
317+
case 'resume'
318+
if ~isempty(logger_paused) && isempty(logger)
319+
logger = logger_paused;
320+
logger_paused = [];
321+
end
284322
otherwise
285323
if isempty(logger)
286324
[varargout{1:nargout}] = [];

lib/mptestver.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
% See https://github.com/MATPOWER/mptest for more info.
2323

2424
v = struct( 'Name', 'MP-Test', ...
25-
'Version', '8.1+', ...
25+
'Version', '8.2-dev', ...
2626
'Release', '', ...
27-
'Date', '23-Jul-2026' );
27+
'Date', '30-Jul-2026' );
2828
if nargout > 0
2929
if nargin > 0
3030
rv = v;

lib/t/t_mp_logger.m

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ function t_mp_logger(quiet)
1717
quiet = 0;
1818
end
1919

20-
n_tests = 20;
20+
n_tests = 44;
2121

2222
t_begin(n_tests, quiet);
2323

@@ -37,6 +37,8 @@ function t_mp_logger(quiet)
3737

3838
%% no redirection
3939
t = 'no redirection : ';
40+
t_ok(~mp.logger.manager('active'), [t 'not active']);
41+
t_ok(mp.logger.manager('write_to_console'), [t 'write_to_console']);
4042
fname_got = mp.logger.manager('path');
4143
t_ok(isempty(fname_got), [t 'log file path (empty)']);
4244
c = evalc('mp_disp(sprintf(''This is %d\nlines of\ntext (%s).\n'', 3, ''I think'')); mp_disp(exp(1));');
@@ -62,21 +64,29 @@ function t_mp_logger(quiet)
6264
t = 'redirect to file : ';
6365
fname = sprintf('redir-disp-%d.txt', fix(rand*1e8));
6466
mp.logger.manager('init', fname);
67+
active = mp.logger.manager('active');
68+
write_to_console = mp.logger.manager('write_to_console');
6569
mp_disp(exp(1));
6670
c = evalc('mp_disp(sprintf(''This is %d\nlines of\ntext (%s).\n'', 3, ''I think''));');
6771
fname_got = mp.logger.manager('path');
6872
mp.logger.manager('clear', fname);
73+
t_ok(active, [t 'active']);
74+
t_ok(~write_to_console, [t 'not write_to_console']);
6975
t_str_match(fname_got, fname, [t 'log file path']);
7076
t_file_match(fname, redir_disp_fname, [t 'mp_disp - file w/expected content'], {}, true);
7177
t_ok(isempty(c), [t 'mp_disp - no console output']);
7278
t_ok(isempty(mp.logger.manager('get')), [t 'mp.logger.manage(''clear'')']);
7379

7480
fname = sprintf('redir-printf-%d.txt', fix(rand*1e8));
7581
mp.logger.manager('init', fname);
82+
active = mp.logger.manager('active');
83+
write_to_console = mp.logger.manager('write_to_console');
7684
mp_printf('This is %d\nlines of\ntext (%s).\n', 3, 'I think');
7785
c = evalc('mp_printf(''Hello %s!\n\n'', ''mp_printf'');');
7886
fname_got = mp.logger.manager('path');
7987
mp.logger.manager('clear', fname);
88+
t_ok(active, [t 'active']);
89+
t_ok(~write_to_console, [t 'not write_to_console']);
8090
t_str_match(fname_got, fname, [t 'log file path']);
8191
t_file_match(fname, redir_printf_fname, [t 'mp_printf - file w/expected content'], {}, true);
8292
t_ok(isempty(c), [t 'mp_printf - no console output']);
@@ -86,6 +96,8 @@ function t_mp_logger(quiet)
8696
t = 'both : ';
8797
fname = sprintf('redir-disp-%d.txt', fix(rand*1e8));
8898
mp.logger.manager('init', fname, 'a', 1);
99+
active = mp.logger.manager('active');
100+
write_to_console = mp.logger.manager('write_to_console');
89101
c = evalc('mp_disp(exp(1)); mp_disp(sprintf(''This is %d\nlines of\ntext (%s).\n'', 3, ''I think''));');
90102
if have_feature('octave')
91103
if have_feature('octave', 'vnum') < 6
@@ -98,6 +110,8 @@ function t_mp_logger(quiet)
98110
end
99111
fname_got = mp.logger.manager('path');
100112
mp.logger.manager('clear', fname);
113+
t_ok(active, [t 'active']);
114+
t_ok(write_to_console, [t 'write_to_console']);
101115
t_str_match(fname_got, fname, [t 'log file path']);
102116
t_file_match(fname, redir_disp_fname, [t 'mp_disp - file w/expected content'], {}, true);
103117
if ~t_str_match(c, expected, [t 'mp_disp - outputs to console']);
@@ -108,17 +122,56 @@ function t_mp_logger(quiet)
108122

109123
fname = sprintf('redir-printf-%d.txt', fix(rand*1e8));
110124
mp.logger.manager('init', fname, 'w', 1);
125+
active = mp.logger.manager('active');
126+
write_to_console = mp.logger.manager('write_to_console');
111127
c = evalc(' mp_printf(''This is %d\nlines of\ntext (%s).\n'', 3, ''I think''); mp_printf(''Hello %s!\n\n'', ''mp_printf'');');
112128
expected = sprintf('This is 3\nlines of\ntext (I think).\nHello mp_printf!\n\n');
113129
fname_got = mp.logger.manager('path');
114130
mp.logger.manager('clear', fname);
131+
t_ok(active, [t 'active']);
132+
t_ok(write_to_console, [t 'write_to_console']);
115133
t_str_match(fname_got, fname, [t 'log file path']);
116134
t_file_match(fname, redir_printf_fname, [t 'mp_printf - file w/expected content'], {}, true);
117135
t_str_match(c, expected, [t 'mp_printf - outputs to console']);
118136
t_ok(isempty(mp.logger.manager('get')), [t 'mp.logger.manage(''clear'')']);
137+
t_ok(~mp.logger.manager('active'), [t 'not active']);
138+
t_ok(mp.logger.manager('write_to_console'), [t 'write_to_console']);
119139

120140
fname_got = mp.logger.manager('path');
121141
t_ok(isempty(fname_got), [t 'log file path (empty)']);
142+
143+
%% pause
144+
t = 'pause : ';
145+
fname = sprintf('redir-printf-%d.txt', fix(rand*1e8));
146+
mp.logger.manager('init', fname);
147+
active = mp.logger.manager('active');
148+
write_to_console = mp.logger.manager('write_to_console');
149+
mp.logger.manager('pause');
150+
t_ok(active, [t 'active (before pause)']);
151+
t_ok(~write_to_console, [t 'not write_to_console (before pause)']);
152+
t_ok(~mp.logger.manager('active'), [t 'not active']);
153+
t_ok(mp.logger.manager('write_to_console'), [t 'write_to_console']);
154+
fname_got = mp.logger.manager('path');
155+
t_ok(isempty(fname_got), [t 'log file path (empty)']);
156+
c = evalc('mp_printf(''Hello %s!\n\n'', ''mp_printf''); mp_printf(''This is %d\nlines of\ntext (%s).\n'', 3, ''I think'');');
157+
expected = sprintf('Hello mp_printf!\n\nThis is 3\nlines of\ntext (I think).\n');
158+
t_str_match(c, expected, [t 'mp_printf - outputs to console']);
159+
160+
%% resume
161+
t = 'resume : ';
162+
mp.logger.manager('resume');
163+
active = mp.logger.manager('active');
164+
write_to_console = mp.logger.manager('write_to_console');
165+
mp_printf('This is %d\nlines of\ntext (%s).\n', 3, 'I think');
166+
c = evalc('mp_printf(''Hello %s!\n\n'', ''mp_printf'');');
167+
fname_got = mp.logger.manager('path');
168+
mp.logger.manager('clear', fname);
169+
t_ok(active, [t 'active']);
170+
t_ok(~write_to_console, [t 'not write_to_console']);
171+
t_str_match(fname_got, fname, [t 'log file path']);
172+
t_file_match(fname, redir_printf_fname, [t 'mp_printf - file w/expected content'], {}, true);
173+
t_ok(isempty(c), [t 'mp_printf - no console output']);
174+
t_ok(isempty(mp.logger.manager('get')), [t 'mp.logger.manage(''clear'')']);
122175
else
123176
t_skip(n_tests, 'mp.logger object in use, tests will not work');
124177
end

0 commit comments

Comments
 (0)