| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package main | |
| import Integer "integer" | |
| type Int Integer.Integer; | |
| const ( | |
| sa = "991"; | |
| sb = "2432902008176640000"; // 20! | |
| sc = "93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000"; // 100! | |
| ) | |
| var ( | |
| m, z, p, | |
| a, b, c, | |
| a_a, a_b, a_c, b_b, b_c, c_c, a_b_c | |
| Int | |
| ) | |
| func CHECK(msg string, p bool) { | |
| if !p { | |
| panic "CHECK failed: ", msg, "\n"; | |
| } | |
| } | |
| func Init() { | |
| m = Integer.FromInt(-1); | |
| z = Integer.FromInt(0); | |
| p = Integer.FromInt(1); | |
| a = Integer.FromString(sa); | |
| b = Integer.FromString(sb); | |
| c = Integer.FromString(sc); | |
| a_a = Integer.FromInt(991 + 991); | |
| a_b = Integer.FromString("2432902008176640991"); | |
| a_c = Integer.FromString("93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000991"); | |
| } | |
| func N991() string { return "991" } | |
| func TestConv() { | |
| print "TestConv\n"; | |
| CHECK("TC1", a.eql(Integer.FromInt(991))); | |
| CHECK("TC2", b.eql(Integer.Fact(20))); | |
| CHECK("TC3", c.eql(Integer.Fact(100))); | |
| CHECK("TC4", a.ToString() == sa); | |
| CHECK("TC5", b.ToString() == sb); | |
| CHECK("TC6", c.ToString() == sc); | |
| // also tested much via TestFact | |
| } | |
| func TestAdd() { | |
| print "TestAdd\n"; | |
| CHECK("TA1", z.add(z).eql(z)); | |
| CHECK("TA2", a.add(z).eql(a)); | |
| CHECK("TA3", z.add(a).eql(a)); | |
| CHECK("TA4", c.add(z).eql(c)); | |
| CHECK("TA5", z.add(c).eql(c)); | |
| CHECK("TA6", m.add(p).eql(z)); | |
| CHECK("TA7", a.add(a).eql(a_a)); | |
| CHECK("TA8", a.add(b).eql(a_b)); | |
| CHECK("TA9", a.add(c).eql(a_c)); | |
| // needs more | |
| } | |
| func TestSub() { | |
| print "TestSub\n"; | |
| CHECK("TS1", z.sub(z).eql(z)); | |
| CHECK("TS2", a.sub(z).eql(a)); | |
| CHECK("TS3", z.sub(a).eql(a.neg())); | |
| CHECK("TS4", c.sub(z).eql(c)); | |
| CHECK("TS5", z.sub(c).eql(c.neg())); | |
| CHECK("TS6", p.sub(m).eql(p.add(p))); | |
| CHECK("TS7", a.sub(a).eql(z)); | |
| // needs more | |
| } | |
| func TestMul() { | |
| print "TestMul\n"; | |
| // tested much via TestFact for now | |
| } | |
| func TestDiv() { | |
| print "TestDiv\n"; | |
| // no div implemented yet | |
| } | |
| func TestMod() { | |
| print "TestMod\n"; | |
| // no mod implemented yet | |
| } | |
| func TestFact() { | |
| print "TestFact\n"; | |
| for n := 990; n < 1010; n++ { | |
| f := Integer.Fact(n); | |
| CHECK("TF", Integer.FromString(f.ToString()).eql(f)); | |
| } | |
| } | |
| func main() { | |
| Init(); | |
| TestConv(); | |
| TestAdd(); | |
| TestSub(); | |
| TestMul(); | |
| TestDiv(); | |
| TestMod(); | |
| TestFact(); | |
| print "PASSED\n"; | |
| } |