-- Test2Impl.mesa -- written by Bill Paxton, April 1981 -- last edit by Bill Paxton, 29-Jun-81 15:59:27 -- This module provides random testing for editing Text nodes DIRECTORY EditTest, TextEdit, RopeEdit, TextNode, RunReader, RopeReader, Rope, RopeInline; Test2Impl: PROGRAM IMPORTS EditTest, TextEdit, RopeEdit, RunReader, RopeReader, Rope EXPORTS EditTest = BEGIN OPEN rI:Rope, EditTest, editI:TextEdit, ropeI:RopeEdit, nodeI:TextNode, runrdrI:RunReader, roperdrI:RopeReader; -- ***** Text Edit operations ReplaceByChar: PUBLIC PROC = { dest: Node _ PickNode[]; destStart, destEnd, destLen, oldSize, oldPos, newPos, resultStart, resultLen: Offset; newRope, oldRope: Rope; newRuns, oldRuns: Runs; inherit: BOOLEAN _ RandomBoolean[]; looks: Looks; IF ~inherit THEN looks _ PickLooks[]; [destStart,destEnd] _ PickTwo[dest]; oldSize _ editI.Size[dest]; oldRope _ editI.GetRope[dest]; oldRuns _ editI.GetRuns[dest]; BeforeUndo[dest]; [resultStart,resultLen] _ editI.ReplaceByChar[dest,'#, destStart,destLen_destEnd-destStart,inherit,looks,event]; newRope _ editI.GetRope[dest]; newRuns _ editI.GetRuns[dest]; IF resultStart # destStart OR resultLen # 1 THEN ERROR; CheckSize[dest,oldSize+1-destLen]; CheckRopes[newRope,0,oldRope,0,destStart]; IF editI.FetchChar[dest,destStart] # '# THEN ERROR; oldPos _ destStart+destLen; newPos _ destStart+1; CheckRopes[newRope,newPos,oldRope,oldPos,oldSize-oldPos]; CheckRuns[newRuns,0,oldRuns,0,destStart]; IF ~inherit AND editI.FetchLooks[dest,destStart] # looks THEN ERROR; CheckRuns[newRuns,newPos,oldRuns,oldPos,oldSize-oldPos]; TestUndo[]; AdjustLength[dest] }; InsertChar: PUBLIC PROC = { dest: Node _ PickNode[]; destLoc: Offset _ PickOne[dest]; oldSize, loc, oldPos, newPos, resultStart, resultLen: Offset; newRope, oldRope: Rope; newRuns, oldRuns: Runs; inherit: BOOLEAN _ RandomBoolean[]; looks: Looks; num: NAT _ ChooseNAT[1,20]; -- number of chars to insert IF ~inherit THEN looks _ PickLooks[]; oldSize _ editI.Size[dest]; oldRope _ editI.GetRope[dest]; oldRuns _ editI.GetRuns[dest]; loc _ destLoc; FOR i:NAT IN [0..num) DO [resultStart,resultLen] _ editI.InsertChar[dest,'z-i,loc,inherit,looks]; IF resultStart # loc OR resultLen # 1 THEN ERROR; loc _ loc+1; ENDLOOP; newRope _ editI.GetRope[dest]; newRuns _ editI.GetRuns[dest]; CheckSize[dest,oldSize+num]; CheckRopes[newRope,0,oldRope,0,destLoc]; loc _ destLoc; FOR i:NAT IN [0..num) DO IF editI.FetchChar[dest,loc] # 'z-i THEN ERROR; IF ~inherit AND editI.FetchLooks[dest,loc] # looks THEN ERROR; loc _ loc+1; ENDLOOP; oldPos _ destLoc; newPos _ destLoc+num; CheckRopes[newRope,newPos,oldRope,oldPos,oldSize-oldPos]; CheckRuns[newRuns,0,oldRuns,0,destLoc]; CheckRuns[newRuns,newPos,oldRuns,oldPos,oldSize-oldPos]; AdjustLength[dest] }; AppendChar: PUBLIC PROC = { dest: Node _ PickNode[]; inherit: BOOLEAN _ RandomBoolean[]; looks: Looks; loc, oldSize, resultStart, resultLen: Offset; newRope, oldRope: Rope; newRuns, oldRuns: Runs; num: NAT _ ChooseNAT[1,20]; -- number of chars to append IF ~inherit THEN looks _ PickLooks[]; oldSize _ editI.Size[dest]; oldRope _ editI.GetRope[dest]; oldRuns _ editI.GetRuns[dest]; FOR i:NAT IN [0..num) DO loc: Offset _ editI.Size[dest]; [resultStart,resultLen] _ editI.AppendChar[dest,'Z-i,inherit,looks]; IF resultStart # loc OR resultLen # 1 THEN ERROR; ENDLOOP; newRope _ editI.GetRope[dest]; newRuns _ editI.GetRuns[dest]; CheckSize[dest,oldSize+num]; CheckRopes[newRope,0,oldRope,0,oldSize]; loc _ oldSize; FOR i:NAT IN [0..num) DO IF editI.FetchChar[dest,loc] # 'Z-i THEN ERROR; IF ~inherit AND editI.FetchLooks[dest,loc] # looks THEN ERROR; loc _ loc+1; ENDLOOP; CheckRuns[newRuns,0,oldRuns,0,oldSize]; AdjustLength[dest] }; string: REF READONLY TEXT _ "1234567890123456789012345678901234567890"; stringRope: Rope _ rI.FromString[string]; ReplaceByString: PUBLIC PROC = { dest: Node _ PickNode[]; destStart, destEnd, destLen, oldSize, oldPos, newPos, resultStart, resultLen: Offset; newRope, oldRope: Rope; newRuns, oldRuns: Runs; inherit: BOOLEAN _ RandomBoolean[]; looks: Looks; strStart, strEnd, strLen: NAT; oldSize _ editI.Size[dest]; oldRope _ editI.GetRope[dest]; oldRuns _ editI.GetRuns[dest]; IF ~inherit THEN looks _ PickLooks[]; [destStart,destEnd] _ PickTwo[dest]; [strStart,strEnd] _ ChooseTwoNATs[0,string.length]; BeforeUndo[dest]; [resultStart,resultLen] _ editI.ReplaceByString[dest,string,strStart, strLen_strEnd-strStart,destStart,destLen_destEnd-destStart,inherit,looks,event]; newRope _ editI.GetRope[dest]; newRuns _ editI.GetRuns[dest]; IF resultStart # destStart OR resultLen # strLen THEN ERROR; CheckSize[dest,oldSize+strLen-destLen]; CheckRopes[newRope,0,oldRope,0,destStart]; CheckRopes[newRope,destStart,stringRope,strStart,strLen]; oldPos _ destStart+destLen; newPos _ destStart+strLen; CheckRopes[newRope,newPos,oldRope,oldPos,oldSize-oldPos]; CheckRuns[newRuns,0,oldRuns,0,destStart]; IF ~inherit AND strLen>0 AND editI.FetchLooks[dest,destStart] # looks THEN ERROR; CheckRuns[newRuns,newPos,oldRuns,oldPos,oldSize-oldPos]; TestUndo[]; AdjustLength[dest] }; InsertString: PUBLIC PROC = { dest: Node _ PickNode[]; InsertStringInNode[dest]; AdjustLength[dest] }; InsertStringInNode: PUBLIC PROC [dest: Node] = { oldSize, resultStart, resultLen: Offset; destLoc: Offset _ PickOne[dest]; inherit: BOOLEAN _ RandomBoolean[]; newRope, oldRope: Rope; newRuns, oldRuns: Runs; looks: Looks; strStart, strEnd, strLen: NAT; IF ~inherit THEN looks _ PickLooks[]; [strStart,strEnd] _ ChooseTwoNATs[0,string.length]; oldSize _ editI.Size[dest]; oldRope _ editI.GetRope[dest]; oldRuns _ editI.GetRuns[dest]; [resultStart,resultLen] _ editI.InsertString[dest,string,strStart,strLen_strEnd-strStart, destLoc,inherit,looks]; newRope _ editI.GetRope[dest]; newRuns _ editI.GetRuns[dest]; IF resultStart # destLoc OR resultLen # strLen THEN ERROR; CheckSize[dest,oldSize+strLen]; CheckRopes[newRope,0,oldRope,0,destLoc]; CheckRopes[newRope,destLoc,stringRope,strStart,strLen]; CheckRopes[newRope,destLoc+strLen,oldRope,destLoc,oldSize-destLoc]; CheckRuns[newRuns,0,oldRuns,0,destLoc]; IF ~inherit AND strLen>0 AND editI.FetchLooks[dest,destLoc] # looks THEN ERROR; CheckRuns[newRuns,destLoc+strLen,oldRuns,destLoc,oldSize-destLoc] }; AppendString: PUBLIC PROC = { dest: Node _ PickNode[]; inherit: BOOLEAN _ RandomBoolean[]; looks: Looks; oldSize, resultStart, resultLen: Offset; newRope, oldRope: Rope; newRuns, oldRuns: Runs; strStart, strEnd, strLen: NAT; IF ~inherit THEN looks _ PickLooks[]; [strStart,strEnd] _ ChooseTwoNATs[0,string.length]; oldSize _ editI.Size[dest]; oldRope _ editI.GetRope[dest]; oldRuns _ editI.GetRuns[dest]; [resultStart,resultLen] _ editI.AppendString[dest,string,strStart,strLen_strEnd-strStart, inherit,looks]; newRope _ editI.GetRope[dest]; newRuns _ editI.GetRuns[dest]; IF resultStart # oldSize OR resultLen # strLen THEN ERROR; CheckSize[dest,oldSize+strLen]; CheckRopes[newRope,0,oldRope,0,oldSize]; CheckRopes[newRope,oldSize,stringRope,strStart,strLen]; CheckRuns[newRuns,0,oldRuns,0,oldSize]; IF ~inherit AND strLen>0 AND editI.FetchLooks[dest,oldSize] # looks THEN ERROR; AdjustLength[dest] }; ReplaceByRope: PUBLIC PROC = { dest: Node _ PickNode[]; rope: Rope _ PickRope[]; newRope, oldRope: Rope; newRuns, oldRuns: Runs; destStart, destEnd, destLen, oldSize, oldPos, newPos, ropeLen, resultStart, resultLen: Offset; inherit: BOOLEAN _ RandomBoolean[]; looks: Looks; [destStart,destEnd] _ PickTwo[dest]; IF ~inherit THEN looks _ PickLooks[]; oldSize _ editI.Size[dest]; oldRope _ editI.GetRope[dest]; oldRuns _ editI.GetRuns[dest]; ropeLen _ ropeI.Size[rope]; BeforeUndo[dest]; [resultStart,resultLen] _ editI.ReplaceByRope[dest,rope, destStart,destLen_destEnd-destStart,inherit,looks,event]; newRope _ editI.GetRope[dest]; newRuns _ editI.GetRuns[dest]; IF resultStart # destStart OR resultLen # ropeLen THEN ERROR; CheckSize[dest,oldSize+ropeLen-destLen]; CheckRopes[newRope,0,oldRope,0,destStart]; CheckRopes[newRope,destStart,rope,0,ropeLen]; oldPos _ destStart+destLen; newPos _ destStart+ropeLen; CheckRopes[newRope,newPos,oldRope,oldPos,oldSize-oldPos]; CheckRuns[newRuns,0,oldRuns,0,destStart]; IF ~inherit AND ropeLen>0 AND editI.FetchLooks[dest,destStart] # looks THEN ERROR; CheckRuns[newRuns,newPos,oldRuns,oldPos,oldSize-oldPos]; TestUndo[]; AdjustLength[dest] }; InsertRope: PUBLIC PROC = { dest: Node _ PickNode[]; destLoc: Offset _ PickOne[dest]; oldSize, ropeLen, resultStart, resultLen: Offset; rope: Rope _ PickRope[]; newRope, oldRope: Rope; newRuns, oldRuns: Runs; inherit: BOOLEAN _ RandomBoolean[]; looks: Looks; IF ~inherit THEN looks _ PickLooks[]; oldSize _ editI.Size[dest]; oldRope _ editI.GetRope[dest]; oldRuns _ editI.GetRuns[dest]; ropeLen _ ropeI.Size[rope]; [resultStart,resultLen] _ editI.InsertRope[dest,rope,destLoc,inherit,looks]; newRope _ editI.GetRope[dest]; newRuns _ editI.GetRuns[dest]; IF resultStart # destLoc OR resultLen # ropeLen THEN ERROR; CheckSize[dest,oldSize+ropeLen]; CheckRopes[newRope,0,oldRope,0,destLoc]; CheckRopes[newRope,destLoc,rope,0,ropeLen]; CheckRopes[newRope,destLoc+ropeLen,oldRope,destLoc,oldSize-destLoc]; CheckRuns[newRuns,0,oldRuns,0,destLoc]; IF ~inherit AND ropeLen>0 AND editI.FetchLooks[dest,destLoc] # looks THEN ERROR; CheckRuns[newRuns,destLoc+ropeLen,oldRuns,destLoc,oldSize-destLoc]; AdjustLength[dest] }; AppendRope: PUBLIC PROC = { dest: Node _ PickNode[]; rope: Rope _ PickRope[]; oldSize, ropeLen, resultStart, resultLen: Offset; newRope, oldRope: Rope; newRuns, oldRuns: Runs; inherit: BOOLEAN _ RandomBoolean[]; looks: Looks; IF ~inherit THEN looks _ PickLooks[]; oldSize _ editI.Size[dest]; oldRope _ editI.GetRope[dest]; oldRuns _ editI.GetRuns[dest]; ropeLen _ ropeI.Size[rope]; [resultStart,resultLen] _ editI.AppendRope[dest,rope,inherit,looks]; newRope _ editI.GetRope[dest]; newRuns _ editI.GetRuns[dest]; IF resultStart # oldSize OR resultLen # ropeLen THEN ERROR; CheckSize[dest,oldSize+ropeLen]; CheckRopes[newRope,0,oldRope,0,oldSize]; CheckRopes[newRope,oldSize,rope,0,ropeLen]; CheckRuns[newRuns,0,oldRuns,0,oldSize]; IF ~inherit AND ropeLen>0 AND editI.FetchLooks[dest,oldSize] # looks THEN ERROR; AdjustLength[dest] }; END.