Tizen 2.1 base
[external/gmp.git] / tests / cxx / t-constr.cc
1 /* Test mp*_class constructors.
2
3 Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
4
5 This file is part of the GNU MP Library.
6
7 The GNU MP Library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11
12 The GNU MP Library is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15 License for more details.
16
17 You should have received a copy of the GNU Lesser General Public License
18 along with the GNU MP Library.  If not, see http://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 namespace std;
31
32
33 void
34 check_mpz (void)
35 {
36   // mpz_class()
37   {
38     mpz_class a; ASSERT_ALWAYS(a == 0);
39   }
40
41   // mpz_class(const mpz_class &)
42   // see below
43
44   // template <class T, class U> mpz_class(const __gmp_expr<T, U> &)
45   // not tested here, see t-unary.cc, t-binary.cc
46
47   // mpz_class(signed char)
48   {
49     signed char a = -127;
50     mpz_class b(a); ASSERT_ALWAYS(b == -127);
51   }
52
53   // mpz_class(unsigned char)
54   {
55     unsigned char a = 255;
56     mpz_class b(a); ASSERT_ALWAYS(b == 255);
57   }
58
59   // either signed or unsigned char, machine dependent
60   {
61     mpz_class a('A'); ASSERT_ALWAYS(a == 65);
62   }
63   {
64     mpz_class a('z'); ASSERT_ALWAYS(a == 122);
65   }
66
67   // mpz_class(signed int)
68   {
69     signed int a = 0;
70     mpz_class b(a); ASSERT_ALWAYS(b == 0);
71   }
72   {
73     signed int a = -123;
74     mpz_class b(a); ASSERT_ALWAYS(b == -123);
75   }
76   {
77     signed int a = 4567;
78     mpz_class b(a); ASSERT_ALWAYS(b == 4567);
79   }
80
81   // mpz_class(unsigned int)
82   {
83     unsigned int a = 890;
84     mpz_class b(a); ASSERT_ALWAYS(b == 890);
85   }
86
87   // mpz_class(signed short int)
88   {
89     signed short int a = -12345;
90     mpz_class b(a); ASSERT_ALWAYS(b == -12345);
91   }
92
93   // mpz_class(unsigned short int)
94   {
95     unsigned short int a = 54321u;
96     mpz_class b(a); ASSERT_ALWAYS(b == 54321u);
97   }
98
99   // mpz_class(signed long int)
100   {
101     signed long int a = -1234567890L;
102     mpz_class b(a); ASSERT_ALWAYS(b == -1234567890L);
103   }
104
105   // mpz_class(unsigned long int)
106   {
107     unsigned long int a = 1UL << 30;
108     mpz_class b(a); ASSERT_ALWAYS(b == 1073741824L);
109   }
110
111   // mpz_class(float)
112   {
113     float a = 123.45;
114     mpz_class b(a); ASSERT_ALWAYS(b == 123);
115   }
116
117   // mpz_class(double)
118   {
119     double a = 3.141592653589793238;
120     mpz_class b(a); ASSERT_ALWAYS(b == 3);
121   }
122
123   // mpz_class(long double)
124   // currently not implemented
125
126   // mpz_class(const char *)
127   {
128     const char *a = "1234567890";
129     mpz_class b(a); ASSERT_ALWAYS(b == 1234567890L);
130   }
131
132   // mpz_class(const char *, int)
133   {
134     const char *a = "FFFF";
135     int base = 16;
136     mpz_class b(a, base); ASSERT_ALWAYS(b == 65535u);
137   }
138
139   // mpz_class(const std::string &)
140   {
141     string a("1234567890");
142     mpz_class b(a); ASSERT_ALWAYS(b == 1234567890L);
143   }
144
145   // mpz_class(const std::string &, int)
146   {
147     string a("7777");
148     int base = 8;
149     mpz_class b(a, base); ASSERT_ALWAYS(b == 4095);
150   }
151
152   // mpz_class(const char *) with invalid
153   {
154     try {
155       const char *a = "ABC";
156       mpz_class b(a);
157       ASSERT_ALWAYS (0);  /* should not be reached */
158     } catch (invalid_argument) {
159     }
160   }
161
162   // mpz_class(const char *, int) with invalid
163   {
164     try {
165       const char *a = "GHI";
166       int base = 16;
167       mpz_class b(a, base);
168       ASSERT_ALWAYS (0);  /* should not be reached */
169     } catch (invalid_argument) {
170     }
171   }
172
173   // mpz_class(const std::string &) with invalid
174   {
175     try {
176       string a("abc");
177       mpz_class b(a);
178       ASSERT_ALWAYS (0);  /* should not be reached */
179     } catch (invalid_argument) {
180     }
181   }
182
183   // mpz_class(const std::string &, int) with invalid
184   {
185     try {
186       string a("ZZZ");
187       int base = 8;
188       mpz_class b(a, base);
189       ASSERT_ALWAYS (0);  /* should not be reached */
190     } catch (invalid_argument) {
191     }
192   }
193
194   // mpz_class(mpz_srcptr)
195   {
196     mpz_t a;
197     mpz_init_set_ui(a, 100);
198     mpz_class b(a); ASSERT_ALWAYS(b == 100);
199     mpz_clear(a);
200   }
201
202   // mpz_class(const mpz_class &)
203   {
204     mpz_class a(12345); // tested above, assume it works
205     mpz_class b(a); ASSERT_ALWAYS(b == 12345);
206   }
207
208   // no constructor for bool, but it gets casted to int
209   {
210     bool a = true;
211     mpz_class b(a); ASSERT_ALWAYS(b == 1);
212   }
213   {
214     bool a = false;
215     mpz_class b(a); ASSERT_ALWAYS(b == 0);
216   }
217 }
218
219 void
220 check_mpq (void)
221 {
222   // mpq_class()
223   {
224     mpq_class a; ASSERT_ALWAYS(a == 0);
225   }
226
227   // mpq_class(const mpq_class &)
228   // see below
229
230   // template <class T, class U> mpq_class(const __gmp_expr<T, U> &)
231   // not tested here, see t-unary.cc, t-binary.cc
232
233   // mpq_class(signed char)
234   {
235     signed char a = -127;
236     mpq_class b(a); ASSERT_ALWAYS(b == -127);
237   }
238
239   // mpq_class(unsigned char)
240   {
241     unsigned char a = 255;
242     mpq_class b(a); ASSERT_ALWAYS(b == 255);
243   }
244
245   // either signed or unsigned char, machine dependent
246   {
247     mpq_class a('A'); ASSERT_ALWAYS(a == 65);
248   }
249   {
250     mpq_class a('z'); ASSERT_ALWAYS(a == 122);
251   }
252
253   // mpq_class(signed int)
254   {
255     signed int a = 0;
256     mpq_class b(a); ASSERT_ALWAYS(b == 0);
257   }
258   {
259     signed int a = -123;
260     mpq_class b(a); ASSERT_ALWAYS(b == -123);
261   }
262   {
263     signed int a = 4567;
264     mpq_class b(a); ASSERT_ALWAYS(b == 4567);
265   }
266
267   // mpq_class(unsigned int)
268   {
269     unsigned int a = 890;
270     mpq_class b(a); ASSERT_ALWAYS(b == 890);
271   }
272
273   // mpq_class(signed short int)
274   {
275     signed short int a = -12345;
276     mpq_class b(a); ASSERT_ALWAYS(b == -12345);
277   }
278
279   // mpq_class(unsigned short int)
280   {
281     unsigned short int a = 54321u;
282     mpq_class b(a); ASSERT_ALWAYS(b == 54321u);
283   }
284
285   // mpq_class(signed long int)
286   {
287     signed long int a = -1234567890L;
288     mpq_class b(a); ASSERT_ALWAYS(b == -1234567890L);
289   }
290
291   // mpq_class(unsigned long int)
292   {
293     unsigned long int a = 1UL << 30;
294     mpq_class b(a); ASSERT_ALWAYS(b == 1073741824L);
295   }
296
297   // mpq_class(float)
298   {
299     float a = 0.625;
300     mpq_class b(a); ASSERT_ALWAYS(b == 0.625);
301   }
302
303   // mpq_class(double)
304   {
305     double a = 1.25;
306     mpq_class b(a); ASSERT_ALWAYS(b == 1.25);
307   }
308
309   // mpq_class(long double)
310   // currently not implemented
311
312   // mpq_class(const char *)
313   {
314     const char *a = "1234567890";
315     mpq_class b(a); ASSERT_ALWAYS(b == 1234567890L);
316   }
317
318   // mpq_class(const char *, int)
319   {
320     const char *a = "FFFF";
321     int base = 16;
322     mpq_class b(a, base); ASSERT_ALWAYS(b == 65535u);
323   }
324
325   // mpq_class(const std::string &)
326   {
327     string a("1234567890");
328     mpq_class b(a); ASSERT_ALWAYS(b == 1234567890L);
329   }
330
331   // mpq_class(const std::string &, int)
332   {
333     string a("7777");
334     int base = 8;
335     mpq_class b(a, base); ASSERT_ALWAYS(b == 4095);
336   }
337
338   // mpq_class(const char *) with invalid
339   {
340     try {
341       const char *a = "abc";
342       mpq_class b(a);
343       ASSERT_ALWAYS (0);  /* should not be reached */
344     } catch (invalid_argument) {
345     }
346   }
347
348   // mpq_class(const char *, int) with invalid
349   {
350     try {
351       const char *a = "ZZZ";
352       int base = 16;
353       mpq_class b (a, base);
354       ASSERT_ALWAYS (0);  /* should not be reached */
355     } catch (invalid_argument) {
356     }
357   }
358
359   // mpq_class(const std::string &) with invalid
360   {
361     try {
362       string a("abc");
363       mpq_class b(a);
364       ASSERT_ALWAYS (0);  /* should not be reached */
365     } catch (invalid_argument) {
366     }
367   }
368
369   // mpq_class(const std::string &, int) with invalid
370   {
371     try {
372       string a("ZZZ");
373       int base = 8;
374       mpq_class b (a, base);
375       ASSERT_ALWAYS (0);  /* should not be reached */
376     } catch (invalid_argument) {
377     }
378   }
379
380   // mpq_class(mpq_srcptr)
381   {
382     mpq_t a;
383     mpq_init(a);
384     mpq_set_ui(a, 100, 1);
385     mpq_class b(a); ASSERT_ALWAYS(b == 100);
386     mpq_clear(a);
387   }
388
389   // mpq_class(const mpz_class &, const mpz_class &)
390   {
391     mpz_class a(123), b(4); // tested above, assume it works
392     mpq_class c(a, b); ASSERT_ALWAYS(c == 30.75);
393   }
394   {
395     mpz_class a(-1), b(2);  // tested above, assume it works
396     mpq_class c(a, b); ASSERT_ALWAYS(c == -0.5);
397   }
398   {
399     mpz_class a(5), b(4); // tested above, assume it works
400     mpq_class c(a, b); ASSERT_ALWAYS(c == 1.25);
401   }
402
403   // mpq_class(const mpz_class &)
404   {
405     mpq_class a(12345); // tested above, assume it works
406     mpq_class b(a); ASSERT_ALWAYS(b == 12345);
407   }
408
409   // no constructor for bool, but it gets casted to int
410   {
411     bool a = true;
412     mpq_class b(a); ASSERT_ALWAYS(b == 1);
413   }
414   {
415     bool a = false;
416     mpq_class b(a); ASSERT_ALWAYS(b == 0);
417   }
418 }
419
420 void
421 check_mpf (void)
422 {
423   // mpf_class()
424   {
425     mpf_class a; ASSERT_ALWAYS(a == 0);
426   }
427
428   // mpf_class(const mpf_class &)
429   // mpf_class(const mpf_class &, unsigned long int)
430   // see below
431
432   // template <class T, class U> mpf_class(const __gmp_expr<T, U> &)
433   // template <class T, class U> mpf_class(const __gmp_expr<T, U> &,
434   //                                       unsigned long int)
435   // not tested here, see t-unary.cc, t-binary.cc
436
437   // mpf_class(signed char)
438   {
439     signed char a = -127;
440     mpf_class b(a); ASSERT_ALWAYS(b == -127);
441   }
442
443   // mpf_class(signed char, unsigned long int)
444   {
445     signed char a = -1;
446     int prec = 64;
447     mpf_class b(a, prec); ASSERT_ALWAYS(b == -1);
448   }
449
450   // mpf_class(unsigned char)
451   {
452     unsigned char a = 255;
453     mpf_class b(a); ASSERT_ALWAYS(b == 255);
454   }
455
456   // mpf_class(unsigned char, unsigned long int)
457   {
458     unsigned char a = 128;
459     int prec = 128;
460     mpf_class b(a, prec); ASSERT_ALWAYS(b == 128);
461   }
462
463   // either signed or unsigned char, machine dependent
464   {
465     mpf_class a('A'); ASSERT_ALWAYS(a == 65);
466   }
467   {
468     int prec = 256;
469     mpf_class a('z', prec); ASSERT_ALWAYS(a == 122);
470   }
471
472   // mpf_class(signed int)
473   {
474     signed int a = 0;
475     mpf_class b(a); ASSERT_ALWAYS(b == 0);
476   }
477   {
478     signed int a = -123;
479     mpf_class b(a); ASSERT_ALWAYS(b == -123);
480   }
481   {
482     signed int a = 4567;
483     mpf_class b(a); ASSERT_ALWAYS(b == 4567);
484   }
485
486   // mpf_class(signed int, unsigned long int)
487   {
488     signed int a = -123;
489     int prec = 64;
490     mpf_class b(a, prec); ASSERT_ALWAYS(b == -123);
491   }
492
493   // mpf_class(unsigned int)
494   {
495     unsigned int a = 890;
496     mpf_class b(a); ASSERT_ALWAYS(b == 890);
497   }
498
499   // mpf_class(unsigned int, unsigned long int)
500   {
501     unsigned int a = 890;
502     int prec = 128;
503     mpf_class b(a, prec); ASSERT_ALWAYS(b == 890);
504   }
505
506   // mpf_class(signed short int)
507   {
508     signed short int a = -12345;
509     mpf_class b(a); ASSERT_ALWAYS(b == -12345);
510   }
511
512   // mpf_class(signed short int, unsigned long int)
513   {
514     signed short int a = 6789;
515     int prec = 256;
516     mpf_class b(a, prec); ASSERT_ALWAYS(b == 6789);
517   }
518
519   // mpf_class(unsigned short int)
520   {
521     unsigned short int a = 54321u;
522     mpf_class b(a); ASSERT_ALWAYS(b == 54321u);
523   }
524
525   // mpf_class(unsigned short int, unsigned long int)
526   {
527     unsigned short int a = 54321u;
528     int prec = 64;
529     mpf_class b(a, prec); ASSERT_ALWAYS(b == 54321u);
530   }
531
532   // mpf_class(signed long int)
533   {
534     signed long int a = -1234567890L;
535     mpf_class b(a); ASSERT_ALWAYS(b == -1234567890L);
536   }
537
538   // mpf_class(signed long int, unsigned long int)
539   {
540     signed long int a = -1234567890L;
541     int prec = 128;
542     mpf_class b(a, prec); ASSERT_ALWAYS(b == -1234567890L);
543   }
544
545   // mpf_class(unsigned long int)
546   {
547     unsigned long int a = 3456789012UL;
548     mpf_class b(a); ASSERT_ALWAYS(b == 3456789012UL);
549   }
550
551   // mpf_class(unsigned long int, unsigned long int)
552   {
553     unsigned long int a = 3456789012UL;
554     int prec = 256;
555     mpf_class b(a, prec); ASSERT_ALWAYS(b == 3456789012UL);
556   }
557
558   // mpf_class(float)
559   {
560     float a = 1234.5;
561     mpf_class b(a); ASSERT_ALWAYS(b == 1234.5);
562   }
563
564   // mpf_class(float, unsigned long int)
565   {
566     float a = 1234.5;
567     int prec = 64;
568     mpf_class b(a, prec); ASSERT_ALWAYS(b == 1234.5);
569   }
570
571   // mpf_class(double)
572   {
573     double a = 12345.0;
574     mpf_class b(a); ASSERT_ALWAYS(b == 12345);
575   }
576   {
577     double a = 1.2345e+4;
578     mpf_class b(a); ASSERT_ALWAYS(b == 12345);
579   }
580   {
581     double a = 312.5e-2;
582     mpf_class b(a); ASSERT_ALWAYS(b == 3.125);
583   }
584
585   // mpf_class(double, unsigned long int)
586   {
587     double a = 5.4321e+4;
588     int prec = 128;
589     mpf_class b(a, prec); ASSERT_ALWAYS(b == 54321L);
590   }
591
592   // mpf_class(long double)
593   // mpf_class(long double, unsigned long int)
594   // currently not implemented
595
596   // mpf_class(const char *)
597   {
598     const char *a = "1234567890";
599     mpf_class b(a); ASSERT_ALWAYS(b == 1234567890L);
600   }
601
602   // mpf_class(const char *, unsigned long int, int = 0)
603   {
604     const char *a = "1234567890";
605     int prec = 256;
606     mpf_class b(a, prec); ASSERT_ALWAYS(b == 1234567890L);
607   }
608   {
609     const char *a = "777777";
610     int prec = 64, base = 8;
611     mpf_class b(a, prec, base); ASSERT_ALWAYS(b == 262143L);
612   }
613
614   // mpf_class(const std::string &)
615   {
616     string a("1234567890");
617     mpf_class b(a); ASSERT_ALWAYS(b == 1234567890L);
618   }
619
620   // mpf_class(const std::string &, unsigned long int, int = 0)
621   {
622     string a("1234567890");
623     int prec = 128;
624     mpf_class b(a, prec); ASSERT_ALWAYS(b == 1234567890L);
625   }
626   {
627     string a("FFFF");
628     int prec = 256, base = 16;
629     mpf_class b(a, prec, base); ASSERT_ALWAYS(b == 65535u);
630   }
631
632   // mpf_class(const char *) with invalid
633   {
634     try {
635       const char *a = "abc";
636       mpf_class b(a);
637       ASSERT_ALWAYS (0);  /* should not be reached */
638     } catch (invalid_argument) {
639     }
640   }
641
642   // mpf_class(const char *, unsigned long int, int = 0) with invalid
643   {
644     try {
645       const char *a = "def";
646       int prec = 256;
647       mpf_class b(a, prec); ASSERT_ALWAYS(b == 1234567890L);
648       ASSERT_ALWAYS (0);  /* should not be reached */
649     } catch (invalid_argument) {
650     }
651   }
652   {
653     try {
654       const char *a = "ghi";
655       int prec = 64, base = 8;
656       mpf_class b(a, prec, base); ASSERT_ALWAYS(b == 262143L);
657       ASSERT_ALWAYS (0);  /* should not be reached */
658     } catch (invalid_argument) {
659     }
660   }
661
662   // mpf_class(const std::string &) with invalid
663   {
664     try {
665       string a("abc");
666       mpf_class b(a); ASSERT_ALWAYS(b == 1234567890L);
667       ASSERT_ALWAYS (0);  /* should not be reached */
668     } catch (invalid_argument) {
669     }
670   }
671
672   // mpf_class(const std::string &, unsigned long int, int = 0) with invalid
673   {
674     try {
675       string a("def");
676       int prec = 128;
677       mpf_class b(a, prec); ASSERT_ALWAYS(b == 1234567890L);
678       ASSERT_ALWAYS (0);  /* should not be reached */
679     } catch (invalid_argument) {
680     }
681   }
682   {
683     try {
684       string a("ghi");
685       int prec = 256, base = 16;
686       mpf_class b(a, prec, base); ASSERT_ALWAYS(b == 65535u);
687       ASSERT_ALWAYS (0);  /* should not be reached */
688     } catch (invalid_argument) {
689     }
690   }
691
692   // mpf_class(mpf_srcptr)
693   {
694     mpf_t a;
695     mpf_init_set_ui(a, 100);
696     mpf_class b(a); ASSERT_ALWAYS(b == 100);
697     mpf_clear(a);
698   }
699
700   // mpf_class(mpf_srcptr, unsigned long int)
701   {
702     mpf_t a;
703     int prec = 64;
704     mpf_init_set_ui(a, 100);
705     mpf_class b(a, prec); ASSERT_ALWAYS(b == 100);
706     mpf_clear(a);
707   }
708
709   // mpf_class(const mpf_class &)
710   {
711     mpf_class a(12345); // tested above, assume it works
712     mpf_class b(a); ASSERT_ALWAYS(b == 12345);
713   }
714
715   // mpf_class(const mpf_class &, unsigned long int)
716   {
717     mpf_class a(12345); // tested above, assume it works
718     int prec = 64;
719     mpf_class b(a, prec); ASSERT_ALWAYS(b == 12345);
720   }
721
722   // no constructors for bool, but it gets casted to int
723   {
724     bool a = true;
725     mpf_class b(a); ASSERT_ALWAYS(b == 1);
726   }
727   {
728     bool a = false;
729     mpf_class b(a); ASSERT_ALWAYS(b == 0);
730   }
731   {
732     bool a = true;
733     int prec = 128;
734     mpf_class b(a, prec); ASSERT_ALWAYS(b == 1);
735   }
736   {
737     bool a = false;
738     int prec = 256;
739     mpf_class b(a, prec); ASSERT_ALWAYS(b == 0);
740   }
741 }
742
743
744 int
745 main (void)
746 {
747   tests_start();
748
749   check_mpz();
750   check_mpq();
751   check_mpf();
752
753   tests_end();
754   return 0;
755 }