]> www.ginac.de Git - ginac.git/blobdiff - check/exam_paranoia.cpp
synced to 1.2
[ginac.git] / check / exam_paranoia.cpp
index c4383c7cf6191aeef4a3c2b470a99733952ec6e5..4050b5f5c238fcd49594993c4d18f02ce18ecdc1 100644 (file)
@@ -6,7 +6,7 @@
  *  these oopses for good, so we run those stupid tests... */
 
 /*
- *  GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -41,7 +41,7 @@ static unsigned exam_paranoia1(void)
        // In the first one expand did not do any job at all:
        if (!g.expand().is_equal(x)) {
                clog << "e = x*y*z; f = y*z; expand(e/f) erroneously returned "
-                        << g.expand() << endl;
+                    << g.expand() << endl;
                ++result;
        }
 
@@ -49,7 +49,7 @@ static unsigned exam_paranoia1(void)
        e = pow(x + 1, -1);
        if (!e.expand().is_equal(e)) {
                clog << "expand(pow(x + 1, -1)) erroneously returned "
-                        << e.expand() << endl;
+                    << e.expand() << endl;
                ++result;
        }
 
@@ -72,20 +72,20 @@ static unsigned exam_paranoia2(void)
        // After .expand(), g should be zero:
        if (!g.expand().is_zero()) {
                clog << "e = (x + z*x); f = e*y; expand(f - e*y) erroneously returned "
-                        << g.expand() << endl;
+                    << g.expand() << endl;
                ++result;
        }
        // After .eval(), g should be zero:
        if (!g.eval().is_zero()) {
                clog << "e = (x + z*x); f = e*y; eval(f - e*y) erroneously returned "
-                        << g.eval() << endl;
+                    << g.eval() << endl;
                ++result;
        }
        // This actually worked already back in April 1999.
        // But we are *very* paranoic!
        if (!g.expand().eval().is_zero()) {
                clog << "e = (x + z*x); f = e*y; eval(expand(f - e*y)) erroneously returned "
-                        << g.expand().eval() << endl;
+                    << g.expand().eval() << endl;
                ++result;
        }
 
@@ -106,17 +106,17 @@ static unsigned exam_paranoia3(void)
 
        if (!f.is_equal(y)) {
                clog << "e = x*y - y; f = e.subs(x == 2) erroneously returned "
-                        << f << endl;
+                    << f << endl;
                ++result;
        }
        if (!f.eval().is_equal(y)) {
                clog << "e = x*y - y; eval(e.subs(x == 2)) erroneously returned "
-                        << f.eval() << endl;
+                    << f.eval() << endl;
                ++result;
        }
        if (!f.expand().is_equal(y)) {
                clog << "e = x*y - y; expand(e.subs(x == 2)) erroneously returned "
-                        << f.expand() << endl;
+                    << f.expand() << endl;
                ++result;
        }
 
@@ -136,12 +136,12 @@ static unsigned exam_paranoia4(void)
 
        if (!g.is_zero()) {
                clog << "e = pow(x,2) + x + 1; f = pow(x,2) + x + 1; g = e-f; g erroneously returned "
-                        << g << endl;
+                    << g << endl;
                ++result;
        }
        if (!g.is_zero()) {
                clog << "e = pow(x,2) + x + 1; f = pow(x,2) + x + 1; g = e-f; g.eval() erroneously returned "
-                        << g.eval() << endl;
+                    << g.eval() << endl;
                ++result;
        }
 
@@ -160,7 +160,7 @@ static unsigned exam_paranoia5(void)
 
        if (!(e-f).expand().is_zero()) {
                clog << "e = pow(x*y+1,2); f = pow(x,2)*pow(y,2) + 2*x*y + 1; (e-f).expand() erroneously returned "
-                        << (e-f).expand() << endl;
+                    << (e-f).expand() << endl;
                ++result;
        }
 
@@ -196,8 +196,8 @@ static unsigned exam_paranoia7(void)
 
        if (f.nops() > 3) {
                clog << "e=y+y*x+2; f=expand(pow(e,2)-(e*y*(x+1))) has "
-                        << f.nops() << " arguments instead of 3 ( f=="
-                        << f << " )" << endl;
+                    << f.nops() << " arguments instead of 3 ( f=="
+                    << f << " )" << endl;
                ++result;
        }
        return result;
@@ -306,7 +306,7 @@ static unsigned exam_paranoia12(void)
        
        if (!(f - d).expand().is_zero()) {
                clog << "normal(" << e << ") returns " << f
-                        << " instead of " << d << endl;
+                    << " instead of " << d << endl;
                ++result;
        }
        return result;
@@ -326,7 +326,7 @@ static unsigned exam_paranoia13(void)
                ex f = e.normal();      
                if (!(f - d).expand().is_zero()) {
                        clog << "normal(" << e << ") returns " << f
-                                << " instead of " << d << endl;
+                            << " instead of " << d << endl;
                        ++result;
                }
        } catch (const exception &err) {
@@ -336,6 +336,40 @@ static unsigned exam_paranoia13(void)
        return result;
 }
 
+// A bug introduced on July 19, 2001. quo() and rem() would sometimes call
+// vector::reserve() with a negative argument. Fixed on Dec 20, 2001.
+static unsigned exam_paranoia14(void)
+{
+       unsigned result = 0;
+       symbol x("x");
+
+       ex q = quo(1, pow(x, 3), x);
+       if (!q.is_zero()) {
+               clog << "quo(1,x^3,x) erroneously returned " << q << " instead of 0\n";
+               ++result;
+       }
+
+       return result;
+}
+
+// Under certain conditions, power::expand_add_2() could produce non-canonical
+// numeric expairs. Fixed on Oct 24, 2002.
+static unsigned exam_paranoia15(void)
+{
+       unsigned result = 0;
+
+       ex q = (pow(pow(2, numeric(1, 2))*2+1, 2)).expand();
+       // this used to produce "1+4*sqrt(2)+4*2" which would never evaluate
+       // to "9+4*sqrt(2)"
+
+       if (!(q-9-4*pow(2, numeric(1, 2))).is_zero()) {
+               clog << "expand((sqrt(2)*2+1)^2) erroneously returned " << q << " instead of 9-4*sqrt(2)\n";
+               ++result;
+       }
+
+       return result;
+}
+
 unsigned exam_paranoia(void)
 {
        unsigned result = 0;
@@ -356,6 +390,8 @@ unsigned exam_paranoia(void)
        result += exam_paranoia11();  cout << '.' << flush;
        result += exam_paranoia12();  cout << '.' << flush;
        result += exam_paranoia13();  cout << '.' << flush;
+       result += exam_paranoia14();  cout << '.' << flush;
+       result += exam_paranoia15();  cout << '.' << flush;
        
        if (!result) {
                cout << " passed " << endl;