-- FileTestImpl.mesa
-- written by Bill Paxton, April 1981
-- last edit by Bill Paxton, 15-Oct-81 15:00:51
-- This package provides random testing for filing Text nodes
DIRECTORY
EditTest,
TextEdit,
TextFind,
TextLooks,
TextLooksSupport,
RopeEdit,
TextNode,
NodeProps,
PutGet,
GetTree,
RunReader,
RopeReader,
Rope,
RopeInline,
CheckNode,
TreeCheck,
FileByteStream;
FileTestImpl: PROGRAM
IMPORTS EditTest, TextEdit, RopeEdit,
PutGet, GetTree, RunReader, RopeReader, Rope,
NodeProps, TextNode, TreeCheck,
CheckNode, FileByteStream
EXPORTS EditTest =
BEGIN
OPEN
rI:Rope,
editI:TextEdit,
findI:TextFind,
looksI:TextLooks,
looksSI:TextLooksSupport,
ropeI:RopeEdit,
nodeI:TextNode,
propsI:NodeProps,
runrdrI:RunReader,
roperdrI:RopeReader,
pgI:PutGet,
checkI:CheckNode,
streamI:FileByteStream,
EditTest;
-- ***** Filing operations
fileNameA: Rope ← rI.FromString["file1.tioga"];
fileNameB: Rope ← rI.FromString["file2.tioga"];
fileName: Rope ← fileNameA;
PutGet: PUBLIC PROC = {
newAlpha, newBeta: Node;
fromFile, child: editI.Ref;
oldAlphaSize, oldBetaSize, endAlpha: Offset;
oldAlphaRope, newAlphaRope, oldBetaRope, newBetaRope: Rope;
oldAlphaRuns, newAlphaRuns, oldBetaRuns, newBetaRuns: Runs;
IF TRUE --OneInN[4]-- THEN RETURN;
oldAlphaSize ← editI.Size[alpha];
oldBetaSize ← editI.Size[beta];
oldAlphaRope ← editI.GetRope[alpha];
oldAlphaRuns ← editI.GetRuns[alpha];
oldBetaRope ← editI.GetRope[beta];
oldBetaRuns ← editI.GetRuns[beta];
endAlpha ← pgI.ToFile[fileName,alpha];
--temp [] ← pgI.ToFile[fileName,beta,endAlpha];
fromFile ← pgI.FromFile[fileName,0,endAlpha];
IF(child ← nodeI.FirstChild[fromFile]) # NIL THEN fromFile ← child;
WITH n:fromFile SELECT FROM text => newAlpha ← @n; ENDCASE => ERROR;
newAlphaRope ← editI.GetRope[newAlpha];
newAlphaRuns ← editI.GetRuns[newAlpha];
checkI.CheckTextNode[newAlpha];
CheckSize[newAlpha,oldAlphaSize];
CheckRopes[newAlphaRope,0,oldAlphaRope,0,oldAlphaSize];
CheckRuns[newAlphaRuns,0,oldAlphaRuns,0,oldAlphaSize];
IF newAlpha.typename # alpha.typename THEN ERROR;
RETURN; --temp
fromFile ← pgI.FromFile[fileName,endAlpha];
IF(child ← nodeI.FirstChild[fromFile]) # NIL THEN fromFile ← child;
WITH n:fromFile SELECT FROM text => newBeta ← @n; ENDCASE => ERROR;
newBetaRope ← editI.GetRope[newBeta];
newBetaRuns ← editI.GetRuns[newBeta];
checkI.CheckTextNode[newBeta];
CheckSize[newBeta,oldBetaSize];
CheckRopes[newBetaRope,0,oldBetaRope,0,oldBetaSize];
CheckRuns[newBetaRuns,0,oldBetaRuns,0,oldBetaSize];
IF newBeta.typename # beta.typename THEN ERROR;
fileName ← IF fileName=fileNameA THEN fileNameB ELSE fileNameA;
};
PutGetToRope: PUBLIC PROC = {
newAlpha, newBeta: Node;
oldAlphaSize, oldBetaSize, endAlpha: Offset;
outputAlpha, outputBeta, output: Rope;
fromRope: editI.Ref;
oldAlphaRope, newAlphaRope, oldBetaRope, newBetaRope: Rope;
oldAlphaRuns, newAlphaRuns, oldBetaRuns, newBetaRuns: Runs;
IF TRUE --OneInN[4]-- THEN RETURN;
oldAlphaSize ← editI.Size[alpha];
oldBetaSize ← editI.Size[beta];
oldAlphaRope ← editI.GetRope[alpha];
oldAlphaRuns ← editI.GetRuns[alpha];
oldBetaRope ← editI.GetRope[beta];
oldBetaRuns ← editI.GetRuns[beta];
outputAlpha ← pgI.ToRope[alpha];
endAlpha ← ropeI.Size[outputAlpha];
outputBeta ← pgI.ToRope[beta];
output ← ropeI.Concat[outputAlpha,outputBeta];
fromRope ← pgI.FromRope[output,0,endAlpha];
WITH n:fromRope SELECT FROM text => newAlpha ← @n; ENDCASE => ERROR;
newAlphaRope ← editI.GetRope[newAlpha];
newAlphaRuns ← editI.GetRuns[newAlpha];
checkI.CheckTextNode[newAlpha];
CheckSize[newAlpha,oldAlphaSize];
CheckRopes[newAlphaRope,0,oldAlphaRope,0,oldAlphaSize];
CheckRuns[newAlphaRuns,0,oldAlphaRuns,0,oldAlphaSize];
IF newAlpha.typename # alpha.typename THEN ERROR;
fromRope ← pgI.FromRope[output,endAlpha];
WITH n:fromRope SELECT FROM text => newBeta ← @n; ENDCASE => ERROR;
newBetaRope ← editI.GetRope[newBeta];
newBetaRuns ← editI.GetRuns[newBeta];
checkI.CheckTextNode[newBeta];
CheckSize[newBeta,oldBetaSize];
CheckRopes[newBetaRope,0,oldBetaRope,0,oldBetaSize];
CheckRuns[newBetaRuns,0,oldBetaRuns,0,oldBetaSize];
IF newBeta.typename # beta.typename THEN ERROR;
};
PutGetToStream: PUBLIC PROC = {
stream: streamI.Handle;
newAlpha, newBeta: Node;
oldAlphaSize, oldBetaSize, alphaChars, betaChars: Offset;
fromStream: editI.Ref;
oldAlphaRope, newAlphaRope, oldBetaRope, newBetaRope: Rope;
oldAlphaRuns, newAlphaRuns, oldBetaRuns, newBetaRuns: Runs;
IF TRUE --OneInN[4]-- THEN RETURN;
stream ← streamI.Open[fileName,write];
streamI.SetLength[stream,0];
oldAlphaSize ← editI.Size[alpha];
oldBetaSize ← editI.Size[beta];
oldAlphaRope ← editI.GetRope[alpha];
oldAlphaRuns ← editI.GetRuns[alpha];
oldBetaRope ← editI.GetRope[beta];
oldBetaRuns ← editI.GetRuns[beta];
streamI.PutChar[stream,'1];
alphaChars ← pgI.ToStream[stream,alpha];
streamI.PutChar[stream,'2];
betaChars ← pgI.ToStream[stream,beta];
streamI.PutChar[stream,'3];
streamI.Close[stream,TRUE];
stream ← streamI.Open[fileName,read];
IF streamI.GetChar[stream] # '1 THEN ERROR;
fromStream ← pgI.FromStream[stream,alphaChars];
WITH n:fromStream SELECT FROM text => newAlpha ← @n; ENDCASE => ERROR;
newAlphaRope ← editI.GetRope[newAlpha];
newAlphaRuns ← editI.GetRuns[newAlpha];
checkI.CheckTextNode[newAlpha];
CheckSize[newAlpha,oldAlphaSize];
CheckRopes[newAlphaRope,0,oldAlphaRope,0,oldAlphaSize];
CheckRuns[newAlphaRuns,0,oldAlphaRuns,0,oldAlphaSize];
IF newAlpha.typename # alpha.typename THEN ERROR;
IF streamI.GetChar[stream] # '2 THEN ERROR;
fromStream ← pgI.FromStream[stream,betaChars];
WITH n:fromStream SELECT FROM text => newBeta ← @n; ENDCASE => ERROR;
newBetaRope ← editI.GetRope[newBeta];
newBetaRuns ← editI.GetRuns[newBeta];
checkI.CheckTextNode[newBeta];
CheckSize[newBeta,oldBetaSize];
CheckRopes[newBetaRope,0,oldBetaRope,0,oldBetaSize];
CheckRuns[newBetaRuns,0,oldBetaRuns,0,oldBetaSize];
IF newBeta.typename # beta.typename THEN ERROR;
IF streamI.GetChar[stream] # '3 THEN ERROR;
IF ~streamI.EndOf[stream] THEN ERROR;
streamI.Close[stream,TRUE];
fileName ← IF fileName=fileNameA THEN fileNameB ELSE fileNameA;
};
PutGetRope: PUBLIC PROC = {
newAlpha, newBeta: Node;
fromFile: editI.Ref;
oldAlphaRope, newAlphaRope, oldBetaRope, newBetaRope: Rope;
oldAlphaSize, oldBetaSize, endAlpha: Offset;
IF TRUE --OneInN[4]-- THEN RETURN;
oldAlphaSize ← editI.Size[alpha];
oldBetaSize ← editI.Size[beta];
oldAlphaRope ← editI.GetRope[alpha];
oldBetaRope ← editI.GetRope[beta];
endAlpha ← oldAlphaSize;
ropeI.ToFile[fileName,oldAlphaRope];
--temp ropeI.ToFile[fileName,oldBetaRope,endAlpha];
fromFile ← pgI.FromFile[fileName,0,endAlpha];
fromFile ← nodeI.FirstChild[fromFile];
WITH x:fromFile SELECT FROM text => newAlpha ← @x; ENDCASE => ERROR;
newAlphaRope ← editI.GetRope[newAlpha];
IF editI.GetRuns[newAlpha] # NIL THEN ERROR;
checkI.CheckTextNode[newAlpha];
CheckSize[newAlpha,oldAlphaSize];
CheckRopes[newAlphaRope,0,oldAlphaRope,0,oldAlphaSize];
newAlphaRope ← ropeI.FromFile[fileName,0,endAlpha];
IF ropeI.Size[newAlphaRope] # oldAlphaSize THEN ERROR;
CheckRopes[newAlphaRope,0,oldAlphaRope,0,oldAlphaSize];
RETURN; --temp
fromFile ← pgI.FromFile[fileName,endAlpha];
fromFile ← nodeI.FirstChild[fromFile];
WITH x:fromFile SELECT FROM text => newBeta ← @x; ENDCASE => ERROR;
newBetaRope ← editI.GetRope[newBeta];
IF editI.GetRuns[newBeta] # NIL THEN ERROR;
checkI.CheckTextNode[newBeta];
CheckSize[newBeta,oldBetaSize];
CheckRopes[newBetaRope,0,oldBetaRope,0,oldBetaSize];
newBetaRope ← ropeI.FromFile[fileName,endAlpha];
IF ropeI.Size[newBetaRope] # oldBetaSize THEN ERROR;
CheckRopes[newBetaRope,0,oldBetaRope,0,oldBetaSize];
fileName ← IF fileName=fileNameA THEN fileNameB ELSE fileNameA;
};
treeFileFlag: BOOLEAN ← FALSE;
treeFileName: Rope ← rI.FromString["TestTree.Text"];
PutGetTree: PUBLIC PROC = {
node: Node;
new: Node;
fromFile: editI.Ref;
IF TRUE --treeFileFlag-- THEN RETURN;
treeFileFlag ← TRUE; -- only do this test once
node ← GetTree.ReadIndent[treeFileName];
TreeCheck.Verify[node];
[] ← pgI.ToFile[fileName,node];
fromFile ← pgI.FromFile[fileName];
TreeCheck.Verify[fromFile];
WITH n:fromFile SELECT FROM text => new ← @n; ENDCASE => ERROR;
CheckTrees[node,new];
fileName ← IF fileName=fileNameA THEN fileNameB ELSE fileNameA;
};
CheckTrees: PROC [t1,t2: editI.Ref] = { -- ERROR if trees not equal
x1, x2: editI.Ref;
WITH n1:t1 SELECT FROM
text => WITH n2:t2 SELECT FROM
text => { -- must have same text&looks
size: Offset ← editI.Size[@n1];
IF editI.Size[@n2] # size THEN ERROR;
CheckRopes[n1.rope,0,n2.rope,0,size];
CheckRuns[n1.runs,0,n2.runs,0,size] };
ENDCASE => ERROR;
other => WITH n2:t2 SELECT FROM
other => NULL;
ENDCASE => ERROR;
ENDCASE => ERROR;
IF t1.typename # t2.typename THEN ERROR;
IF (t1.hasprefix OR t2.hasprefix) AND
propsI.GetPrefixObject[t1]#propsI.GetPrefixObject[t2]
THEN ERROR;
IF (t1.haspostfix OR t2.haspostfix) AND
propsI.GetPostfixObject[t1]#propsI.GetPostfixObject[t2]
THEN ERROR;
x1 ← t1.child; x2 ← t2.child;
DO -- check children
IF x1=NIL THEN IF x2=NIL THEN RETURN ELSE ERROR;
IF x2=NIL THEN ERROR;
CheckTrees[x1,x2];
x1 ← nodeI.Next[x1]; x2 ← nodeI.Next[x2];
ENDLOOP };
bigFileFlag: BOOLEAN ← FALSE;
GetBigFile: PUBLIC PROC = {
rope: Rope;
IF TRUE --bigFileFlag-- THEN RETURN; -- only do this once or will fill up VM
rope ← ropeI.FromFile[rI.FromString["bigfile.text"],0,LAST[Offset],TRUE];
checkI.CheckRope[rope];
bigFileFlag ← TRUE
};
END.