view test/testsamples.py @ 382:0c44e494ef58

Made lexer more generic
author Windel Bouwman
date Sun, 27 Apr 2014 12:24:21 +0200
parents 6df89163e114
children 173e20a47fda
line wrap: on
line source

import unittest
import os
import io
from testemulation import runQemu, has_qemu
from testzcc import relpath
from ppci.buildfunctions import assemble, c3compile, link

startercode = """
mov sp, 0x30000   ; setup stack pointer
BL sample_start     ; Branch to sample start
local_loop:
B local_loop
"""

modarchcode = """
module arch;

function void putc(int c)
{
    var int *UART0DR;
    UART0DR = cast<int*>(0x10009000); // UART0 DR register
    *UART0DR = c;
}

"""

class Samples:
    def testPrint(self):
        snippet = """
         module sample;
         import io;
         function void start()
         {
            io.print("Hello world");
         }
        """
        self.do(snippet, "Hello world")

    def testForLoopPrint(self):
        snippet = """
         module sample;
         import io;
         function void start()
         {
            var int i;
            for (i=0; i<10; i = i + 1)
            {
              io.print2("A = ", i);
            }
         }
        """
        res = "".join("A = 0x{0:08X}\n".format(a) for a in range(10))
        self.do(snippet, res)

    def testIfStatement(self):
        snippet = """
         module sample;
         import io;
         function void start()
         {
            var int i;
            i = 13;
            if (i*7 < 100)
            {
                io.print("Wow");
            }
            else
            {
                io.print("Outch");
            }
         }
        """
        res = "Wow"
        self.do(snippet, res)

    def testParameterPassing4(self):
        snippet = """
         module sample;
         import io;
         function void dump(int a, int b, int c, int d)
         {
            io.print2("a=", a);
            io.print2("b=", b);
            io.print2("c=", c);
            io.print2("d=", d);
         }
         function void start()
         {
            dump(4,55,66,0x1337);
         }
        """
        res = "a=0x{0:08X}\n".format(4)
        res += "b=0x{0:08X}\n".format(55)
        res += "c=0x{0:08X}\n".format(66)
        res += "d=0x{0:08X}\n".format(0x1337)
        self.do(snippet, res)

    def testGlobalVariable(self):
        snippet = """
         module sample;
         import io;
         var int G;
         function void do1()
         {
            G = G + 1;
            io.print2("G=", G);
         }
         function void do5()
         {
            G = G + 5;
            io.print2("G=", G);
         }
         function void start()
         {
            G = 0;
            do1();
            do1();
            do5();
            do1();
            do5();
         }
        """
        res = "".join("G=0x{0:08X}\n".format(a) for a in [1,2,7,8,13])
        self.do(snippet, res)


class TestSamplesOnVexpress(unittest.TestCase, Samples):
    def setUp(self):
        if not has_qemu():
            self.skipTest('Not running qemu tests')

    def do(self, src, expected_output):
        # Construct binary file from snippet:
        o1 = assemble(io.StringIO(startercode), 'arm')
        o2 = c3compile([
            relpath('..', 'kernel', 'src', 'io.c3'),
            io.StringIO(modarchcode),
            io.StringIO(src)], [], 'arm')
        layout = {'code': 0x10000, 'data': 0x20000}
        o3 = link([o1, o2], layout)

        sample_filename = 'testsample.bin'
        with open(sample_filename, 'wb') as f:
            f.write(o3.get_section('code').data)

        # Check bin file exists:
        self.assertTrue(os.path.isfile(sample_filename))

        # Run bin file in emulator:
        res = runQemu(sample_filename, machine='vexpress-a9')
        os.remove(sample_filename)
        self.assertEqual(expected_output, res)


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