Browse Source

add examples for unittest

pikastech 3 years ago
parent
commit
e61e4716ac

+ 18 - 0
examples/unittest

@@ -0,0 +1,18 @@
+import unittest
+
+
+class TestUnittestAssertions(unittest.TestCase):
+    def testEqual(self):
+        self.assertEqual(0, 0)
+
+    def testTrue(self):
+        self.assertTrue(True)
+
+    def testFalse(self):
+        self.assertFalse(False)
+
+
+suit = unittest.TestSuite('test1')
+suit.addTest(TestUnittestAssertions())
+runner = unittest.TextTestRunner()
+runner.run(suit)

+ 8 - 0
package/unittest/_unittest.c

@@ -0,0 +1,8 @@
+#include "_unittest.h"
+
+void _unittest__case_run(PikaObj* self,
+                         PikaObj* test_case,
+                         PikaObj* test_result,
+                         char* suite_name) {
+    __platform_printf("testing %s\n", suite_name);
+}

+ 1 - 0
package/unittest/_unittest.pyi

@@ -0,0 +1 @@
+def _case_run(test_case: object, test_result: object, suite_name: str): ...

+ 32 - 42
package/unittest/unittest.py

@@ -1,10 +1,31 @@
 import _unittest
 
 
-class TestCase:
+class TestResult:
     def __init__(self):
-        pass
+        self.errorsNum = 0
+        self.failuresNum = 0
+        self.skippedNum = 0
+        self.testsRun = 0
+        self.errors = []
+        self.failures = []
+        self.skipped = []
+        self._newFailures = 0
 
+    def wasSuccessful(self):
+        return self.errorsNum == 0 and self.failuresNum == 0
+
+    def __str__(self):
+        # Format is compatible with CPython.
+        s = "<unittest.result.TestResult "
+        s += "run=%d, " % self.testsRun
+        s += "errors=%d, " % self.errorsNum
+        s += "failures=%d, " % self.failuresNum
+        s += "skipped=%d>" % self.skippedNum
+        return s
+
+
+class TestCase:
     def assertEqual(self, x, y):
         msg = "%r vs (expected) %r" % (x, y)
         _assert(x == y, msg)
@@ -29,27 +50,28 @@ class TestCase:
         msg = "Expected %r to be False" % x
         _assert(not x, msg)
 
+    def run(self, result, suite_name):
+        _unittest._case_run(self, result, suite_name)
+
 
 class TestSuite:
     def __init__(self, name):
         self._tests = []
         self.name = name
 
-    def addTest(self, cls):
-        self._tests.append(cls)
+    def addTest(self, case):
+        self._tests.append(case)
 
     def run(self, result):
-        for c in self._tests:
-            run_suite(c, result, self.name)
+        for case in self._tests:
+            case.run(result, self.name)
         return result
 
 
-class TestRunner:
+class TextTestRunner:
     def run(self, suite: TestSuite):
         res = TestResult()
-        suite.run(res)
-
-        res.printErrors()
+        _ = suite.run(res)
         print("----------------------------------------------------------------------")
         print("Ran %d tests\n" % res.testsRun)
         if res.failuresNum > 0 or res.errorsNum > 0:
@@ -63,38 +85,6 @@ class TestRunner:
         return res
 
 
-class TestResult:
-    def __init__(self):
-        self.errorsNum = 0
-        self.failuresNum = 0
-        self.skippedNum = 0
-        self.testsRun = 0
-        self.errors = []
-        self.failures = []
-        self.skipped = []
-        self._newFailures = 0
-
-    def wasSuccessful(self):
-        return self.errorsNum == 0 and self.failuresNum == 0
-
-    def printErrors(self):
-        print()
-        self.printErrorList(self.errors)
-        self.printErrorList(self.failures)
-
-    def __str__(self):
-        # Format is compatible with CPython.
-        return "<unittest.result.TestResult run=%d errors=%d failures=%d>" % (\
-            self.testsRun,\
-            self.errorsNum,\
-            self.failuresNum,\
-        )
-
-def run_suite(c, test_result: TestResult, suite_name=""):
-    c.run(test_result)
-    return
-
-
 def _assert(res, msg):
     if not res:
         print("Assertion failed: %s" % msg)

+ 1 - 1
port/linux/.vscode/launch.json

@@ -11,7 +11,7 @@
             "program": "${workspaceFolder}/build/test/pikascript_test",
             // "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
             "args": [
-                // "--gtest_filter=pikaMain.callback_issue_I5L1MI"
+                "--gtest_filter=unittest.test1"
             ],
             "stopAtEntry": false,
             "cwd": "${workspaceFolder}",

+ 1 - 0
port/linux/package/pikascript/_unittest.pyi

@@ -0,0 +1 @@
+def _case_run(test_case: object, test_result: object, suite_name: str): ...

+ 1 - 0
port/linux/package/pikascript/main.py

@@ -15,6 +15,7 @@ import configparser
 import PikaDebug
 import PikaCV
 import binascii
+import unittest
 
 mem = PikaStdLib.MemChecker()
 print('hello pikascript!')

