git @ Cat's Eye Technologies PL-GOTO.NET / master tests / PLexceptGOTOdotNET.md
master

Tree @master (Download .tar.gz)

PLexceptGOTOdotNET.md @masterview rendered · raw · history · blame

Test Suite for PL-{GOTO}.NET
============================

<!--
SPDX-FileCopyrightText: Chris Pressey, the original author of this work, has dedicated it to the public domain.
For more information, please refer to <https://unlicense.org/>
SPDX-License-Identifier: Unlicense
-->

This test suite is written in [Falderal][] format.  It is far from
exhaustive, but provides a basic sanity check that the language we've
implemented comes close to PL-{GOTO}.

[Falderal]: https://catseye.tc/node/Falderal

PL-{GOTO} Parsing
-----------------

    -> Tests for functionality "Parse PL-{GOTO} Program"

    | n ← 0;
    = Block [AssignZero "n"]

    | n ← m;
    = Block [AssignOther "n" "m"]

    | n ← n + 1;
    = Block [AssignIncr "n" "n"]

    | n ← 0; LOOP n; m ← n; END;
    = Block [AssignZero "n",Loop 0 "n" (Block [AssignOther "m" "n"])]

    | n ← 0; m ← 0;
    | LOOP n;
    |     m ← n + 1;
    | END;
    = Block [AssignZero "n",AssignZero "m",Loop 0 "n" (Block [AssignIncr "m" "n"])]

It's perfectly valid to have variables called LOOP and END.

    | LOOP ← 0; LOOP LOOP; LOOP ← LOOP + 1; END;
    = Block [AssignZero "LOOP",Loop 0 "LOOP" (Block [AssignIncr "LOOP" "LOOP"])]

    | END ← 0; LOOP END; END ← END + 1; END;
    = Block [AssignZero "END",Loop 0 "END" (Block [AssignIncr "END" "END"])]

Loop Labeling
-------------

    -> Tests for functionality "Label PL-{GOTO} Loops"

    | n ← 0; m ← 0; LOOP n;
    |     LOOP m;
    |         n ← 0; 
    |     END;
    | END;
    = (Block [AssignZero "n",AssignZero "m",Loop 1 "n" (Block [Loop 0 "m" (Block [AssignZero "n"])])],2)

PL-{GOTO} Evaluation
--------------------

    -> Tests for functionality "Evaluate PL-{GOTO} Program"

    | n ← 0;
    = n=0

    | n ← 0; m ← n + 1; n ← m + 1;
    = m=1
    = n=2

    | m ← 0; n ← 0; LOOP n; m ← n; END;
    = m=0
    = n=0

    | n ← 0; n ← n + 1; LOOP n; m ← n; END;
    = m=1
    = n=1

    | m ← 0; n ← 0; n ← n + 1; n ← n + 1; LOOP n; m ← m + 1; END;
    = m=2
    = n=2

    | n ← 0; n ← n + 1; n ← n + 1; n ← n + 1; n ← n + 1;
    | m ← 0; k ← 0;
    | LOOP n;
    |     m ← m + 1;
    |     LOOP m;
    |         k ← k + 1;
    |     END;
    | END;
    = k=10
    = m=4
    = n=4

Changing the value of a loop variable inside the loop does not change
the number of times the loop executes.

    | n ← 0; n ← n + 1; n ← n + 1; n ← n + 1; n ← n + 1;
    | m ← 0;
    | LOOP n;
    |     n ← 0; n ← n + 1;
    |     m ← m + 1;
    | END;
    = m=4
    = n=1

The interpreter and the compiled program currently have different behaviour
for this case.  The compiled program never executes the loop, so never sees
`m`, so doesn't introduce `m` into the environment, so doesn't print `m=0`.

    >   | n ← 0; LOOP n; m ← n; END;
    >   = m=0
    >   = n=0