(* Copyright (C) 1990, Digital Equipment Corporation. *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* Last modified on Tue Apr 24 23:14:13 1990 by muller *) (* modified on Fri Mar 9 12:10:18 1990 by mcjones *) MODULE TestSTable EXPORTS Main; IMPORT Fmt, List, SIntTable, SIntTableF, STextTable, STextTableF, Stdio, Text, TextWr, Wr; PROCEDURE TestInts (N: CARDINAL) = VAR i, key: SIntTable.Key; r: REF INTEGER; v: SIntTable.Value; t: SIntTable.T; s: SIntTable.Stream; BEGIN Wr.PutText (Stdio.stdout, "\nTestInts( N := " & Fmt.Int (N) & " )\n"); Wr.PutText (Stdio.stdout, "Calling New.\n"); t := SIntTable.New (); SIntTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling Put N times.\n"); FOR i := 1 TO N DO r := NEW (REF INTEGER); r^ := 2 * i; IF SIntTable.Put (t, 2 * i, r) THEN <* ASSERT (FALSE) *> END END; SIntTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling Get 2*N times.\n"); FOR i := 1 TO N DO IF NOT SIntTable.Get (t, 2 * i, v) THEN <* ASSERT(FALSE) *> END; r := v; IF r^ # 2 * i THEN <* ASSERT (FALSE) *> END; IF SIntTable.Get (t, 2 * i + 1, v) THEN <* ASSERT (FALSE) *> END END; SIntTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling NewStream(ascending).\n"); i := 1 * 2; s := SIntTable.NewStream (t, TRUE, i); Wr.PutText (Stdio.stdout, "Calling Next N times.\n"); LOOP IF NOT SIntTable.Next (s, key, v) THEN EXIT END; <* ASSERT (key = i) *> INC (i, 2) END; <* ASSERT key = 2 * N *> SIntTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling NewStream(descending).\n"); i := 2 * N; s := SIntTable.NewStream (t, FALSE, i); Wr.PutText (Stdio.stdout, "Calling Next N times.\n"); LOOP IF NOT SIntTable.Next (s, key, v) THEN EXIT END; <* ASSERT (key = i) *> DEC (i, 2) END; <* ASSERT key = 2 * 1 *> SIntTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling Delete N times.\n"); FOR i := 1 TO N DO IF NOT SIntTable.Delete (t, 2 * i, v) THEN <* ASSERT FALSE *> END; r := v; IF r^ # 2 * i THEN <* ASSERT FALSE *> END; IF SIntTable.Delete (t, 2 * i + 1, v) THEN <* ASSERT FALSE *> END END; SIntTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling Clear.\n"); SIntTable.Clear (t); <* ASSERT NOT SIntTable.Next (SIntTable.NewStream (t), key, v) *> END TestInts; PROCEDURE TextFromInt (n: INTEGER): Text.T RAISES {} = VAR wr: TextWr.T; BEGIN wr := TextWr.New (); Wr.PutText (wr, Fmt.Pad (Fmt.Int (n), 6)); RETURN TextWr.ToText (wr); END TextFromInt; PROCEDURE TestTexts (N: CARDINAL) = VAR i: CARDINAL; key: STextTable.Key; v: SIntTable.Value; t: STextTable.T; s: STextTable.Stream; BEGIN Wr.PutText (Stdio.stdout, "\nTestTexts( N := " & Fmt.Int (N) & " )\n"); Wr.PutText (Stdio.stdout, "Calling New.\n"); t := STextTable.New (); STextTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling Put N times.\n"); FOR i := 1 TO N DO key := TextFromInt (2 * i); IF STextTable.Put (t, key, key) THEN <* ASSERT FALSE *> END END; STextTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling Get 2*N times.\n"); FOR i := 1 TO N DO key := TextFromInt (2 * i); IF NOT STextTable.Get (t, key, v) OR Text.Compare (v, key) # 0 THEN <* ASSERT FALSE *> END; IF STextTable.Get (t, TextFromInt(2 * i + 1), v) THEN <* ASSERT FALSE *> END END; STextTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling NewStream(ascending).\n"); i := 1 * 2; s := STextTable.NewStream (t, TRUE, TextFromInt(i)); Wr.PutText (Stdio.stdout, "Calling Next N times.\n"); LOOP IF NOT STextTable.Next (s, key, v) THEN EXIT END; <* ASSERT Text.Compare (key, TextFromInt (i)) = 0 *> INC (i, 2) END; <* ASSERT Text.Compare(key, TextFromInt (2 * N)) = 0 *> STextTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling NewStream(descending).\n"); i := 2 * N; s := STextTable.NewStream (t, FALSE, TextFromInt (i)); Wr.PutText (Stdio.stdout, "Calling Next N times.\n"); LOOP IF NOT STextTable.Next (s, key, v) THEN EXIT END; <* ASSERT Text.Compare (key, TextFromInt (i)) = 0 *> DEC (i, 2) END; <* ASSERT Text.Compare (key, TextFromInt (2 * 1)) = 0 *> STextTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling Delete N times.\n"); FOR i := 1 TO N DO key := TextFromInt (2 * i); IF NOT STextTable.Delete (t, key, v) OR Text.Compare (v, key) # 0 THEN <* ASSERT FALSE *> END; IF STextTable.Delete (t, TextFromInt (2 * i + 1), v) THEN <* ASSERT FALSE *> END END; STextTableF.Validate (t); Wr.PutText (Stdio.stdout, "Calling Clear.\n"); STextTable.Clear (t); <* ASSERT NOT STextTable.Next (STextTable.NewStream (t), key, v) *> END TestTexts; BEGIN TestInts (1000); TestTexts (1000); END TestSTable.