from prog import *
import unittest

class TestHNF(unittest.TestCase):

    def test_nil(self):
        # []++[] -> []
        toplevel = Node(append,[Node(nil),Node(nil)])
        result = Node(nil)
        self.assertEqual(toplevel.hnf().tostring(), result.tostring())

    def test_cons(self):
        # [red]++[green] -> red:([]++[green])
        toplevel = Node(append,[Node(cons,[Node(red),Node(nil)]),Node(cons,[Node(green),Node(nil)])])
        result = Node(cons,[Node(red),Node(append,[Node(nil),Node(cons,[Node(green),Node(nil)])])])
        self.assertEqual(toplevel.hnf().tostring(), result.tostring())

    def test_op_nested(self):
        # ([red]++[green])++[blue] -> red:(([]++[green)++[blue]))
        toplevel = Node(append,[Node(append,[Node(cons,[Node(red),Node(nil)]),Node(cons,[Node(green),Node(nil)])]),Node(cons,[Node(blue),Node(nil)])])
        result_string = ":(red,++(++([],:(green,[])),:(blue,[])))"
        self.assertEqual(toplevel.hnf().tostring(), result_string)

if __name__ == '__main__':
    unittest.main()
