View Source Document

Hev.markdown

Test Suite for Hev

This test suite is written in the format of Falderal. It is far from exhaustive, but provides a basic sanity check that the language we've implemented comes close to Hev.

-> Functionality "Parse Hev Program" is implemented by
-> shell command
-> "bin/hev parse %(test-body-file)"

-> Functionality "Compile Hev Program" is implemented by
-> shell command
-> "bin/hev compile %(test-body-file)"

-> Functionality "Hev Binding" is implemented by
-> shell command
-> "bin/hev getbinding %(test-body-file)"

-> Functionality "Hev Execution" is implemented by
-> shell command
-> "bin/hev run %(test-body-file)"

Hev Parsing

-> Tests for functionality "Parse Hev Program"

| 1+2*3
= TreeBranch (TreeBranch (TreeBranch TreeLeaf (TreeVar "+")) (TreeVar "*")) TreeLeaf

| 3+2*1
= TreeBranch TreeLeaf (TreeBranch (TreeVar "+") (TreeBranch (TreeVar "*") TreeLeaf))

| 1,3/2
= TreeBranch (TreeBranch TreeLeaf TreeLeaf) (TreeBranch (TreeVar "/") TreeLeaf)

| 1,6*2,9*3,5*4
= TreeBranch (TreeBranch (TreeBranch TreeLeaf TreeLeaf) (TreeBranch (TreeVar "*") TreeLeaf)) (TreeBranch (TreeBranch (TreeVar "*") TreeLeaf) (TreeBranch (TreeVar "*") TreeLeaf))

| 1,9,2,13,3,10,4,15,5,11,6,14,7,12,8
= TreeBranch (TreeBranch (TreeBranch (TreeBranch TreeLeaf TreeLeaf) (TreeBranch TreeLeaf TreeLeaf)) (TreeBranch (TreeBranch TreeLeaf TreeLeaf) (TreeBranch TreeLeaf TreeLeaf))) (TreeBranch (TreeBranch (TreeBranch TreeLeaf TreeLeaf) (TreeBranch TreeLeaf TreeLeaf)) (TreeBranch (TreeBranch TreeLeaf TreeLeaf) (TreeBranch TreeLeaf TreeLeaf)))

| 120,160,180,271,272,257,15,4,7,121
= TreeBranch (TreeBranch (TreeBranch (TreeBranch (TreeBranch TreeLeaf TreeLeaf) TreeLeaf) TreeLeaf) TreeLeaf) (TreeBranch TreeLeaf (TreeBranch (TreeBranch TreeLeaf (TreeBranch (TreeBranch TreeLeaf TreeLeaf) TreeLeaf)) TreeLeaf))

| 120,160**180,271+-272,257+*15,4//7//121
= TreeBranch (TreeBranch (TreeBranch (TreeBranch (TreeBranch TreeLeaf TreeLeaf) (TreeVar "**")) TreeLeaf) (TreeVar "+-")) (TreeBranch TreeLeaf (TreeBranch (TreeBranch (TreeVar "+*") (TreeBranch (TreeBranch TreeLeaf (TreeVar "//")) (TreeVar "//"))) TreeLeaf))

Hev Compiling

-> Tests for functionality "Compile Hev Program"

Good.

| 43,13,23,53,33
= TreeBranch (TreeBranch TreeLeaf (TreeBranch (TreeBranch TreeLeaf TreeLeaf) TreeLeaf)) (TreeBranch TreeLeaf TreeLeaf)

Bad (incomplete patterns.)

| 1,3,2
= TreeLeaf

Bad (variables in state.)

| 43,13,23,53+33
= TreeLeaf

Bad (variables in body but not head.)

| 43,13,23+53,33
= TreeLeaf

Hev Binding

-> Tests for functionality "Hev Binding"

| +
= Just (TreeBranch TreeLeaf TreeLeaf)

| -
= Just TreeLeaf

| *
= Nothing

Hev Execution

-> Tests for functionality "Hev Execution"

Test a very simple (and completely ground) program.

