-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIdentifierBasedTOFMockTest.st
More file actions
170 lines (145 loc) · 5.72 KB
/
Copy pathIdentifierBasedTOFMockTest.st
File metadata and controls
170 lines (145 loc) · 5.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
USING AxUnit.Assert;
NAMESPACE Simatic.Ax.Mocks
/// Example function block with conditional TOF timer usage
FUNCTION_BLOCK ConditionalTOFFunctionBlock
VAR_INPUT
mode : INT; // 1, 2, or 3 to select which timer to use
END_VAR
VAR_OUTPUT
result : STRING;
END_VAR
VAR
timer1 : TOF_Mock_true;
timer2 : TOF_Mock_true;
timer3 : TOF_Mock_true;
END_VAR
// Conditional timer usage based on mode
IF mode = 1 THEN
timer1(IN := FALSE, PT := T#1s);
IF timer1.Q THEN
result := 'MODE1_ON';
ELSE
result := 'MODE1_OFF';
END_IF;
ELSIF mode = 2 THEN
timer2(IN := FALSE, PT := T#2s);
IF timer2.Q THEN
result := 'MODE2_ON';
ELSE
result := 'MODE2_OFF';
END_IF;
ELSIF mode = 3 THEN
timer3(IN := FALSE, PT := T#5s);
IF timer3.Q THEN
result := 'MODE3_ON';
ELSE
result := 'MODE3_OFF';
END_IF;
ELSE
result := 'INVALID_MODE';
END_IF;
END_FUNCTION_BLOCK
/// Test fixture demonstrating IdentifierBasedTOFMock usage
{TestFixture}
CLASS TestIdentifierBasedTOFMock
VAR
testInstance, testInstanceStateless : ConditionalTOFFunctionBlock;
payload, payloadStateless : IdentifierBasedTOFMockPayload;
END_VAR
/// Setup method to reset instances before each test
{TestSetup}
METHOD PUBLIC TestSetup
payload := payloadStateless;
testInstance := testInstanceStateless;
END_METHOD
/// Test Mode 1 - Timer at position 1 should be ON
{Test}
METHOD PUBLIC TestMode1TimerOn
// Reset counter before test
payload.ResetCounter();
// Configure Timer 1 (1st call position) to be ON
payload.T1_Enabled := TRUE;
payload.T1_CallPosition := 1;
payload.T1_Output := TRUE;
payload.T1_ElapsedTime := T#0ms;
// Apply mock with payload
AxUnit.Mocking.Mock(
mockeeFn := NAME_OF(TOF_Mock_true),
mockFn := NAME_OF(IdentifierBasedTOFMock),
payload := payload
);
// Execute function block in mode 1
testInstance(mode := 1);
// Verify result
Equal(expected := 'MODE1_ON', actual := testInstance.result);
END_METHOD
/// Test Mode 2 - Timer at position 1 should be OFF
{Test}
METHOD PUBLIC TestMode2TimerOff
// Reset counter before test
payload.ResetCounter();
// Configure Timer 1 (1st call position) to be OFF
payload.T1_Enabled := TRUE;
payload.T1_CallPosition := 1;
payload.T1_Output := FALSE;
payload.T1_ElapsedTime := T#2s;
// Apply mock with payload
AxUnit.Mocking.Mock(
mockeeFn := NAME_OF(TOF_Mock_true),
mockFn := NAME_OF(IdentifierBasedTOFMock),
payload := payload
);
// Execute function block in mode 2
testInstance(mode := 2);
// Verify result
Equal(expected := 'MODE2_OFF', actual := testInstance.result);
END_METHOD
/// Test Mode 3 - Timer at position 1 should be ON
{Test}
METHOD PUBLIC TestMode3TimerOn
// Reset counter before test
payload.ResetCounter();
// Configure Timer 1 (1st call position) to be ON
payload.T1_Enabled := TRUE;
payload.T1_CallPosition := 1;
payload.T1_Output := TRUE;
payload.T1_ElapsedTime := T#0ms;
// Apply mock with payload
AxUnit.Mocking.Mock(
mockeeFn := NAME_OF(TOF_Mock_true),
mockFn := NAME_OF(IdentifierBasedTOFMock),
payload := payload
);
// Execute function block in mode 3
testInstance(mode := 3);
// Verify result
Equal(expected := 'MODE3_ON', actual := testInstance.result);
END_METHOD
/// Test with multiple configured timers - only matching position is used
{Test}
METHOD PUBLIC TestMultipleConfiguredTimers
// Reset counter before test
payload.ResetCounter();
// Configure multiple timers with different call positions
payload.T1_Enabled := TRUE;
payload.T1_CallPosition := 1;
payload.T1_Output := FALSE;
payload.T1_ElapsedTime := T#1s;
payload.T2_Enabled := TRUE;
payload.T2_CallPosition := 2;
payload.T2_Output := TRUE;
payload.T2_ElapsedTime := T#0ms;
// Apply mock with payload
AxUnit.Mocking.Mock(
mockeeFn := NAME_OF(TOF_Mock_true),
mockFn := NAME_OF(IdentifierBasedTOFMock),
payload := payload
);
// Execute function block in mode 2 (should match T1 at position 1, but T1 is at position 1)
// Since mode 2 calls timer2, it's the 1st call, so T1 matches
testInstance(mode := 2);
// Verify result - T1 configuration is used (position 1, OFF)
Equal(expected := 'MODE2_OFF', actual := testInstance.result);
END_METHOD
END_CLASS
END_NAMESPACE