Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2
修订版 | 6d8b6474c25e31acd67aebfb1c7bdd8c5693331b (tree) |
---|---|
时间 | 2023-02-11 07:20:01 |
作者 | Albert Mietus < albert AT mietus DOT nl > |
Commiter | Albert Mietus < albert AT mietus DOT nl > |
asis
@@ -7,12 +7,13 @@ | ||
7 | 7 | pytst/writers/CC2Cpy/test_2b_EventProtocol.py \ |
8 | 8 | pytst/writers/CC2Cpy/test_3a_CompPort.py \ |
9 | 9 | pytst/writers/CC2Cpy/test_3b_CompInterface.py \ |
10 | + pytst/writers/CC2Cpy/test_3c_CompClass.py \ | |
10 | 11 | # |
11 | 12 | CURRENT_TESTS = \ |
12 | - pytst/writers/CC2Cpy/test_3c_CompClass.py \ | |
13 | + pytst/writers/CC2Cpy/test_3d_CompStruct.py \ | |
14 | + pytst/writers/CC2Cpy/test_9_genSieve.py \ | |
13 | 15 | # |
14 | 16 | TODO_TESTS = \ |
15 | - pytst/writers/CC2Cpy/test_3d_CompStruct.py \ | |
16 | 17 | pytst/writers/CC2Cpy/test_999_NoNameCollision.py \ |
17 | 18 | # |
18 | 19 |
@@ -77,7 +77,7 @@ | ||
77 | 77 | for no,port in enumerate(self.ports, start_port_no): # Loop over 'own' ports |
78 | 78 | retval.append(f'{prepend}{indent*2}{{') |
79 | 79 | retval.append(f'{prepend}{indent*3}.portNo = {no},') |
80 | - retval.append(f'{prepend}{indent*3}.protocol = {port.portray_typePtr()},') | |
80 | + retval.append(f'{prepend}{indent*3}.protocol = {port.portray_typePtr()},') | |
81 | 81 | retval.append(f'{prepend}{indent*3}.direction = {port.direction.portray_name()},') |
82 | 82 | retval.append(f'{prepend}{indent*3}.name = "{port.name}",') |
83 | 83 | retval.append(f'{prepend}{indent*3}.part_of = &{name} }},') |
@@ -9,7 +9,7 @@ | ||
9 | 9 | from . import * # CCompare |
10 | 10 | |
11 | 11 | from castle.writers.CC2Cpy.Component import * |
12 | - | |
12 | +from castle.writers.CC2Cpy.CCbase import CC_Base | |
13 | 13 | |
14 | 14 | def test_1a_CC_PortDirection(): |
15 | 15 | # Test the (int) value -- needed for the generated C code |
@@ -86,3 +86,7 @@ | ||
86 | 86 | assert CCompare('&'+proto.portray_name(), port.portray_typePtr()) |
87 | 87 | |
88 | 88 | |
89 | +def test_BUG(): | |
90 | + proto = CC_EventProtocol("JustAProtocol", events=[], based_on=None) | |
91 | + port = CC_Port(name="=NoName", type=proto) | |
92 | + assert isinstance(port.type, CC_Base) |
@@ -4,7 +4,7 @@ | ||
4 | 4 | import pytest |
5 | 5 | from . import * # CCompare |
6 | 6 | |
7 | -from castle.writers.CC2Cpy.Component import * | |
7 | +from castle.writers.CC2Cpy.Component import * | |
8 | 8 | |
9 | 9 | |
10 | 10 |
@@ -0,0 +1,83 @@ | ||
1 | +# (C) Albert Mietus, 2022, 2023. Part of Castle/CCastle project | |
2 | + | |
3 | +"""CCastle::CC2Cpy integration test: write the C-code for the "Sieve" component | |
4 | +""" | |
5 | + | |
6 | + | |
7 | +import logging; logger = logging.getLogger(__name__) | |
8 | +import pytest | |
9 | + | |
10 | + | |
11 | +from castle.writers.CC2Cpy.Protocol import * | |
12 | +from castle.writers.CC2Cpy.Event import * | |
13 | +from castle.writers.CC2Cpy.Component import * | |
14 | + | |
15 | +### protocol SimpleSieve : Protocol { | |
16 | +### kind: event; | |
17 | +### input(int:try); | |
18 | +### } | |
19 | +@pytest.fixture | |
20 | +def simpleSieve(): | |
21 | + return CC_EventProtocol("SimpleSieve", events=[ | |
22 | + CC_Event("input", typedParameters=[CC_TypedParameter(name='event', type=int)])]) | |
23 | + | |
24 | + | |
25 | +### component Sieve : Component { | |
26 | +### port SimpleSieve<in>:try; | |
27 | +### port SimpleSieve<out>:coprime; | |
28 | +### } | |
29 | +@pytest.fixture | |
30 | +def sieveInterface(simpleSieve): | |
31 | + return CC_B_ComponentInterface("Sieve", ports=[ | |
32 | + CC_Port(name='try', direction=CC_PortDirection.In, type=simpleSieve), | |
33 | + CC_Port(name='coprime', direction=CC_PortDirection.Out, type=simpleSieve)]) | |
34 | + | |
35 | + | |
36 | +### implement Sieve { | |
37 | +### int myPrime; | |
38 | +### ... | |
39 | +@pytest.fixture | |
40 | +def sieveClass(sieveInterface): | |
41 | + return CC_B_ComponentClass(sieveInterface, | |
42 | + # methods= | |
43 | + ) | |
44 | + | |
45 | + | |
46 | +from pathlib import Path | |
47 | +from tempfile import TemporaryDirectory | |
48 | +import os | |
49 | +import subprocess | |
50 | + | |
51 | + | |
52 | +def write_header(f): | |
53 | + f.writelines("""/*(C) Alber Mietus, Generated code*/ | |
54 | +#include <CC/buildin_types.h> | |
55 | +#include <CC/runtime.h> | |
56 | + | |
57 | +""") | |
58 | + | |
59 | +def verify_it_compiles(file, in_dir:Path): | |
60 | + os.symlink("/Users/albert/work/CCastle2/from_CC-Castle/SRC-EXAMPLE/SIEVE/2.GCD-work/CC", in_dir/"CC") | |
61 | + return_code = subprocess.run(["gcc", "-I", in_dir, "-c", file]).returncode | |
62 | + assert return_code == 0 | |
63 | + | |
64 | + | |
65 | +def test_0a(simpleSieve, sieveInterface, sieveClass, tmp_path): | |
66 | + with open(tmp_path/"sieve-interface.c", 'w') as f: | |
67 | + write_header(f) | |
68 | + f.write(simpleSieve.render()) | |
69 | + f.write(sieveInterface.render()) | |
70 | + verify_it_compiles(f.name, tmp_path) | |
71 | + | |
72 | +@pytest.mark.skip(reason="sieveClass refer to ``cc_B_Sieve_methods`` and ``CC_C_Sieve`` which aren't renderable yet") | |
73 | +def test_0b(simpleSieve, sieveInterface, sieveClass, tmp_path): | |
74 | + with open(tmp_path/"sieve-interface.c", 'w') as f: | |
75 | + write_header(f) | |
76 | + f.write(simpleSieve.render()) | |
77 | + f.write(sieveInterface.render()) | |
78 | + f.write(sieveClass.render()) | |
79 | + verify_it_compiles(f.name, tmp_path) | |
80 | + | |
81 | + | |
82 | +@pytest.mark.skip(reason="More Generate C-file(s)") | |
83 | +def test_more(): pass |