view test/fntests.m @ 5836:ed69a3b5b3d0

[project @ 2006-06-01 16:16:00 by jwe]
author jwe
date Thu, 01 Jun 2006 16:16:01 +0000
parents faafc2d98b8d
children 257643fc806b
line wrap: on
line source

clear all;

global topsrcdir;

currdir = canonicalize_file_name (".");

if (nargin == 1)
  xdir = argv(){1};
else
  xdir = ".";
endif

srcdir = canonicalize_file_name (xdir);
topsrcdir = canonicalize_file_name (fullfile (xdir, ".."));

if (strcmp (currdir, srcdir))
  testdirs = {srcdir};
else
  testdirs = {currdir, srcdir};
endif

src_tree = canonicalize_file_name (fullfile (topsrcdir, "src"));
script_tree = canonicalize_file_name (fullfile (topsrcdir, "scripts"));
fundirs = {src_tree, script_tree};

function print_test_file_name (nm)
  filler = repmat (".", 1, 55-length (nm));
  printf ("  %s %s", nm, filler);
endfunction

function print_pass_fail (n, p)
  if (n > 0)
    printf (" PASS %4d/%-4d", p, n);
    nfail = n - p;
    if (nfail > 0)
      printf (" FAIL %d", nfail);
    endif
  else
    printf (" no tests");
  endif
  printf ("\n");
endfunction

function [dp, dn] = run_test_dir (fid, d);
  lst = dir (d);
  dp = dn = 0;
  for i = 1:length (lst)
    nm = lst(i).name;
    if (length (nm) > 5 && strcmp (nm(1:5), "test_")
	&& strcmp (nm((end-1):end), ".m"))
      print_test_file_name (nm);
      [p, n] = test (nm(1:(end-2)), "quiet", fid);
      print_pass_fail (n, p);
      dp += p;
      dn += n;
    endif
  endfor
endfunction

function y = hastests (f)
  fid = fopen (f);
  str = fscanf (fid, "%s");
  if (findstr (str, "%!test") || findstr (str, "%!assert")
      || findstr (str, "%!error") || findstr (str, "%!warning"))
    y = 1;
  else
    y = 0;
  endif
  fclose (fid);
endfunction

function [dp, dn] = run_test_script (fid, d);
  global topsrcdir;
  lst = dir (d);
  dp = dn = 0;
  for i = 1:length (lst)
    nm = lst(i).name;
    if (lst(i).isdir && ! strcmp (nm, ".") && ! strcmp (nm, "..")
	&& ! strcmp (nm, "CVS"))
      [p, n] = run_test_script (fid, [d, "/", nm]);
      dp += p;
      dn += n;
    endif
  endfor
  for i = 1:length (lst)
    nm = lst(i).name;
    if ((length (nm) > 3 && strcmp (nm((end-2):end), ".cc"))
	|| (length (nm) > 2 && strcmp (nm((end-1):end), ".m")))
      f = fullfile (d, nm);
      print_test_file_name (strrep (f, [topsrcdir, "/"], ""));
      p = n = 0;
      ## Only run if it contains %!test, %!assert %!error or %!warning
      if (hastests (f))
	[p, n] = test (f, "quiet", fid);
	dp += p;
	dn += n;
      endif
      print_pass_fail (n, p);
    endif
  endfor 
  ##  printf("%s%s -> passes %d of %d tests\n", ident, d, dp, dn);
endfunction

function printf_assert (varargin)
  global _assert_printf;
  _assert_printf = cat (2, _assert_printf, sprintf (varargin{:}));
endfunction

function ret = prog_output_assert (str)
  global _assert_printf;
  if (isempty (_assert_printf))
    ret = isempty (str);
  elseif (_assert_printf(end) == "\n")
    ret = strcmp (_assert_printf(1:(end-1)), str);
  else
    ret = strcmp (_assert_printf, str);
  endif
  _assert_printf = "";
endfunction

pso = page_screen_output ();
warn_state = warning ("query", "quiet");
warning ("on", "quiet");
try
  page_screen_output (0);
  fid = fopen ("fntests.log", "wt");
  if (fid < 0)
    error ("could not open fntests.log for writing");
  endif
  test ("", "explain", fid);
  dp = dn = 0;
  printf ("\nIntegrated test scripts:\n\n");
  for i = 1:length (fundirs)
    [p, n] = run_test_script (fid, fundirs{i});
    dp += p;
    dn += n;
  endfor
  printf ("\nFixed test scripts:\n\n");
  for i = 1:length (testdirs)
    [p, n] = run_test_dir (fid, testdirs{i});
    dp += p;
    dn += n;
  endfor
  printf ("\nSummary:\n\n  PASS %6d\n", dp);
  nfail = dn - dp;
  printf ("  FAIL %6d\n", nfail);
  printf ("\nSee fntests.log for details.\n");
  fclose (fid);
  page_screen_output (pso);
  warning (warn_state.state, "quiet");
catch
  page_screen_output (pso);
  warning (warn_state.state, "quiet");
  disp (lasterr ());
end_try_catch