Clean up check suite a little bit.
[ginac.git] / check / exam_factor.cpp
index ce4d7027644ad1b3851b57f4456bc350734b8970..d346efed3e07c82dce355eb63d7d0b6db440487a 100644 (file)
@@ -3,7 +3,7 @@
  *  Factorization test suite. */
 
 /*
- *  GiNaC Copyright (C) 1999-2019 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2020 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
@@ -26,8 +26,6 @@ using namespace GiNaC;
 #include <iostream>
 using namespace std;
 
-static symbol w("w"), x("x"), y("y"), z("z");
-
 static unsigned check_factor(const ex& e)
 {
        ex ee = e.expand();
@@ -44,9 +42,11 @@ static unsigned exam_factor1()
        unsigned result = 0;
        ex e;
        symbol x("x");
-       lst syms;
-       syms.append(x);
-       
+       lst syms = {x};
+
+       e = 1;
+       result += check_factor(e);
+
        e = ex("1+x-x^3", syms);
        result += check_factor(e);
 
@@ -193,13 +193,30 @@ static unsigned check_factor_expanded(const ex& e)
        return 0;
 }
 
+static unsigned exam_factor_content()
+{
+       unsigned result = 0;
+       ex e;
+       symbol x("x"), y("y");
+
+       // Fixed 2013-07-28 by Alexei Sheplyakov in factor_univariate().
+       e = ex("174247781*x^2-1989199947807987/200000000000000", lst{x});
+       result += check_factor(e);
+
+       // Fixed 2014-05-18 by Alexei Sheplyakov in factor_multivariate().
+       e = ex("(x+y+x*y)*(3*x+2*y)", lst{x, y});
+       result += check_factor(e);
+
+       return result;
+}
+
 static unsigned exam_factor_wang()
 {
        // these 15 polynomials are from the appendix of P.S.Wang,
        // "An Improved Multivariate Polynomial Factoring Algorithm"
        unsigned result = 0;
        ex e;
-       symbol x("x"), y("y"), z("z"), u("u");
+       symbol u("u"), w("w"), x("x"), y("y"), z("z");
 
        e = ex("(z+x*y+10)*(x*z+y+30)*(y*z+x+20)", lst{x, y, z});
        result += check_factor_expanded(e);
@@ -263,33 +280,6 @@ static unsigned exam_factor_wang()
        return result;
 }
 
-static unsigned check_factorization(const exvector& factors)
-{
-       ex e = dynallocate<mul>(factors);
-       ex ef = factor(e.expand());
-       if (ef.nops() != factors.size()) {
-               clog << "wrong number of factors, expected " << factors.size() <<
-                       ", got " << ef.nops();
-               return 1;
-       }
-       for (size_t i = 0; i < ef.nops(); ++i) {
-               if (find(factors.begin(), factors.end(), ef.op(i)) == factors.end()) {
-                       clog << "wrong factorization: term not found: " << ef.op(i);
-                       return 1;
-               }
-       }
-       return 0;
-}
-
-static unsigned factor_integer_content_bug()
-{
-       parser reader;
-       exvector factors;
-       factors.push_back(reader("x+y+x*y"));
-       factors.push_back(reader("3*x+2*y"));
-       return check_factorization(factors);
-}
-
 unsigned exam_factor()
 {
        unsigned result = 0;
@@ -299,9 +289,8 @@ unsigned exam_factor()
        result += exam_factor1(); cout << '.' << flush;
        result += exam_factor2(); cout << '.' << flush;
        result += exam_factor3(); cout << '.' << flush;
+       result += exam_factor_content(); cout << '.' << flush;
        result += exam_factor_wang(); cout << '.' << flush;
-       result += factor_integer_content_bug();
-       cout << '.' << flush;
 
        return result;
 }