tctouch.ada
来自「用于进行gcc测试」· ADA 代码 · 共 265 行
ADA
265 行
-- TCTouch.A---- Grant of Unlimited Rights---- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained-- unlimited rights in the software and documentation contained herein.-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making-- this public release, the Government intends to confer upon all-- recipients unlimited rights equal to those held by the Government.-- These rights include rights to use, duplicate, release or disclose the-- released technical data and computer software in whole or in part, in-- any manner and for any purpose whatsoever, and to have or permit others-- to do so.---- DISCLAIMER---- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A-- PARTICULAR PURPOSE OF SAID MATERIAL.--*---- FOUNDATION DESCRIPTION:-- The tools in this foundation are not peculiar to any particular-- aspect of the language, but simplify the test writing and reading-- process. Assert and Assert_Not are used to reduce the textual-- overhead of the test-that-this-condition-is-(not)-true paradigm.-- Touch and Validate are used to simplify tracing an expected path-- of execution.-- A tag comment of the form:---- TCTouch.Touch( 'A' ); ----------------------------------------- A---- is recommended to improve readability of this feature.---- Report.Test must be called before any of the procedures in this-- package with the exception of Touch.-- The usage paradigm is to call Touch in locations in the test where you-- want a trace of execution. Each call to Touch should have a unique-- character associated with it. At each place where a check can-- reasonably be performed to determine correct execution of a-- sub-test, a call to Validate should be made. The first parameter-- passed to Validate is the expected string of characters produced by-- call(s) to Touch in the subtest just executed. The second parameter-- is the message to pass to Report.Failed if the expected sequence was-- not executed.---- Validate should always be called after calls to Touch before a test-- completes.---- In the event that calls may have been made to Touch that are not-- intended to be recorded, or, the failure of a previous subtest may-- leave Touch calls "Unvalidated", the procedure Flush will reset the-- tracker to the "empty" state. Flush does not make any calls to-- Report.---- Calls to Assert and Assert_Not are to replace the idiom:---- if BadCondition then -- or if not PositiveTest then-- Report.Failed(Message);-- end if;---- with:---- Assert_Not( BadCondition, Message ); -- or-- Assert( PositiveTest, Message );---- Implementation_Check is for use with tests that cross the boundary-- between the core and the Special Needs Annexes. There are several-- instances where language in the core becomes enforceable only when-- a Special Needs Annex is supported. Implementation_Check should be-- called in place of Report.Failed in these cases; it examines the-- constants in Impdef that indicate if the particular Special Needs-- Annex is being validated with this validation; and acts accordingly.---- The constant Foundation_ID contains the internal change version-- for this software.---- ERROR CONDITIONS:---- It is an error to perform more than Max_Touch_Count (80) calls to-- Touch without a subsequent call to Validate. To do so will cause-- a false test failure.---- CHANGE HISTORY:-- 02 JUN 94 SAIC Initial version-- 27 OCT 94 SAIC Revised version-- 07 AUG 95 SAIC Added Implementation_Check-- 07 FEB 96 SAIC Changed to match new Impdef for 2.1-- 16 MAR 00 RLB Changed foundation id to reflect test suite version.-- 22 MAR 01 RLB Changed foundation id to reflect test suite version.-- 29 MAR 02 RLB Changed foundation id to reflect test suite version.----!package TCTouch is Foundation_ID : constant String := "TCTouch ACATS 2.5"; Max_Touch_Count : constant := 80; procedure Assert ( SB_True : Boolean; Message : String ); procedure Assert_Not( SB_False : Boolean; Message : String ); procedure Touch ( A_Tag : Character ); procedure Validate( Expected: String; Message : String; Order_Meaningful : Boolean := True ); procedure Flush; type Special_Needs_Annexes is ( Annex_C, Annex_D, Annex_E, Annex_F, Annex_G, Annex_H ); procedure Implementation_Check( Message : in String; Annex : in Special_Needs_Annexes := Annex_C ); -- If Impdef.Validating_Annex_<Annex> is true, will call Report.Failed -- otherwise will call Report.Not_Applicable. This is to allow tests -- which are driven by wording in the core of the language, yet have -- their functionality dictated by the Special Needs Annexes to perform -- dual purpose. -- The default of Annex_C for the Annex parameter is to support early -- tests written with the assumption that Implementation_Check was -- expressly for use with the Systems Programming Annex.end TCTouch;with Report;with Impdef;package body TCTouch is procedure Assert( SB_True : Boolean; Message : String ) is begin if not SB_True then Report.Failed( "Assertion failed: " & Message ); end if; end Assert; procedure Assert_Not( SB_False : Boolean; Message : String ) is begin if SB_False then Report.Failed( "Assertion failed: " & Message ); end if; end Assert_Not; Collection : String(1..Max_Touch_Count); Finger : Natural := 0; procedure Touch ( A_Tag : Character ) is begin Finger := Finger+1; Collection(Finger) := A_Tag; exception when Constraint_Error => Report.Failed("Trace Overflow: " & Collection); Finger := 0; end Touch; procedure Sort_String( S: in out String ) is -- algorithm from Booch Components Page 472 No_Swaps : Boolean; procedure Swap(C1, C2: in out Character) is T: Character := C1; begin C1 := C2; C2 := T; end Swap; begin for OI in S'First+1..S'Last loop No_Swaps := True; for II in reverse OI..S'Last loop if S(II) < S(II-1) then Swap(S(II),S(II-1)); No_Swaps := False; end if; end loop; exit when No_Swaps; end loop; end Sort_String; procedure Validate( Expected: String; Message : String; Order_Meaningful : Boolean := True) is Want : String(1..Expected'Length) := Expected; begin if not Order_Meaningful then Sort_String( Want ); Sort_String( Collection(1..Finger) ); end if; if Collection(1..Finger) /= Want then Report.Failed( Message & " Expecting: " & Want & " Got: " & Collection(1..Finger) ); end if; Finger := 0; end Validate; procedure Flush is begin Finger := 0; end Flush; procedure Implementation_Check( Message : in String; Annex : in Special_Needs_Annexes := Annex_C ) is -- default to cover some legacy -- USAGE DISCIPLINE: -- Implementation_Check is designed to be used in tests that have -- interdependency on one of the Special Needs Annexes, yet are _really_ -- tests based in the core language. There will be instances where the -- execution of a test would be failing in the light of the requirements -- of the annex, yet from the point of view of the core language without -- the additional requirements of the annex, the test does not apply. -- In these cases, rather than issuing a call to Report.Failed, calling -- TCTouch.Implementation_Check will check that sensitivity, and if -- the implementation is attempting to validate against the specific -- annex, Report.Failed will be called, otherwise, Report.Not_Applicable -- will be called. begin case Annex is when Annex_C => if ImpDef.Validating_Annex_C then Report.Failed( Message ); else Report.Not_Applicable( Message & " Annex C not supported" ); end if; when Annex_D => if ImpDef.Validating_Annex_D then Report.Failed( Message ); else Report.Not_Applicable( Message & " Annex D not supported" ); end if; when Annex_E => if ImpDef.Validating_Annex_E then Report.Failed( Message ); else Report.Not_Applicable( Message & " Annex E not supported" ); end if; when Annex_F => if ImpDef.Validating_Annex_F then Report.Failed( Message ); else Report.Not_Applicable( Message & " Annex F not supported" ); end if; when Annex_G => if ImpDef.Validating_Annex_G then Report.Failed( Message ); else Report.Not_Applicable( Message & " Annex G not supported" ); end if; when Annex_H => if ImpDef.Validating_Annex_H then Report.Failed( Message ); else Report.Not_Applicable( Message & " Annex H not supported" ); end if; end case; end Implementation_Check;end TCTouch;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?