]> www.ginac.de Git - ginac.git/blobdiff - check/exam_paranoia.cpp
[bugfix] fix sqrfree(poly) for zero polynomials in disguise.
[ginac.git] / check / exam_paranoia.cpp
index ad7ee8d25facc53da8d7022113da134c3f8cb986..5c8ef03ccffbd555256362d19a32f185fee1bef8 100644 (file)
@@ -6,7 +6,7 @@
  *  these oopses for good, so we run those stupid tests... */
 
 /*
- *  GiNaC Copyright (C) 1999-2015 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2016 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
@@ -440,16 +440,26 @@ static unsigned exam_paranoia17()
 }
 
 // Bug in add::eval() could result in numeric terms not being collected into
-// the overall coefficient. Fixed on Sep 22, 2010
+// the overall coefficient. Fixed first on Sep 22, 2010 and again on Dec 17 2015
 static unsigned exam_paranoia18()
 {
+       unsigned result = 0;
+
        ex sqrt2 = sqrt(ex(2));
-       ex e = 1+2*(sqrt2+1)*(sqrt2-1);
-       if ( e.real_part() != 3 ) {
+       ex e1 = 1 + 2*(sqrt2+1)*(sqrt2-1);
+       if (e1.real_part() != 3) {
                clog << "real_part(1+2*(sqrt(2)+1)*(sqrt(2)-1)) failed to evaluate to 3\n";
-               return 1;
+               ++result;
        }
-       return 0;
+
+       ex sqrt3 = sqrt(ex(3));
+       ex e2 = 2 + 2*(sqrt2+1)*(sqrt2-1) - 2*(sqrt3+1)*(sqrt3-1);
+       if (e2.real_part() != 0) {
+               clog << "real_part(2+2*(sqrt(2)+1)*(sqrt(2)-1)-3*(sqrt(3)+1)*(sqrt(3)-1)) failed to evaluate to 0\n";
+               ++result;
+       }
+
+       return result;
 }
 
 // Bug in mul::conjugate when factors are evaluated at branch cuts, reported as
@@ -567,6 +577,52 @@ static unsigned exam_paranoia23()
        return result;
 }
 
+// Bug in sqrfree_yun (fixed 2016-02-02).
+static unsigned exam_paranoia24()
+{
+       unsigned result = 0;
+       symbol x("x");
+       ex e;
+
+       e = (x-1)*(x+1) - x*x + 1;  // an unexpanded 0...
+       try {
+               ex f = sqrfree(e);
+               if (!f.is_zero()) {
+                       clog << "sqrfree(" << e << ") returns " << f << " instead of 0\n";
+                       ++result;
+               }
+       } catch (const exception &err) {
+               clog << "sqrfree(" << e << ") throws " << err.what() << endl;
+               ++result;
+       }
+
+       e = pow(x-1,3) - expand(pow(x-1,3));  // ...still after differentiating...
+       try {
+               ex f = sqrfree(e);
+               if (!f.is_zero()) {
+                       clog << "sqrfree(" << e << ") returns " << f << " instead of 0\n";
+                       ++result;
+               }
+       } catch (const exception &err) {
+               clog << "sqrfree(" << e << ") throws " << err.what() << endl;
+               ++result;
+       }
+
+       e = pow(x-1,4) - expand(pow(x-1,4));  // ...and after differentiating twice.
+       try {
+               ex f = sqrfree(e);
+               if (!f.is_zero()) {
+                       clog << "sqrfree(" << e << ") returns " << f << " instead of 0\n";
+                       ++result;
+               }
+       } catch (const exception &err) {
+               clog << "sqrfree(" << e << ") throws " << err.what() << endl;
+               ++result;
+       }
+
+       return result;
+}
+
 unsigned exam_paranoia()
 {
        unsigned result = 0;
@@ -597,6 +653,7 @@ unsigned exam_paranoia()
        result += exam_paranoia21();  cout << '.' << flush;
        result += exam_paranoia22();  cout << '.' << flush;
        result += exam_paranoia23();  cout << '.' << flush;
+       result += exam_paranoia24();  cout << '.' << flush;
        
        return result;
 }