Skip to content

Commit dc4097c

Browse files
committed
test: Integration tests
1 parent bcf1489 commit dc4097c

10 files changed

+565
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// RUN: (%COMPILE %s && %RUN) | %CHECK %s
2+
3+
FUNCTION_BLOCK FbA
4+
VAR
5+
localState: DINT := 5;
6+
END_VAR
7+
8+
METHOD increaseStateByOne
9+
localState := localState + 1;
10+
printf('FbA::increaseStateByOne: localState = %d$N', localState);
11+
END_METHOD
12+
13+
METHOD increaseStateByArg
14+
VAR_INPUT
15+
in: DINT;
16+
END_VAR
17+
18+
localState := localState + in;
19+
printf('FbA::increaseStateByArg: localState = %d$N', localState);
20+
END_METHOD
21+
END_FUNCTION_BLOCK
22+
23+
FUNCTION main
24+
VAR
25+
instanceFbA: FbA;
26+
fnPtrIncreaseStateByOne: POINTER TO FbA.increaseStateByOne := ADR(FbA.increaseStateByOne);
27+
fnPtrIncreaseStateByArg: POINTER TO FbA.increaseStateByArg := ADR(FbA.increaseStateByArg);
28+
END_VAR
29+
30+
// CHECK: FbA::increaseStateByOne: localState = 6
31+
// CHECK: FbA::increaseStateByArg: localState = 10
32+
fnPtrIncreaseStateByOne^(instanceFbA);
33+
fnPtrIncreaseStateByArg^(instanceFbA, 4);
34+
END_FUNCTION
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
// RUN: (%COMPILE %s && %RUN) | %CHECK %s
2+
3+
TYPE PositionWithExtraMetadata:
4+
STRUCT
5+
x: REAL;
6+
y: REAL;
7+
data: ARRAY[1..100] OF STRING;
8+
END_STRUCT
9+
END_TYPE
10+
11+
FUNCTION_BLOCK FbA
12+
VAR
13+
localStruct: PositionWithExtraMetadata := (x := 1.0, y := 2.0, data := ['Data 1', 'Data 2', 'Data 3']);
14+
localStringArray: ARRAY[1..3] OF STRING := ['Value 1', 'Value 2', 'Value 3'];
15+
localStructArray: ARRAY[1..3] OF PositionWithExtraMetadata := [
16+
(x := 3.0, y := 4.0, data := ['Data 4', 'Data 5', 'Data 6']),
17+
(x := 5.0, y := 6.0, data := ['Data 7', 'Data 8', 'Data 9']),
18+
(x := 7.0, y := 8.0, data := ['Data 10', 'Data 11', 'Data 12'])
19+
];
20+
END_VAR
21+
22+
METHOD returnString: STRING
23+
returnString := 'FbA::returnString';
24+
END_METHOD
25+
26+
METHOD returnStruct: PositionWithExtraMetadata
27+
returnStruct := localStruct;
28+
END_METHOD
29+
30+
METHOD returnStringArray: ARRAY[1..3] OF STRING
31+
returnStringArray := localStringArray;
32+
END_METHOD
33+
34+
METHOD returnStructArray: ARRAY[1..3] OF PositionWithExtraMetadata
35+
returnStructArray := localStructArray;
36+
END_METHOD
37+
END_FUNCTION_BLOCK
38+
39+
FUNCTION main
40+
VAR
41+
instanceA: FbA;
42+
returnStringPtr: POINTER TO FbA.returnString := ADR(instanceA.returnString);
43+
returnStructPtr: POINTER TO FbA.returnStruct := ADR(instanceA.returnStruct);
44+
returnStringArrayPtr: POINTER TO FbA.returnStringArray := ADR(instanceA.returnStringArray);
45+
returnStructArrayPtr: POINTER TO FbA.returnStructArray := ADR(instanceA.returnStructArray);
46+
47+
localReturnString: STRING;
48+
localReturnStruct: PositionWithExtraMetadata;
49+
localReturnStringArray: ARRAY[1..3] OF STRING;
50+
localReturnStructArray: ARRAY[1..3] OF PositionWithExtraMetadata;
51+
END_VAR
52+
53+
// localReturnString := instanceA.returnString();
54+
// CHECK: localReturnString = FbA::returnString
55+
localReturnString := returnStringPtr^(instanceA);
56+
printf('localReturnString = %s$N', ADR(localReturnString));
57+
58+
// localReturnStruct := instanceA.returnStruct();
59+
// CHECK: localReturnStruct.x = 1.000000
60+
// CHECK: localReturnStruct.y = 2.000000
61+
// CHECK: localReturnStruct.data[1] = Data 1
62+
// CHECK: localReturnStruct.data[2] = Data 2
63+
// CHECK: localReturnStruct.data[3] = Data 3
64+
localReturnStruct := returnStructPtr^(instanceA);
65+
printf('localReturnStruct.x = %f$N', localReturnStruct.x);
66+
printf('localReturnStruct.y = %f$N', localReturnStruct.y);
67+
printf('localReturnStruct.data[1] = %s$N', ADR(localReturnStruct.data[1]));
68+
printf('localReturnStruct.data[2] = %s$N', ADR(localReturnStruct.data[2]));
69+
printf('localReturnStruct.data[3] = %s$N', ADR(localReturnStruct.data[3]));
70+
71+
// localReturnStringArray := instanceA.returnStringArray();
72+
// CHECK: localReturnStringArray[1] = Value 1
73+
// CHECK: localReturnStringArray[2] = Value 2
74+
// CHECK: localReturnStringArray[3] = Value 3
75+
localReturnStringArray := returnStringArrayPtr^(instanceA);
76+
printf('localReturnStringArray[1] = %s$N', ADR(localReturnStringArray[1]));
77+
printf('localReturnStringArray[2] = %s$N', ADR(localReturnStringArray[2]));
78+
printf('localReturnStringArray[3] = %s$N', ADR(localReturnStringArray[3]));
79+
80+
// localReturnStructArray := instanceA.returnStructArray();
81+
// CHECK: localReturnStructArray[1].x = 3.000000
82+
// CHECK: localReturnStructArray[1].y = 4.000000
83+
// CHECK: localReturnStructArray[1].data[1] = Data 4
84+
// CHECK: localReturnStructArray[1].data[2] = Data 5
85+
// CHECK: localReturnStructArray[1].data[3] = Data 6
86+
// CHECK: localReturnStructArray[2].x = 5.000000
87+
// CHECK: localReturnStructArray[2].y = 6.000000
88+
// CHECK: localReturnStructArray[2].data[1] = Data 7
89+
// CHECK: localReturnStructArray[2].data[2] = Data 8
90+
// CHECK: localReturnStructArray[2].data[3] = Data 9
91+
// CHECK: localReturnStructArray[3].x = 7.000000
92+
// CHECK: localReturnStructArray[3].y = 8.000000
93+
// CHECK: localReturnStructArray[3].data[1] = Data 10
94+
// CHECK: localReturnStructArray[3].data[2] = Data 11
95+
// CHECK: localReturnStructArray[3].data[3] = Data 12
96+
localReturnStructArray := returnStructArrayPtr^(instanceA);
97+
printf('localReturnStructArray[1].x = %f$N', localReturnStructArray[1].x);
98+
printf('localReturnStructArray[1].y = %f$N', localReturnStructArray[1].y);
99+
printf('localReturnStructArray[1].data[1] = %s$N', ADR(localReturnStructArray[1].data[1]));
100+
printf('localReturnStructArray[1].data[2] = %s$N', ADR(localReturnStructArray[1].data[2]));
101+
printf('localReturnStructArray[1].data[3] = %s$N', ADR(localReturnStructArray[1].data[3]));
102+
printf('localReturnStructArray[2].x = %f$N', localReturnStructArray[2].x);
103+
printf('localReturnStructArray[2].y = %f$N', localReturnStructArray[2].y);
104+
printf('localReturnStructArray[2].data[1] = %s$N', ADR(localReturnStructArray[2].data[1]));
105+
printf('localReturnStructArray[2].data[2] = %s$N', ADR(localReturnStructArray[2].data[2]));
106+
printf('localReturnStructArray[2].data[3] = %s$N', ADR(localReturnStructArray[2].data[3]));
107+
printf('localReturnStructArray[3].x = %f$N', localReturnStructArray[3].x);
108+
printf('localReturnStructArray[3].y = %f$N', localReturnStructArray[3].y);
109+
printf('localReturnStructArray[3].data[1] = %s$N', ADR(localReturnStructArray[3].data[1]));
110+
printf('localReturnStructArray[3].data[2] = %s$N', ADR(localReturnStructArray[3].data[2]));
111+
printf('localReturnStructArray[3].data[3] = %s$N', ADR(localReturnStructArray[3].data[3]));
112+
END_FUNCTION
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// RUN: (%COMPILE %s && %RUN) | %CHECK %s
2+
3+
TYPE PositionWithExtraMetadata:
4+
STRUCT
5+
x: REAL;
6+
y: REAL;
7+
data: ARRAY[1..100] OF STRING;
8+
END_STRUCT
9+
END_TYPE
10+
11+
FUNCTION_BLOCK FbA
12+
METHOD foo
13+
VAR_OUTPUT
14+
outString: STRING;
15+
outStruct: PositionWithExtraMetadata;
16+
outStructArray: ARRAY[1..5] OF PositionWithExtraMetadata;
17+
END_VAR
18+
19+
outString := 'FbA::foo result';
20+
outStruct.x := 1.0;
21+
outStruct.y := 2.0;
22+
outStruct.data[1] := 'Data 1';
23+
outStruct.data[2] := 'Data 2';
24+
outStruct.data[3] := 'Data 3';
25+
outStructArray[1].x := 3.0;
26+
outStructArray[1].y := 4.0;
27+
outStructArray[1].data[1] := 'Data 4';
28+
outStructArray[1].data[2] := 'Data 5';
29+
outStructArray[1].data[3] := 'Data 6';
30+
END_METHOD
31+
END_FUNCTION_BLOCK
32+
33+
FUNCTION main
34+
VAR
35+
fooPtr: POINTER TO FbA.foo := ADR(FbA.foo);
36+
instanceA: FbA;
37+
localOutString: STRING;
38+
localOutStruct: PositionWithExtraMetadata;
39+
localOutStructArray: ARRAY[1..5] OF PositionWithExtraMetadata;
40+
END_VAR
41+
42+
// CHECK: localOutString = FbA::foo result
43+
// CHECK: localOutStruct.x = 1.000000
44+
// CHECK: localOutStruct.y = 2.000000
45+
// CHECK: localOutStruct.data[1] = Data 1
46+
// CHECK: localOutStruct.data[2] = Data 2
47+
// CHECK: localOutStruct.data[3] = Data 3
48+
// CHECK: localOutStructArray[1].x = 3.000000
49+
// CHECK: localOutStructArray[1].y = 4.000000
50+
// CHECK: localOutStructArray[1].data[1] = Data 4
51+
// CHECK: localOutStructArray[1].data[2] = Data 5
52+
// CHECK: localOutStructArray[1].data[3] = Data 6
53+
fooPtr^(instanceA, outStructArray => localOutStructArray, outString => localOutString, outStruct => localOutStruct );
54+
printf('localOutString = %s$N', ADR(localOutString));
55+
printf('localOutStruct.x = %f$N', localOutStruct.x);
56+
printf('localOutStruct.y = %f$N', localOutStruct.y);
57+
printf('localOutStruct.data[1] = %s$N', ADR(localOutStruct.data[1]));
58+
printf('localOutStruct.data[2] = %s$N', ADR(localOutStruct.data[2]));
59+
printf('localOutStruct.data[3] = %s$N', ADR(localOutStruct.data[3]));
60+
printf('localOutStructArray[1].x = %f$N', localOutStructArray[1].x);
61+
printf('localOutStructArray[1].y = %f$N', localOutStructArray[1].y);
62+
printf('localOutStructArray[1].data[1] = %s$N', ADR(localOutStructArray[1].data[1]));
63+
printf('localOutStructArray[1].data[2] = %s$N', ADR(localOutStructArray[1].data[2]));
64+
printf('localOutStructArray[1].data[3] = %s$N', ADR(localOutStructArray[1].data[3]));
65+
END_FUNCTION
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// RUN: (%COMPILE %s && %RUN) | %CHECK %s
2+
3+
TYPE PositionWithExtraMetadata:
4+
STRUCT
5+
x: REAL;
6+
y: REAL;
7+
data: ARRAY[1..100] OF STRING;
8+
END_STRUCT
9+
END_TYPE
10+
11+
FUNCTION_BLOCK FbA
12+
METHOD foo
13+
VAR_OUTPUT
14+
outString: STRING;
15+
outStruct: PositionWithExtraMetadata;
16+
outStringArray: ARRAY[1..5] OF STRING;
17+
outStructArray: ARRAY[1..5] OF PositionWithExtraMetadata;
18+
END_VAR
19+
20+
outString := 'FbA::foo result';
21+
outStruct.x := 1.0;
22+
outStruct.y := 2.0;
23+
outStruct.data[1] := 'Data 1';
24+
outStruct.data[2] := 'Data 2';
25+
outStruct.data[3] := 'Data 3';
26+
outStringArray[1] := 'Data 4';
27+
outStringArray[2] := 'Data 5';
28+
outStringArray[3] := 'Data 6';
29+
outStructArray[1].x := 3.0;
30+
outStructArray[1].y := 4.0;
31+
outStructArray[1].data[1] := 'Data 7';
32+
outStructArray[1].data[2] := 'Data 8';
33+
outStructArray[1].data[3] := 'Data 9';
34+
END_METHOD
35+
END_FUNCTION_BLOCK
36+
37+
FUNCTION main
38+
VAR
39+
fooPtr: POINTER TO FbA.foo := ADR(FbA.foo);
40+
instanceA: FbA;
41+
localOutString: STRING;
42+
localOutStruct: PositionWithExtraMetadata;
43+
localOutStringArray: ARRAY[1..5] OF STRING;
44+
localOutStructArray: ARRAY[1..5] OF PositionWithExtraMetadata;
45+
END_VAR
46+
47+
// CHECK: localOutString = FbA::foo result
48+
// CHECK: localOutStruct.x = 1.000000
49+
// CHECK: localOutStruct.y = 2.000000
50+
// CHECK: localOutStruct.data[1] = Data 1
51+
// CHECK: localOutStruct.data[2] = Data 2
52+
// CHECK: localOutStruct.data[3] = Data 3
53+
// CHECK: localOutStringArray[1] = Data 4
54+
// CHECK: localOutStringArray[2] = Data 5
55+
// CHECK: localOutStringArray[3] = Data 6
56+
// CHECK: localOutStructArray[1].x = 3.000000
57+
// CHECK: localOutStructArray[1].y = 4.000000
58+
// CHECK: localOutStructArray[1].data[1] = Data 7
59+
// CHECK: localOutStructArray[1].data[2] = Data 8
60+
// CHECK: localOutStructArray[1].data[3] = Data 9
61+
fooPtr^(instanceA, outStructArray => localOutStructArray, outString => localOutString, outStruct => localOutStruct, outStringArray => localOutStringArray);
62+
printf('localOutString = %s$N', ADR(localOutString));
63+
printf('localOutStruct.x = %f$N', localOutStruct.x);
64+
printf('localOutStruct.y = %f$N', localOutStruct.y);
65+
printf('localOutStruct.data[1] = %s$N', ADR(localOutStruct.data[1]));
66+
printf('localOutStruct.data[2] = %s$N', ADR(localOutStruct.data[2]));
67+
printf('localOutStruct.data[3] = %s$N', ADR(localOutStruct.data[3]));
68+
printf('localOutStringArray[1] = %s$N', ADR(localOutStringArray[1]));
69+
printf('localOutStringArray[2] = %s$N', ADR(localOutStringArray[2]));
70+
printf('localOutStringArray[3] = %s$N', ADR(localOutStringArray[3]));
71+
printf('localOutStructArray[1].x = %f$N', localOutStructArray[1].x);
72+
printf('localOutStructArray[1].y = %f$N', localOutStructArray[1].y);
73+
printf('localOutStructArray[1].data[1] = %s$N', ADR(localOutStructArray[1].data[1]));
74+
printf('localOutStructArray[1].data[2] = %s$N', ADR(localOutStructArray[1].data[2]));
75+
printf('localOutStructArray[1].data[3] = %s$N', ADR(localOutStructArray[1].data[3]));
76+
END_FUNCTION
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// RUN: (%COMPILE %s && %RUN) | %CHECK %s
2+
3+
FUNCTION_BLOCK A
4+
METHOD printArgs
5+
VAR_INPUT
6+
message: STRING;
7+
value: DINT;
8+
END_VAR
9+
10+
printf('%s %d$N', ADR(message), value);
11+
END_METHOD
12+
END_FUNCTION_BLOCK
13+
14+
TYPE FnTable:
15+
STRUCT
16+
printArgs: POINTER TO A.printArgs := ADR(A.printArgs);
17+
END_STRUCT
18+
END_TYPE
19+
20+
VAR_GLOBAL
21+
fnTableInstance: FnTable;
22+
END_VAR
23+
24+
FUNCTION main
25+
VAR
26+
instanceA: A;
27+
fnTableRef: POINTER TO __VOID := ADR(fnTableInstance);
28+
END_VAR
29+
30+
// Not a direct cast of a void pointer function but rather its virtual table, basically how the virtual
31+
// table is also accessed in desugared code (though the access happens in the POU rather than a local
32+
// variable in the main function)
33+
// CHECK: value = 5
34+
FnTable#(fnTableRef^).printArgs^(instanceA, message := 'value =', value := 5);
35+
36+
// FIXME: Issues when not having named arguments?
37+
// FnTable#(fnTableRef^).printArgs^(instanceA, 'value =', 5);
38+
END_FUNCTION
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// RUN: (%COMPILE %s && %RUN) | %CHECK %s
2+
3+
FUNCTION_BLOCK A
4+
METHOD inoutArguments
5+
VAR_IN_OUT
6+
inout1: DINT;
7+
inout2: DINT;
8+
END_VAR
9+
10+
inout1 := 100;
11+
inout2 := 200;
12+
printf('A::inoutArguments: inout1 = %d, inout2 = %d$N', inout1, inout2);
13+
END_METHOD
14+
END_FUNCTION_BLOCK
15+
16+
FUNCTION main
17+
VAR
18+
instanceA: A;
19+
localInOut1: DINT;
20+
localInOut2: DINT;
21+
22+
fnPtrInOutArguments: POINTER TO A.inoutArguments := ADR(A.inoutArguments);
23+
END_VAR
24+
25+
// Explicit
26+
// CHECK: A::inoutArguments: inout1 = 100, inout2 = 200
27+
// CHECK: A::inoutArguments: inout1 = 100, inout2 = 200
28+
fnPtrInOutArguments^(instanceA, localInOut1, localInOut2);
29+
fnPtrInOutArguments^(instanceA, inout1 := localInOut1, inout2 := localInOut2);
30+
END_FUNCTION
31+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// RUN: (%COMPILE %s && %RUN) | %CHECK %s
2+
3+
FUNCTION_BLOCK A
4+
METHOD inputArguments
5+
VAR_INPUT
6+
in1: DINT;
7+
in2: DINT;
8+
END_VAR
9+
10+
printf('A::inputArguments: in1 = %d, in2 = %d$N', in1, in2);
11+
END_METHOD
12+
END_FUNCTION_BLOCK
13+
14+
FUNCTION main
15+
VAR
16+
instanceA: A;
17+
localOut1: DINT;
18+
localOut2: DINT;
19+
20+
fnPtrInputArguments: POINTER TO A.inputArguments := ADR(A.inputArguments);
21+
END_VAR
22+
23+
// Implicit
24+
// CHECK: A::inputArguments: in1 = 5, in2 = 10
25+
// CHECK: A::inputArguments: in1 = 5, in2 = 10
26+
fnPtrInputArguments^(instanceA, 5, 10);
27+
fnPtrInputArguments^(instanceA, in1 := 5, in2 := 10);
28+
END_FUNCTION

0 commit comments

Comments
 (0)