Test INOUT parameters

This test case it part of the test suite proposed for new devices.

Test case ID: R0190
Language: ST

Code:
tests2/t0190.st
TYPE 
    POINT: STRUCT            X: INT;            Y : INT;    END_STRUCT;
END_TYPE 

FUNCTION F_R0190: POINT (* adds 1 to the io1 and in to io2, same with X from the points; returns a copy of the original p1 *)
    VAR_INPUT        in : INT;     END_VAR
    VAR_IN_OUT
        io1,io2 : INT;
        p1,p2 : POINT;
    END_VAR
    VAR pt : POINT;    END_VAR

    io1 := io1 + 1;
    io2 := io2 + in;
    
    pt := p1;  // what if the following is done directly?
    F_R0190 := pt;

    p1.X := p1.X + 1;
    p2.X := p2.X + in;
END_FUNCTION

FUNCTION_BLOCK FB_R0190 (* similar to F_R0190  *)
    VAR_INPUT   in : INT;     END_VAR
    VAR_OUTPUT  out : POINT;    END_VAR
    VAR_IN_OUT
        io1,io2 : SINT;
        p1,p2 : POINT;
    END_VAR
    VAR pt : POINT;    END_VAR

    

    io1 := io1 + 1;
    io2 := io2 + INT_TO_SINT(in);
    
    pt := p1;  // what if the following is done directly?
    out := pt;

    p1.X := p1.X + 1;
    p2.X := p2.X + in;
    
END_FUNCTION_BLOCK


PROGRAM TEST_R0190
    VAR
        i,j,k : INT;
        s1,s2:SINT;
        zio1 : FB_R0190;
        px1,px2,px3 : POINT;
    END_VAR
    
    px1.X:=20;
    px1.Y:=30;
    px2:=px1;
    px3:=px1; (* all points initialized to (20,30) *)
    px3.Y:=40;
    // function call 
    px3 := F_R0190(in := 3 ,io1 := j , io2 := k, p1:= px1, p2:= px2); (* j=1 k=3 px1=(21,30) px2=(23,30) px3=(20,40) *)
_GEB_ASSERT_(j = 1);
_GEB_ASSERT_(k = 3);
_GEB_ASSERT_(px1.X = 21);
_GEB_ASSERT_(px1.Y = 30);
_GEB_ASSERT_(px2.X = 23);
_GEB_ASSERT_(px2.Y = 30);
_GEB_ASSERT_(px3.X = 20);
_GEB_ASSERT_(px3.Y = 30);
    
    // function call with dup var in out  
    px3 := F_R0190(in := 300 ,io1 := j , io2 := j, p1:= px1, p2:= px1); (* j=302 px1=(322,30) px3=(21,30) *)
_GEB_ASSERT_(j = 302); 
_GEB_ASSERT_(px1.X = 322);
_GEB_ASSERT_(px1.Y = 30);
_GEB_ASSERT_(px3.X = 21);
_GEB_ASSERT_(px3.Y = 30);

   zio1(in := 300 ,io1 := s1 , io2 := s2, p1:= px1, p2:= px1);


END_PROGRAM