view test/testsamples.py @ 375:19eacf4f7270

Started on memory manager
author Windel Bouwman
date Sun, 23 Mar 2014 15:44:06 +0100
parents 72a3b646d543
children 9667d78ba79e
line wrap: on
line source

import unittest
import os
import io
from testemulation import runQemu, has_qemu
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 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 = 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()