#include "main.h"

#include <exception>  // std::exception

struct Foo {
  static Index object_count;
  static Index object_limit;
  int dummy;

  Foo() : dummy(0) {
#ifdef EIGEN_EXCEPTIONS
    // TODO: Is this the correct way to handle this?
    if (Foo::object_count > Foo::object_limit) {
      std::cout << "\nThrow!\n";
      throw Foo::Fail();
    }
#endif
    std::cout << '+';
    ++Foo::object_count;
  }

  ~Foo() {
    std::cout << '-';
    --Foo::object_count;
  }

  class Fail : public std::exception {};
};

Index Foo::object_count = 0;
Index Foo::object_limit = 0;

#undef EIGEN_TEST_MAX_SIZE
#define EIGEN_TEST_MAX_SIZE 3

EIGEN_DECLARE_TEST(ctorleak) {
  typedef Matrix<Foo, Dynamic, Dynamic> MatrixX;
  typedef Matrix<Foo, Dynamic, 1> VectorX;

  Foo::object_count = 0;
  for (int i = 0; i < g_repeat; i++) {
    Index rows = internal::random<Index>(2, EIGEN_TEST_MAX_SIZE),
          cols = internal::random<Index>(2, EIGEN_TEST_MAX_SIZE);
    Foo::object_limit = rows * cols;
    {
      MatrixX r(rows, cols);
      Foo::object_limit = r.size() + internal::random<Index>(0, rows * cols - 2);
      std::cout << "object_limit =" << Foo::object_limit << std::endl;
#ifdef EIGEN_EXCEPTIONS
      try {
#endif
        if (internal::random<bool>()) {
          std::cout << "\nMatrixX m(" << rows << ", " << cols << ");\n";
          MatrixX m(rows, cols);
        } else {
          std::cout << "\nMatrixX m(r);\n";
          MatrixX m(r);
        }
#ifdef EIGEN_EXCEPTIONS
        VERIFY(false);             // not reached if exceptions are enabled
      } catch (const Foo::Fail&) { /* ignore */
      }
#endif
    }
    VERIFY_IS_EQUAL(Index(0), Foo::object_count);

    {
      Foo::object_limit = (rows + 1) * (cols + 1);
      MatrixX A(rows, cols);
      VERIFY_IS_EQUAL(Foo::object_count, rows * cols);
      VectorX v = A.row(0);
      VERIFY_IS_EQUAL(Foo::object_count, (rows + 1) * cols);
      v = A.col(0);
      VERIFY_IS_EQUAL(Foo::object_count, rows * (cols + 1));
    }
    VERIFY_IS_EQUAL(Index(0), Foo::object_count);
  }
  std::cout << "\n";
}