+ 8 - 0
port/linux/package/pikascript/pikascript-lib/unittest/_unittest.c

@@ -0,0 +1,8 @@
+#include "_unittest.h"
+
+void _unittest__case_run(PikaObj* self,
+                         PikaObj* test_case,
+                         PikaObj* test_result,
+                         char* suite_name) {
+    __platform_printf("testing %s\n", suite_name);
+}

+ 32 - 42
port/linux/package/pikascript/unittest.py

@@ -1,10 +1,31 @@
 import _unittest
 
 
-class TestCase:
+class TestResult:
     def __init__(self):
-        pass
+        self.errorsNum = 0
+        self.failuresNum = 0
+        self.skippedNum = 0
+        self.testsRun = 0
+        self.errors = []
+        self.failures = []
+        self.skipped = []
+        self._newFailures = 0
 
+    def wasSuccessful(self):
+        return self.errorsNum == 0 and self.failuresNum == 0
+
+    def __str__(self):
+        # Format is compatible with CPython.
+        s = "<unittest.result.TestResult "
+        s += "run=%d, " % self.testsRun
+        s += "errors=%d, " % self.errorsNum
+        s += "failures=%d, " % self.failuresNum
+        s += "skipped=%d>" % self.skippedNum
+        return s
+
+
+class TestCase:
     def assertEqual(self, x, y):
         msg = "%r vs (expected) %r" % (x, y)
         _assert(x == y, msg)
@@ -29,27 +50,28 @@ class TestCase:
         msg = "Expected %r to be False" % x
         _assert(not x, msg)
 
+    def run(self, result, suite_name):
+        _unittest._case_run(self, result, suite_name)
+
 
 class TestSuite:
     def __init__(self, name):
         self._tests = []
         self.name = name
 
-    def addTest(self, cls):
-        self._tests.append(cls)
+    def addTest(self, case):
+        self._tests.append(case)
 
     def run(self, result):
-        for c in self._tests:
-            run_suite(c, result, self.name)
+        for case in self._tests:
+            case.run(result, self.name)
         return result
 
 
-class TestRunner:
+class TextTestRunner:
     def run(self, suite: TestSuite):
         res = TestResult()
-        suite.run(res)
-
-        res.printErrors()
+        _ = suite.run(res)
         print("----------------------------------------------------------------------")
         print("Ran %d tests\n" % res.testsRun)
         if res.failuresNum > 0 or res.errorsNum > 0:
@@ -63,38 +85,6 @@ class TestRunner:
         return res
 
 
-class TestResult:
-    def __init__(self):
-        self.errorsNum = 0
-        self.failuresNum = 0
-        self.skippedNum = 0
-        self.testsRun = 0
-        self.errors = []
-        self.failures = []
-        self.skipped = []
-        self._newFailures = 0
-
-    def wasSuccessful(self):
-        return self.errorsNum == 0 and self.failuresNum == 0
-
-    def printErrors(self):
-        print()
-        self.printErrorList(self.errors)
-        self.printErrorList(self.failures)
-
-    def __str__(self):
-        # Format is compatible with CPython.
-        return "<unittest.result.TestResult run=%d errors=%d failures=%d>" % (\
-            self.testsRun,\
-            self.errorsNum,\
-            self.failuresNum,\
-        )
-
-def run_suite(c, test_result: TestResult, suite_name=""):
-    c.run(test_result)
-    return
-
-
 def _assert(res, msg):
     if not res:
         print("Assertion failed: %s" % msg)

+ 19 - 1
port/linux/test/module-test.cpp

@@ -136,4 +136,22 @@ TEST(module, import_as_issue1) {
     obj_deinit(pikaMain);
     EXPECT_EQ(pikaMemNow(), 0);
 }
-#endif
+#endif
+
+#if PIKA_SYNTAX_LEVEL==PIKA_SYNTAX_LEVEL_MAXIMAL
+TEST(unittest, test1) {
+    /* init */
+    pikaMemInfo.heapUsedMax = 0;
+    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
+    extern unsigned char pikaModules_py_a[];
+    obj_linkLibrary(pikaMain, pikaModules_py_a);
+    /* run */
+    __platform_printf("BEGIN\r\n");
+    pikaVM_runSingleFile(pikaMain, "test/python/unittest/test1.py");
+    /* collect */
+    /* assert */
+    /* deinit */
+    obj_deinit(pikaMain);
+    EXPECT_EQ(pikaMemNow(), 0);
+}
+#endif

+ 18 - 0
port/linux/test/python/unittest/test1.py

@@ -0,0 +1,18 @@
+import unittest
+
+
+class TestUnittestAssertions(unittest.TestCase):
+    def testEqual(self):
+        self.assertEqual(0, 0)
+
+    def testTrue(self):
+        self.assertTrue(True)
+
+    def testFalse(self):
+        self.assertFalse(False)
+
+
+suit = unittest.TestSuite('test1')
+suit.addTest(TestUnittestAssertions())
+runner = unittest.TextTestRunner()
+runner.run(suit)