- implemented Multiplication
- changed Cmp to return -1, 0, +1
- added corresponding test cases

R=rsc
DELTA=173  (136 added, 3 deleted, 34 changed)
OCL=33431
CL=33459
diff --git a/src/pkg/big/int_test.go b/src/pkg/big/int_test.go
index 528afdd..4e150ee 100644
--- a/src/pkg/big/int_test.go
+++ b/src/pkg/big/int_test.go
@@ -25,6 +25,14 @@
 	argZZ{newZ(-1111111110), newZ(-123456789), newZ(-987654321)},
 }
 
+var prodZZ = []argZZ{
+	argZZ{newZ(0), newZ(0), newZ(0)},
+	argZZ{newZ(0), newZ(1), newZ(0)},
+	argZZ{newZ(1), newZ(1), newZ(1)},
+	argZZ{newZ(-991*991), newZ(991), newZ(-991)},
+	// TODO(gri) add larger products
+}
+
 
 func TestSetZ(t *testing.T) {
 	for _, a := range sumZZ {
@@ -46,7 +54,7 @@
 }
 
 
-func TestFunZZ(t *testing.T) {
+func TestSumZZ(t *testing.T) {
 	AddZZ := func(z, x, y *Int) *Int { return z.Add(x, y) };
 	SubZZ := func(z, x, y *Int) *Int { return z.Sub(x, y) };
 	for _, a := range sumZZ {
@@ -63,3 +71,49 @@
 		testFunZZ(t, "SubZZ symmetric", SubZZ, arg);
 	}
 }
+
+
+func TestProdZZ(t *testing.T) {
+	MulZZ := func(z, x, y *Int) *Int { return z.Mul(x, y) };
+	for _, a := range prodZZ {
+		arg := a;
+		testFunZZ(t, "MulZZ", MulZZ, arg);
+
+		arg = argZZ{a.z, a.y, a.x};
+		testFunZZ(t, "MulZZ symmetric", MulZZ, arg);
+	}
+}
+
+
+var facts = map[int] string {
+	0: "1",
+	1: "1",
+	2: "2",
+	10: "3628800",
+	20: "2432902008176640000",
+	100: "933262154439441526816992388562667004907159682643816214685929"
+		"638952175999932299156089414639761565182862536979208272237582"
+		"51185210916864000000000000000000000000",
+}
+
+
+func fact(n int) *Int {
+	var z Int;
+	z.New(1);
+	for i := 2; i <= n; i++ {
+		var t Int;
+		t.New(int64(i));
+		z.Mul(&z, &t);
+	}
+	return &z;
+}
+
+
+func TestFact(t *testing.T) {
+	for n, s := range facts {
+		f := fact(n).String();
+		if f != s {
+			t.Errorf("%d! = %s; want %s", n, f, s);
+		}
+	}
+}