]> www.ginac.de Git - ginac.git/blobdiff - check/exam_paranoia.cpp
[bugfix] Make sure add::eval() collects all numeric terms *correctly*.
[ginac.git] / check / exam_paranoia.cpp
index 6c2f4571200409aacd8a37eed3fbbb410d079ef5..81dda8537772c5480d67862bd309e6794adde4a2 100644 (file)
@@ -468,16 +468,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 e = 1 + 2*(sqrt2+1)*(sqrt2-1);
+       if (e.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 f = 2 + 2*(sqrt2+1)*(sqrt2-1) - 2*(sqrt3+1)*(sqrt3-1);
+       if (f.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
@@ -544,6 +554,30 @@ static unsigned is_polynomial_false_positive()
        return result;
 }
 
+// Bug in power::expand reported by Isuru Fernando (fixed 2015-05-07).
+static unsigned exam_paranoia21()
+{
+       symbol x("x");
+       ex e = pow(x + sqrt(ex(2))*x, 2).expand();
+       if (e.nops() != 2) {
+               clog << "(x+sqrt(2)*x)^2 was wrongly expanded to " << e << "\n";
+               return 1;
+       }
+       return 0;
+}
+
+// Bug in power::expand (fixed 2015-07-18).
+static unsigned exam_paranoia22()
+{
+       symbol x("x"), y("y");
+       ex e = pow(sqrt(1+x)+y*sqrt(1+x), 2).expand();
+       if (e.nops() != 6) {
+               clog << "(sqrt(1+x)+y*sqrt(1+x))^2 was wrongly expanded to " << e << "\n";
+               return 1;
+       }
+       return 0;
+}
+
 unsigned exam_paranoia()
 {
        unsigned result = 0;
@@ -571,6 +605,8 @@ unsigned exam_paranoia()
        result += exam_paranoia19();  cout << '.' << flush;
        result += exam_paranoia20();  cout << '.' << flush;
        result += is_polynomial_false_positive(); cout << '.' << flush;
+       result += exam_paranoia21();  cout << '.' << flush;
+       result += exam_paranoia22();  cout << '.' << flush;
        
        return result;
 }