--           __(root)_X_53______
-- (rule    /                   \
--  list)  X 43               33 X   (state)
--        / \                   / \
-- (end) ,   \                 ,   ,
--            \
--             \
--              \
--            23 X  (rule)
--              / \
--             /   \
--            /     \
--           /       \
--          /         \
-- (head)  X 13        ,   (body)
--        / \
--       ,   ,

| 43,13,23,53,33
= TreeLeaf

Test pattern-matching with a variable, causing a single rewrite.

--           __(root)_X_81______
-- (rule    /                   \
--  list)  X 49               73 X   (state)
--        / \                   / \
-- (end) ,   \              64 X   \
--            \               / \   \
--             \             ,   ,   X 17
--              \                   / \
--            36 X  (rule)         ,   X 4
--              / \                   / \
--             /   \                 ,   ,
--            /     \
--           /       \
--          /         \
-- (head)  X 25     16 X   (body)
--        / \         / \
--     9 X   +       +   ,
--      / \
--     ,   ,

After one rewrite of state: + matches branch at 17, new state becomes:

--        X
--       / \
--   17 X   ,
--     / \
--    ,   X 4
--       / \
--      ,   ,

| 49,9,25+36+16,81,64,73,17,4
= TreeBranch (TreeBranch TreeLeaf (TreeBranch TreeLeaf TreeLeaf)) TreeLeaf

Test several rewrites of state. The state is reduced to a single leaf.

--           __(root)_X_4_______
-- (rule    /                   \
--  list)  X 3                 2 X   (state)
--        / \                   / \
-- (end) ,   \                 /   \
--            \               /     \
--             \             X 1   1 X
--              \           / \     / \
--             2 X  (rule) ,   ,   ,   ,
--              / \
--             /   \
--            /     \
--           /       \
--          /         \
-- (head)  X 1         *   (body)
--        / \
--       *   *

| 3*1*2*4,1,2,1
= TreeLeaf

Test that rewriting is indeed top-down. For this program, a bottom-up strategy produces a double branch, while a top-down strategy produces a single branch. (Work it out by hand if you doubt me!)

--           __(root)_X_99______
-- (rule    /                   \
--  list)  X 71                  \
--        / \                     \
-- (end) ,   \                     \
--            \                     \
--             \                     X 61 (state)
--              \                   / \
--            29 X  (rule)         /   \
--              / \               /     \
--             /   \          37 X       X 47
--            /     \           / \     / \
--           /       \         /   \   ,   ,
--          /         \     6 X   7 X
-- (head)  X 27 (body) *     / \   / \
--        / \               ,   , ,   ,
--       /   \
--    8 X     X 19
--     / \   / \
--    +   * ,   ,

| 71+8*27,19,29*99,6,37,7,61,47
= TreeBranch TreeLeaf TreeLeaf

Test multiple rules.

--                            _________(root)__X__188___________
--                           /                                  \
--             (rule list)  X 154                            111 X   (state)
--                         / \                                  / \
--                        /   \                                ,   X 91
--                       /     \                                  / \
--                      /       \                                ,   X 77
--                     /         \                                  / \
--                    /       137 X  (rule)                        ,   ,
--                   /           / \
--                  /           /   \
--                 /    (head) X 6   , (body)
--                /           / \
--               /         2 X   ,
--              /           / \
-- (rule node) X 103       ,   ,
--            / \
--     (end) ,   X (rule) 86
--              / \
--             /   \
--            /     \
--    (head) X 5   9 X (body)
--          / \     / \
--         ,   X 4 -   ,
--            / \
--           ,   -

| 103,5,4-86-9,154,2,6,137,188,111,91,77
= TreeLeaf

Obviously we can't test that execution of a nonterminating program truly never terminates, but we give a nonterminating Hev program here as an example, which you can run if you like:

25,20*24,20,1*26,25

--           __(root)_X_26______
-- (rule    /                   \
--  list)  X 25                  X (state)
--        / \                   / \
-- (end) ,   \                 ,   ,
--            \
--             \
--              \
--            24 X  (rule)
--              / \
--             /   \
--            /     \
--           /       \
--          /         \
-- (head)  X   (body)  X 20
--        / \         / \
--       ,   *       ,   X 1
--                      / \
--                     ,   *