fpc/utils/unicode/uca_test.pas
paul 3c0e11fa5a utils: apply Inoussa patch Unicode utils (issue #0022909):
This patch fixes some memory overwrites that were causing the helpers crash.
  It introduces the generation of the little endian and big endian files 
  regardless of the host endianess.
  The patch also adds some new test cases. The cldrparser program now accepts a
  "-t" switch to execute the test suite.

git-svn-id: trunk@24018 -
2013-03-27 00:57:50 +00:00

281 lines
7.5 KiB
ObjectPascal

{ Unicode Collation Algorithm test routines for generated data.
Copyright (c) 2012 by Inoussa OUEDRAOGO
The source code is distributed under the Library GNU
General Public License with the following modification:
- object files and libraries linked into an application may be
distributed without source code.
If you didn't receive a copy of the file COPYING, contact:
Free Software Foundation
675 Mass Ave
Cambridge, MA 02139
USA
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
}
unit uca_test;
{$mode objfpc}{$H+}
interface
uses
SysUtils,
helper;
procedure uca_CheckProp_1(
ABook : TUCA_DataBook;
APropBook : PUCA_PropBook
);
procedure uca_CheckProp_x(
ABook : TUCA_DataBook;
APropBook : PUCA_PropBook
);
procedure uca_CheckProp_1y(
const ABook : TUCA_DataBook;
const APropBook : PUCA_PropBook;
const AFirstTable : PucaBmpFirstTable;
const ASecondTable : PucaBmpSecondTable
);
procedure uca_CheckProp_2y(
const ABook : TUCA_DataBook;
const APropBook : PUCA_PropBook;
const AFirstTable : PucaOBmpFirstTable;
const ASecondTable : PucaOBmpSecondTable
);
implementation
function IndexOf(const ACodePoint : Cardinal; APropBook : PUCA_PropBook): Integer;
var
i : Integer;
begin
for i := 0 to Length(APropBook^.Index) - 1 do begin
if (ACodePoint = APropBook^.Index[i].CodePoint) then
exit(i);
end;
Result := -1;
end;
function CompareWeigth(AExpect : PUCA_LineRec; AActual : PUCA_PropItemRec) : Boolean;
var
i, k : Integer;
p : PUCA_PropWeights;
pw : array of TUCA_PropWeights;
begin
Result := False;
if (Length(AExpect^.Weights) <> AActual^.WeightLength) then
exit;
//p := PUCA_PropWeights(PtrUInt(AActual) + SizeOf(TUCA_PropItemRec));
SetLength(pw,AActual^.WeightLength);
p := @pw[0];
AActual^.GetWeightArray(p);
for i := 0 to Length(AExpect^.Weights) - 1 do begin
//if (BoolToByte(AExpect^.Weights[i].Variable) <> p^.Variable) then
//exit;
for k := 0 to 3 - 1 do begin
if (AExpect^.Weights[i].Weights[k] <> p^.Weights[k]) then
exit;
end;
Inc(p);
end;
Result := True;
end;
procedure uca_CheckProp_1(
ABook : TUCA_DataBook;
APropBook : PUCA_PropBook
);
var
i, c, k : Integer;
line : PUCA_LineRec;
uc : Cardinal;
p : PUCA_PropItemRec;
begin
WriteLn('uca_CheckProp_1 Start ... ');
line := @ABook.Lines[0];
c := Length(ABook.Lines);
for i := 0 to c - 1 do begin
if line^.Stored and (Length(line^.CodePoints) = 1) then begin
uc := line^.CodePoints[0];
k := IndexOf(uc,APropBook);
if (k = -1) then begin
WriteLn('Property not found for Code Point : ' + Format('%x',[uc]));
end else begin
p := PUCA_PropItemRec(PtrUInt(APropBook^.Items)+APropBook^.Index[k].Position);
if not CompareWeigth(line,p) then
WriteLn('CompareWeigth fail for Code Point : ' + Format('%x',[uc]));
end;
end;
Inc(line);
end;
WriteLn('uca_CheckProp_1 End');
end;
function FindWord(
const AWord : array of Cardinal;
const APropBook : PUCA_PropItemRec
) : PUCA_PropItemRec;
var
cc : Cardinal;
p : PUCA_PropItemRec;
i, k, kc : Integer;
ok : Boolean;
begin
Result := nil;
p := APropBook;
for i := 1 to Length(AWord) - 1 do begin
ok := False;
kc := p^.ChildCount - 1;
p := PUCA_PropItemRec(PtrUInt(p) + p^.GetSelfOnlySize());
for k := 0 to kc do begin
if (AWord[i] = p^.CodePoint) then begin
ok := True;
Break;
end;
p := PUCA_PropItemRec(PtrUInt(p) + p^.Size);
end;
if not ok then
exit;
end;
Result := p;
end;
function DumpCodePoints(const AValues : array of Cardinal) : string;
var
i : Integer;
begin
Result := '';
for i := 0 to Length(AValues) - 1 do
Result := Format('%s %x',[Result,AValues[i]]);
Result := Trim(Result);
end;
procedure uca_CheckProp_x(
ABook : TUCA_DataBook;
APropBook : PUCA_PropBook
);
var
i, c, k : Integer;
line : PUCA_LineRec;
uc : Cardinal;
p, q : PUCA_PropItemRec;
begin
WriteLn('uca_CheckProp_x Start ... ');
line := @ABook.Lines[0];
c := Length(ABook.Lines);
for i := 0 to c - 1 do begin
if line^.Stored and (Length(line^.CodePoints) > 1) then begin
//WriteLn(' Code Point sequence : ' + DumpCodePoints(line^.CodePoints));
uc := line^.CodePoints[0];
k := IndexOf(uc,APropBook);
if (k = -1) then begin
WriteLn(' Property not found for Code Point : ' + Format('%x',[uc]));
end else begin
q := PUCA_PropItemRec(PtrUInt(APropBook^.Items)+APropBook^.Index[k].Position);
p := FindWord(line^.CodePoints,q);
if (p = nil) then
WriteLn(' Data not found for Code Point sequence : ' + DumpCodePoints(line^.CodePoints))
else if not CompareWeigth(line,p) then
WriteLn(' CompareWeigth fail for Code Point sequence : ' + DumpCodePoints(line^.CodePoints));
end;
end;
Inc(line);
end;
WriteLn('uca_CheckProp_x End');
end;
function GetPropPosition(
const ABMPCodePoint : Word;
const AFirstTable : PucaBmpFirstTable;
const ASecondTable : PucaBmpSecondTable
) : Integer; inline;overload;
begin
Result:=
ASecondTable^[AFirstTable^[WordRec(ABMPCodePoint).Hi]][WordRec(ABMPCodePoint).Lo] - 1
end;
procedure uca_CheckProp_1y(
const ABook : TUCA_DataBook;
const APropBook : PUCA_PropBook;
const AFirstTable : PucaBmpFirstTable;
const ASecondTable : PucaBmpSecondTable
);
var
i, c, k : Integer;
line : PUCA_LineRec;
uc : Cardinal;
p : PUCA_PropItemRec;
ucw : Word;
begin
WriteLn('uca_CheckProp_1y Start (BMP) ... ');
line := @ABook.Lines[0];
c := Length(ABook.Lines);
for i := 0 to c - 1 do begin
if line^.Stored and (Length(line^.CodePoints) = 1) then begin
uc := line^.CodePoints[0];
if (uc <= High(Word)) then begin
ucw := uc;
k := GetPropPosition(ucw,AFirstTable,ASecondTable);
if (k = -1) then begin
WriteLn('Property not found for Code Point : ' + Format('%x',[uc]));
end else begin
p := PUCA_PropItemRec(PtrUInt(APropBook^.Items)+k);
if not CompareWeigth(line,p) then
WriteLn('CompareWeigth fail for Code Point : ' + Format('%x',[uc]));
end;
end;
end;
Inc(line);
end;
WriteLn('uca_CheckProp_1y End');
end;
procedure uca_CheckProp_2y(
const ABook : TUCA_DataBook;
const APropBook : PUCA_PropBook;
const AFirstTable : PucaOBmpFirstTable;
const ASecondTable : PucaOBmpSecondTable
);
var
i, c, k : Integer;
line : PUCA_LineRec;
uc : Cardinal;
p : PUCA_PropItemRec;
uchs, ucls : Word;
begin
WriteLn('uca_CheckProp_2y Start (>BMP) ... ');
line := @ABook.Lines[0];
c := Length(ABook.Lines);
for i := 0 to c - 1 do begin
if line^.Stored and (Length(line^.CodePoints) = 1) then begin
uc := line^.CodePoints[0];
if (uc > High(Word)) then begin
FromUCS4(uc,uchs,ucls);
k := GetPropPosition(uchs,ucls,AFirstTable,ASecondTable);
if (k = -1) then begin
WriteLn('Property not found for Code Point : ' + Format('%x',[uc]));
end else begin
p := PUCA_PropItemRec(PtrUInt(APropBook^.Items)+k);
if not CompareWeigth(line,p) then
WriteLn('CompareWeigth fail for Code Point : ' + Format('%x',[uc]));
end;
end;
end;
Inc(line);
end;
WriteLn('uca_CheckProp_2y End');
end;
end.