Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2
修訂 | 7666fcbc367fa041d4db1c3bd2052b94ef8651c1 (tree) |
---|---|
時間 | 2023-02-21 07:28:50 |
作者 | Albert Mietus < albert AT mietus DOT nl > |
Commiter | Albert Mietus < albert AT mietus DOT nl > |
asis
@@ -10,7 +10,7 @@ | ||
10 | 10 | pytst/writers/CC2Cpy/test_3c_CompClass.py \ |
11 | 11 | # |
12 | 12 | CURRENT_TESTS = \ |
13 | - pytst/writers/CC2Cpy/test_3d_CompStruct.py \ | |
13 | + pytst/writers/CC2Cpy/test_4a_HandlerTables.py \ | |
14 | 14 | pytst/writers/CC2Cpy/test_9_genSieve.py \ |
15 | 15 | # |
16 | 16 | TODO_TESTS = \ |
@@ -64,9 +64,6 @@ | ||
64 | 64 | ######################################################################################################################## |
65 | 65 | ##################################### BUSY ### XXX ### BUZY ############################################################ |
66 | 66 | ######################################################################################################################## |
67 | - | |
68 | - | |
69 | - | |
70 | 67 | @dataclass |
71 | 68 | class CC_B_ComponentClass(CC_Base): |
72 | 69 | metaclass="NULL" # //NULL for now, later: meta-class |
@@ -88,10 +85,7 @@ | ||
88 | 85 | we need to call render_Typedef_CompName first!""" |
89 | 86 | return ( "\n"+ |
90 | 87 | self.render_Typedef_CompName(prepend=prepend, indent=indent) + "\n" + |
91 | - self.render_handlers(prepend=prepend, indent=indent) + "\n" + | |
92 | - self.render_methods(prepend=prepend, indent=indent) + "\n" + | |
93 | - self.render_(prepend=prepend, indent=indent) + "\n" + | |
94 | - | |
88 | + self.render_callables(prepend=prepend, indent=indent) + "\n" + # handlers & methods (implementation) XXX TODO | |
95 | 89 | self.render_Fill_ComponentClass(prepend=prepend, indent=indent) + "\n" + |
96 | 90 | "\n" ) |
97 | 91 |
@@ -125,6 +119,44 @@ | ||
125 | 119 | |
126 | 120 | return '\n'.join(retval)+"\n" |
127 | 121 | |
122 | + | |
123 | + def render_callables(self, prepend:str="", indent:str=" ") ->str: | |
124 | + return """\ | |
125 | +/** TODO: render_callables:: | |
126 | + all Event/Data/Stream-handlers and local ("internal") methods/functions. | |
127 | + | |
128 | + This are a lot of (tobe static) C-function implementations, like | |
129 | + * CC_C_Sieve* CC_Mi_Sieve__init(CC_C_Sieve* self, int prime) ... | |
130 | + * CC_C_Sieve* CC_E_Sieve__SimpleSieve_input__try(CC_C_Sieve* self, CC_OutPortType sender, int try) ... | |
131 | + * etc (one for every event in every input-port, plus the local ones | |
132 | + | |
133 | + Those functions are collected in CC_B_methodHandler-array and CC_B_eventHandler-arrays (aka dispatch-tables). | |
134 | + those are NOW generated here*/""" | |
135 | + | |
136 | + def render_Fill_MethodHandlers(self, prepend:str="", indent:str=" ") ->str: | |
137 | + retval = [] | |
138 | + retval.append(f'CC_B_methodHandler cc_S_Sieve_methods[] = {{') | |
139 | + | |
140 | + retval.append("""/* TODO: render_Fill_MethodHandlers | |
141 | + the local/internal functions & methods */ | |
142 | + Note: cc_S_Sieve_methods is hardcoded""") | |
143 | + retval.append(f'}};') | |
144 | + return '\n'.join(retval)+"\n" | |
145 | + | |
146 | + def render_Fill_PortHandlers(self, port, prepend:str="", indent:str=" ") ->str: | |
147 | + retval = [] | |
148 | + | |
149 | + retval.append(f'CC_B_methodHandler cc_S_Sieve_try[] = {{') | |
150 | + | |
151 | + retval.append("""/* TODO: ``render_Fill_PortHandlers(port)`` | |
152 | + the local/internal functions & methods | |
153 | + Note: `cc_S_Sieve_try` is hardcoded""") | |
154 | + retval.append(f'}};') | |
155 | + return '\n'.join(retval)+"\n" | |
156 | + | |
157 | + | |
158 | + | |
159 | + | |
128 | 160 | def _bases_classes(self) ->Sequence: #XXX |
129 | 161 | return () #XXX WRONG |
130 | 162 |
@@ -37,3 +37,11 @@ | ||
37 | 37 | assert p1.name == 'aName' |
38 | 38 | assert p1.kind == CC_ProtocolKind.Unknown |
39 | 39 | assert p1.based_on is baseProtocol |
40 | + | |
41 | + | |
42 | +import dataclasses | |
43 | + | |
44 | +def test_3_dataclasses_are_dataclasses(): | |
45 | + assert dataclasses.is_dataclass(CC_RootProtocol) | |
46 | + assert dataclasses.is_dataclass(baseProtocol) | |
47 | + |
@@ -1,14 +0,0 @@ | ||
1 | -# (C) Albert Mietus, 2022, 2023. Part of Castle/CCastle project | |
2 | - | |
3 | -import logging; logger = logging.getLogger(__name__) | |
4 | -import pytest | |
5 | -from . import * # CCompare | |
6 | - | |
7 | -from castle.writers.CC2Cpy.Component import * | |
8 | - | |
9 | - | |
10 | - | |
11 | - | |
12 | - | |
13 | -@pytest.mark.skip(reason="More CompStruct-tests are needed") | |
14 | -def test_more(): pass |
@@ -0,0 +1,49 @@ | ||
1 | +# (C) Albert Mietus, 2022, 2023. Part of Castle/CCastle project | |
2 | + | |
3 | +import logging; logger = logging.getLogger(__name__) | |
4 | +import pytest | |
5 | +from . import * # CCompare | |
6 | + | |
7 | +from castle.writers.CC2Cpy.Component import * # CC_B_ComponentClass | |
8 | + | |
9 | + | |
10 | +ref_sieveMethods="""\ | |
11 | +CC_B_methodHandler cc_S_Sieve_methods[] = { | |
12 | + (CC_B_methodHandler)CC_Mi_error, | |
13 | + (CC_B_methodHandler)CC_Mc_New, | |
14 | + (CC_B_methodHandler)CC_Mi_error, | |
15 | + (CC_B_methodHandler)CC_Mi_Sieve__init, | |
16 | +}; | |
17 | +""" | |
18 | + | |
19 | +ref_TryPort="""\ | |
20 | +CC_B_eventHandler cc_S_Sieve_try[] = { | |
21 | + (CC_B_eventHandler)CC_Mi_error, | |
22 | + (CC_B_eventHandler)CC_Mi_error, | |
23 | + (CC_B_eventHandler)CC_Mi_error, | |
24 | + (CC_B_eventHandler)CC_Mi_error, | |
25 | + (CC_B_eventHandler)CC_Mi_error, | |
26 | + (CC_B_eventHandler)CC_Mi_error, | |
27 | + (CC_B_eventHandler)CC_E_Sieve__SimpleSieve_input__try, | |
28 | +}; | |
29 | +""" | |
30 | + | |
31 | +#XXX move to common? | |
32 | +from .test_9_genSieve import * | |
33 | + | |
34 | +@pytest.mark.skip | |
35 | +def test_SieveMethods(sieveClass): | |
36 | + dispatch_table= sieveClass.render_Fill_MethodHandlers() | |
37 | + logger.debug("\n%s\n", dispatch_table) | |
38 | + assert CCompare(ref_sieveMethods,dispatch_table, log_all=True) | |
39 | + | |
40 | +TRY="fill_in_later" | |
41 | +@pytest.mark.skip | |
42 | +def test_TryPortHandlers(sieveClass): | |
43 | + dispatch_table= sieveClass.render_Fill_PortHandlers(TRY) | |
44 | + logger.debug("\n%s\n", dispatch_table) | |
45 | + assert CCompare(ref_TryPorr, dispatch_table, log_all=True) | |
46 | + | |
47 | + | |
48 | +@pytest.mark.skip(reason="More CompStruct-tests are needed") | |
49 | +def test_more(): pass |
@@ -73,7 +73,7 @@ | ||
73 | 73 | f.write(sieveInterface.render()) |
74 | 74 | verify_it_compiles(f.name, tmp_path) |
75 | 75 | |
76 | -@pytest.mark.skip(reason="sieveClass refer to ``cc_B_Sieve_methods`` and ``CC_C_Sieve`` which aren't renderable yet") | |
76 | +@pytest.mark.skip(reason="sieveClass refer to ``cc_B_Sieve_methods`` and ``CC_C_Sieve`` which aren't renderable yet. See test-4") | |
77 | 77 | def test_1b_ProtoInterClass(simpleSieveProto, sieveInterface, sieveClass, tmp_path): |
78 | 78 | FILE="sieve-ProtoInterClass.c" |
79 | 79 | with open(tmp_path/FILE, 'w') as f: |