]> www.ginac.de Git - ginac.git/blobdiff - check/exam_paranoia.cpp
finalized 1.0.14
[ginac.git] / check / exam_paranoia.cpp
index 94bfbacb1e0579c57aac07a8e02f782f3afd0f07..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
@@ -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;