diff test/testc3.py @ 284:05184b95fa16

Moved tests to seperate folder
author Windel Bouwman
date Fri, 15 Nov 2013 13:43:22 +0100
parents python/testc3.py@02385f62f250
children 1c7c1e619be8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/testc3.py	Fri Nov 15 13:43:22 2013 +0100
@@ -0,0 +1,435 @@
+import c3
+import time, ppci, x86, ir
+import unittest
+import glob
+
+testsrc = """module test;
+
+/*
+ demo of the source that is correct :)
+*/ 
+var int c, d;
+var double e;
+var int f;
+
+const int A = 1337;
+
+function void test1()
+{
+    var int bdd;
+    var int a = 10;
+    bdd = 20;
+    var int buf;
+    var int i;
+    i = 2;
+    var int zero = i - 2;
+    if (i > 1)
+    {
+       buf = b + 22 * i - 13 + (55 * 2 *9-2) / 44 - 1;
+    }
+    else
+    {
+      ;;;
+    }
+
+    t2(2, 3);
+}
+
+function int t2(int a, int b)
+{
+   if (a > 0)
+   {
+      a = 2 + t2(a - 1, 10);
+   }
+
+   return a + b;
+}
+
+var int a, b;
+
+function int t3(int aap, int blah)
+{
+   if (a > blah and blah < 45 + 33 or 33 > aap or 6 > 2 and true)
+   {
+      a = 2 + t2(a - 1, 0);
+   }
+
+   return a + b;
+}
+
+var int hahaa = 23 * 2;
+
+
+"""
+
+class testLexer(unittest.TestCase):
+    def testUnexpectedCharacter(self):
+        snippet = """ var s \u6c34 """
+        with self.assertRaises(ppci.CompilerError):
+            list(c3.lexer.tokenize(snippet))
+
+    def testBlockComment(self):
+        snippet = """
+          /* Demo */
+          var int x = 0;
+        """
+        toks = ['var', 'ID', 'ID', '=', 'NUMBER', ';', 'END']
+        self.assertSequenceEqual([tok.typ for tok in c3.lexer.tokenize(snippet)], toks)
+
+    def testBlockCommentMultiLine(self):
+        snippet = """
+          /* Demo
+          bla1
+          bla2
+          */
+          var int x = 0;
+        """
+        toks = ['var', 'ID', 'ID', '=', 'NUMBER', ';', 'END']
+        self.assertSequenceEqual([tok.typ for tok in c3.lexer.tokenize(snippet)], toks)
+
+class testBuilder(unittest.TestCase):
+    def setUp(self):
+        self.diag = ppci.DiagnosticsManager()
+        self.builder = c3.Builder(self.diag)
+        self.diag.clear()
+
+    def testSrc(self):
+        self.expectOK(testsrc)
+
+    def expectErrors(self, snippet, rows):
+        """ Helper to test for expected errors on rows """
+        ircode = self.builder.build(snippet)
+        actualErrors = [err.row for err in self.diag.diags]
+        if rows != actualErrors:
+            self.diag.printErrors(snippet)
+        self.assertSequenceEqual(rows, actualErrors)
+        self.assertFalse(ircode)
+
+    def expectOK(self, snippet, pack_dir=None):
+        ircode = self.builder.build(snippet, pack_dir=pack_dir)
+        if not ircode:
+            self.diag.printErrors(snippet)
+        self.assertTrue(ircode)
+        return ircode
+
+    def testPackage(self):
+        p1 = """module p1;
+        type int A;
+        """
+        self.assertTrue(self.builder.build(p1))
+        p2 = """module p2;
+        import p1;
+        var A b;
+        """
+        self.expectOK(p2)
+
+    def testFunctArgs(self):
+      snippet = """
+         module testargs;
+         function void t2(int a, double b)
+         {
+            t2(2, 2);
+            t2(2);
+            t2(1, 1.2);
+         }
+      """
+      self.expectErrors(snippet, [5, 6])
+
+    def testExpressions(self):
+      snippet = """
+         module test;
+         function void t(int a, double b)
+         {
+            var int a2;
+            var bool c;
+
+            a2 = b * a;
+            c = a;
+            c = b > 1;
+         }
+      """
+      self.expectErrors(snippet, [8, 9, 10])
+
+    def testExpression1(self):
+      snippet = """
+         module testexpr1;
+         function void t()
+         {
+            var int a, b, c;
+            a = 1;
+            b = a * 2 + a * a;
+            c = b * a - 3;
+         }
+      """
+      self.expectOK(snippet)
+
+    def testEmpty(self):
+      snippet = """
+      module A
+      """
+      self.expectErrors(snippet, [3])
+
+    def testEmpty2(self):
+      snippet = ""
+      self.expectErrors(snippet, [1])
+
+    def testRedefine(self):
+      snippet = """
+      module test;
+      var int a;
+      var int b;
+      var int a;
+      """
+      self.expectErrors(snippet, [5])
+
+    def testWhile(self):
+      snippet = """
+      module tstwhile;
+      var int a;
+      function void t()
+      {
+         var int i = 0;
+         while (i < 1054)
+         {
+            i = i + 3;
+            a = a + i;
+         }
+
+         while(true)
+         {
+         }
+
+         while(false)
+         {
+         }
+      }
+      """
+      self.expectOK(snippet)
+
+    def testIf(self):
+        snippet = """
+      module tstIFF;
+      function void t(int b)
+      {
+         var int a;
+         a = 2;
+         if (a > b)
+         {
+            if (a > 1337)
+            {
+               b = 2;
+            }
+         }
+         else
+         {
+            b = 1;
+         }
+
+         return b;
+      }
+        """
+        self.expectOK(snippet)
+
+    def testTypeDef(self):
+        snippet = """
+         module testtypedef;
+         type int my_int;
+         function void t()
+         {
+            var my_int a;
+            var int b;
+            a = 2;
+            b = a + 2;
+         }
+        """
+        self.expectOK(snippet)
+
+    def testLocalVariable(self):
+        snippet = """
+         module testlocalvar;
+         function void t()
+         {
+            var int a, b;
+            a = 2;
+            b = a + 2;
+         }
+        """
+        self.expectOK(snippet)
+
+    def testUnknownType(self):
+        snippet = """module testlocalvar;
+         function void t()
+         {
+            var int2 a;
+         }
+        """
+        self.expectErrors(snippet, [4])
+
+    def testStruct1(self):
+        snippet = """
+         module teststruct1;
+         function void t()
+         {
+            var struct {int x, y;} a;
+            a.x = 2;
+            a.y = a.x + 2;
+         }
+        """
+        self.expectOK(snippet)
+
+    def testPointerType1(self):
+        snippet = """
+         module testpointer1;
+         var int* pa;
+         function void t()
+         {
+            var int a;
+            pa = &a;
+            *pa = 22;
+         }
+        """
+        self.expectOK(snippet)
+
+    def testPointerType(self):
+        snippet = """
+         module testpointer;
+         var int* pa, pb;
+         function void t(int a, double b)
+         {
+            var int a2;
+            a2 = a; // parameters cannot be escaped for now..
+            pa = &a2;
+            pb = pa;
+            *pa = 22;
+         }
+        """
+        self.expectOK(snippet)
+
+    def testPointerTypeInCorrect(self):
+        snippet = """
+         module testpointerincorrect;
+         var int* pa;
+         function void t(int a, double b)
+         {
+            pa = 2; // type conflict
+            pa = &a;
+            pa = &2;
+            &a = pa; // No valid lvalue
+            **pa = 22; // Cannot deref int
+         }
+        """
+        self.expectErrors(snippet, [6, 9, 10])
+
+    def testPointerTypeIr(self):
+        snippet = """
+         module testptr_ir;
+         function void t()
+         {
+            var int* a;
+            a = cast<int*>(40);
+            *a = 2;
+         }
+        """
+        self.expectOK(snippet)
+
+    def testPointerTypeIr2(self):
+        snippet = """
+         module testptr_ir;
+         type struct {int x,y;}* gpio;
+         function void t()
+         {
+            var gpio a;
+            a = cast<gpio>(40);
+            a->x = 2;
+            a->y = a->x - 14;
+         }
+        """
+        self.expectOK(snippet)
+
+    def testWrongCast(self):
+        snippet = """
+         module testptr_ir;
+         type struct {int x,y;}* gpio;
+         function void t()
+         {
+            var gpio a;
+            *cast<gpio>(*a);
+         }
+        """
+        # TODO: remove the duplicate error:
+        self.expectErrors(snippet, [7, 7])
+
+    def testComplexType(self):
+        snippet = """
+         module testpointer;
+         type int my_int;
+
+         type struct {
+          int x, y;
+         } point;
+
+         type struct {
+           int mem1;
+           int memb2;
+           point P1;
+         } my_struct;
+
+         type my_struct* my_sptr;
+         var int* pa;
+
+         function void t(int a, int b, my_sptr x)
+         {
+            var my_struct *msp;
+
+            var my_struct u, v;
+            var point *pt;
+
+            pt = &msp->P1;
+            msp = x;
+            *pa = 22 + u.mem1 * v.memb2 - u.P1.x;
+            x->memb2 = *pa + a * b;
+
+            msp->P1.x = a * x->P1.y;
+         }
+        """
+        self.expectOK(snippet)
+
+    def testExamples(self):
+        """ Test all examples in the c3/examples directory """
+        example_filenames = glob.glob('./c3/examples/*.c3')
+        for filename in example_filenames:
+            with open(filename, 'r') as f:
+                src = f.read()
+            self.expectOK(src, pack_dir='./c3/examples')
+
+    def test2(self):
+        # testsrc2 is valid code:
+        snippet = """
+        module test2;
+
+        function void tst()
+        {
+           var int a, b;
+           a = 2 * 33 - 12;
+           b = a * 2 + 13;
+           a = b + a;
+           if (a > b and b == 3)
+           {
+              var int x = a;
+              x = b * 2 - a;
+              a = x*x;
+           }
+           else
+           {
+              a = b + a;
+           }
+        }
+
+        """
+        ircode = self.expectOK(snippet)
+        self.assertEqual(1, len(ircode.Functions))
+
+if __name__ == '__main__':
+    unittest.main()
+
+