with Ada.Text_IO; with Agila_Ports; use Agila_Ports; procedure Ports_Test is use type Word; S : Manager; H, New_H : Word; R : Status; M : Message; Handles : array (1 .. Max_Ports) of Word; begin Create (S, 0, H, R); pragma Assert (R = Invalid_Argument and H = 0); Create (S, 10, H, R); pragma Assert (R = Ok and H /= 0); Receive (S, H, 10, M, R); pragma Assert (R = Empty and M = (0, 0)); Send (S, 0, 10, 1, R); pragma Assert (R = Invalid_Handle); Send (S, Word'Last, 10, 1, R); pragma Assert (R = Invalid_Handle); Send (S, H, 0, 1, R); pragma Assert (R = Permission_Denied); Send (S, H, 20, 1, R); pragma Assert (R = Permission_Denied); Allow_Sender (S, H, 99, 20, R); pragma Assert (R = Permission_Denied); Allow_Sender (S, H, 10, 0, R); pragma Assert (R = Invalid_Argument); Allow_Sender (S, H, 10, 20, R); pragma Assert (R = Ok); for I in 1 .. Queue_Capacity loop Send (S, H, 20, Word (I), R); pragma Assert (R = Ok); end loop; Send (S, H, 20, 99, R); pragma Assert (R = Full); Receive (S, H, 20, M, R); pragma Assert (R = Permission_Denied and M = (0, 0)); for I in 1 .. Queue_Capacity loop Receive (S, H, 10, M, R); pragma Assert (R = Ok and M = (20, Word (I))); end loop; Receive (S, H, 10, M, R); pragma Assert (R = Empty); -- Exercise wrap-around without emptying the queue between every operation. for Cycle in 1 .. 100 loop Send (S, H, 20, Word (Cycle), R); pragma Assert (R = Ok); Send (S, H, 10, Word (Cycle + 100), R); pragma Assert (R = Ok); Receive (S, H, 10, M, R); pragma Assert (R = Ok and M.Value = Word (Cycle)); Receive (S, H, 10, M, R); pragma Assert (R = Ok and M.Value = Word (Cycle + 100)); end loop; Revoke_Sender (S, H, 99, 20, R); pragma Assert (R = Permission_Denied); Revoke_Sender (S, H, 10, 20, R); pragma Assert (R = Ok); Send (S, H, 20, 8, R); pragma Assert (R = Permission_Denied); Close (S, H, 20, R); pragma Assert (R = Permission_Denied); Send (S, H, 10, 123, R); pragma Assert (R = Ok); Close (S, H, 10, R); pragma Assert (R = Ok); Create (S, 30, New_H, R); pragma Assert (R = Ok and New_H /= H); Send (S, H, 10, 5, R); pragma Assert (R = Invalid_Handle); Allow_Sender (S, H, 10, 20, R); pragma Assert (R = Invalid_Handle); Receive (S, New_H, 30, M, R); pragma Assert (R = Empty); Close (S, New_H, 30, R); pragma Assert (R = Ok); for I in Handles'Range loop Create (S, Word (I), Handles (I), R); pragma Assert (R = Ok); end loop; Create (S, 50, H, R); pragma Assert (R = Exhausted and H = 0); for I in Handles'Range loop Send (S, Handles (I), Word (I), Word (I * 10), R); pragma Assert (R = Ok); end loop; for I in Handles'Range loop Receive (S, Handles (I), Word (I), M, R); pragma Assert (R = Ok and M.Value = Word (I * 10)); Close (S, Handles (I), Word (I), R); pragma Assert (R = Ok); end loop; Ada.Text_IO.Put_Line ("ADA_PORTS_OK: FIFO, wrap, full/empty, grants, revocation, stale handles, exhaustion, port separation"); end Ports_Test;