blob: 30d3cd68138b494ce2694afde873354f1c1ab13a [file] [log] [blame]
Robert Griesemerdb3bf9c2009-08-14 11:53:27 -07001// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package big
6
7import "testing"
8
9
Robert Griesemere5874222009-08-15 11:43:54 -070010func newZ(x int64) *Int {
11 var z Int;
12 return z.New(x);
Robert Griesemerdb3bf9c2009-08-14 11:53:27 -070013}
14
15
Robert Griesemere5874222009-08-15 11:43:54 -070016type funZZ func(z, x, y *Int) *Int
Russ Cox650bff62009-10-06 14:55:39 -070017type argZZ struct {
18 z, x, y *Int;
19}
Robert Griesemerdb3bf9c2009-08-14 11:53:27 -070020
21var sumZZ = []argZZ{
22 argZZ{newZ(0), newZ(0), newZ(0)},
23 argZZ{newZ(1), newZ(1), newZ(0)},
24 argZZ{newZ(1111111110), newZ(123456789), newZ(987654321)},
25 argZZ{newZ(-1), newZ(-1), newZ(0)},
26 argZZ{newZ(864197532), newZ(-123456789), newZ(987654321)},
27 argZZ{newZ(-1111111110), newZ(-123456789), newZ(-987654321)},
28}
29
Robert Griesemer88742ef2009-08-18 10:06:15 -070030var prodZZ = []argZZ{
31 argZZ{newZ(0), newZ(0), newZ(0)},
32 argZZ{newZ(0), newZ(1), newZ(0)},
33 argZZ{newZ(1), newZ(1), newZ(1)},
Russ Cox650bff62009-10-06 14:55:39 -070034 argZZ{newZ(-991 * 991), newZ(991), newZ(-991)},
35// TODO(gri) add larger products
Robert Griesemer88742ef2009-08-18 10:06:15 -070036}
37
Robert Griesemerdb3bf9c2009-08-14 11:53:27 -070038
39func TestSetZ(t *testing.T) {
40 for _, a := range sumZZ {
Robert Griesemere5874222009-08-15 11:43:54 -070041 var z Int;
42 z.Set(a.z);
43 if CmpInt(&z, a.z) != 0 {
Robert Griesemerdb3bf9c2009-08-14 11:53:27 -070044 t.Errorf("got z = %v; want %v", z, a.z);
45 }
46 }
47}
48
49
50func testFunZZ(t *testing.T, msg string, f funZZ, a argZZ) {
Robert Griesemere5874222009-08-15 11:43:54 -070051 var z Int;
52 f(&z, a.x, a.y);
53 if CmpInt(&z, a.z) != 0 {
54 t.Errorf("%s%+v\n\tgot z = %v; want %v", msg, a, &z, a.z);
Robert Griesemerdb3bf9c2009-08-14 11:53:27 -070055 }
56}
57
58
Robert Griesemer88742ef2009-08-18 10:06:15 -070059func TestSumZZ(t *testing.T) {
Russ Cox650bff62009-10-06 14:55:39 -070060 AddZZ := func(z, x, y *Int) *Int {
61 return z.Add(x, y);
62 };
63 SubZZ := func(z, x, y *Int) *Int {
64 return z.Sub(x, y);
65 };
Robert Griesemerdb3bf9c2009-08-14 11:53:27 -070066 for _, a := range sumZZ {
67 arg := a;
68 testFunZZ(t, "AddZZ", AddZZ, arg);
69
70 arg = argZZ{a.z, a.y, a.x};
71 testFunZZ(t, "AddZZ symmetric", AddZZ, arg);
72
73 arg = argZZ{a.x, a.z, a.y};
74 testFunZZ(t, "SubZZ", SubZZ, arg);
75
76 arg = argZZ{a.y, a.z, a.x};
77 testFunZZ(t, "SubZZ symmetric", SubZZ, arg);
78 }
79}
Robert Griesemer88742ef2009-08-18 10:06:15 -070080
81
82func TestProdZZ(t *testing.T) {
Russ Cox650bff62009-10-06 14:55:39 -070083 MulZZ := func(z, x, y *Int) *Int {
84 return z.Mul(x, y);
85 };
Robert Griesemer88742ef2009-08-18 10:06:15 -070086 for _, a := range prodZZ {
87 arg := a;
88 testFunZZ(t, "MulZZ", MulZZ, arg);
89
90 arg = argZZ{a.z, a.y, a.x};
91 testFunZZ(t, "MulZZ symmetric", MulZZ, arg);
92 }
93}
94
95
Russ Cox650bff62009-10-06 14:55:39 -070096var facts = map[int]string{
Robert Griesemer88742ef2009-08-18 10:06:15 -070097 0: "1",
98 1: "1",
99 2: "2",
100 10: "3628800",
101 20: "2432902008176640000",
102 100: "933262154439441526816992388562667004907159682643816214685929"
103 "638952175999932299156089414639761565182862536979208272237582"
104 "51185210916864000000000000000000000000",
105}
106
107
108func fact(n int) *Int {
109 var z Int;
110 z.New(1);
111 for i := 2; i <= n; i++ {
112 var t Int;
113 t.New(int64(i));
114 z.Mul(&z, &t);
115 }
116 return &z;
117}
118
119
120func TestFact(t *testing.T) {
121 for n, s := range facts {
122 f := fact(n).String();
123 if f != s {
124 t.Errorf("%d! = %s; want %s", n, f, s);
125 }
126 }
127}