From c859558dfbb8a9ee33326bc87ee1ae3c3c652ed9 Mon Sep 17 00:00:00 2001
From: Ansgar Burchardt <burchardt@igpm.rwth-aachen.de>
Date: Mon, 11 May 2015 17:23:14 +0200
Subject: [PATCH] Rework bigunsignedinttest.cc.

---
 dune/common/test/bigunsignedinttest.cc | 130 ++++++++++++++-----------
 1 file changed, 73 insertions(+), 57 deletions(-)

diff --git a/dune/common/test/bigunsignedinttest.cc b/dune/common/test/bigunsignedinttest.cc
index 8db7375af..59aca8640 100644
--- a/dune/common/test/bigunsignedinttest.cc
+++ b/dune/common/test/bigunsignedinttest.cc
@@ -4,73 +4,89 @@
 #include "config.h"
 #endif
 
+#include <cstdint>
 #include <limits>
 #include <iostream>
 
 #include <dune/common/bigunsignedint.hh>
 #include <dune/common/hash.hh>
 
+#define CHECK(x) \
+  do { \
+    if (!(x)) { \
+      pass = false; \
+      std::cerr << "FAILED: " << #x << std::endl; \
+    } \
+  } while(false)
+
 int main()
 {
+  bool pass = true;
+
+  typedef Dune::bigunsignedint<16> ShortInteger;
+  typedef Dune::bigunsignedint<128> BigInteger;
+
+  /* Test std::numeric_limits for ShortInteger (should be same as for uint16_t) */
+  CHECK(std::numeric_limits<ShortInteger>::min() == std::numeric_limits<std::uint16_t>::min());
+  CHECK(std::numeric_limits<ShortInteger>::max() == std::numeric_limits<std::uint16_t>::max());
+  CHECK(std::numeric_limits<ShortInteger>::digits == std::numeric_limits<std::uint16_t>::digits);
+  CHECK(std::numeric_limits<ShortInteger>::epsilon() == std::numeric_limits<std::uint16_t>::epsilon());
+  CHECK(std::numeric_limits<ShortInteger>::round_error() == std::numeric_limits<std::uint16_t>::round_error());
+
+  CHECK(std::numeric_limits<ShortInteger>::is_exact);
+  CHECK(std::numeric_limits<ShortInteger>::is_integer);
+  CHECK(!std::numeric_limits<ShortInteger>::is_signed);
 
-  std::cout<<"unsigned short: max="<<std::numeric_limits<unsigned short>::max()
-           <<" min="<<std::numeric_limits<unsigned short>::min()
-           <<" digits="<<std::numeric_limits<unsigned short>::digits<<std::endl;
-  std::cout<<"int: max="<<std::numeric_limits<int>::max()<<" min="
-           <<std::numeric_limits<int>::min()<<" digits="
-           <<std::numeric_limits<int>::digits<<std::endl;
-  std::cout<<"unsigned int: max="<<std::numeric_limits<unsigned int>::max()
-           <<" min="<<std::numeric_limits<unsigned int>::min()<<" digits="
-           <<std::numeric_limits<unsigned int>::digits<<" digits10="
-           <<std::numeric_limits<unsigned int>::digits10<<" radix="
-           <<std::numeric_limits<unsigned int>::radix<<" eps="
-           <<std::numeric_limits<unsigned int>::epsilon()
-           <<" round_error="
-           <<std::numeric_limits<unsigned int>::round_error()
-           <<" min_exponent="
-           <<std::numeric_limits<unsigned int>::min_exponent
-           <<" float_denorm_style="
-           <<std::numeric_limits<unsigned int>::has_denorm
-           <<" traps="<<std::numeric_limits<unsigned int>::traps
-           <<std::endl;
-  std::cout<<"bigunsignedint: max="<<std::numeric_limits<Dune::bigunsignedint<32> >::max()
-           <<" min="<<std::numeric_limits<Dune::bigunsignedint<32> >::min()<<" digits="<<std::numeric_limits<Dune::bigunsignedint<32> >::digits<<std::endl;
-  std::cout<<"bigunsignedint: max="<<std::numeric_limits<Dune::bigunsignedint<100> >::max()
-           <<" min="<<std::numeric_limits<Dune::bigunsignedint<100> >::min()<<" digits="<<std::numeric_limits<Dune::bigunsignedint<100> >::digits
-           <<" traps="<<std::numeric_limits<Dune::bigunsignedint<100> >::traps
-           <<std::endl;
-
-  int a1, b1, c1;
-  a1=100;
-  b1=3;
-  c1=a1/b1;
-  std::cout<<a1<<"/"<<b1<<"="<<c1<<std::endl;
-
-
-  Dune::bigunsignedint<100> a, b, c;
-  a=100;
-  b=3;
-  c=a/b;
-  std::cout<<a<<"/"<<b<<"="<<c<<std::endl;
-
-  try{
-
-    a=100;
-    b=0;
-    c=a/1;
-    std::cout<<a1<<"/"<<b1<<"="<<c1<<std::endl;
-    a=1000000;
-    std::cout<<a.todouble()<<std::endl;
-    std::cout<<a.touint()<<std::endl;
-    b=a;
-    a=a*b*b;
-    std::cout<<a.todouble()<<std::endl;
-
-    Dune::hash<Dune::bigunsignedint<100> > hasher;
-    std::cout << "Dune::hash:     " << hasher(a) << std::endl;
+  /* Test std::numeric_limits for BigInteger */
+  CHECK(std::numeric_limits<BigInteger>::min() == 0u);
+  CHECK(std::numeric_limits<BigInteger>::digits == 128);
+  CHECK(std::numeric_limits<BigInteger>::epsilon() == 0u);
+  CHECK(std::numeric_limits<BigInteger>::round_error() == 0u);
 
+  CHECK(std::numeric_limits<BigInteger>::is_exact);
+  CHECK(std::numeric_limits<BigInteger>::is_integer);
+  CHECK(!std::numeric_limits<BigInteger>::is_signed);
+
+  /* Test constructor */
+  CHECK(BigInteger(10u) == 10u);
+  CHECK(BigInteger(10) == BigInteger(10u));
+
+  try {
+    BigInteger tmp(-10);
+    pass = false;
+    std::cerr << "FAILED: BigInteger(-10) should throw an exception." << std::endl;
+  }
+  catch(const Dune::Exception&) {
+    /* Ignore */
   }
-  catch(Dune::MathError e) {
-    std::cout<<e<<std::endl;
+  catch(...) {
+    pass = false;
+    std::cerr << "FAILED: BigInteger(-10) threw an unexpected exception." << std::endl;
   }
+
+  /* Test conversion */
+  CHECK(BigInteger(10u).touint() == 10u);
+  CHECK(BigInteger(10u).todouble() == 10.0);
+
+  /* Check BigInteger arithmetic */
+  CHECK(BigInteger(10u) + BigInteger(3u) == BigInteger(10u + 3u));
+  CHECK(BigInteger(10u) - BigInteger(3u) == BigInteger(10u - 3u));
+  CHECK(BigInteger(10u) * BigInteger(3u) == BigInteger(10u * 3u));
+  CHECK(BigInteger(10u) / BigInteger(3u) == BigInteger(10u / 3u));
+  CHECK(BigInteger(10u) % BigInteger(3u) == BigInteger(10u % 3u));
+
+  CHECK(BigInteger(100000u) + BigInteger(30000u) == BigInteger(100000u + 30000u));
+  CHECK(BigInteger(100000u) - BigInteger(30000u) == BigInteger(100000u - 30000u));
+  CHECK(BigInteger(70000u) - BigInteger(30000u) == BigInteger(70000u - 30000u));
+  CHECK(BigInteger(100000u) * BigInteger(30000u) == BigInteger(100000u * 30000u));
+  CHECK(BigInteger(100000u) / BigInteger(30000u) == BigInteger(100000u / 30000u));
+  CHECK(BigInteger(100000u) % BigInteger(30000u) == BigInteger(100000u % 30000u));
+
+  /* Test hashing */
+  {
+    Dune::hash<BigInteger> hasher;
+    CHECK(hasher(BigInteger(100)) == hasher(BigInteger(100)));
+  }
+
+  return pass ? 0 : 1;
 }
-- 
GitLab