github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/cxx/t-assign.cc (about)

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