Explorar el Código

support `setattr` and `getattr`

run tests() in cases is ok
pikastech hace 3 años
padre
commit
bb54c2e719

+ 3 - 0
examples/unittest/test1.py

@@ -3,12 +3,15 @@ import unittest
 
 class TestUnittestAssertions(unittest.TestCase):
     def testEqual(self):
+        print("in testEqual...")
         self.assertEqual(0, 0)
 
     def testTrue(self):
+        print("in testTrue...")
         self.assertTrue(True)
 
     def testFalse(self):
+        print("in testFalse...")
         self.assertFalse(False)
 
 

+ 2 - 2
package/PikaStdLib/PikaStdData.pyi

@@ -63,8 +63,8 @@ class String:
     def __str__(self) -> str: ...
     def __len__(self) -> int: ...
     def encode(self) -> bytes: ...
-    def startwith(self, prefix: str) -> int: ...
-    def endwith(self, suffix: str) -> int: ...
+    def startswith(self, prefix: str) -> int: ...
+    def endswith(self, suffix: str) -> int: ...
     def isdigit(self) -> int: ...
     def islower(self) -> int: ...
     def isalnum(self) -> int: ...

+ 2 - 2
package/PikaStdLib/PikaStdData_String.c

@@ -66,7 +66,7 @@ char* PikaStdData_String___str__(PikaObj* self) {
     return obj_getStr(self, "str");
 }
 
