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