1 /* Test mp*_class assignment operators. 2 3 Copyright 2001-2003 Free Software Foundation, Inc. 4 5 This file is part of the GNU MP Library test suite. 6 7 The GNU MP Library test suite is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 3 of the License, 10 or (at your option) any later version. 11 12 The GNU MP Library test suite is distributed in the hope that it will be 13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 15 Public License for more details. 16 17 You should have received a copy of the GNU General Public License along with 18 the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ 19 20 #include "config.h" 21 22 #include <iostream> 23 #include <string> 24 25 #include "gmpxx.h" 26 #include "gmp-impl.h" 27 #include "tests.h" 28 29 using std::string; 30 using std::invalid_argument; 31 32 33 void 34 check_mpz (void) 35 { 36 // operator=(const mpz_class &) 37 { 38 mpz_class a(123), b; 39 b = a; ASSERT_ALWAYS(b == 123); 40 } 41 42 // template <class T, class U> operator=(const __gmp_expr<T, U> &) 43 // not tested here, see t-unary.cc, t-binary.cc 44 45 // operator=(signed char) 46 { 47 signed char a = -127; 48 mpz_class b; 49 b = a; ASSERT_ALWAYS(b == -127); 50 } 51 52 // operator=(unsigned char) 53 { 54 unsigned char a = 255; 55 mpz_class b; 56 b = a; ASSERT_ALWAYS(b == 255); 57 } 58 59 // either signed or unsigned char, machine dependent 60 { 61 mpz_class a; 62 a = 'A'; ASSERT_ALWAYS(a == 65); 63 } 64 { 65 mpz_class a; 66 a = 'z'; ASSERT_ALWAYS(a == 122); 67 } 68 69 // operator=(signed int) 70 { 71 signed int a = 0; 72 mpz_class b; 73 b = a; ASSERT_ALWAYS(b == 0); 74 } 75 { 76 signed int a = -123; 77 mpz_class b; 78 b = a; ASSERT_ALWAYS(b == -123); 79 } 80 { 81 signed int a = 32767; 82 mpz_class b; 83 b = a; ASSERT_ALWAYS(b == 32767); 84 } 85 86 // operator=(unsigned int) 87 { 88 unsigned int a = 65535u; 89 mpz_class b; 90 b = a; ASSERT_ALWAYS(b == 65535u); 91 } 92 93 // operator=(signed short int) 94 { 95 signed short int a = -12345; 96 mpz_class b; 97 b = a; ASSERT_ALWAYS(b == -12345); 98 } 99 100 // operator=(unsigned short int) 101 { 102 unsigned short int a = 54321u; 103 mpz_class b; 104 b = a; ASSERT_ALWAYS(b == 54321u); 105 } 106 107 // operator=(signed long int) 108 { 109 signed long int a = -1234567890L; 110 mpz_class b; 111 b = a; ASSERT_ALWAYS(b == -1234567890L); 112 } 113 114 // operator=(unsigned long int) 115 { 116 unsigned long int a = 3456789012UL; 117 mpz_class b; 118 b = a; ASSERT_ALWAYS(b == 3456789012UL); 119 } 120 121 // operator=(float) 122 { 123 float a = 123.0; 124 mpz_class b; 125 b = a; ASSERT_ALWAYS(b == 123); 126 } 127 128 // operator=(double) 129 { 130 double a = 0.0; 131 mpz_class b; 132 b = a; ASSERT_ALWAYS(b == 0); 133 } 134 { 135 double a = -12.375; 136 mpz_class b; 137 b = a; ASSERT_ALWAYS(b == -12); 138 } 139 { 140 double a = 6.789e+3; 141 mpz_class b; 142 b = a; ASSERT_ALWAYS(b == 6789); 143 } 144 { 145 double a = 9.375e-1; 146 mpz_class b; 147 b = a; ASSERT_ALWAYS(b == 0); 148 } 149 150 // operator=(long double) 151 // currently not implemented 152 153 // operator=(const char *) 154 { 155 const char *a = "1234567890"; 156 mpz_class b; 157 b = a; ASSERT_ALWAYS(b == 1234567890L); 158 } 159 160 // operator=(const std::string &) 161 { 162 string a("1234567890"); 163 mpz_class b; 164 b = a; ASSERT_ALWAYS(b == 1234567890L); 165 } 166 167 // operator=(const char *) with invalid 168 { 169 try { 170 const char *a = "abc"; 171 mpz_class b; 172 b = a; 173 ASSERT_ALWAYS (0); /* should not be reached */ 174 } catch (invalid_argument&) { 175 } 176 } 177 178 // operator=(const std::string &) with invalid 179 { 180 try { 181 string a("def"); 182 mpz_class b; 183 b = a; 184 ASSERT_ALWAYS (0); /* should not be reached */ 185 } catch (invalid_argument&) { 186 } 187 } 188 189 // swap(mpz_class &) 190 { 191 mpz_class a(123); 192 mpz_class b(456); 193 a.swap(b); 194 a.swap(a); 195 ASSERT_ALWAYS(a == 456); 196 ASSERT_ALWAYS(b == 123); 197 } 198 199 // swap(mpz_class &, mpz_class &) 200 { 201 mpz_class a(123); 202 mpz_class b(456); 203 ::swap(a, b); 204 ::swap(a, a); 205 ASSERT_ALWAYS(a == 456); 206 ASSERT_ALWAYS(b == 123); 207 } 208 { 209 using std::swap; 210 mpz_class a(123); 211 mpz_class b(456); 212 swap(a, b); 213 swap(a, a); 214 ASSERT_ALWAYS(a == 456); 215 ASSERT_ALWAYS(b == 123); 216 } 217 } 218 219 void 220 check_mpq (void) 221 { 222 // operator=(const mpq_class &) 223 { 224 mpq_class a(1, 2), b; 225 b = a; ASSERT_ALWAYS(b == 0.5); 226 } 227 228 // template <class T, class U> operator=(const __gmp_expr<T, U> &) 229 // not tested here, see t-unary.cc, t-binary.cc 230 231 // operator=(signed char) 232 { 233 signed char a = -127; 234 mpq_class b; 235 b = a; ASSERT_ALWAYS(b == -127); 236 } 237 238 // operator=(unsigned char) 239 { 240 unsigned char a = 255; 241 mpq_class b; 242 b = a; ASSERT_ALWAYS(b == 255); 243 } 244 245 // either signed or unsigned char, machine dependent 246 { 247 mpq_class a; 248 a = 'A'; ASSERT_ALWAYS(a == 65); 249 } 250 { 251 mpq_class a; 252 a = 'z'; ASSERT_ALWAYS(a == 122); 253 } 254 255 // operator=(signed int) 256 { 257 signed int a = 0; 258 mpq_class b; 259 b = a; ASSERT_ALWAYS(b == 0); 260 } 261 { 262 signed int a = -123; 263 mpq_class b; 264 b = a; ASSERT_ALWAYS(b == -123); 265 } 266 { 267 signed int a = 32767; 268 mpq_class b; 269 b = a; ASSERT_ALWAYS(b == 32767); 270 } 271 272 // operator=(unsigned int) 273 { 274 unsigned int a = 65535u; 275 mpq_class b; 276 b = a; ASSERT_ALWAYS(b == 65535u); 277 } 278 279 // operator=(signed short int) 280 { 281 signed short int a = -12345; 282 mpq_class b; 283 b = a; ASSERT_ALWAYS(b == -12345); 284 } 285 286 // operator=(unsigned short int) 287 { 288 unsigned short int a = 54321u; 289 mpq_class b; 290 b = a; ASSERT_ALWAYS(b == 54321u); 291 } 292 293 // operator=(signed long int) 294 { 295 signed long int a = -1234567890L; 296 mpq_class b; 297 b = a; ASSERT_ALWAYS(b == -1234567890L); 298 } 299 300 // operator=(unsigned long int) 301 { 302 unsigned long int a = 3456789012UL; 303 mpq_class b; 304 b = a; ASSERT_ALWAYS(b == 3456789012UL); 305 } 306 307 // operator=(float) 308 { 309 float a = 123.0; 310 mpq_class b; 311 b = a; ASSERT_ALWAYS(b == 123); 312 } 313 314 // operator=(double) 315 { 316 double a = 0.0; 317 mpq_class b; 318 b = a; ASSERT_ALWAYS(b == 0); 319 } 320 { 321 double a = -12.375; 322 mpq_class b; 323 b = a; ASSERT_ALWAYS(b == -12.375); 324 } 325 { 326 double a = 6.789e+3; 327 mpq_class b; 328 b = a; ASSERT_ALWAYS(b == 6789); 329 } 330 { 331 double a = 9.375e-1; 332 mpq_class b; 333 b = a; ASSERT_ALWAYS(b == 0.9375); 334 } 335 336 // operator=(long double) 337 // currently not implemented 338 339 // operator=(const char *) 340 { 341 const char *a = "1234567890"; 342 mpq_class b; 343 b = a; ASSERT_ALWAYS(b == 1234567890L); 344 } 345 346 // operator=(const std::string &) 347 { 348 string a("1234567890"); 349 mpq_class b; 350 b = a; ASSERT_ALWAYS(b == 1234567890L); 351 } 352 353 // operator=(const char *) with invalid 354 { 355 try { 356 const char *a = "abc"; 357 mpq_class b; 358 b = a; 359 ASSERT_ALWAYS (0); /* should not be reached */ 360 } catch (invalid_argument&) { 361 } 362 } 363 364 // operator=(const std::string &) with invalid 365 { 366 try { 367 string a("def"); 368 mpq_class b; 369 b = a; 370 ASSERT_ALWAYS (0); /* should not be reached */ 371 } catch (invalid_argument&) { 372 } 373 } 374 375 // swap(mpq_class &) 376 { 377 mpq_class a(3, 2); 378 mpq_class b(-1, 4); 379 a.swap(b); 380 a.swap(a); 381 ASSERT_ALWAYS(a == -.25); 382 ASSERT_ALWAYS(b == 1.5); 383 } 384 385 // swap(mpq_class &, mpq_class &) 386 { 387 mpq_class a(3, 2); 388 mpq_class b(-1, 4); 389 ::swap(a, b); 390 ::swap(a, a); 391 ASSERT_ALWAYS(a == -.25); 392 ASSERT_ALWAYS(b == 1.5); 393 } 394 { 395 using std::swap; 396 mpq_class a(3, 2); 397 mpq_class b(-1, 4); 398 swap(a, b); 399 swap(a, a); 400 ASSERT_ALWAYS(a == -.25); 401 ASSERT_ALWAYS(b == 1.5); 402 } 403 } 404 405 void 406 check_mpf (void) 407 { 408 // operator=(const mpf_class &) 409 { 410 mpf_class a(123), b; 411 b = a; ASSERT_ALWAYS(b == 123); 412 } 413 414 // template <class T, class U> operator=(const __gmp_expr<T, U> &) 415 // not tested here, see t-unary.cc, t-binary.cc 416 417 // operator=(signed char) 418 { 419 signed char a = -127; 420 mpf_class b; 421 b = a; ASSERT_ALWAYS(b == -127); 422 } 423 424 // operator=(unsigned char) 425 { 426 unsigned char a = 255; 427 mpf_class b; 428 b = a; ASSERT_ALWAYS(b == 255); 429 } 430 431 // either signed or unsigned char, machine dependent 432 { 433 mpf_class a; 434 a = 'A'; ASSERT_ALWAYS(a == 65); 435 } 436 { 437 mpf_class a; 438 a = 'z'; ASSERT_ALWAYS(a == 122); 439 } 440 441 // operator=(signed int) 442 { 443 signed int a = 0; 444 mpf_class b; 445 b = a; ASSERT_ALWAYS(b == 0); 446 } 447 { 448 signed int a = -123; 449 mpf_class b; 450 b = a; ASSERT_ALWAYS(b == -123); 451 } 452 { 453 signed int a = 32767; 454 mpf_class b; 455 b = a; ASSERT_ALWAYS(b == 32767); 456 } 457 458 // operator=(unsigned int) 459 { 460 unsigned int a = 65535u; 461 mpf_class b; 462 b = a; ASSERT_ALWAYS(b == 65535u); 463 } 464 465 // operator=(signed short int) 466 { 467 signed short int a = -12345; 468 mpf_class b; 469 b = a; ASSERT_ALWAYS(b == -12345); 470 } 471 472 // operator=(unsigned short int) 473 { 474 unsigned short int a = 54321u; 475 mpf_class b; 476 b = a; ASSERT_ALWAYS(b == 54321u); 477 } 478 479 // operator=(signed long int) 480 { 481 signed long int a = -1234567890L; 482 mpf_class b; 483 b = a; ASSERT_ALWAYS(b == -1234567890L); 484 } 485 486 // operator=(unsigned long int) 487 { 488 unsigned long int a = 3456789012UL; 489 mpf_class b; 490 b = a; ASSERT_ALWAYS(b == 3456789012UL); 491 } 492 493 // operator=(float) 494 { 495 float a = 123.0; 496 mpf_class b; 497 b = a; ASSERT_ALWAYS(b == 123); 498 } 499 500 // operator=(double) 501 { 502 double a = 0.0; 503 mpf_class b; 504 b = a; ASSERT_ALWAYS(b == 0); 505 } 506 { 507 double a = -12.375; 508 mpf_class b; 509 b = a; ASSERT_ALWAYS(b == -12.375); 510 } 511 { 512 double a = 6.789e+3; 513 mpf_class b; 514 b = a; ASSERT_ALWAYS(b == 6789); 515 } 516 { 517 double a = 9.375e-1; 518 mpf_class b; 519 b = a; ASSERT_ALWAYS(b == 0.9375); 520 } 521 522 // operator=(long double) 523 // currently not implemented 524 525 // operator=(const char *) 526 { 527 const char *a = "1234567890"; 528 mpf_class b; 529 b = a; ASSERT_ALWAYS(b == 1234567890L); 530 } 531 532 // operator=(const std::string &) 533 { 534 string a("1234567890"); 535 mpf_class b; 536 b = a; ASSERT_ALWAYS(b == 1234567890L); 537 } 538 539 // operator=(const char *) with invalid 540 { 541 try { 542 const char *a = "abc"; 543 mpf_class b; 544 b = a; 545 ASSERT_ALWAYS (0); /* should not be reached */ 546 } catch (invalid_argument&) { 547 } 548 } 549 550 // operator=(const std::string &) with invalid 551 { 552 try { 553 string a("def"); 554 mpf_class b; 555 b = a; 556 ASSERT_ALWAYS (0); /* should not be reached */ 557 } catch (invalid_argument&) { 558 } 559 } 560 561 // swap(mpf_class &) 562 { 563 mpf_class a(123); 564 mpf_class b(456); 565 a.swap(b); 566 a.swap(a); 567 ASSERT_ALWAYS(a == 456); 568 ASSERT_ALWAYS(b == 123); 569 } 570 571 // swap(mpf_class &, mpf_class &) 572 { 573 mpf_class a(123); 574 mpf_class b(456); 575 ::swap(a, b); 576 ::swap(a, a); 577 ASSERT_ALWAYS(a == 456); 578 ASSERT_ALWAYS(b == 123); 579 } 580 { 581 using std::swap; 582 mpf_class a(123); 583 mpf_class b(456); 584 swap(a, b); 585 swap(a, a); 586 ASSERT_ALWAYS(a == 456); 587 ASSERT_ALWAYS(b == 123); 588 } 589 } 590 591 592 int 593 main (void) 594 { 595 tests_start(); 596 597 check_mpz(); 598 check_mpq(); 599 check_mpf(); 600 601 tests_end(); 602 return 0; 603 } 604