- Completely restructured the checks in subdir check/.
[ginac.git] / check / exam_misc.cpp
1 /** @file exam_misc.cpp
2  *
3  */
4 /*
5  *  GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2 of the License, or
10  *  (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22
23 #include "exams.h"
24
25 #define VECSIZE 30
26 static unsigned exam_expand_subs(void)
27 {
28     unsigned result = 0;
29     symbol a1("a1");
30     symbol a[VECSIZE];
31     ex e, aux;
32     
33     a[1] = a1;
34     for (unsigned i=0; i<VECSIZE; ++i) {
35         e = e + a[i];
36     }
37     
38     // prepare aux so it will swallow anything but a1^2:
39     aux = -e + a[0] + a[1];
40     e = expand(subs(expand(pow(e, 2)), a[0] == aux));
41     
42     if (e != pow(a1,2)) {
43         clog << "Denny Fliegner's quick consistency check erroneously returned "
44              << e << "." << endl;
45         ++result;
46     }
47     
48     return result;
49 }
50
51 /*  A simple modification of Denny Fliegner's three step consistency test:
52  *  1)  e = (a0 + a1)^200
53  *  2)  expand e
54  *  3)  substitute a0 by -a1 in e
55  *  after which e should return 0 (without expanding). */
56 static unsigned exam_expand_subs2(void)
57 {
58     unsigned result = 0;
59     symbol a("a"), b("b");
60     ex e, f;
61     
62     e = pow(a+b,200).expand();
63     f = e.subs(a == -b);
64
65     if (f != 0) {
66         clog << "e = pow(a+b,200).expand(); f = e.subs(a == -b); erroneously returned "
67              << f << " instead of simplifying to 0." << endl;
68         ++result;
69     }
70     
71     return result;
72 }
73
74 unsigned exam_misc(void)
75 {
76     unsigned result = 0;
77     
78     cout << "examining miscellaneous other things" << flush;
79     clog << "----------miscellaneous other things:" << endl;
80     
81     result += exam_expand_subs();  cout << '.' << flush;
82     result += exam_expand_subs2();  cout << '.' << flush;
83     
84     if (!result) {
85         cout << " passed " << endl;
86         clog << "(no output)" << endl;
87     } else {
88         cout << " failed " << endl;
89     }
90     
91     return result;
92 }