program ANTITEST { Tests AntiDate } ; uses AntiDate, DateProx ; var Yr : integer ; Mo, Dy : byte ; MJD, Diff, DD : MJDate ; W, D : 0..6 ; YW, MW, DW : word ; Tkr : longint absolute $40:$6C ; K, K1, K2, K3, T : longint ; const Tim = 50 ; Op : Options = (Cal : Gregorian ; Astr : false) ; procedure V(Y : word ; M, D : byte) ; begin Write(Y:7, M:3, D:3, AntiDate.ValidDate(D, M, Y):6) end ; BEGIN Writeln('ANTITEST : www.merlyn.demon.co.uk >=1998/06/04') ; {$IFNDEF OnlyPart} Writeln('Leap Test') ; for Yr := 1500 to 2500 do begin Write(#13, Yr:5) ; if Leap_Year(Op, Yr)<>IsLeap(Yr) then begin Write(' error? ') ; Readln end ; end ; Writeln(#13'Leap OK') ; Write('DaysPerYear:') ; for Yr := 1995 to 2001 do Write(Yr:5, '=', DaysPerYear(Yr)) ; Writeln ; Writeln('DaysPerMonth:') ; for Yr := 1995 to 2001 do begin Write(Yr:5, ' ') ; for Mo := 1 to 12 do Write(DaysPerMonth(Mo, Yr):3) ; Writeln end ; Writeln('ValidDate:') ; V(1998, 3, 5) ; V(1999, 2, 29) ; V(1777, 0, 3) ; V(1999, 13, 5) ; Writeln ; V(1888, 4, 0) ; V(2222, 6, 37) ; V(2000, 1, 1) ; V(2000, 2, 29) ; Writeln ; Writeln('DayOfWeek :') ; for MJD := 50000 to 52000 -1888 do begin Write(#13, MJD:6) ; MJDtoYMD(MJD, Yr, Mo, Dy) ; W := AntiDate.DayOfWeek(Dy, Mo, Yr) ; D := Ord(DateProx.ISODoW(MJD)) ; if W<>D then begin Write(' error :', W:2, D:2) ; Readln end ; end ; Writeln(#13, 'DayOfWeek OK') ; Writeln('DoW Speeds:') ; T := Tkr ; repeat until T<>Tkr ; T := Tkr + Tim ; MJD := 50000 ; repeat Write(#13, MJD:6) ; MJDtoYMD(MJD, Yr, Mo, Dy) ; Inc(MJD) until Tkr>T ; K1 := MJD-50000 ; Writeln(#13, ' O''hd', K1:7, 'Overheadless':19) ; T := Tkr ; repeat until T<>Tkr ; T := Tkr + Tim ; MJD := 50000 ; repeat Write(#13, MJD:6) ; MJDtoYMD(MJD, Yr, Mo, Dy) ; D := Ord(DateProx.ISODoW(YMDtoMJD(Yr, Mo, Dy))) ; Inc(MJD) until Tkr>T ; K2 := MJD-50000 ; Writeln(#13, ' JRSs', K2:7, Round(1/(1/K2-1/K1)):19) ; T := Tkr ; repeat until T<>Tkr ; T := Tkr + Tim ; MJD := 50000 ; repeat Write(#13, MJD:6) ; MJDtoYMD(MJD, Yr, Mo, Dy) ; W := AntiDate.DayOfWeek(Dy, Mo, Yr) ; Inc(MJD) until Tkr>T ; K3 := MJD-50000 ; Writeln(#13, ' Anti', K3:7, Round(1/(1/K3-1/K1)):19) ; Write(' ') ; Readln ; Writeln('AddDays:') ; RandSeed := 0 ; for K := 1 to 23 do begin MJD := MJDate(Random(10000))+50000 ; Diff := MJDate(Random(20000))-10000 ; MJDtoYMD(MJD, Yr, Mo, Dy) ; YW := Yr ; MW := Mo ; DW := Dy ; Write(MJD:8, YW:6, MW:3, DW:3, Diff:9) ; AddDays(DW, MW, YW, Diff) ; Write(YW:9, MW:3, DW:3) ; MJDtoYMD(MJD+Diff, Yr, Mo, Dy) ; Write(Yr:7, Mo:3, Dy:3) ; if (Yr=YW) and (Mo=MW) and (Dy=DW) then Write(' OK') else Write(^G' ERROR!'^G) ; Writeln end ; Write(' ') ; Readln ; Writeln('DateDiff:') ; RandSeed := 0 ; for K := 1 to 23 do begin MJD := MJDate(Random(10000))+50000 ; Diff := MJDate(Random(20000))-10000 ; MJDtoYMD(MJD, Yr, Mo, Dy) ; YW := Yr ; MW := Mo ; DW := Dy ; Write(MJD:8, YW:6, MW:3, DW:3, Diff:9) ; MJDtoYMD(MJD+Diff, Yr, Mo, Dy) ; Write(Yr:7, Mo:3, Dy:3) ; DD := DateDiff(DW, MW, YW, Dy, Mo, Yr) ; Write(DD:8) ; if DD=Diff then Write(' OK') else Write(^G' ERROR!'^G) ; Writeln end ; Write(' ') ; Readln ; {$ENDIF} Writeln('Date arithmetic speeds:') ; Write(' Overhead: ') ; RandSeed := 0 ; K1 := 0 ; T := Tkr ; repeat until T<>Tkr ; T := Tkr + Tim ; repeat MJD := MJDate(Random(10000))+50000 ; Diff := MJDate(Random(20000))-10000 ; MJDtoYMD(MJD, Yr, Mo, Dy) ; YW := Yr ; MW := Mo ; DW := Dy ; Inc(K1) until Tkr>T ; Writeln(K1:7, 'Overheadless':19) ; Write(' AntiDate: ') ; RandSeed := 0 ; K2 := 0 ; T := Tkr ; repeat until T<>Tkr ; T := Tkr + Tim ; repeat MJD := MJDate(Random(10000))+50000 ; Diff := MJDate(Random(20000))-10000 ; MJDtoYMD(MJD, Yr, Mo, Dy) ; YW := Yr ; MW := Mo ; DW := Dy ; AddDays(DW, MW, YW, Diff) ; Diff := DateDiff(DW, MW, YW, Dy, Mo, Yr) ; Inc(K2) until Tkr>T ; Writeln(K2:7, Round(1/(1/K2-1/K1)):19) ; Write(' DateProx: ') ; RandSeed := 0 ; K3 := 0 ; T := Tkr ; repeat until T<>Tkr ; T := Tkr + Tim ; repeat MJD := MJDate(Random(10000))+50000 ; Diff := MJDate(Random(20000))-10000 ; MJDtoYMD(MJD, Yr, Mo, Dy) ; YW := Yr ; MW := Mo ; DW := Dy ; { AddDays(DW, MW, YW, Diff) : } MJDtoYMD(YMDtoMJD(Yr, Mo, Dy)+Diff, Yr, Mo, Dy) ; { Diff := DateDiff(DW, MW, YW, Dy, Mo, Yr) : } Diff := YMDtoMJD(YW, MW, DW)-YMDtoMJD(Yr, Mo, Dy) ; Inc(K3) until Tkr>T ; Writeln(K3:7, Round(1/(1/K3-1/K1)):19) ; Write('Done. ') ; Readln ; END. CONCLUSION : AntiDate is OK but slower than DateProx.