123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- { 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.
|