| // 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"; |
| } |