view test/testsamples.py @ 373:fc1b89b09896

Added run test.py
author Windel Bouwman
date Fri, 21 Mar 2014 14:32:54 +0100
parents 68841f9ab96c
children 72a3b646d543
line wrap: on
line source

import unittest
import os
import io
from testemulation import runQemu
from testzcc import relpath
from ppci.tasks import TaskRunner
from ppci.buildtasks import Assemble, Compile, Link
from ppci.objectfile import ObjectFile

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

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 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 do(self, src, expected_output):
        # Construct binary file from snippet:
        o1 = ObjectFile()
        o2 = ObjectFile()
        asmb = Assemble(io.StringIO(startercode), 'arm', o1)
        comp = Compile([
            relpath('..', 'kernel', 'src', 'io.c3'),
            relpath('..', 'kernel', 'arch', 'vexpressA9.c3'),
            io.StringIO(src)], [], 'arm', o2)
        sample_filename = 'testsample.bin'
        layout = {'code': 0x10000, 'data':0x20000}
        link = Link([o1, o2], layout, sample_filename)

        # Create task executor:
        runner = TaskRunner()
        runner.add_task(asmb)
        runner.add_task(comp)
        runner.add_task(link)
        runner.run_tasks()
        # 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()