view test/testsamples.py @ 366:39bf68bf1891

Fix sample tests and deterministic build
author Windel Bouwman
date Fri, 21 Mar 2014 09:43:01 +0100
parents c49459768aaa
children 68841f9ab96c
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 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()