cldrtest.pas 123 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267
  1. { CLDR collation Algorithm test routines.
  2. Copyright (c) 2013 by Inoussa OUEDRAOGO
  3. The source code is distributed under the Library GNU
  4. General Public License with the following modification:
  5. - object files and libraries linked into an application may be
  6. distributed without source code.
  7. If you didn't receive a copy of the file COPYING, contact:
  8. Free Software Foundation
  9. 675 Mass Ave
  10. Cambridge, MA 02139
  11. USA
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  15. }
  16. unit cldrtest;
  17. {$mode objfpc}{$H+}
  18. {$typedaddress on}
  19. {$warn 4056 off} //Conversion between ordinals and pointers is not portable
  20. interface
  21. uses
  22. Classes, SysUtils,
  23. helper, cldrhelper, unicodedata;
  24. function ToAnsiChars(const AValue : array of TUnicodeCodePoint) : string;
  25. function DumpSequenceAnsi(const ASequence : TOrderedCharacters) : string;
  26. function DumpWeigth(const AItem : TUCA_WeightRec) : string;overload;
  27. function DumpWeigth(const AItems : array of TUCA_WeightRec) : string;overload;
  28. function DumpLine(ALine : TUCA_LineRec) : string;
  29. function DumpLines(ALines : TUCA_LineRecArray) : string;
  30. function CodePointToArray(const ACodePoint : TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
  31. function CodePointToArray(const ACodePoints : array of TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
  32. function ToWeight(const APrimary, ASecondary, ATertiary : Cardinal) : TUCA_WeightRecArray;overload;
  33. function ToWeight(const AWeigths : array of Cardinal) : TUCA_WeightRecArray;overload;
  34. procedure exec_tests();
  35. procedure test1();
  36. procedure test2();
  37. procedure test3();
  38. procedure test4();
  39. procedure test5();
  40. procedure test6();
  41. procedure test7();
  42. procedure test8();
  43. procedure test9();
  44. procedure test10();
  45. procedure test11();
  46. procedure test12();
  47. procedure test13();
  48. procedure test14();
  49. procedure test15();
  50. implementation
  51. procedure exec_tests();
  52. begin
  53. WriteLn('***************************** TEST 1 ******************');
  54. test1();
  55. WriteLn('***************************** TEST 2 ******************');
  56. test2();
  57. WriteLn('***************************** TEST 3 ******************');
  58. test3();
  59. WriteLn('***************************** TEST 4 ******************');
  60. test4();
  61. WriteLn('***************************** TEST 5 ******************');
  62. test5();
  63. WriteLn('***************************** TEST 6 ******************');
  64. test6();
  65. WriteLn('***************************** TEST 7 ******************');
  66. test7();
  67. WriteLn('***************************** TEST 8 ******************');
  68. test8();
  69. WriteLn('***************************** TEST 9 ******************');
  70. test9();
  71. WriteLn('***************************** TEST 10 ******************');
  72. test10();
  73. WriteLn('***************************** TEST 11 ******************');
  74. test11();
  75. WriteLn('***************************** TEST 12 ******************');
  76. test12();
  77. WriteLn('***************************** TEST 13 ******************');
  78. test13();
  79. WriteLn('***************************** TEST 14 ******************');
  80. test14();
  81. WriteLn('***************************** TEST 15 ******************');
  82. test15();
  83. end;
  84. function ToAnsiChars(const AValue : array of TUnicodeCodePoint) : string;
  85. var
  86. i : Integer;
  87. s : string;
  88. begin
  89. Result := '';
  90. for i := Low(AValue) to High(AValue) do begin
  91. if (AValue[i] <= 127) then
  92. Result := Result + AnsiChar(AValue[i])
  93. else
  94. begin
  95. s := Format('%x',[AValue[i]]);
  96. if (Length(s) < 4) then
  97. s := StringOfChar('0',4-Length(s)) + s;
  98. Result := Result + '$' + s;
  99. end;
  100. end;
  101. end;
  102. function DumpSequenceAnsi(const ASequence : TOrderedCharacters) : string;
  103. var
  104. i : Integer;
  105. s : string;
  106. p : PReorderUnit;
  107. begin
  108. s := '';
  109. if (ASequence.ActualLength < 1) then
  110. exit;
  111. p := @ASequence.Data[0];
  112. i := 0;
  113. while (i < ASequence.ActualLength) do begin
  114. if (p^.WeigthKind <> TReorderWeigthKind.Deletion) then
  115. Break;
  116. WriteStr(s,s, ' ',ToAnsiChars(p^.Characters),'- ');
  117. Inc(p);
  118. Inc(i);
  119. end;
  120. if (i < ASequence.ActualLength) then begin
  121. s := s + ' ' + ToAnsiChars(p^.Characters) + ' ';
  122. Inc(i);
  123. Inc(p);
  124. for i := i to ASequence.ActualLength - 1 do begin
  125. //WriteStr(s,s,AnsiChar(p^.Characters[0]),' <',(1+Ord(p^.WeigthKind)),' ');
  126. WriteStr(s,s,'<',(1+Ord(p^.WeigthKind)),' ',ToAnsiChars(p^.Characters),' ');
  127. Inc(p);
  128. end;
  129. end;
  130. Result := s;
  131. end;
  132. function DumpWeigth(const AItem : TUCA_WeightRec) : string;overload;
  133. var
  134. r : string;
  135. begin
  136. r := '[';
  137. if AItem.Variable then
  138. r := r + '*'
  139. else
  140. r := r + '.';
  141. r := r + Format('%x.%x.%x',[AItem.Weights[0],AItem.Weights[1],AItem.Weights[2]]);
  142. r := r + ']';
  143. Result := r;
  144. end;
  145. function DumpWeigth(const AItems : array of TUCA_WeightRec) : string;
  146. var
  147. r : string;
  148. i : Integer;
  149. begin
  150. r := '';
  151. for i := 0 to Length(AItems) - 1 do
  152. r := r + ' ' +DumpWeigth(AItems[i]);
  153. Result := Trim(r);
  154. end;
  155. function DumpKey(const AItem : TUCASortKey) : string;
  156. var
  157. i : Integer;
  158. r : string;
  159. begin
  160. r := '';
  161. for i := Low(AItem) to High(AItem) do
  162. r := Trim(r) + ' ' + Format('%4x',[AItem[i]]);
  163. Result := r;
  164. end;
  165. function DumpLine(ALine : TUCA_LineRec) : string;
  166. var
  167. i : Integer;
  168. r : string;
  169. ctxItem : TUCA_LineContextItemRec;
  170. begin
  171. r := '';
  172. if ALine.HasContext() then begin
  173. r := r + '*';
  174. for i := 0 to Length(ALine.Context.Data) - 1 do begin
  175. ctxItem := ALine.Context.Data[i];
  176. r := r + sLineBreak +
  177. ' ' + ToAnsiChars(ctxItem.CodePoints) + ' => ' + DumpWeigth(ctxItem.Weights);
  178. end;
  179. r := r + sLineBreak + ' ';
  180. end;
  181. if (Length(ALine.Weights) = 0) then begin
  182. r := r + '[]';
  183. end else begin
  184. for i := Low(ALine.Weights) to High(ALine.Weights) do
  185. r := r + DumpWeigth(ALine.Weights[i]);
  186. end;
  187. Result := Format('%s %s',[ToAnsiChars(ALine.CodePoints),r]);
  188. end;
  189. function DumpLines(ALines : TUCA_LineRecArray) : string;
  190. var
  191. i : Integer;
  192. r : string;
  193. begin
  194. r := '';
  195. for i := Low(ALines) to High(ALines) do
  196. r := r + ' ' + DumpLine(ALines[i]) + sLineBreak;
  197. Result := r;
  198. end;
  199. function CodePointToArray(const ACodePoint : TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
  200. begin
  201. SetLength(Result,1);
  202. Result[0] := ACodePoint;
  203. end;
  204. function CodePointToArray(const ACodePoints : array of TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
  205. var
  206. i : Integer;
  207. begin
  208. SetLength(Result,Length(ACodePoints));
  209. for i := 0 to length(ACodePoints) - 1 do
  210. Result[i] := ACodePoints[i];
  211. end;
  212. function ToWeight(const APrimary, ASecondary, ATertiary : Cardinal) : TUCA_WeightRecArray;overload;
  213. begin
  214. SetLength(Result,1);
  215. Result[0].Weights[0] := APrimary;
  216. Result[0].Weights[1] := ASecondary;
  217. Result[0].Weights[2] := ATertiary;
  218. Result[0].Weights[3] := 0;
  219. end;
  220. function ToWeight(const AWeigths : array of Cardinal) : TUCA_WeightRecArray;overload;
  221. var
  222. i, k, c : Integer;
  223. begin
  224. c := Length(AWeigths);
  225. SetLength(Result,(c div 3));
  226. k := 0;
  227. for i := 0 to (c div 3) - 1 do begin
  228. Result[i].Weights[0] := AWeigths[k+0];
  229. Result[i].Weights[1] := AWeigths[k+1];
  230. Result[i].Weights[2] := AWeigths[k+2];
  231. Result[i].Weights[3] := 0;
  232. k := k + 3;
  233. end;
  234. end;
  235. procedure constructPropBook(
  236. var ABook : unicodedata.TUCA_DataBook;
  237. const AFirstTable : TucaBmpFirstTable;
  238. const ASecondTable : TucaBmpSecondTable;
  239. const AOFirstTable : TucaOBmpFirstTable;
  240. const AOSecondTable : TucaOBmpSecondTable;
  241. const AInitDataBook : helper.TUCA_DataBook;
  242. const AInitPropBook : helper.PUCA_PropBook
  243. );
  244. var
  245. c, i, k, ci : Integer;
  246. begin
  247. c := Length(AFirstTable);
  248. if (c > 0) then begin
  249. ABook.BMP_Table1 := AllocMem(c);
  250. Move(AFirstTable[0],ABook.BMP_Table1^,c);
  251. end;
  252. c := Length(ASecondTable);
  253. if (c > 0) then begin
  254. ABook.BMP_Table2 := AllocMem(c*SizeOf(UInt24)*256);
  255. for i := 0 to c - 1 do begin
  256. for k := 0 to 255 do
  257. ABook.BMP_Table2[(i*256)+k] := ASecondTable[i][k];
  258. end;
  259. end;
  260. c := Length(AOFirstTable);
  261. if (c > 0) then begin
  262. ABook.OBMP_Table1 := AllocMem(c*SizeOf(Word));
  263. Move(AOFirstTable[0],ABook.OBMP_Table1^,(c*SizeOf(Word)));
  264. end;
  265. c := Length(AOSecondTable);
  266. if (c > 0) then begin
  267. ci := Length(AOSecondTable[0]);
  268. ABook.OBMP_Table2 := AllocMem(c*SizeOf(UInt24)*ci);
  269. for i := 0 to c - 1 do begin
  270. for k := 0 to ci - 1 do
  271. ABook.OBMP_Table2[(i*ci)+k] := AOSecondTable[i][k];
  272. end;
  273. end;
  274. ABook.Version := AInitDataBook.Version;
  275. ABook.VariableWeight := unicodedata.TUCA_VariableKind(Ord(AInitDataBook.VariableWeight));
  276. ABook.Backwards := AInitDataBook.Backwards;
  277. ABook.PropCount := AInitPropBook^.ItemSize;
  278. ABook.Props := Pointer(AInitPropBook^.Items);
  279. ABook.VariableLowLimit := AInitPropBook^.VariableLowLimit;
  280. ABook.VariableHighLimit := AInitPropBook^.VariableHighLimit;
  281. end;
  282. procedure ConstructUnicodeBook(
  283. const AWeitghs : TUCA_LineRecArray;
  284. const AVersion : string;
  285. const ACollationName : string;
  286. const ABase : unicodedata.PUCA_DataBook;
  287. var AUnicodeBook : unicodedata.TUCA_DataBook
  288. );
  289. var
  290. dataBook : helper.TUCA_DataBook;
  291. propBook : helper.PUCA_PropBook;
  292. firstTable : TucaBmpFirstTable;
  293. secondTable : TucaBmpSecondTable;
  294. ofirstTable : TucaOBmpFirstTable;
  295. osecondTable : TucaOBmpSecondTable;
  296. i : Integer;
  297. begin
  298. FillByte(dataBook,SizeOf(dataBook),0);
  299. dataBook.Version := AVersion;
  300. SetLength(dataBook.Lines,Length(AWeitghs));
  301. for i := 0 to Length(AWeitghs)-1 do begin
  302. dataBook.Lines[i] := AWeitghs[i];
  303. dataBook.Lines[i].Stored := True;
  304. end;
  305. MakeUCA_Props(@dataBook,propBook);
  306. MakeUCA_BmpTables(firstTable,secondTable,propBook);
  307. MakeUCA_OBmpTables(ofirstTable,osecondTable,propBook);
  308. FillByte(AUnicodeBook,SizeOf(AUnicodeBook),0);
  309. constructPropBook(
  310. AUnicodeBook,firstTable,secondTable,ofirstTable,osecondTable,
  311. dataBook,propBook
  312. );
  313. AUnicodeBook.CollationName := ACollationName;
  314. AUnicodeBook.Base := ABase;
  315. end;
  316. procedure CheckEqual(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
  317. var
  318. keyA, keyB : TUCASortKey;
  319. s : string;
  320. begin
  321. keyA := ComputeSortKey(A,ACollation);
  322. keyB := ComputeSortKey(B,ACollation);
  323. if (CompareSortKey(keyA,keyB) <> 0) then begin
  324. s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
  325. s := Format('"%s" <>= "%s" %s%s',[A,B,sLineBreak,s]);
  326. raise Exception.Create(s);
  327. end;
  328. end;
  329. procedure CheckNotEqual(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
  330. var
  331. keyA, keyB : TUCASortKey;
  332. s : string;
  333. begin
  334. keyA := ComputeSortKey(A,ACollation);
  335. keyB := ComputeSortKey(B,ACollation);
  336. if (CompareSortKey(keyA,keyB) = 0) then begin
  337. s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
  338. s := Format('"%s" = "%s" %s%s',[A,B,sLineBreak,s]);
  339. raise Exception.Create(s);
  340. end;
  341. end;
  342. procedure CheckInf(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
  343. var
  344. keyA, keyB : TUCASortKey;
  345. begin
  346. keyA := ComputeSortKey(A,ACollation);
  347. keyB := ComputeSortKey(B,ACollation);
  348. if (CompareSortKey(keyA,keyB) >= 0) then
  349. raise Exception.CreateFmt('"%s" >= "%s" !',[A,B]);
  350. end;
  351. procedure CheckInf(AStrings : array of UnicodeString; ACollation : unicodedata.PUCA_DataBook);
  352. var
  353. c, i : Integer;
  354. keyA, keyB : TUCASortKey;
  355. s : string;
  356. begin
  357. c := Length(AStrings);
  358. if (c < 2) then
  359. exit;
  360. keyA := ComputeSortKey(AStrings[0],ACollation);
  361. for i := 1 to c - 1 do begin
  362. keyB := ComputeSortKey(AStrings[i],ACollation);
  363. if (CompareSortKey(keyA,keyB) >= 0) then begin
  364. s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
  365. s := Format('"%s" >= "%s" %s%s',[AStrings[i-1],AStrings[i],sLineBreak,s]);
  366. raise Exception.Create(s);
  367. end;
  368. keyA := keyB;
  369. end;
  370. end;
  371. procedure test1_prepareWeigth(var AData : TUCA_LineRecArray);
  372. var
  373. p : PUCA_LineRec;
  374. begin
  375. SetLength(AData,12);
  376. p := @AData[Low(AData)];
  377. p^.CodePoints := CodePointToArray(Ord('a'));
  378. p^.Weights := ToWeight($15EF,$0020,$0002);
  379. Inc(p);
  380. p^.CodePoints := CodePointToArray(Ord('b'));
  381. p^.Weights := ToWeight($1605,$0020,$0002);
  382. Inc(p);
  383. p^.CodePoints := CodePointToArray(Ord('c'));
  384. p^.Weights := ToWeight($161D,$0020,$0002);
  385. Inc(p);
  386. p^.CodePoints := CodePointToArray(Ord('d'));
  387. p^.Weights := ToWeight($1631,$0020,$0002);
  388. Inc(p);
  389. p^.CodePoints := CodePointToArray(Ord('e'));
  390. p^.Weights := ToWeight($164C,$0020,$0002);
  391. Inc(p);
  392. p^.CodePoints := CodePointToArray(Ord('f'));
  393. p^.Weights := ToWeight($1684,$0020,$0002);
  394. Inc(p);
  395. p^.CodePoints := CodePointToArray(Ord('g'));
  396. p^.Weights := ToWeight($1691,$0020,$0002);
  397. Inc(p);
  398. p^.CodePoints := CodePointToArray(Ord('h'));
  399. p^.Weights := ToWeight($16B4,$0020,$0002);
  400. Inc(p);
  401. p^.CodePoints := CodePointToArray(Ord('i'));
  402. p^.Weights := ToWeight($16CD,$0020,$0002);
  403. Inc(p);
  404. p^.CodePoints := CodePointToArray(Ord('j'));
  405. p^.Weights := ToWeight($16E6,$0020,$0002);
  406. Inc(p);
  407. p^.CodePoints := CodePointToArray(Ord('k'));
  408. p^.Weights := ToWeight($16FF,$0020,$0002);
  409. Inc(p);
  410. p^.CodePoints := CodePointToArray(Ord('l'));
  411. p^.Weights := ToWeight($1711,$0020,$0002);
  412. end;
  413. procedure test1();
  414. var
  415. sequence : TOrderedCharacters;
  416. statement : TReorderSequence;
  417. wfirst, wresult : TUCA_LineRecArray;
  418. i : Integer;
  419. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  420. begin
  421. statement.Clear();
  422. test1_prepareWeigth(wfirst);
  423. sequence := TOrderedCharacters.Create();
  424. sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  425. sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  426. sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  427. sequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
  428. sequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
  429. sequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
  430. sequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
  431. sequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
  432. sequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
  433. sequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
  434. sequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  435. sequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
  436. for i := 0 to sequence.ActualLength - 1 do
  437. sequence.Data[i].Changed := False;
  438. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  439. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  440. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  441. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook1);
  442. SetLength(statement.Reset,1);
  443. statement.Reset[0] := Ord('a');
  444. SetLength(statement.Elements,1);
  445. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  446. sequence.ApplyStatement(@statement);
  447. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  448. wresult := nil;
  449. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  450. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  451. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  452. CheckInf(['a','g'{*},'b','c','d','e','f','h','i','j','k','l'],@unicodeBook2);
  453. SetLength(statement.Reset,1);
  454. statement.Reset[0] := Ord('a');
  455. SetLength(statement.Elements,2);
  456. statement.Elements[0] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,0);
  457. statement.Elements[1] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,0);
  458. sequence.ApplyStatement(@statement);
  459. WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  460. wresult := nil;
  461. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  462. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  463. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  464. CheckInf(['a','h'{*},'k'{*},'g'{*},'b','c','d','e','f','i','j','l'],@unicodeBook2);
  465. SetLength(statement.Reset,1);
  466. statement.Reset[0] := Ord('h');
  467. SetLength(statement.Elements,1);
  468. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
  469. sequence.ApplyStatement(@statement);
  470. WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence));
  471. wresult := nil;
  472. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  473. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  474. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  475. CheckInf(['a','h'{*},'g'{*},'k'{*},'b','c','d','e','f','i','j','l'],@unicodeBook2);
  476. end;
  477. procedure test2_prepareWeigth(var AData : TUCA_LineRecArray);
  478. var
  479. p : PUCA_LineRec;
  480. begin
  481. SetLength(AData,11);
  482. p := @AData[Low(AData)];
  483. p^.CodePoints := CodePointToArray(Ord('a'));
  484. p^.Weights := ToWeight($15EF,$0020,$0002);
  485. Inc(p);
  486. p^.CodePoints := CodePointToArray([Ord('('),Ord('a'),Ord(')')]);
  487. p^.Weights := ToWeight($15EF,$0020,$0006); //15EF.0020.0006.24D0
  488. Inc(p);
  489. p^.CodePoints := CodePointToArray(Ord('A'));
  490. p^.Weights := ToWeight($15EF,$0020,$0008); //15EF.0020.0008.0041
  491. Inc(p);
  492. p^.CodePoints := CodePointToArray([Ord('('),Ord('A'),Ord(')')]);
  493. p^.Weights := ToWeight($15EF,$0020,$000C); //15EF.0020.000C
  494. Inc(p);
  495. p^.CodePoints := CodePointToArray([Ord('a'),Ord('`')]);
  496. p^.Weights := ToWeight([$15EF,$0020,$0002, $0000,$0035,$0002]); //[.15EF.0020.0002.0061][.0000.0035.0002.0300]
  497. Inc(p);
  498. p^.CodePoints := CodePointToArray([Ord('A'),Ord('`')]);
  499. p^.Weights := ToWeight([$15EF,$0020,$0008, $0000,$0035,$0002]); //[.15EF.0020.0008.0041][.0000.0035.0002.0300]
  500. Inc(p);
  501. p^.CodePoints := CodePointToArray([Ord('a'),Ord('e')]);
  502. p^.Weights := ToWeight([$15F0,$0020,$0002]); //[.15EF.0020.0004.00E6][.0000.0139.0004.00E6][.164C.0020.0004.00E6]
  503. Inc(p);
  504. p^.CodePoints := CodePointToArray([Ord(UpCase('a')),Ord(UpCase('e'))]);
  505. p^.Weights := ToWeight([$15F0,$0020,$0006]);//[.15EF.0020.000A.00C6][.0000.0139.0004.00C6][.164C.0020.000A.00C6]
  506. Inc(p);
  507. p^.CodePoints := CodePointToArray(Ord('b'));
  508. p^.Weights := ToWeight($1605,$0020,$0002);
  509. Inc(p);
  510. p^.CodePoints := CodePointToArray([Ord('('),Ord('b'),Ord(')')]);
  511. p^.Weights := ToWeight($1605,$0020,$0006); //.1605.0020.0006.24D1
  512. Inc(p);
  513. p^.CodePoints := CodePointToArray(Ord('B'));
  514. p^.Weights := ToWeight($1605,$0020,$0008); //1605.0020.0008.0042
  515. end;
  516. procedure test2();
  517. var
  518. sequenceClean, sequence : TOrderedCharacters;
  519. statement : TReorderSequence;
  520. wfirst, wresult : TUCA_LineRecArray;
  521. i : Integer;
  522. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  523. begin
  524. statement.Clear();
  525. test2_prepareWeigth(wfirst);
  526. sequenceClean := TOrderedCharacters.Create();
  527. sequenceClean.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  528. sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('a'),Ord(')')],TReorderWeigthKind.Tertiary,2));
  529. sequenceClean.Append(TReorderUnit.From(Ord('A'),TReorderWeigthKind.Tertiary,3));
  530. sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('A'),Ord(')')],TReorderWeigthKind.Tertiary,4));
  531. //sequenceClean.Append(TReorderUnit.From(Ord('à'),TReorderWeigthKind.Secondary,0));
  532. sequenceClean.Append(TReorderUnit.From([Ord('a'),Ord('`')],TReorderWeigthKind.Secondary,5));
  533. //sequenceClean.Append(TReorderUnit.From(Ord(UpCase('à')),TReorderWeigthKind.Tertiary,0));
  534. sequenceClean.Append(TReorderUnit.From([Ord('A'),Ord('`')],TReorderWeigthKind.Tertiary,6));
  535. sequenceClean.Append(TReorderUnit.From([Ord('a'),Ord('e')],TReorderWeigthKind.Primary,7));
  536. sequenceClean.Append(TReorderUnit.From([Ord(UpCase('a')),Ord(UpCase('e'))],TReorderWeigthKind.Tertiary,8));
  537. sequenceClean.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,9));
  538. sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('b'),Ord(')')],TReorderWeigthKind.Tertiary,10));
  539. sequenceClean.Append(TReorderUnit.From(Ord('B'),TReorderWeigthKind.Tertiary,11));
  540. for i := 0 to sequenceClean.ActualLength - 1 do
  541. sequenceClean.Data[i].Changed := False;
  542. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  543. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  544. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  545. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook1);
  546. sequence := sequenceClean.Clone();
  547. SetLength(statement.Reset,1);
  548. statement.Reset[0] := Ord('a');
  549. SetLength(statement.Elements,1);
  550. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  551. sequence.ApplyStatement(@statement);
  552. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  553. wresult := nil;
  554. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  555. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  556. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  557. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B'],@unicodeBook2);
  558. CheckInf(['gg','ae'],@unicodeBook2);
  559. CheckInf(['gb','ae'],@unicodeBook2);
  560. //CheckInf(['aeae','AE'],@unicodeBook2);
  561. sequence := sequenceClean.Clone();
  562. SetLength(statement.Reset,1);
  563. statement.Reset[0] := Ord('a');
  564. SetLength(statement.Elements,1);
  565. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
  566. sequence.ApplyStatement(@statement);
  567. WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  568. wresult := nil;
  569. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  570. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  571. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  572. CheckInf(['a','(a)','A','(A)', 'g'{*}, 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
  573. CheckInf(['(A)a','ga'],@unicodeBook2);
  574. CheckInf(['g','ae'],@unicodeBook2);
  575. sequence := sequenceClean.Clone();
  576. SetLength(statement.Reset,1);
  577. statement.Reset[0] := Ord('a');
  578. SetLength(statement.Elements,1);
  579. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  580. sequence.ApplyStatement(@statement);
  581. WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  582. wresult := nil;
  583. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  584. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  585. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  586. CheckInf(['a', 'g'{*},'(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
  587. CheckInf(['aa','ga'],@unicodeBook2);
  588. CheckInf(['ga','(a)a'],@unicodeBook2);
  589. sequence := sequenceClean.Clone();
  590. SetLength(statement.Reset,2);
  591. statement.Reset[0] := Ord('a');
  592. statement.Reset[1] := Ord('`');
  593. SetLength(statement.Elements,1);
  594. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  595. sequence.ApplyStatement(@statement);
  596. WriteLn('Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  597. wresult := nil;
  598. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  599. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  600. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  601. CheckInf(['a','(a)','A','(A)', 'a`', 'g'{*},'A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
  602. CheckInf(['a`a','ga'],@unicodeBook2);
  603. CheckInf(['ga','ae'],@unicodeBook2);
  604. end;
  605. //------------------------------------------------------
  606. procedure test3_prepareWeigth(var AData : TUCA_LineRecArray);
  607. var
  608. p : PUCA_LineRec;
  609. begin
  610. SetLength(AData,12);
  611. p := @AData[Low(AData)];
  612. p^.CodePoints := CodePointToArray(Ord('a'));
  613. p^.Weights := ToWeight($15EF,$0020,$0002);
  614. Inc(p);
  615. p^.CodePoints := CodePointToArray(Ord('b'));
  616. p^.Weights := ToWeight($1605,$0020,$0002);
  617. Inc(p);
  618. p^.CodePoints := CodePointToArray(Ord('c'));
  619. p^.Weights := ToWeight($161D,$0020,$0002);
  620. Inc(p);
  621. p^.CodePoints := CodePointToArray(Ord('d'));
  622. p^.Weights := ToWeight($1631,$0020,$0002);
  623. Inc(p);
  624. p^.CodePoints := CodePointToArray(Ord('e'));
  625. p^.Weights := ToWeight($164C,$0020,$0002);
  626. Inc(p);
  627. p^.CodePoints := CodePointToArray(Ord('f'));
  628. p^.Weights := ToWeight($1684,$0020,$0002);
  629. Inc(p);
  630. p^.CodePoints := CodePointToArray(Ord('g'));
  631. p^.Weights := ToWeight($1691,$0020,$0002);
  632. Inc(p);
  633. p^.CodePoints := CodePointToArray(Ord('h'));
  634. p^.Weights := ToWeight($16B4,$0020,$0002);
  635. Inc(p);
  636. p^.CodePoints := CodePointToArray(Ord('i'));
  637. p^.Weights := ToWeight($16CD,$0020,$0002);
  638. Inc(p);
  639. p^.CodePoints := CodePointToArray(Ord('j'));
  640. p^.Weights := ToWeight($16E6,$0020,$0002);
  641. Inc(p);
  642. p^.CodePoints := CodePointToArray(Ord('k'));
  643. p^.Weights := ToWeight($16FF,$0020,$0002);
  644. Inc(p);
  645. p^.CodePoints := CodePointToArray(Ord('l'));
  646. p^.Weights := ToWeight($1711,$0020,$0002);
  647. end;
  648. procedure PopulateSequence(var ASequence : TOrderedCharacters);
  649. var
  650. i : Integer;
  651. begin
  652. ASequence := TOrderedCharacters.Create();
  653. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  654. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  655. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  656. ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
  657. ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
  658. ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
  659. ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
  660. ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
  661. ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
  662. ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
  663. ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  664. ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
  665. for i := 0 to ASequence.ActualLength - 1 do
  666. ASequence.Data[i].Changed := False;
  667. end;
  668. procedure test3();
  669. var
  670. sequence, sequenceClean : TOrderedCharacters;
  671. statement : TReorderSequence;
  672. wfirst, wresult : TUCA_LineRecArray;
  673. i : Integer;
  674. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  675. keyA, keyB : TUCASortKey;
  676. us : UnicodeString;
  677. begin //'a','b','c','d','e','f','g','h','i','j','k','l'
  678. statement.Clear();
  679. test3_prepareWeigth(wfirst);
  680. PopulateSequence(sequenceClean);
  681. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  682. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  683. //Generate the original tables
  684. ConstructUnicodeBook(wfirst,'test3','first',nil,unicodeBook1);
  685. us := 'a';
  686. keyA := ComputeSortKey(us,@unicodeBook1);
  687. for i := Ord('b') to Ord('l') do begin
  688. us := unicodeChar(i);
  689. keyB := ComputeSortKey(us,@unicodeBook1);
  690. if (CompareSortKey(keyA,keyB) >= 0) then
  691. raise Exception.CreateFmt('"%s" >= "%s" !',[AnsiChar(i-1),AnsiChar(i)]);
  692. keyA := keyB;
  693. end;
  694. // --- test 1
  695. sequence := sequenceClean.Clone();
  696. SetLength(statement.Reset,1);
  697. statement.Reset[0] := Ord('b');
  698. SetLength(statement.Elements,1);
  699. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  700. sequence.ApplyStatement(@statement);
  701. wresult := nil;
  702. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  703. //Generate updatet tables
  704. ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
  705. CheckInf(['a','b','g'{*}, 'c','d','e','f','h','i','j','k','l'],@unicodeBook2);
  706. CheckInf(['bb','g'{*}],@unicodeBook2);
  707. CheckInf(['bc','g'{*}],@unicodeBook2);
  708. CheckInf(['bc','gg'{*}],@unicodeBook2);
  709. CheckInf(['bg','bc'{*}],@unicodeBook2);
  710. WriteLn(' -- test 1 - ok');
  711. // --- test 2
  712. sequence := sequenceClean.Clone();
  713. SetLength(statement.Reset,1);
  714. statement.Reset[0] := Ord('c');
  715. SetLength(statement.Elements,1);
  716. statement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
  717. sequence.ApplyStatement(@statement);
  718. wresult := nil;
  719. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  720. //Generate updatet tables
  721. ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
  722. CheckInf(['a','b','c','ch'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  723. CheckInf(['ca','ch'{*}],@unicodeBook2);
  724. CheckInf(['cc','ch'{*}],@unicodeBook2);
  725. CheckInf(['cd','ch'{*}],@unicodeBook2);
  726. CheckInf(['ce','ch'{*}],@unicodeBook2);
  727. CheckInf(['cf','ch'{*}],@unicodeBook2);
  728. CheckInf(['ci','ch'{*}],@unicodeBook2);
  729. CheckInf(['cj','ch'{*}],@unicodeBook2);
  730. CheckInf(['ck','ch'{*}],@unicodeBook2);
  731. CheckInf(['cl','ch'{*}],@unicodeBook2);
  732. CheckInf(['ac','ach'{*}],@unicodeBook2);
  733. CheckInf(['aci','achat'{*}],@unicodeBook2);
  734. WriteLn(' -- test 2 - ok');
  735. // --- test 3
  736. sequence := sequenceClean.Clone();
  737. SetLength(statement.Reset,1);
  738. statement.Reset[0] := Ord('c');
  739. SetLength(statement.Elements,1);
  740. statement.Elements[0] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Identity,0);
  741. sequence.ApplyStatement(@statement);
  742. wresult := nil;
  743. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  744. //Generate updatet tables
  745. ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
  746. CheckInf(['a','b','k'{*},'d','e','f','g','h','i','j','l'],@unicodeBook2);
  747. CheckInf(['a','b','c'{*},'d','e','f','g','h','i','j','l'],@unicodeBook2);
  748. CheckEqual('c','k',@unicodeBook2);
  749. CheckEqual('cc','kk',@unicodeBook2);
  750. CheckEqual('ck','kc',@unicodeBook2);
  751. CheckEqual('kc','kk',@unicodeBook2);
  752. CheckEqual('cckkc','kckcc',@unicodeBook2);
  753. CheckInf(['acb','akc'{*}],@unicodeBook2);
  754. WriteLn(' -- test 3 - ok');
  755. // --- test 4
  756. sequence := sequenceClean.Clone();
  757. SetLength(statement.Reset,1);
  758. statement.Reset[0] := Ord('a');
  759. SetLength(statement.Elements,1);
  760. statement.Elements[0] := TReorderUnit.From([Ord('c')],TReorderWeigthKind.Primary,0);
  761. sequence.ApplyStatement(@statement);
  762. statement.Reset[0] := Ord('c');
  763. SetLength(statement.Elements,1);
  764. statement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
  765. sequence.ApplyStatement(@statement);
  766. wresult := nil;
  767. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  768. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  769. //Generate updatet tables
  770. ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
  771. CheckInf(['a','c'{*},'ch'{*},'b','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  772. CheckInf(['ca','ch'{*}],@unicodeBook2);
  773. CheckInf(['cc','ch'{*}],@unicodeBook2);
  774. CheckInf(['cd','ch'{*}],@unicodeBook2);
  775. CheckInf(['ce','ch'{*}],@unicodeBook2);
  776. CheckInf(['cf','ch'{*}],@unicodeBook2);
  777. CheckInf(['ci','ch'{*}],@unicodeBook2);
  778. CheckInf(['cj','ch'{*}],@unicodeBook2);
  779. CheckInf(['ck','ch'{*}],@unicodeBook2);
  780. CheckInf(['cl','ch'{*}],@unicodeBook2);
  781. CheckInf(['ac','ach'{*}],@unicodeBook2);
  782. CheckInf(['aci','achat'{*}],@unicodeBook2);
  783. WriteLn(' -- test 4 - ok');
  784. end;
  785. //------------------------------------------------------
  786. procedure test4_prepareWeigth(var AData : TUCA_LineRecArray);
  787. var
  788. p : PUCA_LineRec;
  789. begin
  790. SetLength(AData,12);
  791. p := @AData[Low(AData)];
  792. p^.CodePoints := CodePointToArray(Ord('a'));
  793. p^.Weights := ToWeight($15EF,$0020,$0002);
  794. Inc(p);
  795. p^.CodePoints := CodePointToArray(Ord('b'));
  796. p^.Weights := ToWeight($1605,$0020,$0002);
  797. Inc(p);
  798. p^.CodePoints := CodePointToArray(Ord('c')); {*}
  799. p^.Weights := ToWeight($1606,$0020,$0002);
  800. Inc(p);
  801. p^.CodePoints := CodePointToArray(Ord('d'));
  802. p^.Weights := ToWeight($1631,$0020,$0002);
  803. Inc(p);
  804. p^.CodePoints := CodePointToArray(Ord('e'));
  805. p^.Weights := ToWeight($164C,$0020,$0002);
  806. Inc(p);
  807. p^.CodePoints := CodePointToArray(Ord('f'));
  808. p^.Weights := ToWeight($1684,$0020,$0002);
  809. Inc(p);
  810. p^.CodePoints := CodePointToArray(Ord('g'));
  811. p^.Weights := ToWeight($1691,$0020,$0002);
  812. Inc(p);
  813. p^.CodePoints := CodePointToArray(Ord('h'));
  814. p^.Weights := ToWeight($16B4,$0020,$0002);
  815. Inc(p);
  816. p^.CodePoints := CodePointToArray(Ord('i'));
  817. p^.Weights := ToWeight($16CD,$0020,$0002);
  818. Inc(p);
  819. p^.CodePoints := CodePointToArray(Ord('j'));
  820. p^.Weights := ToWeight($16E6,$0020,$0002);
  821. Inc(p);
  822. p^.CodePoints := CodePointToArray(Ord('k'));
  823. p^.Weights := ToWeight($16FF,$0020,$0002);
  824. Inc(p);
  825. p^.CodePoints := CodePointToArray(Ord('l'));
  826. p^.Weights := ToWeight($1711,$0020,$0002);
  827. end;
  828. procedure test4();
  829. var
  830. sequence, sequenceClean : TOrderedCharacters;
  831. statement : TReorderSequence;
  832. wfirst, wresult : TUCA_LineRecArray;
  833. i : Integer;
  834. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  835. keyA, keyB : TUCASortKey;
  836. us : UnicodeString;
  837. begin
  838. statement.Clear();
  839. test4_prepareWeigth(wfirst);
  840. PopulateSequence(sequenceClean);
  841. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  842. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  843. //Generate the original tables
  844. ConstructUnicodeBook(wfirst,'test4','first',nil,unicodeBook1);
  845. us := 'a';
  846. keyA := ComputeSortKey(us,@unicodeBook1);
  847. for i := Ord('b') to Ord('l') do begin
  848. us := unicodeChar(i);
  849. keyB := ComputeSortKey(us,@unicodeBook1);
  850. if (CompareSortKey(keyA,keyB) >= 0) then
  851. raise Exception.CreateFmt('"%s" >= "%s" !',[AnsiChar(i-1),AnsiChar(i)]);
  852. keyA := keyB;
  853. end;
  854. // --- test 1
  855. sequence := sequenceClean.Clone();
  856. SetLength(statement.Reset,1);
  857. statement.Reset[0] := Ord('b');
  858. SetLength(statement.Elements,1);
  859. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  860. sequence.ApplyStatement(@statement);
  861. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  862. wresult := nil;
  863. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  864. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  865. //Generate updatet tables
  866. ConstructUnicodeBook(wresult,'test4','second',@unicodeBook1,unicodeBook2);
  867. unicodeBook2.Base := @unicodeBook1;
  868. CheckInf(['a','b','g'{*}, 'c','d','e','f','h','i','j','k','l'],@unicodeBook2);
  869. CheckInf(['g'{*}, 'c'],@unicodeBook2);
  870. CheckInf(['gg'{*}, 'c'],@unicodeBook2);
  871. CheckInf(['gg'{*}, 'cc'],@unicodeBook2);
  872. CheckInf(['g'{*}, 'ca'],@unicodeBook2);
  873. CheckInf(['gg'{*}, 'ca'],@unicodeBook2);
  874. CheckInf(['bb','g'{*}],@unicodeBook2);
  875. CheckInf(['bc','g'{*}],@unicodeBook2);
  876. CheckInf(['bc','gg'{*}],@unicodeBook2);
  877. CheckInf(['bg','bc'{*}],@unicodeBook2);
  878. WriteLn(' -- test 1 - ok',sLineBreak);
  879. // --- test 2
  880. sequence := sequenceClean.Clone();
  881. SetLength(statement.Reset,1);
  882. statement.Reset[0] := Ord('b');
  883. SetLength(statement.Elements,2);
  884. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  885. statement.Elements[1] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,0);
  886. sequence.ApplyStatement(@statement);
  887. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  888. wresult := nil;
  889. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  890. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  891. //Generate updatet tables
  892. ConstructUnicodeBook(wresult,'test4','second',@unicodeBook1,unicodeBook2);
  893. unicodeBook2.Base := @unicodeBook1;
  894. CheckInf(['a','b','g'{*},'k'{*}, 'c','d','e','f','h','i','j','l'],@unicodeBook2);
  895. CheckInf(['g'{*}, 'c'],@unicodeBook2);
  896. CheckInf(['k'{*}, 'c'],@unicodeBook2);
  897. CheckInf(['b','kk'{*}],@unicodeBook2);
  898. CheckInf(['bb','kk'{*}],@unicodeBook2);
  899. CheckInf(['b','kkk'{*}],@unicodeBook2);
  900. CheckInf(['gk','kk'{*}],@unicodeBook2);
  901. CheckInf(['gk','k'{*}],@unicodeBook2);
  902. CheckInf(['gk','kkk'{*}],@unicodeBook2);
  903. CheckInf(['gg'{*}, 'c'],@unicodeBook2);
  904. CheckInf(['gg'{*}, 'cc'],@unicodeBook2);
  905. CheckInf(['g'{*}, 'ca'],@unicodeBook2);
  906. CheckInf(['gg'{*}, 'ca'],@unicodeBook2);
  907. CheckInf(['bb','g'{*}],@unicodeBook2);
  908. CheckInf(['bc','g'{*}],@unicodeBook2);
  909. CheckInf(['bc','gg'{*}],@unicodeBook2);
  910. CheckInf(['bg','bc'{*}],@unicodeBook2);
  911. WriteLn(' -- test 2 - ok');
  912. end;
  913. //-------------------------------------------------------------------------
  914. procedure test5_prepareWeigth(var AData : TUCA_LineRecArray);
  915. var
  916. p : PUCA_LineRec;
  917. begin
  918. SetLength(AData,6);
  919. p := @AData[Low(AData)];
  920. p^.CodePoints := CodePointToArray(Ord('a'));
  921. p^.Weights := ToWeight($15EF,$0020,$0002);
  922. Inc(p);
  923. p^.CodePoints := CodePointToArray(Ord('b'));
  924. p^.Weights := ToWeight($1605,$0020,$0002);
  925. Inc(p);
  926. p^.CodePoints := CodePointToArray([Ord('a'),Ord('d'),Ord('a')]);
  927. p^.Weights := ToWeight($1609,$0020,$0002);
  928. Inc(p);
  929. p^.CodePoints := CodePointToArray(Ord('c'));
  930. p^.Weights := ToWeight($161D,$0020,$0002);
  931. Inc(p);
  932. p^.CodePoints := CodePointToArray(Ord('d'));
  933. p^.Weights := ToWeight($1631,$0020,$0002);
  934. Inc(p);
  935. p^.CodePoints := CodePointToArray(Ord('e'));
  936. p^.Weights := ToWeight($164C,$0020,$0002);
  937. end;
  938. procedure test5_PopulateSequence(var ASequence : TOrderedCharacters);
  939. var
  940. i : Integer;
  941. begin
  942. ASequence := TOrderedCharacters.Create();
  943. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  944. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  945. ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Primary,3));
  946. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,4));
  947. ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,5));
  948. ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,6));
  949. for i := 0 to ASequence.ActualLength - 1 do
  950. ASequence.Data[i].Changed := False;
  951. end;
  952. procedure test5();
  953. var
  954. sequence, sequenceClean : TOrderedCharacters;
  955. statement : TReorderSequence;
  956. wfirst, wresult : TUCA_LineRecArray;
  957. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  958. begin
  959. statement.Clear();
  960. test5_prepareWeigth(wfirst);
  961. test5_PopulateSequence(sequenceClean);
  962. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  963. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  964. //Generate the original tables
  965. ConstructUnicodeBook(wfirst,'test5','first',nil,unicodeBook1);
  966. CheckInf(['a','b','ada','c','d','e'],@unicodeBook1);
  967. CheckInf(['ba','adaa'],@unicodeBook1);
  968. // --- test 1
  969. sequence := sequenceClean.Clone();
  970. SetLength(statement.Reset,0);
  971. SetLength(statement.Elements,1);
  972. statement.Elements[0] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Deletion,0);
  973. sequence.ApplyStatement(@statement);
  974. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  975. wresult := nil;
  976. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  977. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  978. //Generate updatet tables
  979. ConstructUnicodeBook(wresult,'test5','second',@unicodeBook1,unicodeBook2);
  980. unicodeBook2.Base := @unicodeBook1;
  981. CheckInf(['a','b','ada','d','e', 'c'{* deleted !}],@unicodeBook2);
  982. CheckInf(['ee','ca'],@unicodeBook2);
  983. WriteLn(' -- test 1 - ok',sLineBreak);
  984. // --- test 2
  985. sequence := sequenceClean.Clone();
  986. SetLength(statement.Reset,0);
  987. SetLength(statement.Elements,1);
  988. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
  989. sequence.ApplyStatement(@statement);
  990. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  991. wresult := nil;
  992. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  993. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  994. //Generate updatet tables
  995. ConstructUnicodeBook(wresult,'test5','second',@unicodeBook1,unicodeBook2);
  996. unicodeBook2.Base := @unicodeBook1;
  997. CheckInf(['a', 'adac'{* deleted !}, 'b','c','d','e'],@unicodeBook2);
  998. CheckInf(['a','ada'],@unicodeBook2);
  999. CheckInf(['ada','b'],@unicodeBook2);
  1000. CheckInf(['ac','ada'],@unicodeBook2);
  1001. CheckInf(['ac','adac'],@unicodeBook2);
  1002. CheckInf(['abe','ada'],@unicodeBook2);
  1003. CheckInf(['abe','adae'],@unicodeBook2);
  1004. WriteLn(' -- test 2 - ok',sLineBreak);
  1005. end;
  1006. //-------------------------------------------------------------------------
  1007. procedure test6_prepareWeigth(var AData : TUCA_LineRecArray);
  1008. var
  1009. p : PUCA_LineRec;
  1010. begin
  1011. SetLength(AData,7);
  1012. p := @AData[Low(AData)];
  1013. p^.CodePoints := CodePointToArray(Ord('a'));
  1014. p^.Weights := ToWeight($15EF,$0020,$0002);
  1015. Inc(p);
  1016. p^.CodePoints := CodePointToArray(Ord('b'));
  1017. p^.Weights := ToWeight($1605,$0020,$0002);
  1018. Inc(p);
  1019. p^.CodePoints := CodePointToArray([Ord('a'),Ord('d')]);
  1020. p^.Weights := ToWeight($1609,$0020,$0002);
  1021. Inc(p);
  1022. p^.CodePoints := CodePointToArray([Ord('a'),Ord('d'),Ord('a')]);
  1023. p^.Weights := ToWeight($1613,$0020,$0002);
  1024. Inc(p);
  1025. p^.CodePoints := CodePointToArray(Ord('c'));
  1026. p^.Weights := ToWeight($161D,$0020,$0002);
  1027. Inc(p);
  1028. p^.CodePoints := CodePointToArray(Ord('d'));
  1029. p^.Weights := ToWeight($1631,$0020,$0002);
  1030. Inc(p);
  1031. p^.CodePoints := CodePointToArray(Ord('e'));
  1032. p^.Weights := ToWeight($164C,$0020,$0002);
  1033. end;
  1034. procedure test6_PopulateSequence(var ASequence : TOrderedCharacters);
  1035. var
  1036. i : Integer;
  1037. begin
  1038. ASequence := TOrderedCharacters.Create();
  1039. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  1040. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  1041. ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,3));
  1042. ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Primary,4));
  1043. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,5));
  1044. ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,6));
  1045. ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,7));
  1046. for i := 0 to ASequence.ActualLength - 1 do
  1047. ASequence.Data[i].Changed := False;
  1048. end;
  1049. procedure test6();
  1050. var
  1051. sequence, sequenceClean : TOrderedCharacters;
  1052. statement : TReorderSequence;
  1053. wfirst, wresult : TUCA_LineRecArray;
  1054. unicodeBook1, unicodeBook2, unicodeBook3 : unicodedata.TUCA_DataBook;
  1055. begin
  1056. statement.Clear();
  1057. test6_prepareWeigth(wfirst);
  1058. test6_PopulateSequence(sequenceClean);
  1059. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1060. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1061. //Generate the original tables
  1062. ConstructUnicodeBook(wfirst,'test6','first',nil,unicodeBook1);
  1063. CheckInf(['a','b','ad','ada','c','d','e'],@unicodeBook1);
  1064. CheckInf(['ba','ad'],@unicodeBook1);
  1065. CheckInf(['ba','adaa'],@unicodeBook1);
  1066. // --- test 1
  1067. sequence := sequenceClean.Clone();
  1068. SetLength(statement.Reset,0);
  1069. SetLength(statement.Elements,1);
  1070. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Deletion,0);
  1071. sequence.ApplyStatement(@statement);
  1072. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1073. wresult := nil;
  1074. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1075. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1076. //Generate updatet tables
  1077. ConstructUnicodeBook(wresult,'test6','second',@unicodeBook1,unicodeBook2);
  1078. unicodeBook2.Base := @unicodeBook1;
  1079. CheckInf(['a', 'ad'{*},'ada', 'b','c','d','e'],@unicodeBook2);
  1080. CheckInf(['ab','ad'],@unicodeBook2);
  1081. CheckInf(['ab','adb'],@unicodeBook2);
  1082. CheckInf(['ad','ba'],@unicodeBook2);
  1083. CheckInf(['adaa','ba'],@unicodeBook2);
  1084. WriteLn(' -- test 1 - ok',sLineBreak);
  1085. // --- test 2
  1086. //sequence := sequenceClean.Clone();
  1087. SetLength(statement.Reset,0);
  1088. SetLength(statement.Elements,1);
  1089. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
  1090. sequence.ApplyStatement(@statement);
  1091. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1092. wresult := nil;
  1093. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1094. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1095. //Generate updatet tables
  1096. ConstructUnicodeBook(wresult,'test6','second',@unicodeBook2,unicodeBook3);
  1097. unicodeBook3.Base := @unicodeBook2;
  1098. CheckInf(['a', 'ad'{*},'ada'{*}, 'b','c','d','e'],@unicodeBook3);
  1099. CheckInf(['ab','ad'],@unicodeBook3);
  1100. CheckInf(['ab','adb'],@unicodeBook3);
  1101. CheckInf(['ab','ada'],@unicodeBook3);
  1102. WriteLn(' -- test 2 - ok',sLineBreak);
  1103. // --- test 3
  1104. sequence := sequenceClean.Clone();
  1105. SetLength(statement.Reset,0);
  1106. SetLength(statement.Elements,1);
  1107. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
  1108. sequence.ApplyStatement(@statement);
  1109. WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1110. wresult := nil;
  1111. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1112. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1113. //Generate updatet tables
  1114. ConstructUnicodeBook(wresult,'test6','second',@unicodeBook1,unicodeBook2);
  1115. unicodeBook2.Base := @unicodeBook1;
  1116. CheckInf(['a', 'b', 'ad', 'c','d','e'],@unicodeBook2);
  1117. CheckInf(['ad','ada'],@unicodeBook2);
  1118. WriteLn(' -- test 3 - ok',sLineBreak);
  1119. end;
  1120. //-------------------------------------------------------------------------
  1121. procedure test7_prepareWeigth(var AData : TUCA_LineRecArray);
  1122. var
  1123. p : PUCA_LineRec;
  1124. begin
  1125. SetLength(AData,8);
  1126. p := @AData[Low(AData)];
  1127. p^.CodePoints := CodePointToArray($030A);//030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
  1128. p^.Weights := ToWeight($0000,$0043,$0002);
  1129. Inc(p);
  1130. p^.CodePoints := CodePointToArray($0327);//0327 ; [.0000.0056.0002.0327] # COMBINING CEDILLA
  1131. p^.Weights := ToWeight($0000,$0056,$0002);
  1132. Inc(p);
  1133. p^.CodePoints := CodePointToArray($0061);//a
  1134. p^.Weights := ToWeight($15EF,$0020,$0002);
  1135. Inc(p);
  1136. p^.CodePoints := CodePointToArray($0062);//b
  1137. p^.Weights := ToWeight($1605,$0020,$0002);
  1138. Inc(p);
  1139. p^.CodePoints := CodePointToArray($0063);//c
  1140. p^.Weights := ToWeight($161D,$0020,$0002);
  1141. Inc(p);
  1142. p^.CodePoints := CodePointToArray($0064);//d
  1143. p^.Weights := ToWeight($1631,$0020,$0002);
  1144. Inc(p);
  1145. p^.CodePoints := CodePointToArray([$0061,$030A]);//a,030A;COMBINING RING ABOVE
  1146. p^.Weights := ToWeight($164C,$0020,$0002);
  1147. Inc(p);
  1148. p^.CodePoints := CodePointToArray(Ord('k'));
  1149. p^.Weights := ToWeight($16FF,$0020,$0002);
  1150. end;
  1151. procedure test7_PopulateSequence(var ASequence : TOrderedCharacters);
  1152. var
  1153. i : Integer;
  1154. begin
  1155. ASequence := TOrderedCharacters.Create();
  1156. ASequence.Append(TReorderUnit.From($030A,TReorderWeigthKind.Tertiary,1));
  1157. ASequence.Append(TReorderUnit.From($0327,TReorderWeigthKind.Tertiary,2));
  1158. ASequence.Append(TReorderUnit.From($0061,TReorderWeigthKind.Primary,3));
  1159. ASequence.Append(TReorderUnit.From($0062,TReorderWeigthKind.Primary,4));
  1160. ASequence.Append(TReorderUnit.From($0063,TReorderWeigthKind.Primary,5));
  1161. ASequence.Append(TReorderUnit.From($0064,TReorderWeigthKind.Primary,6));
  1162. ASequence.Append(TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Primary,7));
  1163. ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  1164. for i := 0 to ASequence.ActualLength - 1 do
  1165. ASequence.Data[i].Changed := False;
  1166. end;
  1167. procedure test7();
  1168. var
  1169. sequence, sequenceClean : TOrderedCharacters;
  1170. statement : TReorderSequence;
  1171. wfirst, wresult : TUCA_LineRecArray;
  1172. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1173. begin // Permutation simple test
  1174. statement.Clear();
  1175. test7_prepareWeigth(wfirst);
  1176. test7_PopulateSequence(sequenceClean);
  1177. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1178. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1179. //Generate the original tables
  1180. ConstructUnicodeBook(wfirst,'test7','first',nil,unicodeBook1);
  1181. CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064, #$0061#$030A,'k'],@unicodeBook1);
  1182. CheckInf([#$0064, #$0061#$030A#$0327#$0062,'k'],@unicodeBook1);// Permutation here $030A <=> #$0327
  1183. CheckInf([#$0064, #$0061#$0327#$030A#$0062,'k'],@unicodeBook1);
  1184. CheckEqual(#$0061#$030A#$0327, #$0061#$0327#$030A,@unicodeBook1);
  1185. // --- test 2
  1186. sequence := sequenceClean.Clone();
  1187. SetLength(statement.Reset,0);
  1188. SetLength(statement.Elements,1);
  1189. statement.Elements[0] := TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Deletion,0);
  1190. sequence.ApplyStatement(@statement);
  1191. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1192. wresult := nil;
  1193. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1194. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1195. //Generate updatet tables
  1196. ConstructUnicodeBook(wresult,'test7','second',@unicodeBook1,unicodeBook2);
  1197. unicodeBook2.Base := @unicodeBook1;
  1198. CheckInf([#$030A,#$0327,#$0061,#$0061#$030A ,#$0062,#$0063,#$0064,'k'],@unicodeBook2);
  1199. CheckInf([#$0061, #$0061#$030A#$0327#$0062,#$0062,#$0064],@unicodeBook2);
  1200. CheckInf([#$0061, #$0061#$030A#$0062#$0327,#$0062,#$0064],@unicodeBook2);
  1201. WriteLn(' -- test 2 - ok',sLineBreak);
  1202. end;
  1203. //-------------------------------------------------------------------------
  1204. procedure test8_prepareWeigth(var AData : TUCA_LineRecArray);
  1205. var
  1206. p : PUCA_LineRec;
  1207. begin
  1208. SetLength(AData,12);
  1209. p := @AData[Low(AData)];
  1210. p^.CodePoints := CodePointToArray(Ord('a'));
  1211. p^.Weights := ToWeight($15EF,$0020,$0002);
  1212. Inc(p);
  1213. p^.CodePoints := CodePointToArray(Ord('b'));
  1214. p^.Weights := ToWeight($1605,$0020,$0002);
  1215. Inc(p);
  1216. p^.CodePoints := CodePointToArray(Ord('c'));
  1217. p^.Weights := ToWeight($161D,$0020,$0002);
  1218. Inc(p);
  1219. p^.CodePoints := CodePointToArray(Ord('d'));
  1220. p^.Weights := ToWeight($1631,$0020,$0002);
  1221. Inc(p);
  1222. p^.CodePoints := CodePointToArray(Ord('e'));
  1223. p^.Weights := ToWeight($164C,$0020,$0002);
  1224. Inc(p);
  1225. p^.CodePoints := CodePointToArray(Ord('f'));
  1226. p^.Weights := ToWeight($1684,$0020,$0002);
  1227. Inc(p);
  1228. p^.CodePoints := CodePointToArray(Ord('g'));
  1229. p^.Weights := ToWeight($1691,$0020,$0002);
  1230. Inc(p);
  1231. p^.CodePoints := CodePointToArray(Ord('h'));
  1232. p^.Weights := ToWeight($16B4,$0020,$0002);
  1233. Inc(p);
  1234. p^.CodePoints := CodePointToArray(Ord('i'));
  1235. p^.Weights := ToWeight($16CD,$0020,$0002);
  1236. Inc(p);
  1237. p^.CodePoints := CodePointToArray(Ord('j'));
  1238. p^.Weights := ToWeight($16E6,$0020,$0002);
  1239. Inc(p);
  1240. p^.CodePoints := CodePointToArray(Ord('k'));
  1241. p^.Weights := ToWeight($16FF,$0020,$0002);
  1242. Inc(p);
  1243. p^.CodePoints := CodePointToArray(Ord('l'));
  1244. p^.Weights := ToWeight($1711,$0020,$0002);
  1245. end;
  1246. procedure test8_PopulateSequence(var ASequence : TOrderedCharacters);
  1247. var
  1248. i : Integer;
  1249. begin
  1250. ASequence := TOrderedCharacters.Create();
  1251. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  1252. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  1253. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  1254. ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
  1255. ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
  1256. ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
  1257. ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
  1258. ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
  1259. ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
  1260. ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
  1261. ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  1262. ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
  1263. for i := 0 to ASequence.ActualLength - 1 do
  1264. ASequence.Data[i].Changed := False;
  1265. end;
  1266. procedure test8();
  1267. var
  1268. sequence, sequenceClean : TOrderedCharacters;
  1269. statement : TReorderSequence;
  1270. wfirst, wresult : TUCA_LineRecArray;
  1271. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1272. begin
  1273. statement.Clear();
  1274. test8_prepareWeigth(wfirst);
  1275. test8_PopulateSequence(sequenceClean);
  1276. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1277. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1278. //Generate the original tables
  1279. ConstructUnicodeBook(wfirst,'test8','first',nil,unicodeBook1);
  1280. CheckInf('l','-'{* computed are greater},@unicodeBook1);
  1281. // --- test 1
  1282. sequence := sequenceClean.Clone();
  1283. SetLength(statement.Reset,1);
  1284. statement.Reset[0] := Ord('c');
  1285. SetLength(statement.Elements,1);
  1286. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
  1287. sequence.ApplyStatement(@statement);
  1288. wresult := nil;
  1289. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1290. //Generate updatet tables
  1291. ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
  1292. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1293. CheckEqual('cc','c-'{*},@unicodeBook2);
  1294. CheckEqual('ccc','c-c'{*},@unicodeBook2);
  1295. CheckEqual('cca','c-a'{*},@unicodeBook2);
  1296. CheckEqual('cce','c-e'{*},@unicodeBook2);
  1297. CheckInf(['cc','c-c'{*}],@unicodeBook2);
  1298. CheckInf(['bc','bc-c'{*}],@unicodeBook2);
  1299. CheckInf('l','-'{* computed are greater},@unicodeBook2);
  1300. WriteLn(' -- test 1 - ok');
  1301. // --- test 2
  1302. sequence := sequenceClean.Clone();
  1303. SetLength(statement.Reset,1);
  1304. statement.Reset[0] := Ord('c');
  1305. SetLength(statement.Elements,1);
  1306. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Primary,0);
  1307. sequence.ApplyStatement(@statement);
  1308. wresult := nil;
  1309. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1310. //Generate updatet tables
  1311. ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
  1312. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1313. CheckInf('cc','c-'{*},@unicodeBook2);
  1314. CheckInf('ccl','c-'{*},@unicodeBook2);
  1315. CheckInf('ccc','c-c'{*},@unicodeBook2);
  1316. CheckInf('cca','c-a'{*},@unicodeBook2);
  1317. CheckInf('cce','c-e'{*},@unicodeBook2);
  1318. CheckInf(['cc','c-c'{*}],@unicodeBook2);
  1319. CheckInf(['bc','bc-c'{*}],@unicodeBook2);
  1320. CheckInf('l','-'{* computed are greater},@unicodeBook2);
  1321. WriteLn(' -- test 2 - ok');
  1322. // --- test 3
  1323. sequence := sequenceClean.Clone();
  1324. SetLength(statement.Reset,1);
  1325. statement.Reset[0] := Ord('c');
  1326. SetLength(statement.Elements,1);
  1327. statement.Elements[0] := TReorderUnit.From([Ord('-'),Ord('+')],[Ord('c')],TReorderWeigthKind.Identity,0);
  1328. sequence.ApplyStatement(@statement);
  1329. wresult := nil;
  1330. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1331. //Generate updatet tables
  1332. ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
  1333. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1334. CheckEqual('cc','c-+'{*},@unicodeBook2);
  1335. CheckEqual('ccc','c-+c'{*},@unicodeBook2);
  1336. CheckEqual('cca','c-+a'{*},@unicodeBook2);
  1337. CheckEqual('cce','c-+e'{*},@unicodeBook2);
  1338. CheckInf(['cc','c-+c'{*}],@unicodeBook2);
  1339. CheckInf(['bc','bc-+c'{*}],@unicodeBook2);
  1340. CheckInf('l','-+'{* computed are greater},@unicodeBook2);
  1341. WriteLn(' -- test 3 - ok');
  1342. // --- test 4 : '-' has 3 contexts to force the context tree to have at least
  1343. // a "Left" and a "Right"
  1344. sequence := sequenceClean.Clone();
  1345. SetLength(statement.Reset,1);
  1346. statement.Reset[0] := Ord('c');
  1347. SetLength(statement.Elements,1);
  1348. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
  1349. sequence.ApplyStatement(@statement);
  1350. statement.Reset[0] := Ord('f');
  1351. SetLength(statement.Elements,1);
  1352. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('f')],TReorderWeigthKind.Identity,0);
  1353. sequence.ApplyStatement(@statement);
  1354. statement.Reset[0] := Ord('a');
  1355. SetLength(statement.Elements,1);
  1356. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('a')],TReorderWeigthKind.Identity,0);
  1357. sequence.ApplyStatement(@statement);
  1358. wresult := nil;
  1359. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1360. //Generate updatet tables
  1361. ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
  1362. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1363. // Check c
  1364. CheckEqual('cc','c-'{*},@unicodeBook2);
  1365. CheckEqual('ccc','c-c'{*},@unicodeBook2);
  1366. CheckEqual('cca','c-a'{*},@unicodeBook2);
  1367. CheckEqual('cce','c-e'{*},@unicodeBook2);
  1368. CheckInf(['cc','c-c'{*}],@unicodeBook2);
  1369. CheckInf(['bc','bc-c'{*}],@unicodeBook2);
  1370. //check f
  1371. CheckEqual('ff','f-'{*},@unicodeBook2);
  1372. CheckEqual('fff','f-f'{*},@unicodeBook2);
  1373. CheckEqual('ffa','f-a'{*},@unicodeBook2);
  1374. CheckEqual('ffe','f-e'{*},@unicodeBook2);
  1375. CheckInf(['ff','f-f'{*}],@unicodeBook2);
  1376. CheckInf(['bf','bf-f'{*}],@unicodeBook2);
  1377. //check c and f
  1378. CheckEqual('ccf','c-f'{*},@unicodeBook2);
  1379. CheckEqual('ccff','c-f-'{*},@unicodeBook2);
  1380. CheckEqual('ccfff','c-f-f'{*},@unicodeBook2);
  1381. CheckEqual('ffcc','f-c-'{*},@unicodeBook2);
  1382. CheckEqual('ffccf','f-c-f'{*},@unicodeBook2);
  1383. CheckInf('ffccf','g'{*},@unicodeBook2);
  1384. CheckInf('a-','ab',@unicodeBook2);
  1385. // check - alone
  1386. CheckInf('l','-'{* computed are greater},@unicodeBook2);
  1387. WriteLn(' -- test 4 - ok');
  1388. // --- test 5 : Add a contraction to force the code path
  1389. sequence := sequenceClean.Clone();
  1390. SetLength(statement.Reset,1);
  1391. statement.Reset[0] := Ord('a');
  1392. SetLength(statement.Elements,1);
  1393. statement.Elements[0] := TReorderUnit.From([Ord('-'),Ord('h')],TReorderWeigthKind.Primary,0);
  1394. sequence.ApplyStatement(@statement);
  1395. statement.Reset[0] := Ord('c');
  1396. SetLength(statement.Elements,1);
  1397. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
  1398. sequence.ApplyStatement(@statement);
  1399. wresult := nil;
  1400. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1401. //Generate updatet tables
  1402. ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
  1403. CheckInf(['a','-h','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1404. CheckEqual('cc','c-'{*},@unicodeBook2);
  1405. CheckEqual('ccc','c-c'{*},@unicodeBook2);
  1406. CheckEqual('cca','c-a'{*},@unicodeBook2);
  1407. CheckEqual('cce','c-e'{*},@unicodeBook2);
  1408. CheckInf(['cc','c-c'{*}],@unicodeBook2);
  1409. CheckInf(['bc','bc-c'{*}],@unicodeBook2);
  1410. CheckInf(['ab','-hb'{*}],@unicodeBook2);
  1411. CheckInf(['-hb','ba'],@unicodeBook2);
  1412. CheckInf('l','-'{* computed are greater},@unicodeBook2);
  1413. WriteLn(' -- test 5 - ok');
  1414. WriteLn(' -- test - ok',sLineBreak);
  1415. end;
  1416. //-------------------------------------------------------------------------
  1417. procedure test9_prepareWeigth(var AData : TUCA_LineRecArray);
  1418. var
  1419. p : PUCA_LineRec;
  1420. begin
  1421. SetLength(AData,8);
  1422. p := @AData[Low(AData)];
  1423. p^.CodePoints := CodePointToArray($030A);//030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
  1424. p^.Weights := ToWeight($0000,$0043,$0002);
  1425. Inc(p);
  1426. p^.CodePoints := CodePointToArray($0327);//0327 ; [.0000.0056.0002.0327] # COMBINING CEDILLA
  1427. p^.Weights := ToWeight($0000,$0056,$0002);
  1428. Inc(p);
  1429. p^.CodePoints := CodePointToArray($0061);//a
  1430. p^.Weights := ToWeight($15EF,$0020,$0002);
  1431. Inc(p);
  1432. p^.CodePoints := CodePointToArray($0062);//b
  1433. p^.Weights := ToWeight($1605,$0020,$0002);
  1434. Inc(p);
  1435. p^.CodePoints := CodePointToArray($0063);//c
  1436. p^.Weights := ToWeight($161D,$0020,$0002);
  1437. Inc(p);
  1438. p^.CodePoints := CodePointToArray($0064);//d
  1439. p^.Weights := ToWeight($1631,$0020,$0002);
  1440. Inc(p);
  1441. p^.CodePoints := CodePointToArray([$0061,$030A]);//a,030A;COMBINING RING ABOVE
  1442. p^.Weights := ToWeight($164C,$0020,$0002);
  1443. Inc(p);
  1444. p^.CodePoints := CodePointToArray(Ord('k'));
  1445. p^.Weights := ToWeight($16FF,$0020,$0002);
  1446. end;
  1447. procedure test9_PopulateSequence(var ASequence : TOrderedCharacters);
  1448. var
  1449. i : Integer;
  1450. begin
  1451. ASequence := TOrderedCharacters.Create();
  1452. ASequence.Append(TReorderUnit.From($030A,TReorderWeigthKind.Tertiary,1));
  1453. ASequence.Append(TReorderUnit.From($0327,TReorderWeigthKind.Tertiary,2));
  1454. ASequence.Append(TReorderUnit.From($0061,TReorderWeigthKind.Primary,3));
  1455. ASequence.Append(TReorderUnit.From($0062,TReorderWeigthKind.Primary,4));
  1456. ASequence.Append(TReorderUnit.From($0063,TReorderWeigthKind.Primary,5));
  1457. ASequence.Append(TReorderUnit.From($0064,TReorderWeigthKind.Primary,6));
  1458. ASequence.Append(TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Primary,7));
  1459. ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  1460. for i := 0 to ASequence.ActualLength - 1 do
  1461. ASequence.Data[i].Changed := False;
  1462. end;
  1463. procedure test9();
  1464. var
  1465. sequence, sequenceClean : TOrderedCharacters;
  1466. statement : TReorderSequence;
  1467. wfirst, wresult : TUCA_LineRecArray;
  1468. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1469. begin// Permutation with Context
  1470. statement.Clear();
  1471. test7_prepareWeigth(wfirst);
  1472. test7_PopulateSequence(sequenceClean);
  1473. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1474. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1475. //Generate the original tables
  1476. ConstructUnicodeBook(wfirst,'test9','first',nil,unicodeBook1);
  1477. CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064, #$0061#$030A,'k'],@unicodeBook1);
  1478. CheckInf([#$0064, #$0061#$030A#$0327#$0062,'k'],@unicodeBook1);// Permutation here $030A <=> #$0327
  1479. // --- test 2
  1480. sequence := sequenceClean.Clone();
  1481. SetLength(statement.Reset,1);
  1482. statement.Reset[0] := $0062;
  1483. SetLength(statement.Elements,1);
  1484. statement.Elements[0] := TReorderUnit.From([Ord('k'),$032D],[$0061],TReorderWeigthKind.Secondary,0); //032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;;
  1485. sequence.ApplyStatement(@statement);
  1486. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1487. wresult := nil;
  1488. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1489. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1490. //Generate updatet tables
  1491. ConstructUnicodeBook(wresult,'test9','second',@unicodeBook1,unicodeBook2);
  1492. unicodeBook2.Base := @unicodeBook1;
  1493. CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064,'k'],@unicodeBook2);
  1494. CheckInf([#$0061'k'#$032D ,#$0061#$0063],@unicodeBook2);
  1495. CheckNotEqual(#$0061'k'#$0327#$032D, #$0061#$0327,@unicodeBook2);
  1496. CheckInf([#$0061'k'#$0327#$032D ,#$0061#$0063],@unicodeBook2);
  1497. WriteLn(' -- test 2 - ok',sLineBreak);
  1498. end;
  1499. //------------------------------------------------------
  1500. procedure test10_prepareWeigth(var AData : TUCA_LineRecArray);
  1501. var
  1502. p : PUCA_LineRec;
  1503. begin
  1504. SetLength(AData,12);
  1505. p := @AData[Low(AData)];
  1506. p^.CodePoints := CodePointToArray(Ord('a'));
  1507. p^.Weights := ToWeight($15EF,$0020,$0002);
  1508. Inc(p);
  1509. p^.CodePoints := CodePointToArray([Ord('('),Ord('a'),Ord(')')]);
  1510. p^.Weights := ToWeight($15EF,$0020,$0006); //15EF.0020.0006.24D0
  1511. Inc(p);
  1512. p^.CodePoints := CodePointToArray(Ord('A'));
  1513. p^.Weights := ToWeight($15EF,$0020,$0008); //15EF.0020.0008.0041
  1514. Inc(p);
  1515. p^.CodePoints := CodePointToArray([Ord('('),Ord('A'),Ord(')')]);
  1516. p^.Weights := ToWeight($15EF,$0020,$000C); //15EF.0020.000C
  1517. Inc(p);
  1518. p^.CodePoints := CodePointToArray([Ord('a'),Ord('`')]);
  1519. p^.Weights := ToWeight([$15EF,$0020,$0002, $0000,$0035,$0002]); //[.15EF.0020.0002.0061][.0000.0035.0002.0300]
  1520. Inc(p);
  1521. p^.CodePoints := CodePointToArray([Ord('A'),Ord('`')]);
  1522. p^.Weights := ToWeight([$15EF,$0020,$0008, $0000,$0035,$0002]); //[.15EF.0020.0008.0041][.0000.0035.0002.0300]
  1523. Inc(p);
  1524. p^.CodePoints := CodePointToArray([Ord('a'),Ord('e')]);
  1525. p^.Weights := ToWeight([$15F0,$0020,$0002]); //[.15EF.0020.0004.00E6][.0000.0139.0004.00E6][.164C.0020.0004.00E6]
  1526. Inc(p);
  1527. p^.CodePoints := CodePointToArray([Ord(UpCase('a')),Ord(UpCase('e'))]);
  1528. p^.Weights := ToWeight([$15F0,$0020,$0006]);//[.15EF.0020.000A.00C6][.0000.0139.0004.00C6][.164C.0020.000A.00C6]
  1529. Inc(p);
  1530. p^.CodePoints := CodePointToArray(Ord('b'));
  1531. p^.Weights := ToWeight($1605,$0020,$0002);
  1532. Inc(p);
  1533. p^.CodePoints := CodePointToArray([Ord('('),Ord('b'),Ord(')')]);
  1534. p^.Weights := ToWeight($1605,$0020,$0006); //.1605.0020.0006.24D1
  1535. Inc(p);
  1536. p^.CodePoints := CodePointToArray(Ord('B'));
  1537. p^.Weights := ToWeight($1605,$0020,$0008); //1605.0020.0008.0042
  1538. Inc(p);
  1539. p^.CodePoints := CodePointToArray(Ord('c'));
  1540. p^.Weights := ToWeight($161D,$0020,$0002);
  1541. end;
  1542. procedure test10_PopulateSequence(var ASequence : TOrderedCharacters);
  1543. var
  1544. i : Integer;
  1545. begin
  1546. ASequence := TOrderedCharacters.Create();
  1547. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  1548. ASequence.Append(TReorderUnit.From([Ord('('),Ord('a'),Ord(')')],TReorderWeigthKind.Tertiary,2));
  1549. ASequence.Append(TReorderUnit.From(Ord('A'),TReorderWeigthKind.Tertiary,3));
  1550. ASequence.Append(TReorderUnit.From([Ord('('),Ord('A'),Ord(')')],TReorderWeigthKind.Tertiary,4));
  1551. //ASequence.Append(TReorderUnit.From(Ord('à'),TReorderWeigthKind.Secondary,0));
  1552. ASequence.Append(TReorderUnit.From([Ord('a'),Ord('`')],TReorderWeigthKind.Secondary,5));
  1553. //ASequence.Append(TReorderUnit.From(Ord(UpCase('à')),TReorderWeigthKind.Tertiary,0));
  1554. ASequence.Append(TReorderUnit.From([Ord('A'),Ord('`')],TReorderWeigthKind.Tertiary,6));
  1555. ASequence.Append(TReorderUnit.From([Ord('a'),Ord('e')],TReorderWeigthKind.Primary,7));
  1556. ASequence.Append(TReorderUnit.From([Ord(UpCase('a')),Ord(UpCase('e'))],TReorderWeigthKind.Tertiary,8));
  1557. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,9));
  1558. ASequence.Append(TReorderUnit.From([Ord('('),Ord('b'),Ord(')')],TReorderWeigthKind.Tertiary,10));
  1559. ASequence.Append(TReorderUnit.From(Ord('B'),TReorderWeigthKind.Tertiary,11));
  1560. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,12));
  1561. for i := 0 to ASequence.ActualLength - 1 do
  1562. ASequence.Data[i].Changed := False;
  1563. end;
  1564. procedure test10();
  1565. var
  1566. sequence, sequenceClean : TOrderedCharacters;
  1567. statement : TReorderSequence;
  1568. wfirst, wresult : TUCA_LineRecArray;
  1569. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1570. begin
  1571. statement.Clear();
  1572. test10_prepareWeigth(wfirst);
  1573. test10_PopulateSequence(sequenceClean);
  1574. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1575. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1576. //Generate the original tables
  1577. ConstructUnicodeBook(wfirst,'test6','first',nil,unicodeBook1);
  1578. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook1);
  1579. // --- test 1
  1580. sequence := sequenceClean.Clone();
  1581. statement.Clear();
  1582. statement.Before := True;
  1583. SetLength(statement.Reset,2);
  1584. statement.Reset[0] := Ord('a');
  1585. statement.Reset[1] := Ord('e');
  1586. SetLength(statement.Elements,1);
  1587. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  1588. sequence.ApplyStatement(@statement);
  1589. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1590. wresult := nil;
  1591. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1592. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1593. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  1594. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
  1595. CheckInf(['gg','ae'],@unicodeBook2);
  1596. CheckInf(['gb','ae'],@unicodeBook2);
  1597. WriteLn(' -- test 1 - ok',sLineBreak);
  1598. // --- test 2
  1599. sequence := sequenceClean.Clone();
  1600. statement.Clear();
  1601. statement.Before := True;
  1602. SetLength(statement.Reset,2);
  1603. statement.Reset[0] := Ord('a');
  1604. statement.Reset[1] := Ord('e');
  1605. SetLength(statement.Elements,1);
  1606. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
  1607. sequence.ApplyStatement(@statement);
  1608. WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1609. wresult := nil;
  1610. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1611. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1612. ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
  1613. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
  1614. CheckInf(['A`B','gg'],@unicodeBook2);
  1615. CheckInf(['A`b','g'],@unicodeBook2);
  1616. WriteLn(' -- test 2 - ok',sLineBreak);
  1617. // --- test 3
  1618. sequence := sequenceClean.Clone();
  1619. statement.Clear();
  1620. statement.Before := True;
  1621. SetLength(statement.Reset,2);
  1622. statement.Reset[0] := Ord('a');
  1623. statement.Reset[1] := Ord('e');
  1624. SetLength(statement.Elements,1);
  1625. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  1626. sequence.ApplyStatement(@statement);
  1627. WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1628. wresult := nil;
  1629. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1630. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1631. ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
  1632. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
  1633. CheckInf(['A`B','gg'],@unicodeBook2);
  1634. CheckInf(['A`b','g'],@unicodeBook2);
  1635. WriteLn(' -- test 3 - ok',sLineBreak);
  1636. // --- test 4
  1637. sequence := sequenceClean.Clone();
  1638. statement.Clear();
  1639. statement.Before := True;
  1640. SetLength(statement.Reset,2);
  1641. statement.Reset[0] := Ord('A');
  1642. statement.Reset[1] := Ord('`');
  1643. SetLength(statement.Elements,1);
  1644. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  1645. sequence.ApplyStatement(@statement);
  1646. WriteLn('Statement #4.1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1647. wresult := nil;
  1648. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1649. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1650. statement.Clear();
  1651. statement.Before := True;
  1652. SetLength(statement.Reset,2);
  1653. statement.Reset[0] := Ord('A');
  1654. statement.Reset[1] := Ord('`');
  1655. SetLength(statement.Elements,1);
  1656. statement.Elements[0] := TReorderUnit.From(Ord('G'),TReorderWeigthKind.Secondary,0);
  1657. sequence.ApplyStatement(@statement);
  1658. WriteLn('Statement #4.2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1659. wresult := nil;
  1660. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1661. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1662. ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
  1663. CheckInf(['a','(a)','A','(A)', 'G','a`','g'{*},'A`', 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
  1664. CheckInf(['gg','A`B'],@unicodeBook2);
  1665. CheckInf(['g','A`b'],@unicodeBook2);
  1666. CheckInf(['A','gg'],@unicodeBook2);
  1667. CheckInf(['A','Ga'],@unicodeBook2);
  1668. WriteLn(' -- test 4 - ok',sLineBreak);
  1669. // --- test 5
  1670. sequence := sequenceClean.Clone();
  1671. statement.Clear();
  1672. statement.Before := True;
  1673. SetLength(statement.Reset,1);
  1674. statement.Reset[0] := Ord('B');
  1675. SetLength(statement.Elements,1);
  1676. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  1677. sequence.ApplyStatement(@statement);
  1678. WriteLn('Statement #5 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1679. wresult := nil;
  1680. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1681. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1682. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  1683. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'g'{*}, 'b','(b)','B', 'c'],@unicodeBook2);
  1684. CheckInf(['gg','b'],@unicodeBook2);
  1685. CheckInf(['ae','gb'],@unicodeBook2);
  1686. WriteLn(' -- test 5 - ok',sLineBreak);
  1687. end;
  1688. //------------------------------------------------------
  1689. procedure test11_prepareWeigth(var AData : TUCA_LineRecArray);
  1690. var
  1691. p : PUCA_LineRec;
  1692. begin
  1693. SetLength(AData,12);
  1694. p := @AData[Low(AData)];
  1695. p^.CodePoints := CodePointToArray(Ord('a'));
  1696. p^.Weights := ToWeight($15EF,$0020,$0002);
  1697. Inc(p);
  1698. p^.CodePoints := CodePointToArray(Ord('b'));
  1699. p^.Weights := ToWeight($1605,$0020,$0002);
  1700. Inc(p);
  1701. p^.CodePoints := CodePointToArray(Ord('c'));
  1702. p^.Weights := ToWeight($161D,$0020,$0002);
  1703. Inc(p);
  1704. p^.CodePoints := CodePointToArray(Ord('d'));
  1705. p^.Weights := ToWeight($1631,$0020,$0002);
  1706. Inc(p);
  1707. p^.CodePoints := CodePointToArray(Ord('e'));
  1708. p^.Weights := ToWeight($164C,$0020,$0002);
  1709. Inc(p);
  1710. p^.CodePoints := CodePointToArray(Ord('f'));
  1711. p^.Weights := ToWeight($1684,$0020,$0002);
  1712. Inc(p);
  1713. p^.CodePoints := CodePointToArray(Ord('g'));
  1714. p^.Weights := ToWeight($1691,$0020,$0002);
  1715. Inc(p);
  1716. p^.CodePoints := CodePointToArray(Ord('h'));
  1717. p^.Weights := ToWeight($16B4,$0020,$0002);
  1718. Inc(p);
  1719. p^.CodePoints := CodePointToArray(Ord('i'));
  1720. p^.Weights := ToWeight($16CD,$0020,$0002);
  1721. Inc(p);
  1722. p^.CodePoints := CodePointToArray(Ord('j'));
  1723. p^.Weights := ToWeight($16E6,$0020,$0002);
  1724. Inc(p);
  1725. p^.CodePoints := CodePointToArray(Ord('k'));
  1726. p^.Weights := ToWeight($16FF,$0020,$0002);
  1727. Inc(p);
  1728. p^.CodePoints := CodePointToArray(Ord('l'));
  1729. p^.Weights := ToWeight($1711,$0020,$0002);
  1730. end;
  1731. procedure test11_PopulateSequence(var ASequence : TOrderedCharacters);
  1732. var
  1733. i : Integer;
  1734. begin
  1735. ASequence := TOrderedCharacters.Create();
  1736. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  1737. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  1738. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  1739. ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
  1740. ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
  1741. ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
  1742. ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
  1743. ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
  1744. ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
  1745. ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
  1746. ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  1747. ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
  1748. for i := 0 to ASequence.ActualLength - 1 do
  1749. ASequence.Data[i].Changed := False;
  1750. end;
  1751. procedure test11();
  1752. var
  1753. sequence, sequenceClean : TOrderedCharacters;
  1754. statement : TReorderSequence;
  1755. wfirst, wresult : TUCA_LineRecArray;
  1756. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1757. begin
  1758. statement.Clear();
  1759. test11_prepareWeigth(wfirst);
  1760. test11_PopulateSequence(sequenceClean);
  1761. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1762. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1763. //Generate the original tables
  1764. ConstructUnicodeBook(wfirst,'test11','first',nil,unicodeBook1);
  1765. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook1);
  1766. // --- test 1
  1767. sequence := sequenceClean.Clone();
  1768. SetLength(statement.Reset,1);
  1769. statement.Reset[0] := Ord('c');
  1770. SetLength(statement.Elements,1);
  1771. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Tertiary,0);
  1772. statement.Elements[0].SetExpansion(Ord('h'));
  1773. sequence.ApplyStatement(@statement);
  1774. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1775. wresult := nil;
  1776. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1777. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1778. //Generate updatet tables
  1779. ConstructUnicodeBook(wresult,'test1','second',@unicodeBook1,unicodeBook2);
  1780. CheckInf(['a','b','c','x'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1781. CheckInf('ch','x'{*},@unicodeBook2);
  1782. CheckInf('cha','xa'{*},@unicodeBook2);
  1783. CheckInf('chk','xka'{*},@unicodeBook2);
  1784. WriteLn(' -- test 1 - ok');
  1785. // --- test 2
  1786. sequence := sequenceClean.Clone();
  1787. SetLength(statement.Reset,1);
  1788. statement.Reset[0] := Ord('c');
  1789. SetLength(statement.Elements,2);
  1790. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Tertiary,0);
  1791. statement.Elements[0].SetExpansion(Ord('h'));
  1792. statement.Elements[1] := TReorderUnit.From(Ord('X'),TReorderWeigthKind.Tertiary,0);
  1793. sequence.ApplyStatement(@statement);
  1794. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1795. wresult := nil;
  1796. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1797. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1798. //Generate updatet tables
  1799. ConstructUnicodeBook(wresult,'test2','second',@unicodeBook1,unicodeBook2);
  1800. CheckInf(['a','b','c','x'{*},'X'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1801. CheckInf('ch','x'{*},@unicodeBook2);
  1802. CheckInf('cha','xa'{*},@unicodeBook2);
  1803. CheckInf('chk','xka'{*},@unicodeBook2);
  1804. CheckInf('ch','X'{*},@unicodeBook2);
  1805. CheckInf('cha','Xa'{*},@unicodeBook2);
  1806. CheckInf('chk','Xka'{*},@unicodeBook2);
  1807. WriteLn(' -- test 2 - ok');
  1808. end;
  1809. //------------------------------------------------------
  1810. procedure test12_prepareWeigth(var AData : TUCA_LineRecArray);
  1811. var
  1812. p : PUCA_LineRec;
  1813. begin
  1814. SetLength(AData,1);
  1815. p := @AData[Low(AData)];
  1816. p^.CodePoints := CodePointToArray(Ord('a'));
  1817. p^.Weights := ToWeight($15EF,$0120,$0002);
  1818. end;
  1819. procedure test12_PopulateSequence(var ASequence : TOrderedCharacters);
  1820. var
  1821. i : Integer;
  1822. begin
  1823. ASequence := TOrderedCharacters.Create();
  1824. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  1825. for i := 0 to ASequence.ActualLength - 1 do
  1826. ASequence.Data[i].Changed := False;
  1827. end;
  1828. procedure Check(const ACondition : Boolean; const AMsg : string);overload;
  1829. begin
  1830. if not ACondition then
  1831. raise Exception.Create(AMsg);
  1832. end;
  1833. procedure Check(
  1834. const ACondition : Boolean;
  1835. const AFormatMsg : string;
  1836. const AArgs : array of const
  1837. );overload;
  1838. begin
  1839. Check(ACondition,Format(AFormatMsg,AArgs));
  1840. end;
  1841. procedure Check(const ACondition : Boolean);overload;
  1842. begin
  1843. Check(ACondition,'Check failed.')
  1844. end;
  1845. procedure CheckSimpleProps(
  1846. AItem : PUCA_PropItemRec;
  1847. AHasCodePoint,
  1848. AIsValid : Boolean;
  1849. AChildCount : Byte;
  1850. AContextual : Boolean
  1851. );overload;
  1852. var
  1853. p : PUCA_PropItemRec;
  1854. begin
  1855. p := AItem;
  1856. Check(p<>nil,'p = nil');
  1857. Check(p^.HasCodePoint()=AHasCodePoint,'HasCodePoint');
  1858. Check(p^.IsValid()=AIsValid,'IsValid');
  1859. Check(p^.ChildCount=AChildCount,'ChildCount');
  1860. Check(p^.Contextual=AContextual,'Contextual');
  1861. end;
  1862. procedure CheckSimpleProps(
  1863. AItem : PUCA_PropItemRec;
  1864. AHasCodePoint,
  1865. AIsValid : Boolean;
  1866. AChildCount : Byte;
  1867. AContextual,
  1868. AIsDeleted : Boolean
  1869. );overload;
  1870. begin
  1871. CheckSimpleProps(AItem,AHasCodePoint,AIsValid,AChildCount,AContextual);
  1872. Check(AItem^.IsDeleted=AIsDeleted,'IsDeleted');
  1873. end;
  1874. procedure CheckWeigths(AItem : PUCA_PropItemRec; const AWeigths : array of Word);overload;
  1875. var
  1876. p : PUCA_PropItemRec;
  1877. c, i : Integer;
  1878. pb : PByte;
  1879. pw : PWord;
  1880. begin
  1881. p := AItem;
  1882. c := Length(AWeigths);
  1883. if ((c mod 3) > 0) then
  1884. Check(False,'Invalid Weigth Array.');
  1885. c := c div 3;
  1886. Check(c=p^.WeightLength,'WeightLength');
  1887. if (c = 0) then
  1888. exit;
  1889. pb := PByte(PtrUInt(p)+SizeOf(TUCA_PropItemRec));
  1890. pw := @AWeigths[Low(AWeigths)];
  1891. //First Item
  1892. Check(PWord(pb)^ = pw^, 'First Item[0]');
  1893. pw := pw + 1;
  1894. pb := pb + 2;
  1895. if (pw^ > High(Byte)) then begin
  1896. Check(PWord(pb)^ = pw^, 'First Item[1]');
  1897. pb := pb + 2;
  1898. end else begin
  1899. Check(pb^ = pw^, 'First Item[1]');
  1900. pb := pb + 1;
  1901. end;
  1902. pw := pw + 1;
  1903. if (pw^ > High(Byte)) then begin
  1904. Check(PWord(pb)^ = pw^, 'First Item[2]');
  1905. pb := pb + 2;
  1906. end else begin
  1907. Check(pb^ = pw^, 'First Item[2]');
  1908. pb := pb + 1;
  1909. end;
  1910. pw := pw + 1;
  1911. // Others
  1912. for i := 1 to c-1 do begin
  1913. Check(PWord(pb)^ = pw^, 'Item[0],i=%d',[i]);
  1914. Inc(pw);
  1915. pb := pb + 2;
  1916. Check(PWord(pb)^ = pw^, 'Item[1],i=%d',[i]);
  1917. Inc(pw);
  1918. pb := pb + 2;
  1919. Check(PWord(pb)^ = pw^, 'Item[2],i=%d',[i]);
  1920. Inc(pw);
  1921. pb := pb + 2;
  1922. end;
  1923. end;
  1924. procedure CheckWeigths(
  1925. AData : PUCA_PropWeights;
  1926. const ADataCount : Integer;
  1927. const AWeigths : array of Word
  1928. );overload;
  1929. var
  1930. c: Integer;
  1931. begin
  1932. c := Length(AWeigths);
  1933. if ((c mod 3) > 0) then
  1934. Check(False,'Invalid Weigth Array.');
  1935. c := c div 3;
  1936. Check(c=ADataCount,'WeightLength');
  1937. if (c = 0) then
  1938. exit;
  1939. if not CompareMem(AData,@AWeigths[0],(ADataCount*3*SizeOf(Word))) then
  1940. Check(False,'Weight');
  1941. end;
  1942. function CalcWeigthSize(const AWeigths : array of Word) : Integer;
  1943. var
  1944. c : Integer;
  1945. begin
  1946. c := Length(AWeigths);
  1947. if ((c mod 3) > 0) then
  1948. Check(False,'Invalid Weigth Array.');
  1949. Result := c * SizeOf(Word);
  1950. if (c>0) then begin
  1951. if (AWeigths[1] <= High(Byte)) then
  1952. Result := Result - 1;
  1953. if (AWeigths[2] <= High(Byte)) then
  1954. Result := Result - 1;
  1955. end;
  1956. end;
  1957. procedure test12_check_1(const ABook : unicodedata.TUCA_DataBook);
  1958. var
  1959. p, px : PUCA_PropItemRec;
  1960. size, sizeTotal, t: Cardinal;
  1961. begin
  1962. sizeTotal := 0;
  1963. // for 'b'
  1964. p := ABook.Props;
  1965. CheckSimpleProps(p,False,True,0,False);
  1966. CheckWeigths(p,[$15F0,0,0, $15F0,0,0]);
  1967. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15F0,0,0, $15F0,0,0]);
  1968. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  1969. Check(p^.Size = size,'size');
  1970. sizeTotal:= sizeTotal+size;
  1971. // for 'c'
  1972. p := PUCA_PropItemRec(PtrUInt(p)+size);
  1973. CheckSimpleProps(p,False,True,0,False);
  1974. CheckWeigths(p,[$15F0,0,0, $15F1,0,0]);
  1975. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15F0,0,0, $15F0,0,0]);
  1976. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  1977. Check(p^.Size = size,'size');
  1978. sizeTotal:= sizeTotal+size;
  1979. // for 'x'
  1980. p := PUCA_PropItemRec(PtrUInt(p)+size);
  1981. px := p;
  1982. CheckSimpleProps(p,False,False,1,False);
  1983. CheckWeigths(p,[]);
  1984. size := SizeOf(TUCA_PropItemRec);
  1985. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  1986. t := size;
  1987. sizeTotal:= sizeTotal+size;
  1988. // for 'y'
  1989. p := PUCA_PropItemRec(PtrUInt(p)+size);
  1990. CheckSimpleProps(p,True,True,0,False);
  1991. CheckWeigths(p,[$15F0,0,0, $15F2,0,0]);
  1992. size := SizeOf(TUCA_PropItemRec) +
  1993. SizeOf(UInt24) +
  1994. CalcWeigthSize([$15F0,0,0, $15F2,0,0]);
  1995. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  1996. Check(p^.Size = size,'size(y)');
  1997. Check(px^.Size = (t+size),'size(x)');
  1998. sizeTotal:= sizeTotal+size;
  1999. Check(ABook.PropCount = sizeTotal,'size(total)');
  2000. end;
  2001. procedure test12_check_2(const ABook : unicodedata.TUCA_DataBook);
  2002. var
  2003. p, ph : PUCA_PropItemRec;
  2004. size, sizeTotal, t: Integer;
  2005. begin
  2006. sizeTotal := 0;
  2007. // for 'b'
  2008. p := ABook.Props;
  2009. CheckSimpleProps(p,False,True,0,False);
  2010. CheckWeigths(p,[$15EF,$121,0, $15EF,0,0]);
  2011. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0, $15EF,0,0]);
  2012. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2013. Check(p^.Size = size,'size');
  2014. sizeTotal:= sizeTotal+size;
  2015. // for 'c'
  2016. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2017. CheckSimpleProps(p,False,True,0,False);
  2018. CheckWeigths(p,[$15EF,$122,0, $15EF,0,0]);
  2019. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0, $15EF,0,0]);
  2020. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2021. Check(p^.Size = size,'size');
  2022. sizeTotal:= sizeTotal+size;
  2023. // for 'h'
  2024. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2025. ph := p;
  2026. CheckSimpleProps(p,False,False,1,False);
  2027. CheckWeigths(p,[]);
  2028. size := SizeOf(TUCA_PropItemRec);
  2029. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2030. t := size;
  2031. sizeTotal:= sizeTotal+size;
  2032. // for 'i'
  2033. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2034. CheckSimpleProps(p,True,True,0,False);
  2035. CheckWeigths(p,[$15EF,$123,0, $15EF,0,0]);
  2036. size := SizeOf(TUCA_PropItemRec) +
  2037. SizeOf(UInt24) +
  2038. CalcWeigthSize([$15EF,$123,0, $15EF,0,0]);
  2039. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2040. Check(p^.Size = size,'size(i)');
  2041. sizeTotal:= sizeTotal+size;
  2042. Check(ph^.Size = (t+size),'size(h)');
  2043. // for 'k'
  2044. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2045. CheckSimpleProps(p,False,True,0,False);
  2046. CheckWeigths(p,[$15EF,$123,1, $15EF,0,0]);
  2047. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1, $15EF,0,0]);
  2048. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2049. Check(p^.Size = size,'size(k)');
  2050. sizeTotal:= sizeTotal+size;
  2051. Check(ABook.PropCount = sizeTotal,'size(total)');
  2052. end;
  2053. procedure test12_check_3(const ABook : unicodedata.TUCA_DataBook);
  2054. var
  2055. p, pc : PUCA_PropItemRec;
  2056. size, sizeTotal, t: Integer;
  2057. begin
  2058. sizeTotal := 0;
  2059. // for 'b'
  2060. p := ABook.Props;
  2061. CheckSimpleProps(p,False,True,0,False);
  2062. CheckWeigths(p,[$15EF,$121,0, $15EF,0,0]);
  2063. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0, $15EF,0,0]);
  2064. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2065. Check(p^.Size = size,'size');
  2066. sizeTotal:= sizeTotal+size;
  2067. // for 'c'
  2068. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2069. pc := p;
  2070. CheckSimpleProps(p,False,True,1,False);
  2071. CheckWeigths(p,[$15EF,$122,0, $15EF,0,0]);
  2072. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0, $15EF,0,0]);
  2073. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2074. t := size;
  2075. sizeTotal:= sizeTotal+size;
  2076. // for 'i'
  2077. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2078. CheckSimpleProps(p,True,True,0,False);
  2079. CheckWeigths(p,[$15EF,$123,0, $15EF,0,0]);
  2080. size := SizeOf(TUCA_PropItemRec) +
  2081. SizeOf(UInt24) +
  2082. CalcWeigthSize([$15EF,$123,0, $15EF,0,0]);
  2083. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2084. Check(p^.Size = size,'size(i)');
  2085. sizeTotal:= sizeTotal+size;
  2086. Check(pc^.Size = (t+size),'size(c)');
  2087. // for 'k'
  2088. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2089. CheckSimpleProps(p,False,True,0,False);
  2090. CheckWeigths(p,[$15EF,$123,1, $15EF,0,0]);
  2091. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1, $15EF,0,0]);
  2092. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2093. Check(p^.Size = size,'size(k)');
  2094. sizeTotal:= sizeTotal+size;
  2095. Check(ABook.PropCount = sizeTotal,'size(total)');
  2096. end;
  2097. procedure test12_check_4(const ABook : unicodedata.TUCA_DataBook);
  2098. var
  2099. p, pc : PUCA_PropItemRec;
  2100. size, sizeTotal, t: Integer;
  2101. begin
  2102. sizeTotal := 0;
  2103. // for 'b'
  2104. p := ABook.Props;
  2105. CheckSimpleProps(p,False,True,0,False);
  2106. CheckWeigths(p,[$15EF,$121,0, $15EF,0,0]);
  2107. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0, $15EF,0,0]);
  2108. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2109. Check(p^.Size = size,'size');
  2110. sizeTotal:= sizeTotal+size;
  2111. // for 'c'
  2112. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2113. pc := p;
  2114. CheckSimpleProps(p,False,True,2,False);
  2115. CheckWeigths(p,[$15EF,$122,0, $15EF,0,0]);
  2116. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0, $15EF,0,0]);
  2117. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2118. t := size;
  2119. sizeTotal:= sizeTotal+size;
  2120. // for 'i' as in 'ci'
  2121. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2122. CheckSimpleProps(p,True,True,0,False);
  2123. CheckWeigths(p,[$15EF,$123,0, $15EF,0,0]);
  2124. size := SizeOf(TUCA_PropItemRec) +
  2125. SizeOf(UInt24) +
  2126. CalcWeigthSize([$15EF,$123,0, $15EF,0,0]);
  2127. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2128. Check(p^.Size = size,'size(i)');
  2129. t := t+size;
  2130. sizeTotal:= sizeTotal+size;
  2131. // for 's' as in 'cs'
  2132. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2133. CheckSimpleProps(p,True,True,0,False);
  2134. CheckWeigths(p,[$15EF,$123,1, $15F0,0,0]);
  2135. size := SizeOf(TUCA_PropItemRec) +
  2136. SizeOf(UInt24) +
  2137. CalcWeigthSize([$15EF,$123,1, $15F0,0,0]);
  2138. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2139. Check(p^.Size = size,'size(s)');
  2140. t := t+size;
  2141. sizeTotal:= sizeTotal+size;
  2142. Check(pc^.Size = t,'size(c)');
  2143. // for 'k'
  2144. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2145. CheckSimpleProps(p,False,True,0,False);
  2146. CheckWeigths(p,[$15EF,$123,1, $15EF,0,0]);
  2147. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1, $15EF,0,0]);
  2148. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2149. Check(p^.Size = size,'size(k)');
  2150. sizeTotal:= sizeTotal+size;
  2151. Check(ABook.PropCount = sizeTotal,'size(total)');
  2152. end;
  2153. procedure test12();
  2154. var
  2155. sequence, sequenceClean : TOrderedCharacters;
  2156. statement : TReorderSequence;
  2157. wfirst, wresult : TUCA_LineRecArray;
  2158. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  2159. begin
  2160. statement.Clear();
  2161. test12_prepareWeigth(wfirst);
  2162. test12_PopulateSequence(sequenceClean);
  2163. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  2164. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  2165. //Generate the original tables
  2166. ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
  2167. // --- test 1
  2168. sequence := sequenceClean.Clone();
  2169. SetLength(statement.Reset,1);
  2170. statement.Reset[0] := Ord('a');
  2171. SetLength(statement.Elements,3);
  2172. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  2173. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  2174. statement.Elements[2] := TReorderUnit.From([Ord('x'),Ord('y')],TReorderWeigthKind.Primary,0);
  2175. sequence.ApplyStatement(@statement);
  2176. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2177. wresult := nil;
  2178. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2179. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2180. //Generate updatet tables
  2181. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2182. CheckInf(['a','b','c','xy'],@unicodeBook2);
  2183. test12_check_1(unicodeBook2);
  2184. WriteLn(' -- test 1 - ok');
  2185. // --- test 2
  2186. sequence := sequenceClean.Clone();
  2187. statement.Clear();
  2188. SetLength(statement.Reset,1);
  2189. statement.Reset[0] := Ord('a');
  2190. SetLength(statement.Elements,4);
  2191. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
  2192. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
  2193. statement.Elements[2] := TReorderUnit.From([Ord('h'),Ord('i')],TReorderWeigthKind.Secondary,0);
  2194. statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
  2195. sequence.ApplyStatement(@statement);
  2196. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2197. wresult := nil;
  2198. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2199. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2200. //Generate updatet tables
  2201. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2202. CheckInf(['a','b','c','hi','k'],@unicodeBook2);
  2203. test12_check_2(unicodeBook2);
  2204. WriteLn(' -- test 2 - ok');
  2205. // --- test 3
  2206. sequence := sequenceClean.Clone();
  2207. statement.Clear();
  2208. SetLength(statement.Reset,1);
  2209. statement.Reset[0] := Ord('a');
  2210. SetLength(statement.Elements,4);
  2211. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
  2212. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
  2213. statement.Elements[2] := TReorderUnit.From([Ord('c'),Ord('i')],TReorderWeigthKind.Secondary,0);
  2214. statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
  2215. sequence.ApplyStatement(@statement);
  2216. WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2217. wresult := nil;
  2218. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2219. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2220. //Generate updatet tables
  2221. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2222. CheckInf(['a','b','c','ci','k'],@unicodeBook2);
  2223. test12_check_3(unicodeBook2);
  2224. WriteLn(' -- test 3 - ok');
  2225. // --- test 4
  2226. sequence := sequenceClean.Clone();
  2227. statement.Clear();
  2228. SetLength(statement.Reset,1);
  2229. statement.Reset[0] := Ord('a');
  2230. SetLength(statement.Elements,5);
  2231. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
  2232. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
  2233. statement.Elements[2] := TReorderUnit.From([Ord('c'),Ord('i')],TReorderWeigthKind.Secondary,0);
  2234. statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
  2235. statement.Elements[4] := TReorderUnit.From([Ord('c'),Ord('s')],TReorderWeigthKind.Primary,0);
  2236. sequence.ApplyStatement(@statement);
  2237. WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2238. wresult := nil;
  2239. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2240. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2241. //Generate updatet tables
  2242. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2243. CheckInf(['a','b','c','ci','k','cs'],@unicodeBook2);
  2244. test12_check_4(unicodeBook2);
  2245. WriteLn(' -- test 4 - ok');
  2246. end;
  2247. //------------------------------------------------------
  2248. procedure test13_prepareWeigth(var AData : TUCA_LineRecArray);
  2249. var
  2250. p : PUCA_LineRec;
  2251. begin
  2252. SetLength(AData,2);
  2253. p := @AData[Low(AData)];
  2254. p^.CodePoints := CodePointToArray(Ord('a'));
  2255. p^.Weights := ToWeight($15EF,$0120,$0002);
  2256. Inc(p);
  2257. p^.CodePoints := CodePointToArray([Ord('b')]);
  2258. p^.Weights := ToWeight($15F0,$0120,$0002);
  2259. end;
  2260. procedure test13_PopulateSequence(var ASequence : TOrderedCharacters);
  2261. var
  2262. i : Integer;
  2263. begin
  2264. ASequence := TOrderedCharacters.Create();
  2265. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  2266. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  2267. for i := 0 to ASequence.ActualLength - 1 do
  2268. ASequence.Data[i].Changed := False;
  2269. end;
  2270. procedure test13_check_1(const ABook : unicodedata.TUCA_DataBook);
  2271. var
  2272. p, pb : PUCA_PropItemRec;
  2273. size, sizeTotal, t: Integer;
  2274. begin
  2275. sizeTotal := 0;
  2276. // for 'b'
  2277. p := ABook.Props;
  2278. pb := p;
  2279. CheckSimpleProps(p,False,True,1,False,True);
  2280. CheckWeigths(p,[]);
  2281. size := SizeOf(TUCA_PropItemRec);
  2282. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2283. t := size;
  2284. sizeTotal:= sizeTotal+size;
  2285. // for 'u' as in 'bu'
  2286. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2287. CheckSimpleProps(p,True,True,0,False,False);
  2288. CheckWeigths(p,[$15F0,0,0, $15F0,0,0]);
  2289. size := SizeOf(TUCA_PropItemRec) +
  2290. SizeOf(UInt24) +
  2291. CalcWeigthSize([$15F0,0,0, $15F0,0,0]);
  2292. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2293. Check(p^.Size = size,'size(u)');
  2294. t := t+size;
  2295. sizeTotal:= sizeTotal+size;
  2296. Check(pb^.Size = t,'size(c)');
  2297. Check(ABook.PropCount = sizeTotal,'size(total)');
  2298. end;
  2299. procedure test13_check_2(const ABook : unicodedata.TUCA_DataBook);
  2300. var
  2301. p, pb : PUCA_PropItemRec;
  2302. size, sizeTotal, t: Integer;
  2303. begin
  2304. sizeTotal := 0;
  2305. // for 'b'
  2306. p := ABook.Props;
  2307. pb := p;
  2308. CheckSimpleProps(p,False,True,1,False,True);
  2309. CheckWeigths(p,[]);
  2310. size := SizeOf(TUCA_PropItemRec);
  2311. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2312. t := size;
  2313. sizeTotal:= sizeTotal+size;
  2314. // for 'u' as in 'bu'
  2315. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2316. CheckSimpleProps(p,True,True,0,False,False);
  2317. CheckWeigths(p,[$15F0,0,0, $15F0,0,0]);
  2318. size := SizeOf(TUCA_PropItemRec) +
  2319. SizeOf(UInt24) +
  2320. CalcWeigthSize([$15F0,0,0, $15F0,0,0]);
  2321. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2322. Check(p^.Size = size,'size(u)');
  2323. t := t+size;
  2324. sizeTotal:= sizeTotal+size;
  2325. Check(pb^.Size = t,'size(c)');
  2326. // for 'c'
  2327. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2328. CheckSimpleProps(p,False,True,0,False,False);
  2329. CheckWeigths(p,[$15F0,0,0, $15F1,0,0]);
  2330. size := SizeOf(TUCA_PropItemRec) +
  2331. CalcWeigthSize([$15F0,0,0, $15F1,0,0]);
  2332. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2333. Check(p^.Size = size,'size(c)');
  2334. sizeTotal:= sizeTotal+size;
  2335. Check(ABook.PropCount = sizeTotal,'size(total)');
  2336. end;
  2337. procedure test13();
  2338. var
  2339. sequence, sequenceClean : TOrderedCharacters;
  2340. statement : TReorderSequence;
  2341. wfirst, wresult : TUCA_LineRecArray;
  2342. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  2343. begin
  2344. statement.Clear();
  2345. test12_prepareWeigth(wfirst);
  2346. test12_PopulateSequence(sequenceClean);
  2347. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  2348. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  2349. //Generate the original tables
  2350. ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
  2351. // --- test 1
  2352. sequence := sequenceClean.Clone();
  2353. statement.Clear();
  2354. SetLength(statement.Elements,1);
  2355. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Deletion,0);
  2356. sequence.ApplyStatement(@statement);
  2357. statement.Clear();
  2358. SetLength(statement.Reset,1);
  2359. statement.Reset[0] := Ord('a');
  2360. SetLength(statement.Elements,1);
  2361. statement.Elements[0] := TReorderUnit.From([Ord('b'),Ord('u')],TReorderWeigthKind.Primary,0);
  2362. sequence.ApplyStatement(@statement);
  2363. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2364. wresult := nil;
  2365. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2366. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2367. //Generate updatet tables
  2368. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2369. CheckInf(['a','bu','b'{because b's weigth is now computed!}],@unicodeBook2);
  2370. test13_check_1(unicodeBook2);
  2371. WriteLn(' -- test 1 - ok');
  2372. // --- test 2
  2373. sequence := sequenceClean.Clone();
  2374. statement.Clear();
  2375. SetLength(statement.Elements,1);
  2376. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Deletion,0);
  2377. sequence.ApplyStatement(@statement);
  2378. statement.Clear();
  2379. SetLength(statement.Reset,2);
  2380. statement.Reset[0] := Ord('a');
  2381. SetLength(statement.Elements,2);
  2382. statement.Elements[0] := TReorderUnit.From([Ord('b'),Ord('u')],TReorderWeigthKind.Primary,0);
  2383. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  2384. sequence.ApplyStatement(@statement);
  2385. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2386. wresult := nil;
  2387. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2388. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2389. //Generate updatet tables
  2390. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2391. CheckInf(['a','bu','c','b'{because b's weigth is now computed!}],@unicodeBook2);
  2392. test13_check_2(unicodeBook2);
  2393. WriteLn(' -- test 2 - ok');
  2394. end;
  2395. //------------------------------------------------------
  2396. procedure test14_prepareWeigth(var AData : TUCA_LineRecArray);
  2397. var
  2398. p : PUCA_LineRec;
  2399. begin
  2400. SetLength(AData,1);
  2401. p := @AData[Low(AData)];
  2402. p^.CodePoints := CodePointToArray(Ord('a'));
  2403. p^.Weights := ToWeight($15EF,$0120,$0002);
  2404. end;
  2405. procedure test14_PopulateSequence(var ASequence : TOrderedCharacters);
  2406. var
  2407. i : Integer;
  2408. begin
  2409. ASequence := TOrderedCharacters.Create();
  2410. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  2411. for i := 0 to ASequence.ActualLength - 1 do
  2412. ASequence.Data[i].Changed := False;
  2413. end;
  2414. procedure test14_check_1(const ABook : unicodedata.TUCA_DataBook);
  2415. var
  2416. p : PUCA_PropItemRec;
  2417. size, sizeTotal: Integer;
  2418. ctx : PUCA_PropItemContextTreeRec;
  2419. ctxItem : PUCA_PropItemContextTreeNodeRec;
  2420. pb : PByte;
  2421. begin
  2422. sizeTotal := 0;
  2423. // for 'b'
  2424. p := ABook.Props;
  2425. pb := PByte(p);
  2426. size := 0;
  2427. CheckSimpleProps(p,True,True,0,True,False);
  2428. size := SizeOf(TUCA_PropItemRec)+SizeOf(UInt24){codepoint};
  2429. CheckWeigths(p,[]);
  2430. ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
  2431. Check(ctx^.Size>0,'ctx^.Size');
  2432. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
  2433. Check(ctxItem<>nil,'ctxItem');
  2434. Check(ctxItem^.Left=0,'ctxItem^.Left');
  2435. Check(ctxItem^.Right=0,'ctxItem^.Right');
  2436. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  2437. Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
  2438. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  2439. Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
  2440. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  2441. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3, $15EF,0,0]);
  2442. size := SizeOf(TUCA_PropItemRec)+
  2443. SizeOf(UInt24){codepoint}+
  2444. SizeOf(TUCA_PropItemContextTreeRec.Size)+
  2445. SizeOf(TUCA_PropItemContextTreeNodeRec) +
  2446. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  2447. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  2448. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2449. sizeTotal:= sizeTotal+size;
  2450. Check(ABook.PropCount = sizeTotal,'size(total)');
  2451. end;
  2452. procedure test14_check_2(const ABook : unicodedata.TUCA_DataBook);
  2453. var
  2454. p : PUCA_PropItemRec;
  2455. size, sizeTotal : Integer;
  2456. ctx : PUCA_PropItemContextTreeRec;
  2457. ctxItem : PUCA_PropItemContextTreeNodeRec;
  2458. pb : PByte;
  2459. begin
  2460. sizeTotal := 0;
  2461. // for 'b'
  2462. p := ABook.Props;
  2463. pb := PByte(p);
  2464. size := 0;
  2465. CheckSimpleProps(p,True,True,0,True,False);
  2466. CheckWeigths(p,[]);
  2467. ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
  2468. Check(ctx^.Size>0,'ctx^.Size');
  2469. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
  2470. Check(ctxItem<>nil,'ctxItem');
  2471. Check(ctxItem^.Left=0,'ctxItem^.Left');
  2472. Check(ctxItem^.Right=0,'ctxItem^.Right');
  2473. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  2474. Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
  2475. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  2476. Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
  2477. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  2478. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3, $15EF,0,0]);
  2479. size := SizeOf(TUCA_PropItemRec)+
  2480. SizeOf(UInt24){codepoint}+
  2481. SizeOf(TUCA_PropItemContextTreeRec.Size)+
  2482. SizeOf(TUCA_PropItemContextTreeNodeRec) +
  2483. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  2484. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  2485. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2486. sizeTotal:= sizeTotal+size;
  2487. // for 'c'
  2488. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2489. CheckSimpleProps(p,False,True,0,False,False);
  2490. CheckWeigths(p,[$15EF,$120,$3, $15F0,0,0]);
  2491. size := SizeOf(TUCA_PropItemRec) +
  2492. CalcWeigthSize([$15EF,$120,$3, $15F0,0,0]);
  2493. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2494. Check(p^.Size = size,'size(u)');
  2495. sizeTotal:= sizeTotal+size;
  2496. Check(ABook.PropCount = sizeTotal,'size(total)');
  2497. end;
  2498. procedure test14_check_3(const ABook : unicodedata.TUCA_DataBook);
  2499. var
  2500. p : PUCA_PropItemRec;
  2501. size, sizeTotal, t: Integer;
  2502. ctx : PUCA_PropItemContextTreeRec;
  2503. ctxItem : PUCA_PropItemContextTreeNodeRec;
  2504. pb : PByte;
  2505. begin
  2506. sizeTotal := 0;
  2507. // for 'b'
  2508. p := ABook.Props;
  2509. pb := PByte(p);
  2510. size := 0;
  2511. CheckSimpleProps(p,True,True,0,True,False);
  2512. CheckWeigths(p,[]);
  2513. ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
  2514. Check(ctx^.Size>0,'ctx^.Size');
  2515. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
  2516. Check(ctxItem<>nil,'ctxItem');
  2517. Check(ctxItem^.Left=0,'ctxItem^.Left');
  2518. Check(ctxItem^.Right<>0,'ctxItem^.Right');
  2519. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  2520. Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
  2521. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  2522. Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
  2523. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  2524. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3, $15EF,0,0]);
  2525. t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
  2526. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  2527. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  2528. Check(ctxItem^.Right = t,'ctxItem^.Right');
  2529. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItem)+t);
  2530. Check(ctxItem^.Left=0,'ctxItem^.Left');
  2531. Check(ctxItem^.Right=0,'ctxItem^.Right');
  2532. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  2533. Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
  2534. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  2535. Check(Cardinal(PUInt24(pb)^)=Ord('f'),'Context CodePoint');
  2536. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  2537. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$4, $15F1,0,0]);
  2538. size := SizeOf(TUCA_PropItemRec)+
  2539. SizeOf(UInt24){codepoint}+
  2540. SizeOf(TUCA_PropItemContextTreeRec.Size)+
  2541. t+
  2542. SizeOf(TUCA_PropItemContextTreeNodeRec) +
  2543. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  2544. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  2545. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2546. sizeTotal:= sizeTotal+size;
  2547. // for 'e'
  2548. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2549. CheckSimpleProps(p,False,True,0,False,False);
  2550. CheckWeigths(p,[$15EF,$120,$3, $15F0,0,0]);
  2551. size := SizeOf(TUCA_PropItemRec) +
  2552. CalcWeigthSize([$15EF,$120,$3, $15F0,0,0]);
  2553. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2554. Check(p^.Size = size,'size(e)');
  2555. sizeTotal:= sizeTotal+size;
  2556. // for 'f'
  2557. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2558. CheckSimpleProps(p,False,True,0,False,False);
  2559. CheckWeigths(p,[$15EF,$120,$3, $15F1,0,0]);
  2560. size := SizeOf(TUCA_PropItemRec) +
  2561. CalcWeigthSize([$15EF,$120,$3, $15F1,0,0]);
  2562. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2563. Check(p^.Size = size,'size(f)');
  2564. sizeTotal:= sizeTotal+size;
  2565. Check(ABook.PropCount = sizeTotal,'size(total)');
  2566. end;
  2567. procedure test14_check_4(const ABook : unicodedata.TUCA_DataBook);
  2568. var
  2569. p : PUCA_PropItemRec;
  2570. size, sizeTotal, t, ctxSize: Integer;
  2571. ctx : PUCA_PropItemContextTreeRec;
  2572. ctxItem, ctxItemParent : PUCA_PropItemContextTreeNodeRec;
  2573. pb : PByte;
  2574. begin
  2575. sizeTotal := 0;
  2576. ctxSize := 0;
  2577. // for 'b'
  2578. p := ABook.Props;
  2579. pb := PByte(p);
  2580. size := 0;
  2581. CheckSimpleProps(p,True,True,0,True,False);
  2582. CheckWeigths(p,[]);
  2583. ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
  2584. Check(ctx^.Size>0,'ctx^.Size');
  2585. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
  2586. ctxItemParent := ctxItem;
  2587. Check(ctxItem<>nil,'ctxItem');
  2588. Check(ctxItem^.Left<>0,'ctxItem^.Left');
  2589. Check(ctxItem^.Right<>0,'ctxItem^.Right');
  2590. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  2591. Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
  2592. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  2593. Check(Cardinal(PUInt24(pb)^)=Ord('f'),'Context CodePoint');
  2594. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  2595. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$4, $15F1,0,0]);
  2596. t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
  2597. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  2598. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  2599. ctxSize := ctxSize+t;
  2600. Check(ctxItem^.Left = t,'ctxItem^.Left');
  2601. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItem)+t);
  2602. Check(ctxItem^.Left=0,'ctxItem^.Left');
  2603. Check(ctxItem^.Right=0,'ctxItem^.Right');
  2604. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  2605. Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
  2606. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  2607. Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
  2608. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  2609. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3, $15EF,0,0]);
  2610. t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
  2611. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  2612. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  2613. ctxSize := ctxSize+t;
  2614. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItemParent)+ctxSize);
  2615. Check(ctxItem^.Left=0,'ctxItem^.Left');
  2616. Check(ctxItem^.Right=0,'ctxItem^.Right');
  2617. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  2618. Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
  2619. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  2620. Check(Cardinal(PUInt24(pb)^)=Ord('h'),'Context CodePoint');
  2621. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  2622. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$121,$6, $15F1,0,0]);
  2623. t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
  2624. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  2625. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  2626. ctxSize := ctxSize+t;
  2627. ctxSize := ctxSize + SizeOf(TUCA_PropItemContextTreeRec.Size);
  2628. Check(ctx^.Size = ctxSize,'ctx^.Size');
  2629. size := SizeOf(TUCA_PropItemRec)+
  2630. SizeOf(UInt24){codepoint}+
  2631. ctxSize;
  2632. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2633. sizeTotal:= sizeTotal+size;
  2634. // for 'e'
  2635. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2636. CheckSimpleProps(p,False,True,0,False,False);
  2637. CheckWeigths(p,[$15EF,$120,$3, $15F0,0,0]);
  2638. size := SizeOf(TUCA_PropItemRec) +
  2639. CalcWeigthSize([$15EF,$120,$3, $15F0,0,0]);
  2640. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2641. Check(p^.Size = size,'size(e)');
  2642. sizeTotal:= sizeTotal+size;
  2643. // for 'f'
  2644. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2645. CheckSimpleProps(p,False,True,0,False,False);
  2646. CheckWeigths(p,[$15EF,$120,$3, $15F1,0,0]);
  2647. size := SizeOf(TUCA_PropItemRec) +
  2648. CalcWeigthSize([$15EF,$120,$3, $15F1,0,0]);
  2649. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2650. Check(p^.Size = size,'size(f)');
  2651. sizeTotal:= sizeTotal+size;
  2652. // for 'g'
  2653. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2654. CheckSimpleProps(p,False,True,0,False,False);
  2655. CheckWeigths(p,[$15EF,$120,$5, $15F1,0,0]);
  2656. size := SizeOf(TUCA_PropItemRec) +
  2657. CalcWeigthSize([$15EF,$120,$5, $15F1,0,0]);
  2658. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2659. Check(p^.Size = size,'size(g)');
  2660. sizeTotal:= sizeTotal+size;
  2661. // for 'h'
  2662. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2663. CheckSimpleProps(p,False,True,0,False,False);
  2664. CheckWeigths(p,[$15EF,$121,$5, $15F1,0,0]);
  2665. size := SizeOf(TUCA_PropItemRec) +
  2666. CalcWeigthSize([$15EF,$121,$5, $15F1,0,0]);
  2667. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2668. Check(p^.Size = size,'size(h)');
  2669. sizeTotal:= sizeTotal+size;
  2670. Check(ABook.PropCount = sizeTotal,'size(total)');
  2671. end;
  2672. procedure test14();
  2673. var
  2674. sequence, sequenceClean : TOrderedCharacters;
  2675. statement : TReorderSequence;
  2676. wfirst, wresult : TUCA_LineRecArray;
  2677. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  2678. begin
  2679. statement.Clear();
  2680. test12_prepareWeigth(wfirst);
  2681. test12_PopulateSequence(sequenceClean);
  2682. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  2683. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  2684. //Generate the original tables
  2685. ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
  2686. // --- test 1
  2687. sequence := sequenceClean.Clone();
  2688. statement.Clear();
  2689. SetLength(statement.Reset,1);
  2690. statement.Reset[0] := Ord('a');
  2691. SetLength(statement.Elements,1);
  2692. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  2693. sequence.ApplyStatement(@statement);
  2694. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2695. wresult := nil;
  2696. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2697. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2698. //Generate updatet tables
  2699. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2700. test14_check_1(unicodeBook2);
  2701. WriteLn(' -- test 1 - ok');
  2702. WriteLn;
  2703. // --- test 2
  2704. sequence := sequenceClean.Clone();
  2705. statement.Clear();
  2706. SetLength(statement.Reset,1);
  2707. statement.Reset[0] := Ord('a');
  2708. SetLength(statement.Elements,2);
  2709. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  2710. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  2711. sequence.ApplyStatement(@statement);
  2712. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2713. wresult := nil;
  2714. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2715. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2716. //Generate updatet tables
  2717. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2718. test14_check_2(unicodeBook2);
  2719. WriteLn(' -- test 2 - ok');
  2720. WriteLn;
  2721. // --- test 3
  2722. sequence := sequenceClean.Clone();
  2723. statement.Clear();
  2724. SetLength(statement.Reset,1);
  2725. statement.Reset[0] := Ord('a');
  2726. SetLength(statement.Elements,2);
  2727. statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
  2728. statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
  2729. sequence.ApplyStatement(@statement);
  2730. statement.Clear();
  2731. SetLength(statement.Reset,1);
  2732. statement.Reset[0] := Ord('a');
  2733. SetLength(statement.Elements,1);
  2734. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  2735. sequence.ApplyStatement(@statement);
  2736. statement.Clear();
  2737. SetLength(statement.Reset,1);
  2738. statement.Reset[0] := Ord('f');
  2739. SetLength(statement.Elements,1);
  2740. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
  2741. sequence.ApplyStatement(@statement);
  2742. WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2743. wresult := nil;
  2744. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2745. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2746. //Generate updatet tables
  2747. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2748. test14_check_3(unicodeBook2);
  2749. WriteLn(' -- test 3 - ok');
  2750. WriteLn;
  2751. // --- test 4
  2752. sequence := sequenceClean.Clone();
  2753. statement.Clear();
  2754. SetLength(statement.Reset,1);
  2755. statement.Reset[0] := Ord('a');
  2756. SetLength(statement.Elements,4);
  2757. statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
  2758. statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
  2759. statement.Elements[2] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  2760. statement.Elements[3] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Secondary,0);
  2761. sequence.ApplyStatement(@statement);
  2762. statement.Clear();
  2763. SetLength(statement.Reset,1);
  2764. statement.Reset[0] := Ord('f');
  2765. SetLength(statement.Elements,1);
  2766. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
  2767. sequence.ApplyStatement(@statement);
  2768. statement.Clear();
  2769. SetLength(statement.Reset,1);
  2770. statement.Reset[0] := Ord('a');
  2771. SetLength(statement.Elements,1);
  2772. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  2773. sequence.ApplyStatement(@statement);
  2774. statement.Clear();
  2775. SetLength(statement.Reset,1);
  2776. statement.Reset[0] := Ord('h');
  2777. SetLength(statement.Elements,1);
  2778. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('h')],TReorderWeigthKind.Tertiary,0);
  2779. sequence.ApplyStatement(@statement);
  2780. WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2781. wresult := nil;
  2782. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2783. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2784. //Generate updatet tables
  2785. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2786. test14_check_4(unicodeBook2);
  2787. WriteLn(' -- test 4 - ok');
  2788. WriteLn;
  2789. end;
  2790. //------------------------------------------------------
  2791. procedure test15_prepareWeigth(var AData : TUCA_LineRecArray);
  2792. var
  2793. p : PUCA_LineRec;
  2794. begin
  2795. SetLength(AData,1);
  2796. p := @AData[Low(AData)];
  2797. p^.CodePoints := CodePointToArray(Ord('a'));
  2798. p^.Weights := ToWeight($15EF,$0120,$0002);
  2799. end;
  2800. procedure test15_PopulateSequence(var ASequence : TOrderedCharacters);
  2801. var
  2802. i : Integer;
  2803. begin
  2804. ASequence := TOrderedCharacters.Create();
  2805. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  2806. for i := 0 to ASequence.ActualLength - 1 do
  2807. ASequence.Data[i].Changed := False;
  2808. end;
  2809. function ConvertEndianFromNative(
  2810. const AData : Pointer;
  2811. const ADataLen : Integer
  2812. ) : Boolean;
  2813. type
  2814. PUCA_PropItemRec = helper.PUCA_PropItemRec;
  2815. var
  2816. s : PUCA_PropItemRec;
  2817. x, y : array of Byte;
  2818. px, py : PUCA_PropItemRec;
  2819. begin
  2820. if (ADataLen <= 0) then
  2821. exit(True);
  2822. s := PUCA_PropItemRec(AData);
  2823. SetLength(x,ADataLen);
  2824. px := PUCA_PropItemRec(@x[0]);
  2825. ReverseFromNativeEndian(s,ADataLen,px);
  2826. SetLength(y,ADataLen);
  2827. py := PUCA_PropItemRec(@y[0]);
  2828. ReverseToNativeEndian(px,ADataLen,py);
  2829. Result := CompareMem(AData,@y[0],Length(x));
  2830. end;
  2831. procedure test15();
  2832. var
  2833. sequence, sequenceClean : TOrderedCharacters;
  2834. statement : TReorderSequence;
  2835. wfirst, wresult : TUCA_LineRecArray;
  2836. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  2837. begin
  2838. statement.Clear();
  2839. test12_prepareWeigth(wfirst);
  2840. test12_PopulateSequence(sequenceClean);
  2841. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  2842. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  2843. //Generate the original tables
  2844. ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
  2845. // --- test 1
  2846. sequence := sequenceClean.Clone();
  2847. SetLength(statement.Reset,1);
  2848. statement.Reset[0] := Ord('a');
  2849. SetLength(statement.Elements,1);
  2850. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  2851. sequence.ApplyStatement(@statement);
  2852. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2853. wresult := nil;
  2854. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2855. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2856. //Generate updatet tables
  2857. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2858. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  2859. WriteLn(' -- test 1 - ok');
  2860. // --- test 2
  2861. sequence := sequenceClean.Clone();
  2862. statement.Clear();
  2863. SetLength(statement.Reset,1);
  2864. statement.Reset[0] := Ord('a');
  2865. SetLength(statement.Elements,1);
  2866. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  2867. sequence.ApplyStatement(@statement);
  2868. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2869. wresult := nil;
  2870. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2871. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2872. //Generate updatet tables
  2873. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2874. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  2875. WriteLn(' -- test 2 - ok');
  2876. WriteLn;
  2877. // --- test 3
  2878. sequence := sequenceClean.Clone();
  2879. statement.Clear();
  2880. SetLength(statement.Reset,1);
  2881. statement.Reset[0] := Ord('a');
  2882. SetLength(statement.Elements,2);
  2883. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  2884. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  2885. sequence.ApplyStatement(@statement);
  2886. WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2887. wresult := nil;
  2888. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2889. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2890. //Generate updatet tables
  2891. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2892. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  2893. WriteLn(' -- test 3 - ok');
  2894. WriteLn;
  2895. // --- test 4
  2896. sequence := sequenceClean.Clone();
  2897. statement.Clear();
  2898. SetLength(statement.Reset,1);
  2899. statement.Reset[0] := Ord('a');
  2900. SetLength(statement.Elements,2);
  2901. statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
  2902. statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
  2903. sequence.ApplyStatement(@statement);
  2904. statement.Clear();
  2905. SetLength(statement.Reset,1);
  2906. statement.Reset[0] := Ord('a');
  2907. SetLength(statement.Elements,1);
  2908. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  2909. sequence.ApplyStatement(@statement);
  2910. statement.Clear();
  2911. SetLength(statement.Reset,1);
  2912. statement.Reset[0] := Ord('f');
  2913. SetLength(statement.Elements,1);
  2914. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
  2915. sequence.ApplyStatement(@statement);
  2916. WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2917. wresult := nil;
  2918. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2919. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2920. //Generate updatet tables
  2921. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2922. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  2923. WriteLn(' -- test 4 - ok');
  2924. WriteLn;
  2925. // --- test 5
  2926. sequence := sequenceClean.Clone();
  2927. statement.Clear();
  2928. SetLength(statement.Reset,1);
  2929. statement.Reset[0] := Ord('a');
  2930. SetLength(statement.Elements,4);
  2931. statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
  2932. statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
  2933. statement.Elements[2] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  2934. statement.Elements[3] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Secondary,0);
  2935. sequence.ApplyStatement(@statement);
  2936. statement.Clear();
  2937. SetLength(statement.Reset,1);
  2938. statement.Reset[0] := Ord('f');
  2939. SetLength(statement.Elements,1);
  2940. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
  2941. sequence.ApplyStatement(@statement);
  2942. statement.Clear();
  2943. SetLength(statement.Reset,1);
  2944. statement.Reset[0] := Ord('a');
  2945. SetLength(statement.Elements,1);
  2946. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  2947. sequence.ApplyStatement(@statement);
  2948. statement.Clear();
  2949. SetLength(statement.Reset,1);
  2950. statement.Reset[0] := Ord('h');
  2951. SetLength(statement.Elements,1);
  2952. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('h')],TReorderWeigthKind.Tertiary,0);
  2953. sequence.ApplyStatement(@statement);
  2954. WriteLn(' Statement #5 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2955. wresult := nil;
  2956. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2957. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2958. //Generate updatet tables
  2959. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2960. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  2961. WriteLn(' -- test 5 - ok');
  2962. WriteLn;
  2963. // --- test 6
  2964. sequence := sequenceClean.Clone();
  2965. statement.Clear();
  2966. SetLength(statement.Reset,1);
  2967. statement.Reset[0] := Ord('a');
  2968. SetLength(statement.Elements,2);
  2969. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
  2970. statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
  2971. sequence.ApplyStatement(@statement);
  2972. WriteLn(' Statement #6 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2973. wresult := nil;
  2974. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2975. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2976. //Generate updatet tables
  2977. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2978. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  2979. WriteLn(' -- test 6 - ok');
  2980. WriteLn;
  2981. // --- test 7
  2982. sequence := sequenceClean.Clone();
  2983. statement.Clear();
  2984. SetLength(statement.Reset,1);
  2985. statement.Reset[0] := Ord('a');
  2986. SetLength(statement.Elements,3);
  2987. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
  2988. statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
  2989. statement.Elements[2] := TReorderUnit.From(Ord('e'),[Ord('a'),Ord('d')],TReorderWeigthKind.Identity,0);
  2990. sequence.ApplyStatement(@statement);
  2991. WriteLn(' Statement #7 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2992. wresult := nil;
  2993. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2994. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2995. //Generate updatet tables
  2996. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2997. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  2998. WriteLn(' -- test 7 - ok');
  2999. WriteLn;
  3000. // --- test 8
  3001. sequence := sequenceClean.Clone();
  3002. statement.Clear();
  3003. SetLength(statement.Reset,1);
  3004. statement.Reset[0] := Ord('a');
  3005. SetLength(statement.Elements,3);
  3006. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3007. statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('x')],TReorderWeigthKind.Primary,0);
  3008. statement.Elements[2] := TReorderUnit.From([Ord('e'),Ord('a'),Ord('r')],[Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
  3009. sequence.ApplyStatement(@statement);
  3010. WriteLn(' Statement #8 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3011. wresult := nil;
  3012. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3013. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3014. //Generate updatet tables
  3015. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3016. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  3017. WriteLn(' -- test 8 - ok');
  3018. WriteLn;
  3019. end;
  3020. end.