Adding tests for Rational::fromDecimal
authorChristopher L. Conway <christopherleeconway@gmail.com>
Thu, 6 May 2010 20:08:04 +0000 (20:08 +0000)
committerChristopher L. Conway <christopherleeconway@gmail.com>
Thu, 6 May 2010 20:08:04 +0000 (20:08 +0000)
src/util/rational.h
test/unit/Makefile.am
test/unit/util/bitvector_black.h
test/unit/util/rational_black.h [new file with mode: 0644]

index f50b4e63eb3eeebb5f2c909f255363082ffea1d4..428f4f12f0b1fd5d045405c36f8cf3fc76ce572d 100644 (file)
  ** See the file COPYING in the top-level source directory for licensing
  ** information.
  **
- ** A multiprecision rational constant.
- ** This stores the rational as a pair of multiprecision integers,
- ** one for the numerator and one for the denominator.
- ** The number is always stored so that the gcd of the numerator and denominator
- ** is 1.  (This is referred to as referred to as canonical form in GMP's
- ** literature.) A consquence is that that the numerator and denominator may be
- ** different than the values used to construct the Rational.
+ ** Multi-precision rational constants.
  **/
 
 #include "cvc4_public.h"
 
 namespace CVC4 {
 
+/**
+ ** A multi-precision rational constant.
+ ** This stores the rational as a pair of multi-precision integers,
+ ** one for the numerator and one for the denominator.
+ ** The number is always stored so that the gcd of the numerator and denominator
+ ** is 1.  (This is referred to as referred to as canonical form in GMP's
+ ** literature.) A consequence is that that the numerator and denominator may be
+ ** different than the values used to construct the Rational.
+ **
+ ** NOTE: The correct way to create a Rational from an int is to use one of the
+ ** int numerator/int denominator constructors with the denominator 1.  Trying
+ ** to construct a Rational with a single int, e.g., Rational(0), will put you
+ ** in danger of invoking the char* constructor, from whence you will segfault.
+ **/
+
 class Rational {
 private:
   /**
index 2ec5122f3ee5af675f01628859d0ad3fa87d2178..b3a8e12ebbdd9cb1076283460dc21a1b8a75d7b4 100644 (file)
@@ -27,7 +27,8 @@ UNIT_TESTS = \
        util/exception_black \
        util/integer_black \
        util/integer_white \
-       util/rational_white
+       util/rational_black \
+    util/rational_white
 
 # Things that aren't tests but that tests rely on and need to
 # go into the distribution
index f35107af0d25e894b5ebc7644ac0bd09637661d3..08e1216f1550205fab572421d3574131845956b7 100644 (file)
@@ -1,5 +1,5 @@
 /*********************                                                        */
-/** integer_black.h
+/** bitvector_black.h
  ** Original author: taking
  ** Major contributors: none
  ** Minor contributors (to current version): none
@@ -10,7 +10,7 @@
  ** See the file COPYING in the top-level source directory for licensing
  ** information.
  **
- ** Black box testing of CVC4::Integer.
+ ** Black box testing of CVC4::BitVector.
  **/
 
 #include <cxxtest/TestSuite.h>
diff --git a/test/unit/util/rational_black.h b/test/unit/util/rational_black.h
new file mode 100644 (file)
index 0000000..395a509
--- /dev/null
@@ -0,0 +1,48 @@
+/*********************                                                        */
+/** rational_black.h
+ ** Original author: cconway
+ ** Major contributors: none
+ ** Minor contributors (to current version): none
+ ** This file is part of the CVC4 prototype.
+ ** Copyright (c) 2009, 2010  The Analysis of Computer Systems Group (ACSys)
+ ** Courant Institute of Mathematical Sciences
+ ** New York University
+ ** See the file COPYING in the top-level source directory for licensing
+ ** information.
+ **
+ ** Black box testing of CVC4::Rational.
+ **/
+
+#include <cxxtest/TestSuite.h>
+#include <sstream>
+
+#include "util/rational.h"
+
+using namespace CVC4;
+using namespace std;
+
+const char* canReduce = "4547897890548754897897897897890789078907890/54878902347890234";
+
+class RationalBlack : public CxxTest::TestSuite {
+public:
+
+  void testFromDecimal() {
+    TS_ASSERT_EQUALS( Rational(0,1), Rational::fromDecimal("0") );
+    TS_ASSERT_EQUALS( Rational(1,1), Rational::fromDecimal("1") );
+    TS_ASSERT_EQUALS( Rational(-1,1), Rational::fromDecimal("-1") );
+    TS_ASSERT_EQUALS( Rational(3,2), Rational::fromDecimal("1.5") );
+    TS_ASSERT_EQUALS( Rational(-3,2), Rational::fromDecimal("-1.5") );
+    TS_ASSERT_EQUALS( Rational(7,10), Rational::fromDecimal(".7") );
+    TS_ASSERT_EQUALS( Rational(-7,10), Rational::fromDecimal("-.7") );
+    TS_ASSERT_EQUALS( Rational(5,1), Rational::fromDecimal("5.") );
+    TS_ASSERT_EQUALS( Rational(-5,1), Rational::fromDecimal("-5.") );
+    TS_ASSERT_EQUALS( Rational(12345,100), Rational::fromDecimal("123.45") );
+
+    TS_ASSERT_THROWS( Rational::fromDecimal("1.2.3");, const std::invalid_argument& );
+    TS_ASSERT_THROWS( Rational::fromDecimal("1.2/3");, const std::invalid_argument& );
+    TS_ASSERT_THROWS( Rational::fromDecimal("Hello, world!");, const std::invalid_argument& );
+
+    Rational(1);
+  }
+
+};