-int PikaStdData_String_startwith(PikaObj* self, char* prefix) {
+int PikaStdData_String_startswith(PikaObj* self, char* prefix) {
     char* str = obj_getStr(self, "str");
     char* p = prefix;
     int i = 0;
@@ -79,7 +79,7 @@ int PikaStdData_String_startwith(PikaObj* self, char* prefix) {
     return 1;
 }
 
-int PikaStdData_String_endwith(PikaObj* self, char* suffix) {
+int PikaStdData_String_endswith(PikaObj* self, char* suffix) {
     char* str = obj_getStr(self, "str");
     int len1 = strlen(str);
     int len2 = strlen(suffix);

+ 6 - 0
package/PikaStdLib/PikaStdLib.pyi

@@ -82,6 +82,12 @@ class SysObj:
     @staticmethod
     def exec(code: str): ...
 
+    @staticmethod
+    def getattr(obj: object, name: str) -> any: ...
+
+    @staticmethod
+    def setattr(obj: object, name: str, val: any): ...
+
 
 class RangeObj:
     def __next__(self) -> any: ...

+ 25 - 0
package/PikaStdLib/PikaStdLib_SysObj.c

@@ -508,3 +508,28 @@ void PikaStdLib_SysObj_exec(PikaObj* self, char* code) {
     __platform_printf("[Error] PIKA_EXEC_ENABLE is not enabled.\r\n");
 #endif
 }
+
+Arg* PikaStdLib_SysObj_getattr(PikaObj* self, PikaObj* obj, char* name) {
+    Arg* res = NULL;
+    if (NULL == obj) {
+        obj_setErrorCode(self, 1);
+        __platform_printf("[Error] getattr: can not get attr of NULL.\r\n");
+        return NULL;
+    }
+    res = arg_copy(obj_getArg(obj, name));
+    return res;
+}
+
+void PikaStdLib_SysObj_setattr(PikaObj* self,
+                               PikaObj* obj,
+                               char* name,
+                               Arg* val) {
+    if (NULL == obj) {
+        obj_setErrorCode(self, 1);
+        __platform_printf("[Error] setattr: obj is null.\r\n");
+        goto exit;
+    }
+    obj_setArg(obj, name, val);
+exit:
+    return;
+}

+ 1 - 0
package/configparser/README.md

@@ -0,0 +1 @@
+# configparser

+ 3 - 3
package/configparser/configparser.py

@@ -10,11 +10,11 @@ class ConfigParser():
         lines = content.split('\n')
         for line in lines:
             line = String(line)
-            if line.startwith('#'):
+            if line.startswith('#'):
                 continue
-            if line.startwith(';'):
+            if line.startswith(';'):
                 continue
-            if line.startwith('['):
+            if line.startswith('['):
                 section = String(line.replace('[', ''))
                 section = section.replace(']', '')
                 self.config_dict[section] = {}

+ 11 - 5
package/unittest/unittest.py

@@ -1,4 +1,5 @@
 import _unittest
+from PikaStdData import String
 
 
 class TestResult:
@@ -70,8 +71,13 @@ class TestCase:
         msg = "Expected %r to be in %r" % (x, y)
         assert x in y, msg
 
-    def run(self, result, suite_name):
-        _unittest._case_run(self, result, suite_name)
+    def run(self, result: TestResult, suite_name):
+        for name in dir(self):
+            if String(name).startswith("test"):
+                result.testsRun += 1
+                self.test_fn = getattr(self, name)
+                print("[ RUN      ] %s.%s" % (suite_name, name))
+                self.test_fn()
 
 
 class TestSuite:
@@ -82,7 +88,7 @@ class TestSuite:
     def addTest(self, case):
         self._tests.append(case)
 
-    def run(self, result):
+    def run(self, result: TestResult):
         for case in self._tests:
             case.run(result, self.name)
         return result
@@ -93,13 +99,13 @@ class TextTestRunner:
         res = TestResult()
         _ = suite.run(res)
         print("----------------------------------------------------------------------")
-        print("Ran %d tests\n" % res.testsRun)
+        print("[----------] %d tests from %s\n" % res.testsRun, suite.name)
         if res.failuresNum > 0 or res.errorsNum > 0:
             s = "FAILED"
             s += " (%d errors, %d failures)" % (res.errorsNum, res.failuresNum)
             print(s)
         else:
-            msg = "OK"
+            msg = "[==========]"
             if res.skippedNum > 0:
                 msg += " (skipped=%d)" % res.skippedNum
             print(msg)

+ 4 - 1
port/linux/.vscode/settings.json

@@ -1,3 +1,6 @@
 {
-    "C_Cpp.clang_format_style": "{ BasedOnStyle: Chromium, IndentWidth: 4}"
+    "C_Cpp.clang_format_style": "{ BasedOnStyle: Chromium, IndentWidth: 4}",
+    "files.associations": {
+        "pikastdlib_sysobj.h": "c"
+    }
 }

+ 2 - 2
port/linux/package/pikascript/PikaStdData.pyi

@@ -63,8 +63,8 @@ class String:
     def __str__(self) -> str: ...
     def __len__(self) -> int: ...
     def encode(self) -> bytes: ...
-    def startwith(self, prefix: str) -> int: ...
-    def endwith(self, suffix: str) -> int: ...
+    def startswith(self, prefix: str) -> int: ...
+    def endswith(self, suffix: str) -> int: ...
     def isdigit(self) -> int: ...
     def islower(self) -> int: ...
     def isalnum(self) -> int: ...

+ 6 - 0
port/linux/package/pikascript/PikaStdLib.pyi

@@ -82,6 +82,12 @@ class SysObj:
     @staticmethod
     def exec(code: str): ...
 
+    @staticmethod
+    def getattr(obj: object, name: str) -> any: ...
+
+    @staticmethod
+    def setattr(obj: object, name: str, val: any): ...
+
 
 class RangeObj:
     def __next__(self) -> any: ...

+ 3 - 3
port/linux/package/pikascript/configparser.py

@@ -10,11 +10,11 @@ class ConfigParser():
         lines = content.split('\n')
         for line in lines:
             line = String(line)
-            if line.startwith('#'):
+            if line.startswith('#'):
                 continue
-            if line.startwith(';'):
+            if line.startswith(';'):
                 continue
-            if line.startwith('['):
+            if line.startswith('['):
                 section = String(line.replace('[', ''))
                 section = section.replace(']', '')
                 self.config_dict[section] = {}

+ 2 - 2
port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdData_String.c

@@ -66,7 +66,7 @@ char* PikaStdData_String___str__(PikaObj* self) {
     return obj_getStr(self, "str");
 }
 
-int PikaStdData_String_startwith(PikaObj* self, char* prefix) {
+int PikaStdData_String_startswith(PikaObj* self, char* prefix) {
     char* str = obj_getStr(self, "str");
     char* p = prefix;
     int i = 0;
@@ -79,7 +79,7 @@ int PikaStdData_String_startwith(PikaObj* self, char* prefix) {
     return 1;
 }
 
-int PikaStdData_String_endwith(PikaObj* self, char* suffix) {
+int PikaStdData_String_endswith(PikaObj* self, char* suffix) {
     char* str = obj_getStr(self, "str");
     int len1 = strlen(str);
     int len2 = strlen(suffix);

+ 25 - 0
port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c

@@ -508,3 +508,28 @@ void PikaStdLib_SysObj_exec(PikaObj* self, char* code) {
     __platform_printf("[Error] PIKA_EXEC_ENABLE is not enabled.\r\n");
 #endif
 }
+
+Arg* PikaStdLib_SysObj_getattr(PikaObj* self, PikaObj* obj, char* name) {
+    Arg* res = NULL;
+    if (NULL == obj) {
+        obj_setErrorCode(self, 1);
+        __platform_printf("[Error] getattr: can not get attr of NULL.\r\n");
+        return NULL;
+    }
+    res = arg_copy(obj_getArg(obj, name));
+    return res;
+}
+
+void PikaStdLib_SysObj_setattr(PikaObj* self,
+                               PikaObj* obj,
+                               char* name,
+                               Arg* val) {
+    if (NULL == obj) {
+        obj_setErrorCode(self, 1);
+        __platform_printf("[Error] setattr: obj is null.\r\n");
+        goto exit;
+    }
+    obj_setArg(obj, name, val);
+exit:
+    return;
+}

+ 11 - 5
port/linux/package/pikascript/unittest.py

@@ -1,4 +1,5 @@
 import _unittest
+from PikaStdData import String
 
 
 class TestResult:
@@ -70,8 +71,13 @@ class TestCase:
         msg = "Expected %r to be in %r" % (x, y)
         assert x in y, msg
 
-    def run(self, result, suite_name):
-        _unittest._case_run(self, result, suite_name)
+    def run(self, result: TestResult, suite_name):
+        for name in dir(self):
+            if String(name).startswith("test"):
+                result.testsRun += 1
+                self.test_fn = getattr(self, name)
+                print("[ RUN      ] %s.%s" % (suite_name, name))
+                self.test_fn()
 
 
 class TestSuite:
@@ -82,7 +88,7 @@ class TestSuite:
     def addTest(self, case):
         self._tests.append(case)
 
-    def run(self, result):
+    def run(self, result: TestResult):
         for case in self._tests:
             case.run(result, self.name)
         return result
@@ -93,13 +99,13 @@ class TextTestRunner:
         res = TestResult()
         _ = suite.run(res)
         print("----------------------------------------------------------------------")
-        print("Ran %d tests\n" % res.testsRun)
+        print("[----------] %d tests from %s\n" % res.testsRun, suite.name)
         if res.failuresNum > 0 or res.errorsNum > 0:
             s = "FAILED"
             s += " (%d errors, %d failures)" % (res.errorsNum, res.failuresNum)
             print(s)
         else:
-            msg = "OK"
+            msg = "[==========]"
             if res.skippedNum > 0:
                 msg += " (skipped=%d)" % res.skippedNum
             print(msg)

+ 6 - 6
port/linux/test/pikaMain-test.cpp

@@ -2234,15 +2234,15 @@ TEST(pikaMain, module_1_module2_test) {
     EXPECT_EQ(pikaMemNow(), 0);
 }
 
-TEST(pikaMain, string_startwith) {
+TEST(pikaMain, string_startswith) {
     /* init */
     pikaMemInfo.heapUsedMax = 0;
     PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
     /* run */
     obj_run(pikaMain,
             "a = PikaStdData.String('test')\n"
-            "res1 = a.startwith('te')\n"
-            "res2 = a.startwith('st')\n");
+            "res1 = a.startswith('te')\n"
+            "res2 = a.startswith('st')\n");
     /* collect */
     int res1 = obj_getInt(pikaMain, "res1");
     int res2 = obj_getInt(pikaMain, "res2");
@@ -2256,15 +2256,15 @@ TEST(pikaMain, string_startwith) {
     EXPECT_EQ(pikaMemNow(), 0);
 }
 
-TEST(pikaMain, string_endwith) {
+TEST(pikaMain, string_endswith) {
     /* init */
     pikaMemInfo.heapUsedMax = 0;
     PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
     /* run */
     obj_run(pikaMain,
             "a = PikaStdData.String('test')\n"
-            "res1 = a.endwith('te')\n"
-            "res2 = a.endwith('st')\n");
+            "res1 = a.endswith('te')\n"
+            "res2 = a.endswith('st')\n");
     /* collect */
     int res1 = obj_getInt(pikaMain, "res1");
     int res2 = obj_getInt(pikaMain, "res2");

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

@@ -3,12 +3,15 @@ import unittest
 
 class TestUnittestAssertions(unittest.TestCase):
     def testEqual(self):
+        print("in testEqual...")
         self.assertEqual(0, 0)
 
     def testTrue(self):
+        print("in testTrue...")
         self.assertTrue(True)
 
     def testFalse(self):
+        print("in testFalse...")
         self.assertFalse(False)
 
 

+ 44 - 0
port/linux/test/sysObj-test.cpp

@@ -28,3 +28,47 @@ TEST(sysObj, noMethod) {
     obj_deinit(obj);
     EXPECT_EQ(pikaMemNow(), 0);
 }
+
+TEST(sysObj, getattr) {
+    char* lines =
+        "class Test:\n"
+        "    def __init__(self):\n"
+        "        self.a = 1\n"
+        "test = Test()\n"
+        "aa = getattr(test, 'a')\n";
+    /* init */
+    pikaMemInfo.heapUsedMax = 0;
+    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
+    /* run */
+    __platform_printf("BEGIN\r\n");
+    obj_run(pikaMain, lines);
+    /* collect */
+    int aa = obj_getInt(pikaMain, "aa");
+    /* assert */
+    EXPECT_EQ(1, aa);
+    /* deinit */
+    obj_deinit(pikaMain);
+    EXPECT_EQ(pikaMemNow(), 0);
+}
+
+TEST(sysObj, setattr) {
+    char* lines =
+        "class Test:\n"
+        "\n"
+        "test = Test()\n"
+        "setattr(test, 'a', 2)\n"
+        "aa = test.a\n";
+    /* init */
+    pikaMemInfo.heapUsedMax = 0;
+    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
+    /* run */
+    __platform_printf("BEGIN\r\n");
+    obj_run(pikaMain, lines);
+    /* collect */
+    int aa = obj_getInt(pikaMain, "aa");
+    /* assert */
+    EXPECT_EQ(2, aa);
+    /* deinit */
+    obj_deinit(pikaMain);
+    EXPECT_EQ(pikaMemNow(), 0);
+}