source: PSPA/madxPSPA/tools/numdiff/src/utest.c

Last change on this file was 430, checked in by touze, 11 years ago

import madx-5.01.00

File size: 3.1 KB
Line 
1/*
2 o---------------------------------------------------------------------o
3 |
4 | Numdiff
5 |
6 | Copyright (c) 2012+ laurent.deniau@cern.ch
7 | Gnu General Public License
8 |
9 o---------------------------------------------------------------------o
10 
11   Purpose:
12     manage unit tests
13     display results
14 
15 o---------------------------------------------------------------------o
16*/
17
18#include <stdio.h>
19#include <stdlib.h>
20#include <string.h>
21#include <assert.h>
22#include <time.h>
23
24#include "utils.h"
25#include "utest.h"
26#include "error.h"
27
28// ----- constants
29
30#ifndef MAXUTESTKEEP
31#define MAXUTESTKEEP 25
32#endif
33
34enum { UTEST_KEEP = MAXUTESTKEEP };
35
36static const char *const fail_str = CSTR_RED  ("FAIL");
37static const char *const pass_str = CSTR_GREEN("PASS");
38
39// ----- types
40
41struct utest {
42  // output file
43  FILE*       out;
44
45  // history of failed tests
46  const char* fail_cond[UTEST_KEEP];
47  const char* fail_file[UTEST_KEEP];
48  int         fail_line[UTEST_KEEP];
49  int         fail_n;
50
51  // current test info
52  const char* test_str;
53  int         pass_cnt;
54  int         fail_cnt;
55  double      test_t0;
56
57  // tests stat
58  int         total_pass;
59  int         total_fail;
60  double      total_time;
61};
62
63// ----- public
64
65struct utest*
66utest_alloc(FILE *out)
67{
68  struct utest *ut = malloc(sizeof *ut);
69  ensure(ut, "out of memory");
70
71  ut->out = out ? out : stdout;
72  ut->fail_n     = 0;
73  ut->total_pass = 0;
74  ut->total_fail = 0;
75  ut->total_time = 0;
76
77  return ut;
78}
79
80void
81utest_free(struct utest *ut)
82{
83  assert(ut);
84  free(ut);
85}
86
87void
88utest_title(struct utest *ut, const char *str)
89{
90  fprintf(ut->out, " [ %s ]\n", str);
91}
92
93void
94utest_init(struct utest *ut, const char *str)
95{
96  assert(ut);
97
98  fprintf(ut->out, " + %-50s ", str);
99  ut->test_str  = str;
100  ut->pass_cnt  = 0;
101  ut->fail_cnt  = 0;
102  ut->fail_n    = 0;
103  ut->test_t0   = clock();
104}
105
106int
107utest_test(struct utest *ut, int pass, const char *cond, const char *file, int line)
108{
109  assert(ut);
110
111  if (pass)
112    ++ut->pass_cnt;
113  else {
114    ++ut->fail_cnt;
115    if (ut->fail_n < UTEST_KEEP) {
116      const char *p = strrchr(file, '/');
117      if (p) file = p+1;
118      ut->fail_cond[ut->fail_n  ] = cond;
119      ut->fail_file[ut->fail_n  ] = file;
120      ut->fail_line[ut->fail_n++] = line;
121    }
122  }
123
124  return ut->fail_cnt;
125}
126
127void
128utest_fini(struct utest *ut)
129{
130  assert(ut);
131
132  double t1 = clock();
133  double t = (t1 - ut->test_t0) / CLOCKS_PER_SEC;
134 
135  fprintf(ut->out,
136          "(%.2f s) - %3d/%3d : %s\n",
137          t,
138          ut->pass_cnt,
139          ut->pass_cnt+ut->fail_cnt,
140          ut->fail_cnt ? fail_str : pass_str);
141
142  for (int i = 0; i < ut->fail_n; i++)
143    fprintf(ut->out,
144            "   - (%s,%d) %s\n",
145            ut->fail_file[i],
146            ut->fail_line[i],
147            ut->fail_cond[i]);
148
149  ut->total_time += t;
150  ut->total_pass += ut->pass_cnt;
151  ut->total_fail += ut->fail_cnt;
152}
153
154void
155utest_stat(struct utest *ut)
156{
157  assert(ut);
158
159  fprintf(ut->out,
160  " = %5d total, %5d passed, %5d failed            (%.2f s)             %s\n",
161    ut->total_pass+ut->total_fail,
162    ut->total_pass,
163    ut->total_fail,
164    ut->total_time,
165    ut->total_fail ? fail_str : pass_str);
166}
167
Note: See TracBrowser for help on using the repository browser.