From 11da511c784eca003deb90c23570f0873954e0de Mon Sep 17 00:00:00 2001 From: Duncan Wilkie Date: Sat, 18 Nov 2023 06:11:09 -0600 Subject: Initial commit. --- gmp-6.3.0/tests/cxx/t-assign.cc | 603 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 603 insertions(+) create mode 100644 gmp-6.3.0/tests/cxx/t-assign.cc (limited to 'gmp-6.3.0/tests/cxx/t-assign.cc') diff --git a/gmp-6.3.0/tests/cxx/t-assign.cc b/gmp-6.3.0/tests/cxx/t-assign.cc new file mode 100644 index 0000000..a11b0d9 --- /dev/null +++ b/gmp-6.3.0/tests/cxx/t-assign.cc @@ -0,0 +1,603 @@ +/* Test mp*_class assignment operators. + +Copyright 2001-2003 Free Software Foundation, Inc. + +This file is part of the GNU MP Library test suite. + +The GNU MP Library test suite is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 3 of the License, +or (at your option) any later version. + +The GNU MP Library test suite is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +Public License for more details. + +You should have received a copy of the GNU General Public License along with +the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ + +#include "config.h" + +#include +#include + +#include "gmpxx.h" +#include "gmp-impl.h" +#include "tests.h" + +using std::string; +using std::invalid_argument; + + +void +check_mpz (void) +{ + // operator=(const mpz_class &) + { + mpz_class a(123), b; + b = a; ASSERT_ALWAYS(b == 123); + } + + // template operator=(const __gmp_expr &) + // not tested here, see t-unary.cc, t-binary.cc + + // operator=(signed char) + { + signed char a = -127; + mpz_class b; + b = a; ASSERT_ALWAYS(b == -127); + } + + // operator=(unsigned char) + { + unsigned char a = 255; + mpz_class b; + b = a; ASSERT_ALWAYS(b == 255); + } + + // either signed or unsigned char, machine dependent + { + mpz_class a; + a = 'A'; ASSERT_ALWAYS(a == 65); + } + { + mpz_class a; + a = 'z'; ASSERT_ALWAYS(a == 122); + } + + // operator=(signed int) + { + signed int a = 0; + mpz_class b; + b = a; ASSERT_ALWAYS(b == 0); + } + { + signed int a = -123; + mpz_class b; + b = a; ASSERT_ALWAYS(b == -123); + } + { + signed int a = 32767; + mpz_class b; + b = a; ASSERT_ALWAYS(b == 32767); + } + + // operator=(unsigned int) + { + unsigned int a = 65535u; + mpz_class b; + b = a; ASSERT_ALWAYS(b == 65535u); + } + + // operator=(signed short int) + { + signed short int a = -12345; + mpz_class b; + b = a; ASSERT_ALWAYS(b == -12345); + } + + // operator=(unsigned short int) + { + unsigned short int a = 54321u; + mpz_class b; + b = a; ASSERT_ALWAYS(b == 54321u); + } + + // operator=(signed long int) + { + signed long int a = -1234567890L; + mpz_class b; + b = a; ASSERT_ALWAYS(b == -1234567890L); + } + + // operator=(unsigned long int) + { + unsigned long int a = 3456789012UL; + mpz_class b; + b = a; ASSERT_ALWAYS(b == 3456789012UL); + } + + // operator=(float) + { + float a = 123.0; + mpz_class b; + b = a; ASSERT_ALWAYS(b == 123); + } + + // operator=(double) + { + double a = 0.0; + mpz_class b; + b = a; ASSERT_ALWAYS(b == 0); + } + { + double a = -12.375; + mpz_class b; + b = a; ASSERT_ALWAYS(b == -12); + } + { + double a = 6.789e+3; + mpz_class b; + b = a; ASSERT_ALWAYS(b == 6789); + } + { + double a = 9.375e-1; + mpz_class b; + b = a; ASSERT_ALWAYS(b == 0); + } + + // operator=(long double) + // currently not implemented + + // operator=(const char *) + { + const char *a = "1234567890"; + mpz_class b; + b = a; ASSERT_ALWAYS(b == 1234567890L); + } + + // operator=(const std::string &) + { + string a("1234567890"); + mpz_class b; + b = a; ASSERT_ALWAYS(b == 1234567890L); + } + + // operator=(const char *) with invalid + { + try { + const char *a = "abc"; + mpz_class b; + b = a; + ASSERT_ALWAYS (0); /* should not be reached */ + } catch (invalid_argument&) { + } + } + + // operator=(const std::string &) with invalid + { + try { + string a("def"); + mpz_class b; + b = a; + ASSERT_ALWAYS (0); /* should not be reached */ + } catch (invalid_argument&) { + } + } + + // swap(mpz_class &) + { + mpz_class a(123); + mpz_class b(456); + a.swap(b); + a.swap(a); + ASSERT_ALWAYS(a == 456); + ASSERT_ALWAYS(b == 123); + } + + // swap(mpz_class &, mpz_class &) + { + mpz_class a(123); + mpz_class b(456); + ::swap(a, b); + ::swap(a, a); + ASSERT_ALWAYS(a == 456); + ASSERT_ALWAYS(b == 123); + } + { + using std::swap; + mpz_class a(123); + mpz_class b(456); + swap(a, b); + swap(a, a); + ASSERT_ALWAYS(a == 456); + ASSERT_ALWAYS(b == 123); + } +} + +void +check_mpq (void) +{ + // operator=(const mpq_class &) + { + mpq_class a(1, 2), b; + b = a; ASSERT_ALWAYS(b == 0.5); + } + + // template operator=(const __gmp_expr &) + // not tested here, see t-unary.cc, t-binary.cc + + // operator=(signed char) + { + signed char a = -127; + mpq_class b; + b = a; ASSERT_ALWAYS(b == -127); + } + + // operator=(unsigned char) + { + unsigned char a = 255; + mpq_class b; + b = a; ASSERT_ALWAYS(b == 255); + } + + // either signed or unsigned char, machine dependent + { + mpq_class a; + a = 'A'; ASSERT_ALWAYS(a == 65); + } + { + mpq_class a; + a = 'z'; ASSERT_ALWAYS(a == 122); + } + + // operator=(signed int) + { + signed int a = 0; + mpq_class b; + b = a; ASSERT_ALWAYS(b == 0); + } + { + signed int a = -123; + mpq_class b; + b = a; ASSERT_ALWAYS(b == -123); + } + { + signed int a = 32767; + mpq_class b; + b = a; ASSERT_ALWAYS(b == 32767); + } + + // operator=(unsigned int) + { + unsigned int a = 65535u; + mpq_class b; + b = a; ASSERT_ALWAYS(b == 65535u); + } + + // operator=(signed short int) + { + signed short int a = -12345; + mpq_class b; + b = a; ASSERT_ALWAYS(b == -12345); + } + + // operator=(unsigned short int) + { + unsigned short int a = 54321u; + mpq_class b; + b = a; ASSERT_ALWAYS(b == 54321u); + } + + // operator=(signed long int) + { + signed long int a = -1234567890L; + mpq_class b; + b = a; ASSERT_ALWAYS(b == -1234567890L); + } + + // operator=(unsigned long int) + { + unsigned long int a = 3456789012UL; + mpq_class b; + b = a; ASSERT_ALWAYS(b == 3456789012UL); + } + + // operator=(float) + { + float a = 123.0; + mpq_class b; + b = a; ASSERT_ALWAYS(b == 123); + } + + // operator=(double) + { + double a = 0.0; + mpq_class b; + b = a; ASSERT_ALWAYS(b == 0); + } + { + double a = -12.375; + mpq_class b; + b = a; ASSERT_ALWAYS(b == -12.375); + } + { + double a = 6.789e+3; + mpq_class b; + b = a; ASSERT_ALWAYS(b == 6789); + } + { + double a = 9.375e-1; + mpq_class b; + b = a; ASSERT_ALWAYS(b == 0.9375); + } + + // operator=(long double) + // currently not implemented + + // operator=(const char *) + { + const char *a = "1234567890"; + mpq_class b; + b = a; ASSERT_ALWAYS(b == 1234567890L); + } + + // operator=(const std::string &) + { + string a("1234567890"); + mpq_class b; + b = a; ASSERT_ALWAYS(b == 1234567890L); + } + + // operator=(const char *) with invalid + { + try { + const char *a = "abc"; + mpq_class b; + b = a; + ASSERT_ALWAYS (0); /* should not be reached */ + } catch (invalid_argument&) { + } + } + + // operator=(const std::string &) with invalid + { + try { + string a("def"); + mpq_class b; + b = a; + ASSERT_ALWAYS (0); /* should not be reached */ + } catch (invalid_argument&) { + } + } + + // swap(mpq_class &) + { + mpq_class a(3, 2); + mpq_class b(-1, 4); + a.swap(b); + a.swap(a); + ASSERT_ALWAYS(a == -.25); + ASSERT_ALWAYS(b == 1.5); + } + + // swap(mpq_class &, mpq_class &) + { + mpq_class a(3, 2); + mpq_class b(-1, 4); + ::swap(a, b); + ::swap(a, a); + ASSERT_ALWAYS(a == -.25); + ASSERT_ALWAYS(b == 1.5); + } + { + using std::swap; + mpq_class a(3, 2); + mpq_class b(-1, 4); + swap(a, b); + swap(a, a); + ASSERT_ALWAYS(a == -.25); + ASSERT_ALWAYS(b == 1.5); + } +} + +void +check_mpf (void) +{ + // operator=(const mpf_class &) + { + mpf_class a(123), b; + b = a; ASSERT_ALWAYS(b == 123); + } + + // template operator=(const __gmp_expr &) + // not tested here, see t-unary.cc, t-binary.cc + + // operator=(signed char) + { + signed char a = -127; + mpf_class b; + b = a; ASSERT_ALWAYS(b == -127); + } + + // operator=(unsigned char) + { + unsigned char a = 255; + mpf_class b; + b = a; ASSERT_ALWAYS(b == 255); + } + + // either signed or unsigned char, machine dependent + { + mpf_class a; + a = 'A'; ASSERT_ALWAYS(a == 65); + } + { + mpf_class a; + a = 'z'; ASSERT_ALWAYS(a == 122); + } + + // operator=(signed int) + { + signed int a = 0; + mpf_class b; + b = a; ASSERT_ALWAYS(b == 0); + } + { + signed int a = -123; + mpf_class b; + b = a; ASSERT_ALWAYS(b == -123); + } + { + signed int a = 32767; + mpf_class b; + b = a; ASSERT_ALWAYS(b == 32767); + } + + // operator=(unsigned int) + { + unsigned int a = 65535u; + mpf_class b; + b = a; ASSERT_ALWAYS(b == 65535u); + } + + // operator=(signed short int) + { + signed short int a = -12345; + mpf_class b; + b = a; ASSERT_ALWAYS(b == -12345); + } + + // operator=(unsigned short int) + { + unsigned short int a = 54321u; + mpf_class b; + b = a; ASSERT_ALWAYS(b == 54321u); + } + + // operator=(signed long int) + { + signed long int a = -1234567890L; + mpf_class b; + b = a; ASSERT_ALWAYS(b == -1234567890L); + } + + // operator=(unsigned long int) + { + unsigned long int a = 3456789012UL; + mpf_class b; + b = a; ASSERT_ALWAYS(b == 3456789012UL); + } + + // operator=(float) + { + float a = 123.0; + mpf_class b; + b = a; ASSERT_ALWAYS(b == 123); + } + + // operator=(double) + { + double a = 0.0; + mpf_class b; + b = a; ASSERT_ALWAYS(b == 0); + } + { + double a = -12.375; + mpf_class b; + b = a; ASSERT_ALWAYS(b == -12.375); + } + { + double a = 6.789e+3; + mpf_class b; + b = a; ASSERT_ALWAYS(b == 6789); + } + { + double a = 9.375e-1; + mpf_class b; + b = a; ASSERT_ALWAYS(b == 0.9375); + } + + // operator=(long double) + // currently not implemented + + // operator=(const char *) + { + const char *a = "1234567890"; + mpf_class b; + b = a; ASSERT_ALWAYS(b == 1234567890L); + } + + // operator=(const std::string &) + { + string a("1234567890"); + mpf_class b; + b = a; ASSERT_ALWAYS(b == 1234567890L); + } + + // operator=(const char *) with invalid + { + try { + const char *a = "abc"; + mpf_class b; + b = a; + ASSERT_ALWAYS (0); /* should not be reached */ + } catch (invalid_argument&) { + } + } + + // operator=(const std::string &) with invalid + { + try { + string a("def"); + mpf_class b; + b = a; + ASSERT_ALWAYS (0); /* should not be reached */ + } catch (invalid_argument&) { + } + } + + // swap(mpf_class &) + { + mpf_class a(123); + mpf_class b(456); + a.swap(b); + a.swap(a); + ASSERT_ALWAYS(a == 456); + ASSERT_ALWAYS(b == 123); + } + + // swap(mpf_class &, mpf_class &) + { + mpf_class a(123); + mpf_class b(456); + ::swap(a, b); + ::swap(a, a); + ASSERT_ALWAYS(a == 456); + ASSERT_ALWAYS(b == 123); + } + { + using std::swap; + mpf_class a(123); + mpf_class b(456); + swap(a, b); + swap(a, a); + ASSERT_ALWAYS(a == 456); + ASSERT_ALWAYS(b == 123); + } +} + + +int +main (void) +{ + tests_start(); + + check_mpz(); + check_mpq(); + check_mpf(); + + tests_end(); + return 0; +} -- cgit v1.2.3