cldrtest.pas 226 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206
  1. { CLDR collation Algorithm test routines.
  2. Copyright (c) 2013-2015 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. unicodeset, helper, cldrhelper, unicodedata, cldrtxt, cldrxml;
  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(const APropagateException : Boolean = True);
  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. procedure test16a();
  51. procedure test16b();
  52. procedure test16c();
  53. procedure test16d();
  54. procedure test16e();
  55. procedure test17a();
  56. procedure test17b();
  57. procedure test17c();
  58. procedure test_parser_1();
  59. procedure test_parser_2();
  60. procedure test_parser_3();
  61. procedure test_parser_4();
  62. procedure test_parser_5();
  63. procedure test_parser_6();
  64. procedure test_parser_7();
  65. procedure test_parser_8();
  66. procedure test_parser_9();
  67. procedure test_parser_abreviating_1();
  68. procedure test_parser_abreviating_2();
  69. procedure test_parser_abreviating_3();
  70. procedure test_parser_abreviating_4();
  71. procedure test_parser_abreviating_5();
  72. procedure test_parser_abreviating_6();
  73. procedure test_parser_abreviating_7();
  74. procedure test_parser_abreviating_8();
  75. procedure test_parser_abreviating_9();
  76. procedure test_parser_abreviating_10();
  77. procedure test_parser_contraction_1();
  78. procedure test_parser_contraction_2();
  79. procedure test_parser_expansion_1();
  80. procedure test_parser_special_char_1();
  81. procedure test_parser_special_char_2();
  82. procedure test_parser_special_char_3();
  83. procedure test_parser_special_char_4();
  84. procedure test_parser_special_char_5();
  85. procedure test_parser_special_char_6();
  86. procedure test_parser_special_char_7();
  87. procedure test_parser_special_char_8();
  88. procedure test_parser_special_char_9();
  89. procedure test_parser_skip_comment_1();
  90. procedure test_parser_skip_comment_2();
  91. procedure test_parser_skip_comment_3();
  92. procedure test_parser_quoted_string_1();
  93. procedure test_parser_quoted_string_2();
  94. procedure test_parser_quoted_string_3();
  95. procedure test_parser_quoted_string_4();
  96. procedure test_parser_quoted_string_5();
  97. procedure test_parser_quoted_string_6();
  98. procedure test_parser_quoted_string_7();
  99. procedure test_parser_quoted_string_8();
  100. procedure test_parser_contexte_before_1();
  101. procedure test_parser_contexte_before_2();
  102. procedure test_parser_contexte_before_3();
  103. procedure test_parser_contexte_before_4();
  104. procedure test_parser_placement_before_1();
  105. procedure test_parser_placement_before_2();
  106. procedure test_parser_placement_before_3();
  107. procedure test_parser_multi_unit_statement_line_1();
  108. procedure test_parser_multi_unit_statement_line_2();
  109. procedure test_parser_multi_unit_statement_line_3();
  110. procedure test_parser_multi_statement_line_1();
  111. procedure test_parser_multi_statement_line_2();
  112. procedure test_parser_multi_statement_line_3();
  113. procedure test_parser_multi_statement_line_4();
  114. procedure test_parser_multi_line_statements_1();
  115. procedure test_parser_setting_1();
  116. procedure test_parser_setting_2();
  117. procedure test_parser_setting_3();
  118. procedure test_parser_setting_4();
  119. procedure test_parser_setting_5();
  120. procedure test_parser_setting_6();
  121. procedure test_parser_setting_7();
  122. procedure test_parser_setting_8();
  123. procedure test_parser_setting_multi_statement_1();
  124. procedure test_parser_setting_multi_statement_2();
  125. procedure test_parser_setting_multi_statement_3();
  126. procedure test_parser_setting_multi_statement_4();
  127. procedure test_parser_setting_unicodeset_1();
  128. procedure test_parser_setting_unicodeset_2();
  129. procedure test_parser_setting_unicodeset_3();
  130. procedure test_parser_setting_unicodeset_4();
  131. procedure test_collation_parser_HeaderParsing();
  132. procedure test_collation_parser_HeaderParsing_2();
  133. procedure test_collation_parser_FullParsing();
  134. procedure test_collation_parser_FullParsing_2();
  135. procedure test_collation_parser_complete_rules();
  136. procedure test_collation_parser_complete_rules_2();
  137. procedure test_unicode_set_1();
  138. procedure test_unicode_set_2();
  139. procedure test_unicode_set_3();
  140. const
  141. UNICODE_LINE_BREAK = #10;
  142. implementation
  143. uses
  144. typinfo;
  145. function ComputeWeigths(
  146. const AData : PReorderUnit;
  147. const ADataLen : Integer;
  148. const ADataWeigths : TUCA_LineRecArray;
  149. out AResult : TUCA_LineRecArray
  150. ) : Integer;
  151. begin
  152. Result := cldrhelper.ComputeWeigths(AData,ADataLen,ADataWeigths,[],AResult);
  153. end;
  154. function inner_do_exec_test(
  155. ATest : TProcedure;
  156. const APropagateException : Boolean
  157. ) : Boolean;
  158. begin
  159. Result := False;
  160. if APropagateException then begin
  161. ATest();
  162. Result := True;
  163. end else begin
  164. try
  165. ATest();
  166. Result := True;
  167. except
  168. on e : Exception do begin
  169. writeln('Failure:');
  170. writeln(e.Message);
  171. end;
  172. end;
  173. end;
  174. end;
  175. procedure exec_utils_tests(
  176. const APropagateException : Boolean;
  177. out ATotal,
  178. AErrors : Integer
  179. );
  180. procedure do_exec_test(
  181. ATest : TProcedure;
  182. const APropagateException : Boolean
  183. );
  184. begin
  185. ATotal := ATotal+1;
  186. if not inner_do_exec_test(ATest,APropagateException) then
  187. AErrors := AErrors+1;
  188. end;
  189. begin
  190. ATotal := 0;
  191. AErrors := 0;
  192. WriteLn;WriteLn;WriteLn;WriteLn;
  193. WriteLn('UTILITIES TESTS - START');
  194. WriteLn('***************************** TEST UNICODESET 1 ******************');
  195. do_exec_test(@test_unicode_set_1,APropagateException);
  196. WriteLn;
  197. WriteLn('***************************** TEST UNICODESET 2 ******************');
  198. do_exec_test(@test_unicode_set_2,APropagateException);
  199. WriteLn;
  200. WriteLn('***************************** TEST UNICODESET 3 ******************');
  201. do_exec_test(@test_unicode_set_3,APropagateException);
  202. WriteLn;
  203. WriteLn('UTILITIES TESTS - START');
  204. WriteLn;
  205. WriteLn;
  206. end;
  207. procedure exec_parser_tests(
  208. const APropagateException : Boolean;
  209. out ATotal,
  210. AErrors : Integer
  211. );
  212. procedure do_exec_test(
  213. ATest : TProcedure;
  214. const APropagateException : Boolean
  215. );
  216. begin
  217. ATotal := ATotal+1;
  218. if not inner_do_exec_test(ATest,APropagateException) then
  219. AErrors := AErrors+1;
  220. end;
  221. begin
  222. ATotal := 0;
  223. AErrors := 0;
  224. WriteLn;WriteLn;WriteLn;WriteLn;
  225. WriteLn('PARSER TESTS');
  226. WriteLn('***************************** TEST PARSER 1 ******************');
  227. do_exec_test(@test_parser_1,APropagateException);
  228. WriteLn;
  229. WriteLn('***************************** TEST PARSER 2 ******************');
  230. do_exec_test(@test_parser_2,APropagateException);
  231. WriteLn;
  232. WriteLn('***************************** TEST PARSER 3 ******************');
  233. do_exec_test(@test_parser_3,APropagateException);
  234. WriteLn;
  235. WriteLn('***************************** TEST PARSER 4 ******************');
  236. do_exec_test(@test_parser_4,APropagateException);
  237. WriteLn;
  238. WriteLn('***************************** TEST PARSER 5 ******************');
  239. do_exec_test(@test_parser_5,APropagateException);
  240. WriteLn;
  241. WriteLn('***************************** TEST PARSER 6 ******************');
  242. do_exec_test(@test_parser_6,APropagateException);
  243. WriteLn;
  244. WriteLn('***************************** TEST PARSER 7 ******************');
  245. do_exec_test(@test_parser_7,APropagateException);
  246. WriteLn;
  247. WriteLn('***************************** TEST PARSER 8 ******************');
  248. do_exec_test(@test_parser_7,APropagateException);
  249. WriteLn;
  250. WriteLn('***************************** TEST PARSER 9 ******************');
  251. do_exec_test(@test_parser_9,APropagateException);
  252. WriteLn;
  253. WriteLn;
  254. WriteLn('***************************** TEST ABREVIATING 1 ******************');
  255. do_exec_test(@test_parser_abreviating_1,APropagateException);
  256. WriteLn;
  257. WriteLn('***************************** TEST ABREVIATING 2 ******************');
  258. do_exec_test(@test_parser_abreviating_2,APropagateException);
  259. WriteLn;
  260. WriteLn('***************************** TEST ABREVIATING 3 ******************');
  261. do_exec_test(@test_parser_abreviating_3,APropagateException);
  262. WriteLn;
  263. WriteLn('***************************** TEST ABREVIATING 4 ******************');
  264. do_exec_test(@test_parser_abreviating_4,APropagateException);
  265. WriteLn;
  266. WriteLn('***************************** TEST ABREVIATING 5 ******************');
  267. do_exec_test(@test_parser_abreviating_5,APropagateException);
  268. WriteLn;
  269. WriteLn('***************************** TEST ABREVIATING 6 ******************');
  270. do_exec_test(@test_parser_abreviating_6,APropagateException);
  271. WriteLn;
  272. WriteLn('***************************** TEST ABREVIATING 7 ******************');
  273. do_exec_test(@test_parser_abreviating_7,APropagateException);
  274. WriteLn;
  275. WriteLn('***************************** TEST ABREVIATING 8 ******************');
  276. do_exec_test(@test_parser_abreviating_8,APropagateException);
  277. WriteLn;
  278. WriteLn('***************************** TEST ABREVIATING 9 ******************');
  279. do_exec_test(@test_parser_abreviating_9,APropagateException);
  280. WriteLn;
  281. WriteLn;
  282. WriteLn('***************************** TEST ABREVIATING 10 ******************');
  283. do_exec_test(@test_parser_abreviating_10,APropagateException);
  284. WriteLn;
  285. WriteLn('***************************** TEST CONTRACTION 1 ******************');
  286. do_exec_test(@test_parser_contraction_1,APropagateException);
  287. WriteLn;
  288. WriteLn('***************************** TEST CONTRACTION 2 ******************');
  289. do_exec_test(@test_parser_contraction_2,APropagateException);
  290. WriteLn;
  291. WriteLn('***************************** TEST EXPANSION 1 ******************');
  292. do_exec_test(@test_parser_expansion_1,APropagateException);
  293. WriteLn;
  294. WriteLn('***************************** TEST SPECIAL CHAR 1 ******************');
  295. do_exec_test(@test_parser_special_char_1,APropagateException);
  296. WriteLn;
  297. WriteLn('***************************** TEST SPECIAL CHAR 2 ******************');
  298. do_exec_test(@test_parser_special_char_2,APropagateException);
  299. WriteLn;
  300. WriteLn('***************************** TEST SPECIAL CHAR 3 ******************');
  301. do_exec_test(@test_parser_special_char_3,APropagateException);
  302. WriteLn;
  303. WriteLn('***************************** TEST SPECIAL CHAR 4 ******************');
  304. do_exec_test(@test_parser_special_char_4,APropagateException);
  305. WriteLn;
  306. WriteLn('***************************** TEST SPECIAL CHAR 5 ******************');
  307. do_exec_test(@test_parser_special_char_5,APropagateException);
  308. WriteLn;
  309. WriteLn('***************************** TEST SPECIAL CHAR 6 ******************');
  310. do_exec_test(@test_parser_special_char_6,APropagateException);
  311. WriteLn;
  312. WriteLn('***************************** TEST SPECIAL CHAR 7 ******************');
  313. do_exec_test(@test_parser_special_char_7,APropagateException);
  314. WriteLn;
  315. WriteLn('***************************** TEST SPECIAL CHAR 8 ******************');
  316. do_exec_test(@test_parser_special_char_8,APropagateException);
  317. WriteLn;
  318. WriteLn('***************************** TEST SPECIAL CHAR 9 ******************');
  319. do_exec_test(@test_parser_special_char_9,APropagateException);
  320. WriteLn;
  321. WriteLn('***************************** TEST SKIP COMMENT 1 ******************');
  322. do_exec_test(@test_parser_skip_comment_1,APropagateException);
  323. WriteLn;
  324. WriteLn('***************************** TEST SKIP COMMENT 2 ******************');
  325. do_exec_test(@test_parser_skip_comment_2,APropagateException);
  326. WriteLn;
  327. WriteLn('***************************** TEST SKIP COMMENT 3 ******************');
  328. do_exec_test(@test_parser_skip_comment_3,APropagateException);
  329. WriteLn;
  330. WriteLn('***************************** TEST QUOTED STRING 1 ******************');
  331. do_exec_test(@test_parser_quoted_string_1,APropagateException);
  332. WriteLn;
  333. WriteLn('***************************** TEST QUOTED STRING 2 ******************');
  334. do_exec_test(@test_parser_quoted_string_2,APropagateException);
  335. WriteLn;
  336. WriteLn('***************************** TEST QUOTED STRING 3 ******************');
  337. do_exec_test(@test_parser_quoted_string_3,APropagateException);
  338. WriteLn;
  339. WriteLn('***************************** TEST QUOTED STRING 4 ******************');
  340. do_exec_test(@test_parser_quoted_string_4,APropagateException);
  341. WriteLn;
  342. WriteLn('***************************** TEST QUOTED STRING 5 ******************');
  343. do_exec_test(@test_parser_quoted_string_5,APropagateException);
  344. WriteLn;
  345. WriteLn('***************************** TEST QUOTED STRING 6 ******************');
  346. do_exec_test(@test_parser_quoted_string_6,APropagateException);
  347. WriteLn;
  348. WriteLn('***************************** TEST QUOTED STRING 7 ******************');
  349. do_exec_test(@test_parser_quoted_string_7,APropagateException);
  350. WriteLn;
  351. WriteLn('***************************** TEST QUOTED STRING 8 ******************');
  352. do_exec_test(@test_parser_quoted_string_8,APropagateException);
  353. WriteLn;
  354. WriteLn('***************************** TEST CONTEXT BEFORE 1 ******************');
  355. do_exec_test(@test_parser_contexte_before_1,APropagateException);
  356. WriteLn;
  357. WriteLn('***************************** TEST CONTEXT BEFORE 2 ******************');
  358. do_exec_test(@test_parser_contexte_before_2,APropagateException);
  359. WriteLn;
  360. WriteLn('***************************** TEST CONTEXT BEFORE 3 ******************');
  361. do_exec_test(@test_parser_contexte_before_3,APropagateException);
  362. WriteLn;
  363. WriteLn('***************************** TEST CONTEXT BEFORE 4 ******************');
  364. do_exec_test(@test_parser_contexte_before_4,APropagateException);
  365. WriteLn;
  366. WriteLn('***************************** TEST PLACEMENT BEFORE 1 ******************');
  367. do_exec_test(@test_parser_placement_before_1,APropagateException);
  368. WriteLn;
  369. WriteLn('***************************** TEST PLACEMENT BEFORE 2 ******************');
  370. do_exec_test(@test_parser_placement_before_2,APropagateException);
  371. WriteLn;
  372. WriteLn('***************************** TEST PLACEMENT BEFORE 3 ******************');
  373. do_exec_test(@test_parser_placement_before_3,APropagateException);
  374. WriteLn;
  375. WriteLn('***************************** TEST MULTI UNIT STATEMENT LINE 1 ******************');
  376. do_exec_test(@test_parser_multi_unit_statement_line_1,APropagateException);
  377. WriteLn;
  378. WriteLn('***************************** TEST MULTI UNIT STATEMENT LINE 2 ******************');
  379. do_exec_test(@test_parser_multi_unit_statement_line_2,APropagateException);
  380. WriteLn;
  381. WriteLn('***************************** TEST MULTI UNIT STATEMENT LINE 3 ******************');
  382. do_exec_test(@test_parser_multi_unit_statement_line_3,APropagateException);
  383. WriteLn;
  384. WriteLn('***************************** TEST MULTI STATEMENT LINE 1 ******************');
  385. do_exec_test(@test_parser_multi_statement_line_1,APropagateException);
  386. WriteLn;
  387. WriteLn('***************************** TEST MULTI STATEMENT LINE 2 ******************');
  388. do_exec_test(@test_parser_multi_statement_line_2,APropagateException);
  389. WriteLn;
  390. WriteLn('***************************** TEST MULTI STATEMENT LINE 3 ******************');
  391. do_exec_test(@test_parser_multi_statement_line_3,APropagateException);
  392. WriteLn;
  393. WriteLn('***************************** TEST MULTI STATEMENT LINE 4 ******************');
  394. do_exec_test(@test_parser_multi_statement_line_4,APropagateException);
  395. WriteLn;
  396. WriteLn('***************************** TEST MULTI LINE STATEMENTS 1 ******************');
  397. do_exec_test(@test_parser_multi_line_statements_1,APropagateException);
  398. WriteLn;
  399. WriteLn('***************************** TEST SETTING STATEMENT 1 ******************');
  400. do_exec_test(@test_parser_setting_1,APropagateException);
  401. WriteLn;
  402. WriteLn('***************************** TEST SETTING STATEMENT 2 ******************');
  403. do_exec_test(@test_parser_setting_2,APropagateException);
  404. WriteLn;
  405. WriteLn('***************************** TEST SETTING STATEMENT 3 ******************');
  406. do_exec_test(@test_parser_setting_3,APropagateException);
  407. WriteLn;
  408. WriteLn('***************************** TEST SETTING STATEMENT 4 ******************');
  409. do_exec_test(@test_parser_setting_4,APropagateException);
  410. WriteLn;
  411. WriteLn('***************************** TEST SETTING STATEMENT 5 ******************');
  412. do_exec_test(@test_parser_setting_5,APropagateException);
  413. WriteLn;
  414. WriteLn('***************************** TEST SETTING STATEMENT 6 ******************');
  415. do_exec_test(@test_parser_setting_6,APropagateException);
  416. WriteLn;
  417. WriteLn('***************************** TEST SETTING STATEMENT 7 ******************');
  418. do_exec_test(@test_parser_setting_7,APropagateException);
  419. WriteLn;
  420. WriteLn('***************************** TEST SETTING STATEMENT 8 ******************');
  421. do_exec_test(@test_parser_setting_8,APropagateException);
  422. WriteLn;
  423. WriteLn('***************************** TEST SETTING MULTI STATEMENT 1 ******************');
  424. do_exec_test(@test_parser_setting_multi_statement_1,APropagateException);
  425. WriteLn;
  426. WriteLn('***************************** TEST SETTING MULTI STATEMENT 2 ******************');
  427. do_exec_test(@test_parser_setting_multi_statement_2,APropagateException);
  428. WriteLn;
  429. WriteLn('***************************** TEST SETTING MULTI STATEMENT 3 ******************');
  430. do_exec_test(@test_parser_setting_multi_statement_3,APropagateException);
  431. WriteLn;
  432. WriteLn('***************************** TEST SETTING MULTI STATEMENT 4 ******************');
  433. do_exec_test(@test_parser_setting_multi_statement_4,APropagateException);
  434. WriteLn;
  435. WriteLn('***************************** TEST SETTING UNICODE SET 1 ******************');
  436. do_exec_test(@test_parser_setting_unicodeset_1,APropagateException);
  437. WriteLn;
  438. WriteLn('***************************** TEST SETTING UNICODE SET 2 ******************');
  439. do_exec_test(@test_parser_setting_unicodeset_2,APropagateException);
  440. WriteLn;
  441. WriteLn('***************************** TEST SETTING UNICODE SET 3 ******************');
  442. do_exec_test(@test_parser_setting_unicodeset_3,APropagateException);
  443. WriteLn;
  444. WriteLn('***************************** TEST SETTING UNICODE SET 4 ******************');
  445. do_exec_test(@test_parser_setting_unicodeset_4,APropagateException);
  446. WriteLn;
  447. WriteLn;
  448. WriteLn('***************************** TEST REPOSITORY 1 ******************');
  449. do_exec_test(@test_collation_parser_HeaderParsing,APropagateException);
  450. WriteLn;
  451. WriteLn('***************************** TEST REPOSITORY 2 ******************');
  452. do_exec_test(@test_collation_parser_FullParsing,APropagateException);
  453. WriteLn;
  454. WriteLn('***************************** TEST REPOSITORY 3 ******************');
  455. do_exec_test(@test_collation_parser_complete_rules,APropagateException);
  456. WriteLn;
  457. WriteLn('***************************** TEST REPOSITORY 4 ******************');
  458. do_exec_test(@test_collation_parser_HeaderParsing_2,APropagateException);
  459. WriteLn;
  460. WriteLn('***************************** TEST REPOSITORY 5 ******************');
  461. do_exec_test(@test_collation_parser_FullParsing_2,APropagateException);
  462. WriteLn;
  463. WriteLn('***************************** TEST REPOSITORY 6 ******************');
  464. do_exec_test(@test_collation_parser_complete_rules_2,APropagateException);
  465. WriteLn;
  466. WriteLn;
  467. WriteLn;
  468. WriteLn('END PARSER TESTS');
  469. WriteLn('*******************************************************');
  470. end;
  471. procedure exec_basic_tests(
  472. const APropagateException : Boolean;
  473. out ATotal,
  474. AErrors : Integer
  475. );
  476. procedure do_exec_test(
  477. ATest : TProcedure;
  478. const APropagateException : Boolean
  479. );
  480. begin
  481. ATotal := ATotal+1;
  482. if not inner_do_exec_test(ATest,APropagateException) then
  483. AErrors := AErrors+1;
  484. end;
  485. begin
  486. ATotal := 0;
  487. AErrors := 0;
  488. WriteLn('***************************** TEST 1 ******************');
  489. do_exec_test(@test1,APropagateException);
  490. WriteLn('***************************** TEST 2 ******************');
  491. do_exec_test(@test2,APropagateException);
  492. WriteLn('***************************** TEST 3 ******************');
  493. do_exec_test(@test3,APropagateException);
  494. WriteLn('***************************** TEST 4 ******************');
  495. do_exec_test(@test4,APropagateException);
  496. WriteLn('***************************** TEST 5 ******************');
  497. do_exec_test(@test5,APropagateException);
  498. WriteLn('***************************** TEST 6 ******************');
  499. do_exec_test(@test6,APropagateException);
  500. WriteLn('***************************** TEST 7 ******************');
  501. do_exec_test(@test7,APropagateException);
  502. WriteLn('***************************** TEST 8 ******************');
  503. do_exec_test(@test8,APropagateException);
  504. WriteLn('***************************** TEST 9 ******************');
  505. do_exec_test(@test9,APropagateException);
  506. WriteLn('***************************** TEST 10 ******************');
  507. do_exec_test(@test10,APropagateException);
  508. WriteLn('***************************** TEST 11 ******************');
  509. do_exec_test(@test11,APropagateException);
  510. WriteLn('***************************** TEST 12 ******************');
  511. do_exec_test(@test12,APropagateException);
  512. WriteLn('***************************** TEST 13 ******************');
  513. do_exec_test(@test13,APropagateException);
  514. WriteLn('***************************** TEST 14 ******************');
  515. do_exec_test(@test14,APropagateException);
  516. WriteLn('***************************** TEST 15 ******************');
  517. do_exec_test(@test15,APropagateException);
  518. WriteLn('***************************** TEST 16 A ******************');
  519. do_exec_test(@test16a,APropagateException);
  520. WriteLn('***************************** TEST 16 B ******************');
  521. do_exec_test(@test16b,APropagateException);
  522. WriteLn('***************************** TEST 16 C ******************');
  523. do_exec_test(@test16c,APropagateException);
  524. WriteLn('***************************** TEST 16 D ******************');
  525. do_exec_test(@test16d,APropagateException);
  526. WriteLn('***************************** TEST 16 E ******************');
  527. do_exec_test(@test16e,APropagateException);
  528. WriteLn('***************************** TEST 17 A ******************');
  529. do_exec_test(@test17a,APropagateException);
  530. WriteLn('***************************** TEST 17 B ******************');
  531. do_exec_test(@test17b,APropagateException);
  532. WriteLn('***************************** TEST 17 C ******************');
  533. do_exec_test(@test17c,APropagateException);
  534. end;
  535. procedure exec_tests(const APropagateException : Boolean);
  536. var
  537. total, errors, t, e : Integer;
  538. begin
  539. total := 0;
  540. errors := 0;
  541. exec_utils_tests(APropagateException,t,e);
  542. total := total+t;
  543. errors := errors+e;
  544. exec_parser_tests(APropagateException,t,e);
  545. total := total+t;
  546. errors := errors+e;
  547. exec_basic_tests(APropagateException,t,e);
  548. total := total+t;
  549. errors := errors+e;
  550. WriteLn('**** END TESTS',sLineBreak,sLineBreak);
  551. WriteLn('------------------ RESULTS => START ------------------------------');
  552. WriteLn(Format(' %d Total tests',[total]));
  553. WriteLn(Format(' %d tests failed',[errors]));
  554. WriteLn('------------------ RESULTS => END ------------------------------');
  555. end;
  556. function ToAnsiChars(const AValue : array of TUnicodeCodePoint) : string;
  557. var
  558. i : Integer;
  559. s : string;
  560. begin
  561. Result := '';
  562. for i := Low(AValue) to High(AValue) do begin
  563. if (AValue[i] <= 127) then
  564. Result := Result + AnsiChar(AValue[i])
  565. else
  566. begin
  567. s := Format('%x',[AValue[i]]);
  568. if (Length(s) < 4) then
  569. s := StringOfChar('0',4-Length(s)) + s;
  570. Result := Result + '$' + s;
  571. end;
  572. end;
  573. end;
  574. function DumpSequenceAnsi(const ASequence : TOrderedCharacters) : string;
  575. var
  576. i : Integer;
  577. s : string;
  578. p : PReorderUnit;
  579. begin
  580. s := '';
  581. if (ASequence.ActualLength < 1) then
  582. exit;
  583. p := @ASequence.Data[0];
  584. i := 0;
  585. while (i < ASequence.ActualLength) do begin
  586. if (p^.WeigthKind <> TReorderWeigthKind.Deletion) then
  587. Break;
  588. WriteStr(s,s, ' ',ToAnsiChars(p^.Characters),'- ');
  589. Inc(p);
  590. Inc(i);
  591. end;
  592. if (i < ASequence.ActualLength) then begin
  593. s := s + ' ' + ToAnsiChars(p^.Characters) + ' ';
  594. Inc(i);
  595. Inc(p);
  596. for i := i to ASequence.ActualLength - 1 do begin
  597. //WriteStr(s,s,AnsiChar(p^.Characters[0]),' <',(1+Ord(p^.WeigthKind)),' ');
  598. if p^.IsVirtual() then
  599. WriteStr(s,s,' [',GetEnumName(TypeInfo(TReorderLogicalReset),Ord(p^.VirtualPosition)),'] ')
  600. else
  601. WriteStr(s,s,'<',(1+Ord(p^.WeigthKind)),' ',ToAnsiChars(p^.Characters));
  602. if (Length(p^.Context) > 0) then
  603. WriteStr(s,s,'[',ToAnsiChars(p^.Context),']');
  604. WriteStr(s,s,' ');
  605. Inc(p);
  606. end;
  607. end;
  608. Result := s;
  609. end;
  610. function DumpWeigth(const AItem : TUCA_WeightRec) : string;overload;
  611. var
  612. r : string;
  613. begin
  614. r := '[';
  615. if AItem.Variable then
  616. r := r + '*'
  617. else
  618. r := r + '.';
  619. r := r + Format('%x.%x.%x',[AItem.Weights[0],AItem.Weights[1],AItem.Weights[2]]);
  620. r := r + ']';
  621. Result := r;
  622. end;
  623. function DumpWeigth(const AItems : array of TUCA_WeightRec) : string;
  624. var
  625. r : string;
  626. i : Integer;
  627. begin
  628. r := '';
  629. for i := 0 to Length(AItems) - 1 do
  630. r := r + ' ' +DumpWeigth(AItems[i]);
  631. Result := Trim(r);
  632. end;
  633. function DumpKey(const AItem : TUCASortKey) : string;
  634. var
  635. i : Integer;
  636. r : string;
  637. begin
  638. r := '';
  639. for i := Low(AItem) to High(AItem) do
  640. r := Trim(r) + ' ' + Format('%4x',[AItem[i]]);
  641. Result := r;
  642. end;
  643. function DumpLine(ALine : TUCA_LineRec) : string;
  644. var
  645. i : Integer;
  646. r : string;
  647. ctxItem : TUCA_LineContextItemRec;
  648. begin
  649. r := '';
  650. if ALine.HasContext() then begin
  651. r := r + '*';
  652. for i := 0 to Length(ALine.Context.Data) - 1 do begin
  653. ctxItem := ALine.Context.Data[i];
  654. r := r + sLineBreak +
  655. ' ' + ToAnsiChars(ctxItem.CodePoints) + ' => ' + DumpWeigth(ctxItem.Weights);
  656. end;
  657. r := r + sLineBreak + ' ';
  658. end;
  659. if (Length(ALine.Weights) = 0) then begin
  660. r := r + '[]';
  661. end else begin
  662. for i := Low(ALine.Weights) to High(ALine.Weights) do
  663. r := r + DumpWeigth(ALine.Weights[i]);
  664. end;
  665. Result := Format('%s %s',[ToAnsiChars(ALine.CodePoints),r]);
  666. end;
  667. function DumpLines(ALines : TUCA_LineRecArray) : string;
  668. var
  669. i : Integer;
  670. r : string;
  671. begin
  672. r := '';
  673. for i := Low(ALines) to High(ALines) do
  674. r := r + ' ' + DumpLine(ALines[i]) + sLineBreak;
  675. Result := r;
  676. end;
  677. function CodePointToArray(const ACodePoint : TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
  678. begin
  679. SetLength(Result,1);
  680. Result[0] := ACodePoint;
  681. end;
  682. function CodePointToArray(const ACodePoints : array of TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
  683. var
  684. i : Integer;
  685. begin
  686. SetLength(Result,Length(ACodePoints));
  687. for i := 0 to length(ACodePoints) - 1 do
  688. Result[i] := ACodePoints[i];
  689. end;
  690. function ToWeight(const APrimary, ASecondary, ATertiary : Cardinal) : TUCA_WeightRecArray;overload;
  691. begin
  692. SetLength(Result,1);
  693. Result[0].Weights[0] := APrimary;
  694. Result[0].Weights[1] := ASecondary;
  695. Result[0].Weights[2] := ATertiary;
  696. Result[0].Weights[3] := 0;
  697. end;
  698. function ToWeight(const AWeigths : array of Cardinal) : TUCA_WeightRecArray;overload;
  699. var
  700. i, k, c : Integer;
  701. begin
  702. c := Length(AWeigths);
  703. SetLength(Result,(c div 3));
  704. k := 0;
  705. for i := 0 to (c div 3) - 1 do begin
  706. Result[i].Weights[0] := AWeigths[k+0];
  707. Result[i].Weights[1] := AWeigths[k+1];
  708. Result[i].Weights[2] := AWeigths[k+2];
  709. Result[i].Weights[3] := 0;
  710. k := k + 3;
  711. end;
  712. end;
  713. procedure constructPropBook(
  714. var ABook : unicodedata.TUCA_DataBook;
  715. const AFirstTable : TucaBmpFirstTable;
  716. const ASecondTable : TucaBmpSecondTable;
  717. const AOFirstTable : TucaOBmpFirstTable;
  718. const AOSecondTable : TucaOBmpSecondTable;
  719. const AInitDataBook : helper.TUCA_DataBook;
  720. const AInitPropBook : helper.PUCA_PropBook
  721. );
  722. var
  723. c, i, k, ci : Integer;
  724. begin
  725. c := Length(AFirstTable);
  726. if (c > 0) then begin
  727. ABook.BMP_Table1 := AllocMem(c);
  728. Move(AFirstTable[0],ABook.BMP_Table1^,c);
  729. end;
  730. c := Length(ASecondTable);
  731. if (c > 0) then begin
  732. ABook.BMP_Table2 := AllocMem(c*SizeOf(UInt24)*256);
  733. for i := 0 to c - 1 do begin
  734. for k := 0 to 255 do
  735. ABook.BMP_Table2[(i*256)+k] := ASecondTable[i][k];
  736. end;
  737. end;
  738. c := Length(AOFirstTable);
  739. if (c > 0) then begin
  740. ABook.OBMP_Table1 := AllocMem(c*SizeOf(Word));
  741. Move(AOFirstTable[0],ABook.OBMP_Table1^,(c*SizeOf(Word)));
  742. end;
  743. c := Length(AOSecondTable);
  744. if (c > 0) then begin
  745. ci := Length(AOSecondTable[0]);
  746. ABook.OBMP_Table2 := AllocMem(c*SizeOf(UInt24)*ci);
  747. for i := 0 to c - 1 do begin
  748. for k := 0 to ci - 1 do
  749. ABook.OBMP_Table2[(i*ci)+k] := AOSecondTable[i][k];
  750. end;
  751. end;
  752. StringToByteArray(AInitDataBook.Version,PByte(@ABook.Version[1]),Length(ABook.Version));
  753. ABook.VariableWeight := unicodedata.TUCA_VariableKind(Ord(AInitDataBook.VariableWeight));
  754. ABook.Backwards := AInitDataBook.Backwards;
  755. ABook.PropCount := AInitPropBook^.ItemSize;
  756. ABook.Props := Pointer(AInitPropBook^.Items);
  757. ABook.VariableLowLimit := AInitPropBook^.VariableLowLimit;
  758. ABook.VariableHighLimit := AInitPropBook^.VariableHighLimit;
  759. end;
  760. procedure ConstructUnicodeBook(
  761. const AWeitghs : TUCA_LineRecArray;
  762. const AVersion : string;
  763. const ACollationName : string;
  764. const ABase : unicodedata.PUCA_DataBook;
  765. var AUnicodeBook : unicodedata.TUCA_DataBook
  766. );
  767. var
  768. dataBook : helper.TUCA_DataBook;
  769. propBook : helper.PUCA_PropBook;
  770. firstTable : TucaBmpFirstTable;
  771. secondTable : TucaBmpSecondTable;
  772. ofirstTable : TucaOBmpFirstTable;
  773. osecondTable : TucaOBmpSecondTable;
  774. i : Integer;
  775. begin
  776. FillByte(dataBook,SizeOf(dataBook),0);
  777. dataBook.Version := AVersion;
  778. SetLength(dataBook.Lines,Length(AWeitghs));
  779. for i := 0 to Length(AWeitghs)-1 do begin
  780. dataBook.Lines[i] := AWeitghs[i];
  781. dataBook.Lines[i].Stored := True;
  782. end;
  783. MakeUCA_Props(@dataBook,propBook);
  784. FillChar(firstTable,SizeOf(firstTable),0);
  785. secondTable := nil;
  786. FillChar(ofirstTable,SizeOf(ofirstTable),0);
  787. osecondTable := nil;
  788. MakeUCA_BmpTables(firstTable,secondTable,propBook);
  789. MakeUCA_OBmpTables(ofirstTable,osecondTable,propBook);
  790. FillByte(AUnicodeBook,SizeOf(AUnicodeBook),0);
  791. constructPropBook(
  792. AUnicodeBook,firstTable,secondTable,ofirstTable,osecondTable,
  793. dataBook,propBook
  794. );
  795. StringToByteArray(ACollationName,PByte(@AUnicodeBook.CollationName[1]),Length(AUnicodeBook.CollationName));
  796. AUnicodeBook.Base := ABase;
  797. end;
  798. procedure CheckEqual(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
  799. var
  800. keyA, keyB : TUCASortKey;
  801. s : string;
  802. begin
  803. keyA := ComputeSortKey(A,ACollation);
  804. keyB := ComputeSortKey(B,ACollation);
  805. if (CompareSortKey(keyA,keyB) <> 0) then begin
  806. s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
  807. s := Format('"%s" <>= "%s" %s%s',[A,B,sLineBreak,s]);
  808. raise Exception.Create(s);
  809. end;
  810. end;
  811. procedure CheckNotEqual(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
  812. var
  813. keyA, keyB : TUCASortKey;
  814. s : string;
  815. begin
  816. keyA := ComputeSortKey(A,ACollation);
  817. keyB := ComputeSortKey(B,ACollation);
  818. if (CompareSortKey(keyA,keyB) = 0) then begin
  819. s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
  820. s := Format('"%s" = "%s" %s%s',[A,B,sLineBreak,s]);
  821. raise Exception.Create(s);
  822. end;
  823. end;
  824. procedure CheckInf(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
  825. var
  826. keyA, keyB : TUCASortKey;
  827. s : string;
  828. begin
  829. keyA := ComputeSortKey(A,ACollation);
  830. keyB := ComputeSortKey(B,ACollation);
  831. if (CompareSortKey(keyA,keyB) >= 0) then begin
  832. s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
  833. s := Format('"%s" >= "%s" %s%s',[A,B,sLineBreak,s])+sLineBreak;
  834. raise Exception.Create(s);
  835. end;
  836. end;
  837. procedure CheckInf(AStrings : array of UnicodeString; ACollation : unicodedata.PUCA_DataBook);
  838. var
  839. c, i : Integer;
  840. keyA, keyB : TUCASortKey;
  841. s : string;
  842. begin
  843. c := Length(AStrings);
  844. if (c < 2) then
  845. exit;
  846. keyA := ComputeSortKey(AStrings[0],ACollation);
  847. for i := 1 to c - 1 do begin
  848. keyB := ComputeSortKey(AStrings[i],ACollation);
  849. if (CompareSortKey(keyA,keyB) >= 0) then begin
  850. s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
  851. s := Format('"%s" >= "%s" %s%s',[AStrings[i-1],AStrings[i],sLineBreak,s]);
  852. raise Exception.Create(s);
  853. end;
  854. keyA := keyB;
  855. end;
  856. end;
  857. procedure test1_prepareWeigth(var AData : TUCA_LineRecArray);
  858. var
  859. p : PUCA_LineRec;
  860. begin
  861. SetLength(AData,12);
  862. p := @AData[Low(AData)];
  863. p^.CodePoints := CodePointToArray(Ord('a'));
  864. p^.Weights := ToWeight($15EF,$0020,$0002);
  865. Inc(p);
  866. p^.CodePoints := CodePointToArray(Ord('b'));
  867. p^.Weights := ToWeight($1605,$0020,$0002);
  868. Inc(p);
  869. p^.CodePoints := CodePointToArray(Ord('c'));
  870. p^.Weights := ToWeight($161D,$0020,$0002);
  871. Inc(p);
  872. p^.CodePoints := CodePointToArray(Ord('d'));
  873. p^.Weights := ToWeight($1631,$0020,$0002);
  874. Inc(p);
  875. p^.CodePoints := CodePointToArray(Ord('e'));
  876. p^.Weights := ToWeight($164C,$0020,$0002);
  877. Inc(p);
  878. p^.CodePoints := CodePointToArray(Ord('f'));
  879. p^.Weights := ToWeight($1684,$0020,$0002);
  880. Inc(p);
  881. p^.CodePoints := CodePointToArray(Ord('g'));
  882. p^.Weights := ToWeight($1691,$0020,$0002);
  883. Inc(p);
  884. p^.CodePoints := CodePointToArray(Ord('h'));
  885. p^.Weights := ToWeight($16B4,$0020,$0002);
  886. Inc(p);
  887. p^.CodePoints := CodePointToArray(Ord('i'));
  888. p^.Weights := ToWeight($16CD,$0020,$0002);
  889. Inc(p);
  890. p^.CodePoints := CodePointToArray(Ord('j'));
  891. p^.Weights := ToWeight($16E6,$0020,$0002);
  892. Inc(p);
  893. p^.CodePoints := CodePointToArray(Ord('k'));
  894. p^.Weights := ToWeight($16FF,$0020,$0002);
  895. Inc(p);
  896. p^.CodePoints := CodePointToArray(Ord('l'));
  897. p^.Weights := ToWeight($1711,$0020,$0002);
  898. end;
  899. procedure test1();
  900. var
  901. sequence : TOrderedCharacters;
  902. statement : TReorderSequence;
  903. wfirst, wresult : TUCA_LineRecArray;
  904. i : Integer;
  905. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  906. begin
  907. statement.Clear();
  908. test1_prepareWeigth(wfirst);
  909. sequence := TOrderedCharacters.Create();
  910. sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  911. sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  912. sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  913. sequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
  914. sequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
  915. sequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
  916. sequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
  917. sequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
  918. sequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
  919. sequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
  920. sequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  921. sequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
  922. for i := 0 to sequence.ActualLength - 1 do
  923. sequence.Data[i].Changed := False;
  924. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  925. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  926. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  927. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook1);
  928. SetLength(statement.Reset,1);
  929. statement.Reset[0] := Ord('a');
  930. statement.SetElementCount(1);
  931. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  932. sequence.ApplyStatement(@statement);
  933. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  934. wresult := nil;
  935. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  936. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  937. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  938. CheckInf(['a','g'{*},'b','c','d','e','f','h','i','j','k','l'],@unicodeBook2);
  939. SetLength(statement.Reset,1);
  940. statement.Reset[0] := Ord('a');
  941. statement.SetElementCount(2);
  942. statement.Elements[0] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,0);
  943. statement.Elements[1] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,0);
  944. sequence.ApplyStatement(@statement);
  945. WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  946. wresult := nil;
  947. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  948. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  949. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  950. CheckInf(['a','h'{*},'k'{*},'g'{*},'b','c','d','e','f','i','j','l'],@unicodeBook2);
  951. SetLength(statement.Reset,1);
  952. statement.Reset[0] := Ord('h');
  953. statement.SetElementCount(1);
  954. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
  955. sequence.ApplyStatement(@statement);
  956. WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence));
  957. wresult := nil;
  958. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  959. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  960. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  961. CheckInf(['a','h'{*},'g'{*},'k'{*},'b','c','d','e','f','i','j','l'],@unicodeBook2);
  962. end;
  963. procedure test2_prepareWeigth(var AData : TUCA_LineRecArray);
  964. var
  965. p : PUCA_LineRec;
  966. begin
  967. SetLength(AData,11);
  968. p := @AData[Low(AData)];
  969. p^.CodePoints := CodePointToArray(Ord('a'));
  970. p^.Weights := ToWeight($15EF,$0020,$0002);
  971. Inc(p);
  972. p^.CodePoints := CodePointToArray([Ord('('),Ord('a'),Ord(')')]);
  973. p^.Weights := ToWeight($15EF,$0020,$0006); //15EF.0020.0006.24D0
  974. Inc(p);
  975. p^.CodePoints := CodePointToArray(Ord('A'));
  976. p^.Weights := ToWeight($15EF,$0020,$0008); //15EF.0020.0008.0041
  977. Inc(p);
  978. p^.CodePoints := CodePointToArray([Ord('('),Ord('A'),Ord(')')]);
  979. p^.Weights := ToWeight($15EF,$0020,$000C); //15EF.0020.000C
  980. Inc(p);
  981. p^.CodePoints := CodePointToArray([Ord('a'),Ord('`')]);
  982. p^.Weights := ToWeight([$15EF,$0020,$0002, $0000,$0035,$0002]); //[.15EF.0020.0002.0061][.0000.0035.0002.0300]
  983. Inc(p);
  984. p^.CodePoints := CodePointToArray([Ord('A'),Ord('`')]);
  985. p^.Weights := ToWeight([$15EF,$0020,$0008, $0000,$0035,$0002]); //[.15EF.0020.0008.0041][.0000.0035.0002.0300]
  986. Inc(p);
  987. p^.CodePoints := CodePointToArray([Ord('a'),Ord('e')]);
  988. p^.Weights := ToWeight([$15F0,$0020,$0002]); //[.15EF.0020.0004.00E6][.0000.0139.0004.00E6][.164C.0020.0004.00E6]
  989. Inc(p);
  990. p^.CodePoints := CodePointToArray([Ord(UpCase('a')),Ord(UpCase('e'))]);
  991. p^.Weights := ToWeight([$15F0,$0020,$0006]);//[.15EF.0020.000A.00C6][.0000.0139.0004.00C6][.164C.0020.000A.00C6]
  992. Inc(p);
  993. p^.CodePoints := CodePointToArray(Ord('b'));
  994. p^.Weights := ToWeight($1605,$0020,$0002);
  995. Inc(p);
  996. p^.CodePoints := CodePointToArray([Ord('('),Ord('b'),Ord(')')]);
  997. p^.Weights := ToWeight($1605,$0020,$0006); //.1605.0020.0006.24D1
  998. Inc(p);
  999. p^.CodePoints := CodePointToArray(Ord('B'));
  1000. p^.Weights := ToWeight($1605,$0020,$0008); //1605.0020.0008.0042
  1001. end;
  1002. procedure test2();
  1003. var
  1004. sequenceClean, sequence : TOrderedCharacters;
  1005. statement : TReorderSequence;
  1006. wfirst, wresult : TUCA_LineRecArray;
  1007. i : Integer;
  1008. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1009. begin
  1010. statement.Clear();
  1011. test2_prepareWeigth(wfirst);
  1012. sequenceClean := TOrderedCharacters.Create();
  1013. sequenceClean.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  1014. sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('a'),Ord(')')],TReorderWeigthKind.Tertiary,2));
  1015. sequenceClean.Append(TReorderUnit.From(Ord('A'),TReorderWeigthKind.Tertiary,3));
  1016. sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('A'),Ord(')')],TReorderWeigthKind.Tertiary,4));
  1017. //sequenceClean.Append(TReorderUnit.From(Ord('à'),TReorderWeigthKind.Secondary,0));
  1018. sequenceClean.Append(TReorderUnit.From([Ord('a'),Ord('`')],TReorderWeigthKind.Secondary,5));
  1019. //sequenceClean.Append(TReorderUnit.From(Ord(UpCase('à')),TReorderWeigthKind.Tertiary,0));
  1020. sequenceClean.Append(TReorderUnit.From([Ord('A'),Ord('`')],TReorderWeigthKind.Tertiary,6));
  1021. sequenceClean.Append(TReorderUnit.From([Ord('a'),Ord('e')],TReorderWeigthKind.Primary,7));
  1022. sequenceClean.Append(TReorderUnit.From([Ord(UpCase('a')),Ord(UpCase('e'))],TReorderWeigthKind.Tertiary,8));
  1023. sequenceClean.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,9));
  1024. sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('b'),Ord(')')],TReorderWeigthKind.Tertiary,10));
  1025. sequenceClean.Append(TReorderUnit.From(Ord('B'),TReorderWeigthKind.Tertiary,11));
  1026. for i := 0 to sequenceClean.ActualLength - 1 do
  1027. sequenceClean.Data[i].Changed := False;
  1028. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1029. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1030. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  1031. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook1);
  1032. sequence := sequenceClean.Clone();
  1033. SetLength(statement.Reset,1);
  1034. statement.Reset[0] := Ord('a');
  1035. SetLength(statement.Elements,1);
  1036. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  1037. sequence.ApplyStatement(@statement);
  1038. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1039. wresult := nil;
  1040. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1041. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1042. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  1043. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B'],@unicodeBook2);
  1044. CheckInf(['gg','ae'],@unicodeBook2);
  1045. CheckInf(['gb','ae'],@unicodeBook2);
  1046. //CheckInf(['aeae','AE'],@unicodeBook2);
  1047. sequence := sequenceClean.Clone();
  1048. SetLength(statement.Reset,1);
  1049. statement.Reset[0] := Ord('a');
  1050. SetLength(statement.Elements,1);
  1051. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
  1052. sequence.ApplyStatement(@statement);
  1053. WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1054. wresult := nil;
  1055. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1056. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1057. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  1058. CheckInf(['a','(a)','A','(A)', 'g'{*}, 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
  1059. CheckInf(['(A)a','ga'],@unicodeBook2);
  1060. CheckInf(['g','ae'],@unicodeBook2);
  1061. sequence := sequenceClean.Clone();
  1062. SetLength(statement.Reset,1);
  1063. statement.Reset[0] := Ord('a');
  1064. SetLength(statement.Elements,1);
  1065. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  1066. sequence.ApplyStatement(@statement);
  1067. WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1068. wresult := nil;
  1069. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1070. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1071. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  1072. CheckInf(['a', 'g'{*},'(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
  1073. CheckInf(['aa','ga'],@unicodeBook2);
  1074. CheckInf(['ga','(a)a'],@unicodeBook2);
  1075. sequence := sequenceClean.Clone();
  1076. SetLength(statement.Reset,2);
  1077. statement.Reset[0] := Ord('a');
  1078. statement.Reset[1] := Ord('`');
  1079. SetLength(statement.Elements,1);
  1080. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  1081. sequence.ApplyStatement(@statement);
  1082. WriteLn('Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1083. wresult := nil;
  1084. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1085. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1086. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  1087. CheckInf(['a','(a)','A','(A)', 'a`', 'g'{*},'A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
  1088. CheckInf(['a`a','ga'],@unicodeBook2);
  1089. CheckInf(['ga','ae'],@unicodeBook2);
  1090. end;
  1091. //------------------------------------------------------
  1092. procedure test3_prepareWeigth(var AData : TUCA_LineRecArray);
  1093. var
  1094. p : PUCA_LineRec;
  1095. begin
  1096. SetLength(AData,12);
  1097. p := @AData[Low(AData)];
  1098. p^.CodePoints := CodePointToArray(Ord('a'));
  1099. p^.Weights := ToWeight($15EF,$0020,$0002);
  1100. Inc(p);
  1101. p^.CodePoints := CodePointToArray(Ord('b'));
  1102. p^.Weights := ToWeight($1605,$0020,$0002);
  1103. Inc(p);
  1104. p^.CodePoints := CodePointToArray(Ord('c'));
  1105. p^.Weights := ToWeight($161D,$0020,$0002);
  1106. Inc(p);
  1107. p^.CodePoints := CodePointToArray(Ord('d'));
  1108. p^.Weights := ToWeight($1631,$0020,$0002);
  1109. Inc(p);
  1110. p^.CodePoints := CodePointToArray(Ord('e'));
  1111. p^.Weights := ToWeight($164C,$0020,$0002);
  1112. Inc(p);
  1113. p^.CodePoints := CodePointToArray(Ord('f'));
  1114. p^.Weights := ToWeight($1684,$0020,$0002);
  1115. Inc(p);
  1116. p^.CodePoints := CodePointToArray(Ord('g'));
  1117. p^.Weights := ToWeight($1691,$0020,$0002);
  1118. Inc(p);
  1119. p^.CodePoints := CodePointToArray(Ord('h'));
  1120. p^.Weights := ToWeight($16B4,$0020,$0002);
  1121. Inc(p);
  1122. p^.CodePoints := CodePointToArray(Ord('i'));
  1123. p^.Weights := ToWeight($16CD,$0020,$0002);
  1124. Inc(p);
  1125. p^.CodePoints := CodePointToArray(Ord('j'));
  1126. p^.Weights := ToWeight($16E6,$0020,$0002);
  1127. Inc(p);
  1128. p^.CodePoints := CodePointToArray(Ord('k'));
  1129. p^.Weights := ToWeight($16FF,$0020,$0002);
  1130. Inc(p);
  1131. p^.CodePoints := CodePointToArray(Ord('l'));
  1132. p^.Weights := ToWeight($1711,$0020,$0002);
  1133. end;
  1134. procedure PopulateSequence(var ASequence : TOrderedCharacters);
  1135. var
  1136. i : Integer;
  1137. begin
  1138. ASequence := TOrderedCharacters.Create();
  1139. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  1140. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  1141. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  1142. ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
  1143. ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
  1144. ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
  1145. ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
  1146. ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
  1147. ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
  1148. ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
  1149. ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  1150. ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
  1151. for i := 0 to ASequence.ActualLength - 1 do
  1152. ASequence.Data[i].Changed := False;
  1153. end;
  1154. procedure test3();
  1155. var
  1156. sequence, sequenceClean : TOrderedCharacters;
  1157. statement : TReorderSequence;
  1158. wfirst, wresult : TUCA_LineRecArray;
  1159. i : Integer;
  1160. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1161. keyA, keyB : TUCASortKey;
  1162. us : UnicodeString;
  1163. begin //'a','b','c','d','e','f','g','h','i','j','k','l'
  1164. statement.Clear();
  1165. test3_prepareWeigth(wfirst);
  1166. PopulateSequence(sequenceClean);
  1167. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1168. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1169. //Generate the original tables
  1170. ConstructUnicodeBook(wfirst,'test3','first',nil,unicodeBook1);
  1171. us := 'a';
  1172. keyA := ComputeSortKey(us,@unicodeBook1);
  1173. for i := Ord('b') to Ord('l') do begin
  1174. us := unicodeChar(i);
  1175. keyB := ComputeSortKey(us,@unicodeBook1);
  1176. if (CompareSortKey(keyA,keyB) >= 0) then
  1177. raise Exception.CreateFmt('"%s" >= "%s" !',[AnsiChar(i-1),AnsiChar(i)]);
  1178. keyA := keyB;
  1179. end;
  1180. // --- test 1
  1181. sequence := sequenceClean.Clone();
  1182. SetLength(statement.Reset,1);
  1183. statement.Reset[0] := Ord('b');
  1184. SetLength(statement.Elements,1);
  1185. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  1186. sequence.ApplyStatement(@statement);
  1187. wresult := nil;
  1188. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1189. //Generate updatet tables
  1190. ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
  1191. CheckInf(['a','b','g'{*}, 'c','d','e','f','h','i','j','k','l'],@unicodeBook2);
  1192. CheckInf(['bb','g'{*}],@unicodeBook2);
  1193. CheckInf(['bc','g'{*}],@unicodeBook2);
  1194. CheckInf(['bc','gg'{*}],@unicodeBook2);
  1195. CheckInf(['bg','bc'{*}],@unicodeBook2);
  1196. WriteLn(' -- test 1 - ok');
  1197. // --- test 2
  1198. sequence := sequenceClean.Clone();
  1199. SetLength(statement.Reset,1);
  1200. statement.Reset[0] := Ord('c');
  1201. SetLength(statement.Elements,1);
  1202. statement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
  1203. sequence.ApplyStatement(@statement);
  1204. wresult := nil;
  1205. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1206. //Generate updatet tables
  1207. ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
  1208. CheckInf(['a','b','c','ch'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1209. CheckInf(['ca','ch'{*}],@unicodeBook2);
  1210. CheckInf(['cc','ch'{*}],@unicodeBook2);
  1211. CheckInf(['cd','ch'{*}],@unicodeBook2);
  1212. CheckInf(['ce','ch'{*}],@unicodeBook2);
  1213. CheckInf(['cf','ch'{*}],@unicodeBook2);
  1214. CheckInf(['ci','ch'{*}],@unicodeBook2);
  1215. CheckInf(['cj','ch'{*}],@unicodeBook2);
  1216. CheckInf(['ck','ch'{*}],@unicodeBook2);
  1217. CheckInf(['cl','ch'{*}],@unicodeBook2);
  1218. CheckInf(['ac','ach'{*}],@unicodeBook2);
  1219. CheckInf(['aci','achat'{*}],@unicodeBook2);
  1220. WriteLn(' -- test 2 - ok');
  1221. // --- test 3
  1222. sequence := sequenceClean.Clone();
  1223. SetLength(statement.Reset,1);
  1224. statement.Reset[0] := Ord('c');
  1225. SetLength(statement.Elements,1);
  1226. statement.Elements[0] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Identity,0);
  1227. sequence.ApplyStatement(@statement);
  1228. wresult := nil;
  1229. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1230. //Generate updatet tables
  1231. ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
  1232. CheckInf(['a','b','k'{*},'d','e','f','g','h','i','j','l'],@unicodeBook2);
  1233. CheckInf(['a','b','c'{*},'d','e','f','g','h','i','j','l'],@unicodeBook2);
  1234. CheckEqual('c','k',@unicodeBook2);
  1235. CheckEqual('cc','kk',@unicodeBook2);
  1236. CheckEqual('ck','kc',@unicodeBook2);
  1237. CheckEqual('kc','kk',@unicodeBook2);
  1238. CheckEqual('cckkc','kckcc',@unicodeBook2);
  1239. CheckInf(['acb','akc'{*}],@unicodeBook2);
  1240. WriteLn(' -- test 3 - ok');
  1241. // --- test 4
  1242. sequence := sequenceClean.Clone();
  1243. SetLength(statement.Reset,1);
  1244. statement.Reset[0] := Ord('a');
  1245. SetLength(statement.Elements,1);
  1246. statement.Elements[0] := TReorderUnit.From([Ord('c')],TReorderWeigthKind.Primary,0);
  1247. sequence.ApplyStatement(@statement);
  1248. statement.Reset[0] := Ord('c');
  1249. SetLength(statement.Elements,1);
  1250. statement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
  1251. sequence.ApplyStatement(@statement);
  1252. wresult := nil;
  1253. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1254. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1255. //Generate updatet tables
  1256. ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
  1257. CheckInf(['a','c'{*},'ch'{*},'b','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1258. CheckInf(['ca','ch'{*}],@unicodeBook2);
  1259. CheckInf(['cc','ch'{*}],@unicodeBook2);
  1260. CheckInf(['cd','ch'{*}],@unicodeBook2);
  1261. CheckInf(['ce','ch'{*}],@unicodeBook2);
  1262. CheckInf(['cf','ch'{*}],@unicodeBook2);
  1263. CheckInf(['ci','ch'{*}],@unicodeBook2);
  1264. CheckInf(['cj','ch'{*}],@unicodeBook2);
  1265. CheckInf(['ck','ch'{*}],@unicodeBook2);
  1266. CheckInf(['cl','ch'{*}],@unicodeBook2);
  1267. CheckInf(['ac','ach'{*}],@unicodeBook2);
  1268. CheckInf(['aci','achat'{*}],@unicodeBook2);
  1269. WriteLn(' -- test 4 - ok');
  1270. end;
  1271. //------------------------------------------------------
  1272. procedure test4_prepareWeigth(var AData : TUCA_LineRecArray);
  1273. var
  1274. p : PUCA_LineRec;
  1275. begin
  1276. SetLength(AData,12);
  1277. p := @AData[Low(AData)];
  1278. p^.CodePoints := CodePointToArray(Ord('a'));
  1279. p^.Weights := ToWeight($15EF,$0020,$0002);
  1280. Inc(p);
  1281. p^.CodePoints := CodePointToArray(Ord('b'));
  1282. p^.Weights := ToWeight($1605,$0020,$0002);
  1283. Inc(p);
  1284. p^.CodePoints := CodePointToArray(Ord('c')); {*}
  1285. p^.Weights := ToWeight($1606,$0020,$0002);
  1286. Inc(p);
  1287. p^.CodePoints := CodePointToArray(Ord('d'));
  1288. p^.Weights := ToWeight($1631,$0020,$0002);
  1289. Inc(p);
  1290. p^.CodePoints := CodePointToArray(Ord('e'));
  1291. p^.Weights := ToWeight($164C,$0020,$0002);
  1292. Inc(p);
  1293. p^.CodePoints := CodePointToArray(Ord('f'));
  1294. p^.Weights := ToWeight($1684,$0020,$0002);
  1295. Inc(p);
  1296. p^.CodePoints := CodePointToArray(Ord('g'));
  1297. p^.Weights := ToWeight($1691,$0020,$0002);
  1298. Inc(p);
  1299. p^.CodePoints := CodePointToArray(Ord('h'));
  1300. p^.Weights := ToWeight($16B4,$0020,$0002);
  1301. Inc(p);
  1302. p^.CodePoints := CodePointToArray(Ord('i'));
  1303. p^.Weights := ToWeight($16CD,$0020,$0002);
  1304. Inc(p);
  1305. p^.CodePoints := CodePointToArray(Ord('j'));
  1306. p^.Weights := ToWeight($16E6,$0020,$0002);
  1307. Inc(p);
  1308. p^.CodePoints := CodePointToArray(Ord('k'));
  1309. p^.Weights := ToWeight($16FF,$0020,$0002);
  1310. Inc(p);
  1311. p^.CodePoints := CodePointToArray(Ord('l'));
  1312. p^.Weights := ToWeight($1711,$0020,$0002);
  1313. end;
  1314. procedure test4();
  1315. var
  1316. sequence, sequenceClean : TOrderedCharacters;
  1317. statement : TReorderSequence;
  1318. wfirst, wresult : TUCA_LineRecArray;
  1319. i : Integer;
  1320. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1321. keyA, keyB : TUCASortKey;
  1322. us : UnicodeString;
  1323. begin
  1324. statement.Clear();
  1325. test4_prepareWeigth(wfirst);
  1326. PopulateSequence(sequenceClean);
  1327. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1328. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1329. //Generate the original tables
  1330. ConstructUnicodeBook(wfirst,'test4','first',nil,unicodeBook1);
  1331. us := 'a';
  1332. keyA := ComputeSortKey(us,@unicodeBook1);
  1333. for i := Ord('b') to Ord('l') do begin
  1334. us := unicodeChar(i);
  1335. keyB := ComputeSortKey(us,@unicodeBook1);
  1336. if (CompareSortKey(keyA,keyB) >= 0) then
  1337. raise Exception.CreateFmt('"%s" >= "%s" !',[AnsiChar(i-1),AnsiChar(i)]);
  1338. keyA := keyB;
  1339. end;
  1340. // --- test 1
  1341. sequence := sequenceClean.Clone();
  1342. SetLength(statement.Reset,1);
  1343. statement.Reset[0] := Ord('b');
  1344. SetLength(statement.Elements,1);
  1345. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  1346. sequence.ApplyStatement(@statement);
  1347. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1348. wresult := nil;
  1349. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1350. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1351. //Generate updatet tables
  1352. ConstructUnicodeBook(wresult,'test4','second',@unicodeBook1,unicodeBook2);
  1353. unicodeBook2.Base := @unicodeBook1;
  1354. CheckInf(['a','b','g'{*}, 'c','d','e','f','h','i','j','k','l'],@unicodeBook2);
  1355. CheckInf(['g'{*}, 'c'],@unicodeBook2);
  1356. CheckInf(['gg'{*}, 'c'],@unicodeBook2);
  1357. CheckInf(['gg'{*}, 'cc'],@unicodeBook2);
  1358. CheckInf(['g'{*}, 'ca'],@unicodeBook2);
  1359. CheckInf(['gg'{*}, 'ca'],@unicodeBook2);
  1360. CheckInf(['bb','g'{*}],@unicodeBook2);
  1361. CheckInf(['bc','g'{*}],@unicodeBook2);
  1362. CheckInf(['bc','gg'{*}],@unicodeBook2);
  1363. CheckInf(['bg','bc'{*}],@unicodeBook2);
  1364. WriteLn(' -- test 1 - ok',sLineBreak);
  1365. // --- test 2
  1366. sequence := sequenceClean.Clone();
  1367. SetLength(statement.Reset,1);
  1368. statement.Reset[0] := Ord('b');
  1369. SetLength(statement.Elements,2);
  1370. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  1371. statement.Elements[1] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,0);
  1372. sequence.ApplyStatement(@statement);
  1373. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1374. wresult := nil;
  1375. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1376. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1377. //Generate updatet tables
  1378. ConstructUnicodeBook(wresult,'test4','second',@unicodeBook1,unicodeBook2);
  1379. unicodeBook2.Base := @unicodeBook1;
  1380. CheckInf(['a','b','g'{*},'k'{*}, 'c','d','e','f','h','i','j','l'],@unicodeBook2);
  1381. CheckInf(['g'{*}, 'c'],@unicodeBook2);
  1382. CheckInf(['k'{*}, 'c'],@unicodeBook2);
  1383. CheckInf(['b','kk'{*}],@unicodeBook2);
  1384. CheckInf(['bb','kk'{*}],@unicodeBook2);
  1385. CheckInf(['b','kkk'{*}],@unicodeBook2);
  1386. CheckInf(['gk','kk'{*}],@unicodeBook2);
  1387. CheckInf(['gk','k'{*}],@unicodeBook2);
  1388. CheckInf(['gk','kkk'{*}],@unicodeBook2);
  1389. CheckInf(['gg'{*}, 'c'],@unicodeBook2);
  1390. CheckInf(['gg'{*}, 'cc'],@unicodeBook2);
  1391. CheckInf(['g'{*}, 'ca'],@unicodeBook2);
  1392. CheckInf(['gg'{*}, 'ca'],@unicodeBook2);
  1393. CheckInf(['bb','g'{*}],@unicodeBook2);
  1394. CheckInf(['bc','g'{*}],@unicodeBook2);
  1395. CheckInf(['bc','gg'{*}],@unicodeBook2);
  1396. CheckInf(['bg','bc'{*}],@unicodeBook2);
  1397. WriteLn(' -- test 2 - ok');
  1398. end;
  1399. //-------------------------------------------------------------------------
  1400. procedure test5_prepareWeigth(var AData : TUCA_LineRecArray);
  1401. var
  1402. p : PUCA_LineRec;
  1403. begin
  1404. SetLength(AData,6);
  1405. p := @AData[Low(AData)];
  1406. p^.CodePoints := CodePointToArray(Ord('a'));
  1407. p^.Weights := ToWeight($15EF,$0020,$0002);
  1408. Inc(p);
  1409. p^.CodePoints := CodePointToArray(Ord('b'));
  1410. p^.Weights := ToWeight($1605,$0020,$0002);
  1411. Inc(p);
  1412. p^.CodePoints := CodePointToArray([Ord('a'),Ord('d'),Ord('a')]);
  1413. p^.Weights := ToWeight($1609,$0020,$0002);
  1414. Inc(p);
  1415. p^.CodePoints := CodePointToArray(Ord('c'));
  1416. p^.Weights := ToWeight($161D,$0020,$0002);
  1417. Inc(p);
  1418. p^.CodePoints := CodePointToArray(Ord('d'));
  1419. p^.Weights := ToWeight($1631,$0020,$0002);
  1420. Inc(p);
  1421. p^.CodePoints := CodePointToArray(Ord('e'));
  1422. p^.Weights := ToWeight($164C,$0020,$0002);
  1423. end;
  1424. procedure test5_PopulateSequence(var ASequence : TOrderedCharacters);
  1425. var
  1426. i : Integer;
  1427. begin
  1428. ASequence := TOrderedCharacters.Create();
  1429. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  1430. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  1431. ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Primary,3));
  1432. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,4));
  1433. ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,5));
  1434. ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,6));
  1435. for i := 0 to ASequence.ActualLength - 1 do
  1436. ASequence.Data[i].Changed := False;
  1437. end;
  1438. procedure test5();
  1439. var
  1440. sequence, sequenceClean : TOrderedCharacters;
  1441. statement : TReorderSequence;
  1442. wfirst, wresult : TUCA_LineRecArray;
  1443. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1444. begin
  1445. statement.Clear();
  1446. test5_prepareWeigth(wfirst);
  1447. test5_PopulateSequence(sequenceClean);
  1448. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1449. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1450. //Generate the original tables
  1451. ConstructUnicodeBook(wfirst,'test5','first',nil,unicodeBook1);
  1452. CheckInf(['a','b','ada','c','d','e'],@unicodeBook1);
  1453. CheckInf(['ba','adaa'],@unicodeBook1);
  1454. // --- test 1
  1455. sequence := sequenceClean.Clone();
  1456. SetLength(statement.Reset,0);
  1457. SetLength(statement.Elements,1);
  1458. statement.Elements[0] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Deletion,0);
  1459. sequence.ApplyStatement(@statement);
  1460. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1461. wresult := nil;
  1462. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1463. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1464. //Generate updatet tables
  1465. ConstructUnicodeBook(wresult,'test5','second',@unicodeBook1,unicodeBook2);
  1466. unicodeBook2.Base := @unicodeBook1;
  1467. CheckInf(['a','b','ada','d','e', 'c'{* deleted !}],@unicodeBook2);
  1468. CheckInf(['ee','ca'],@unicodeBook2);
  1469. WriteLn(' -- test 1 - ok',sLineBreak);
  1470. // --- test 2
  1471. sequence := sequenceClean.Clone();
  1472. statement.Clear();
  1473. SetLength(statement.Reset,0);
  1474. SetLength(statement.Elements,1);
  1475. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
  1476. sequence.ApplyStatement(@statement);
  1477. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1478. wresult := nil;
  1479. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1480. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1481. //Generate updatet tables
  1482. ConstructUnicodeBook(wresult,'test5','second',@unicodeBook1,unicodeBook2);
  1483. unicodeBook2.Base := @unicodeBook1;
  1484. CheckInf(['a', 'adac'{* deleted !}, 'b','c','d','e'],@unicodeBook2);
  1485. CheckInf(['a','ada'],@unicodeBook2);
  1486. CheckInf(['ada','b'],@unicodeBook2);
  1487. CheckInf(['ac','ada'],@unicodeBook2);
  1488. CheckInf(['ac','adac'],@unicodeBook2);
  1489. CheckInf(['abe','ada'],@unicodeBook2);
  1490. CheckInf(['abe','adae'],@unicodeBook2);
  1491. WriteLn(' -- test 2 - ok',sLineBreak);
  1492. end;
  1493. //-------------------------------------------------------------------------
  1494. procedure test6_prepareWeigth(var AData : TUCA_LineRecArray);
  1495. var
  1496. p : PUCA_LineRec;
  1497. begin
  1498. SetLength(AData,7);
  1499. p := @AData[Low(AData)];
  1500. p^.CodePoints := CodePointToArray(Ord('a'));
  1501. p^.Weights := ToWeight($15EF,$0020,$0002);
  1502. Inc(p);
  1503. p^.CodePoints := CodePointToArray(Ord('b'));
  1504. p^.Weights := ToWeight($1605,$0020,$0002);
  1505. Inc(p);
  1506. p^.CodePoints := CodePointToArray([Ord('a'),Ord('d')]);
  1507. p^.Weights := ToWeight($1609,$0020,$0002);
  1508. Inc(p);
  1509. p^.CodePoints := CodePointToArray([Ord('a'),Ord('d'),Ord('a')]);
  1510. p^.Weights := ToWeight($1613,$0020,$0002);
  1511. Inc(p);
  1512. p^.CodePoints := CodePointToArray(Ord('c'));
  1513. p^.Weights := ToWeight($161D,$0020,$0002);
  1514. Inc(p);
  1515. p^.CodePoints := CodePointToArray(Ord('d'));
  1516. p^.Weights := ToWeight($1631,$0020,$0002);
  1517. Inc(p);
  1518. p^.CodePoints := CodePointToArray(Ord('e'));
  1519. p^.Weights := ToWeight($164C,$0020,$0002);
  1520. end;
  1521. procedure test6_PopulateSequence(var ASequence : TOrderedCharacters);
  1522. var
  1523. i : Integer;
  1524. begin
  1525. ASequence := TOrderedCharacters.Create();
  1526. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  1527. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  1528. ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,3));
  1529. ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Primary,4));
  1530. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,5));
  1531. ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,6));
  1532. ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,7));
  1533. for i := 0 to ASequence.ActualLength - 1 do
  1534. ASequence.Data[i].Changed := False;
  1535. end;
  1536. procedure test6();
  1537. var
  1538. sequence, sequenceClean : TOrderedCharacters;
  1539. statement : TReorderSequence;
  1540. wfirst, wresult : TUCA_LineRecArray;
  1541. unicodeBook1, unicodeBook2, unicodeBook3 : unicodedata.TUCA_DataBook;
  1542. begin
  1543. statement.Clear();
  1544. test6_prepareWeigth(wfirst);
  1545. test6_PopulateSequence(sequenceClean);
  1546. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1547. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1548. //Generate the original tables
  1549. ConstructUnicodeBook(wfirst,'test6','first',nil,unicodeBook1);
  1550. CheckInf(['a','b','ad','ada','c','d','e'],@unicodeBook1);
  1551. CheckInf(['ba','ad'],@unicodeBook1);
  1552. CheckInf(['ba','adaa'],@unicodeBook1);
  1553. // --- test 1
  1554. sequence := sequenceClean.Clone();
  1555. SetLength(statement.Reset,0);
  1556. SetLength(statement.Elements,1);
  1557. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Deletion,0);
  1558. sequence.ApplyStatement(@statement);
  1559. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1560. wresult := nil;
  1561. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1562. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1563. //Generate updatet tables
  1564. ConstructUnicodeBook(wresult,'test6','second',@unicodeBook1,unicodeBook2);
  1565. unicodeBook2.Base := @unicodeBook1;
  1566. CheckInf(['a', 'ad'{*},'ada', 'b','c','d','e'],@unicodeBook2);
  1567. CheckInf(['ab','ad'],@unicodeBook2);
  1568. CheckInf(['ab','adb'],@unicodeBook2);
  1569. CheckInf(['ad','ba'],@unicodeBook2);
  1570. CheckInf(['adaa','ba'],@unicodeBook2);
  1571. WriteLn(' -- test 1 - ok',sLineBreak);
  1572. // --- test 2
  1573. //sequence := sequenceClean.Clone();
  1574. SetLength(statement.Reset,0);
  1575. SetLength(statement.Elements,1);
  1576. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
  1577. sequence.ApplyStatement(@statement);
  1578. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1579. wresult := nil;
  1580. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1581. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1582. //Generate updatet tables
  1583. ConstructUnicodeBook(wresult,'test6','second',@unicodeBook2,unicodeBook3);
  1584. unicodeBook3.Base := @unicodeBook2;
  1585. CheckInf(['a', 'ad'{*},'ada'{*}, 'b','c','d','e'],@unicodeBook3);
  1586. CheckInf(['ab','ad'],@unicodeBook3);
  1587. CheckInf(['ab','adb'],@unicodeBook3);
  1588. CheckInf(['ab','ada'],@unicodeBook3);
  1589. WriteLn(' -- test 2 - ok',sLineBreak);
  1590. // --- test 3
  1591. sequence := sequenceClean.Clone();
  1592. SetLength(statement.Reset,0);
  1593. SetLength(statement.Elements,1);
  1594. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
  1595. sequence.ApplyStatement(@statement);
  1596. WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1597. wresult := nil;
  1598. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1599. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1600. //Generate updatet tables
  1601. ConstructUnicodeBook(wresult,'test6','second',@unicodeBook1,unicodeBook2);
  1602. unicodeBook2.Base := @unicodeBook1;
  1603. CheckInf(['a', 'b', 'ad', 'c','d','e'],@unicodeBook2);
  1604. CheckInf(['ad','ada'],@unicodeBook2);
  1605. WriteLn(' -- test 3 - ok',sLineBreak);
  1606. end;
  1607. //-------------------------------------------------------------------------
  1608. procedure test7_prepareWeigth(var AData : TUCA_LineRecArray);
  1609. var
  1610. p : PUCA_LineRec;
  1611. begin
  1612. SetLength(AData,8);
  1613. p := @AData[Low(AData)];
  1614. p^.CodePoints := CodePointToArray($030A);//030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
  1615. p^.Weights := ToWeight($0000,$0043,$0002);
  1616. Inc(p);
  1617. p^.CodePoints := CodePointToArray($0327);//0327 ; [.0000.0056.0002.0327] # COMBINING CEDILLA
  1618. p^.Weights := ToWeight($0000,$0056,$0002);
  1619. Inc(p);
  1620. p^.CodePoints := CodePointToArray($0061);//a
  1621. p^.Weights := ToWeight($15EF,$0020,$0002);
  1622. Inc(p);
  1623. p^.CodePoints := CodePointToArray($0062);//b
  1624. p^.Weights := ToWeight($1605,$0020,$0002);
  1625. Inc(p);
  1626. p^.CodePoints := CodePointToArray($0063);//c
  1627. p^.Weights := ToWeight($161D,$0020,$0002);
  1628. Inc(p);
  1629. p^.CodePoints := CodePointToArray($0064);//d
  1630. p^.Weights := ToWeight($1631,$0020,$0002);
  1631. Inc(p);
  1632. p^.CodePoints := CodePointToArray([$0061,$030A]);//a,030A;COMBINING RING ABOVE
  1633. p^.Weights := ToWeight($164C,$0020,$0002);
  1634. Inc(p);
  1635. p^.CodePoints := CodePointToArray(Ord('k'));
  1636. p^.Weights := ToWeight($16FF,$0020,$0002);
  1637. end;
  1638. procedure test7_PopulateSequence(var ASequence : TOrderedCharacters);
  1639. var
  1640. i : Integer;
  1641. begin
  1642. ASequence := TOrderedCharacters.Create();
  1643. ASequence.Append(TReorderUnit.From($030A,TReorderWeigthKind.Tertiary,1));
  1644. ASequence.Append(TReorderUnit.From($0327,TReorderWeigthKind.Tertiary,2));
  1645. ASequence.Append(TReorderUnit.From($0061,TReorderWeigthKind.Primary,3));
  1646. ASequence.Append(TReorderUnit.From($0062,TReorderWeigthKind.Primary,4));
  1647. ASequence.Append(TReorderUnit.From($0063,TReorderWeigthKind.Primary,5));
  1648. ASequence.Append(TReorderUnit.From($0064,TReorderWeigthKind.Primary,6));
  1649. ASequence.Append(TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Primary,7));
  1650. ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  1651. for i := 0 to ASequence.ActualLength - 1 do
  1652. ASequence.Data[i].Changed := False;
  1653. end;
  1654. procedure test7();
  1655. var
  1656. sequence, sequenceClean : TOrderedCharacters;
  1657. statement : TReorderSequence;
  1658. wfirst, wresult : TUCA_LineRecArray;
  1659. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1660. begin // Permutation simple test
  1661. statement.Clear();
  1662. test7_prepareWeigth(wfirst);
  1663. test7_PopulateSequence(sequenceClean);
  1664. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1665. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1666. //Generate the original tables
  1667. ConstructUnicodeBook(wfirst,'test7','first',nil,unicodeBook1);
  1668. CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064, #$0061#$030A,'k'],@unicodeBook1);
  1669. CheckInf([#$0064, #$0061#$030A#$0327#$0062,'k'],@unicodeBook1);// Permutation here $030A <=> #$0327
  1670. CheckInf([#$0064, #$0061#$0327#$030A#$0062,'k'],@unicodeBook1);
  1671. CheckEqual(#$0061#$030A#$0327, #$0061#$0327#$030A,@unicodeBook1);
  1672. // --- test 2
  1673. sequence := sequenceClean.Clone();
  1674. SetLength(statement.Reset,0);
  1675. SetLength(statement.Elements,1);
  1676. statement.Elements[0] := TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Deletion,0);
  1677. sequence.ApplyStatement(@statement);
  1678. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1679. wresult := nil;
  1680. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1681. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1682. //Generate updatet tables
  1683. ConstructUnicodeBook(wresult,'test7','second',@unicodeBook1,unicodeBook2);
  1684. unicodeBook2.Base := @unicodeBook1;
  1685. CheckInf([#$030A,#$0327,#$0061,#$0061#$030A ,#$0062,#$0063,#$0064,'k'],@unicodeBook2);
  1686. CheckInf([#$0061, #$0061#$030A#$0327#$0062,#$0062,#$0064],@unicodeBook2);
  1687. CheckInf([#$0061, #$0061#$030A#$0062#$0327,#$0062,#$0064],@unicodeBook2);
  1688. WriteLn(' -- test 2 - ok',sLineBreak);
  1689. end;
  1690. //-------------------------------------------------------------------------
  1691. procedure test8_prepareWeigth(var AData : TUCA_LineRecArray);
  1692. var
  1693. p : PUCA_LineRec;
  1694. begin
  1695. SetLength(AData,12);
  1696. p := @AData[Low(AData)];
  1697. p^.CodePoints := CodePointToArray(Ord('a'));
  1698. p^.Weights := ToWeight($15EF,$0020,$0002);
  1699. Inc(p);
  1700. p^.CodePoints := CodePointToArray(Ord('b'));
  1701. p^.Weights := ToWeight($1605,$0020,$0002);
  1702. Inc(p);
  1703. p^.CodePoints := CodePointToArray(Ord('c'));
  1704. p^.Weights := ToWeight($161D,$0020,$0002);
  1705. Inc(p);
  1706. p^.CodePoints := CodePointToArray(Ord('d'));
  1707. p^.Weights := ToWeight($1631,$0020,$0002);
  1708. Inc(p);
  1709. p^.CodePoints := CodePointToArray(Ord('e'));
  1710. p^.Weights := ToWeight($164C,$0020,$0002);
  1711. Inc(p);
  1712. p^.CodePoints := CodePointToArray(Ord('f'));
  1713. p^.Weights := ToWeight($1684,$0020,$0002);
  1714. Inc(p);
  1715. p^.CodePoints := CodePointToArray(Ord('g'));
  1716. p^.Weights := ToWeight($1691,$0020,$0002);
  1717. Inc(p);
  1718. p^.CodePoints := CodePointToArray(Ord('h'));
  1719. p^.Weights := ToWeight($16B4,$0020,$0002);
  1720. Inc(p);
  1721. p^.CodePoints := CodePointToArray(Ord('i'));
  1722. p^.Weights := ToWeight($16CD,$0020,$0002);
  1723. Inc(p);
  1724. p^.CodePoints := CodePointToArray(Ord('j'));
  1725. p^.Weights := ToWeight($16E6,$0020,$0002);
  1726. Inc(p);
  1727. p^.CodePoints := CodePointToArray(Ord('k'));
  1728. p^.Weights := ToWeight($16FF,$0020,$0002);
  1729. Inc(p);
  1730. p^.CodePoints := CodePointToArray(Ord('l'));
  1731. p^.Weights := ToWeight($1711,$0020,$0002);
  1732. end;
  1733. procedure test8_PopulateSequence(var ASequence : TOrderedCharacters);
  1734. var
  1735. i : Integer;
  1736. begin
  1737. ASequence := TOrderedCharacters.Create();
  1738. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  1739. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  1740. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  1741. ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
  1742. ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
  1743. ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
  1744. ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
  1745. ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
  1746. ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
  1747. ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
  1748. ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  1749. ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
  1750. for i := 0 to ASequence.ActualLength - 1 do
  1751. ASequence.Data[i].Changed := False;
  1752. end;
  1753. procedure test8();
  1754. var
  1755. sequence, sequenceClean : TOrderedCharacters;
  1756. statement : TReorderSequence;
  1757. wfirst, wresult : TUCA_LineRecArray;
  1758. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1759. begin
  1760. statement.Clear();
  1761. test8_prepareWeigth(wfirst);
  1762. test8_PopulateSequence(sequenceClean);
  1763. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1764. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1765. //Generate the original tables
  1766. ConstructUnicodeBook(wfirst,'test8','first',nil,unicodeBook1);
  1767. CheckInf('l','-'{* computed are greater},@unicodeBook1);
  1768. // --- test 1
  1769. sequence := sequenceClean.Clone();
  1770. SetLength(statement.Reset,1);
  1771. statement.Reset[0] := Ord('c');
  1772. SetLength(statement.Elements,1);
  1773. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
  1774. sequence.ApplyStatement(@statement);
  1775. wresult := nil;
  1776. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1777. //Generate updatet tables
  1778. ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
  1779. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1780. CheckEqual('cc','c-'{*},@unicodeBook2);
  1781. CheckEqual('ccc','c-c'{*},@unicodeBook2);
  1782. CheckEqual('cca','c-a'{*},@unicodeBook2);
  1783. CheckEqual('cce','c-e'{*},@unicodeBook2);
  1784. CheckInf(['cc','c-c'{*}],@unicodeBook2);
  1785. CheckInf(['bc','bc-c'{*}],@unicodeBook2);
  1786. CheckInf('l','-'{* computed are greater},@unicodeBook2);
  1787. WriteLn(' -- test 1 - ok');
  1788. // --- test 2
  1789. sequence := sequenceClean.Clone();
  1790. SetLength(statement.Reset,1);
  1791. statement.Reset[0] := Ord('c');
  1792. SetLength(statement.Elements,1);
  1793. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Primary,0);
  1794. sequence.ApplyStatement(@statement);
  1795. wresult := nil;
  1796. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1797. //Generate updatet tables
  1798. ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
  1799. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1800. CheckInf('cc','c-'{*},@unicodeBook2);
  1801. CheckInf('ccl','c-'{*},@unicodeBook2);
  1802. CheckInf('ccc','c-c'{*},@unicodeBook2);
  1803. CheckInf('cca','c-a'{*},@unicodeBook2);
  1804. CheckInf('cce','c-e'{*},@unicodeBook2);
  1805. CheckInf(['cc','c-c'{*}],@unicodeBook2);
  1806. CheckInf(['bc','bc-c'{*}],@unicodeBook2);
  1807. CheckInf('l','-'{* computed are greater},@unicodeBook2);
  1808. WriteLn(' -- test 2 - ok');
  1809. // --- test 3
  1810. sequence := sequenceClean.Clone();
  1811. SetLength(statement.Reset,1);
  1812. statement.Reset[0] := Ord('c');
  1813. SetLength(statement.Elements,1);
  1814. statement.Elements[0] := TReorderUnit.From([Ord('-'),Ord('+')],[Ord('c')],TReorderWeigthKind.Identity,0);
  1815. sequence.ApplyStatement(@statement);
  1816. wresult := nil;
  1817. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1818. //Generate updatet tables
  1819. ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
  1820. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1821. CheckEqual('cc','c-+'{*},@unicodeBook2);
  1822. CheckEqual('ccc','c-+c'{*},@unicodeBook2);
  1823. CheckEqual('cca','c-+a'{*},@unicodeBook2);
  1824. CheckEqual('cce','c-+e'{*},@unicodeBook2);
  1825. CheckInf(['cc','c-+c'{*}],@unicodeBook2);
  1826. CheckInf(['bc','bc-+c'{*}],@unicodeBook2);
  1827. CheckInf('l','-+'{* computed are greater},@unicodeBook2);
  1828. WriteLn(' -- test 3 - ok');
  1829. // --- test 4 : '-' has 3 contexts to force the context tree to have at least
  1830. // a "Left" and a "Right"
  1831. sequence := sequenceClean.Clone();
  1832. SetLength(statement.Reset,1);
  1833. statement.Reset[0] := Ord('c');
  1834. SetLength(statement.Elements,1);
  1835. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
  1836. sequence.ApplyStatement(@statement);
  1837. statement.Reset[0] := Ord('f');
  1838. SetLength(statement.Elements,1);
  1839. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('f')],TReorderWeigthKind.Identity,0);
  1840. sequence.ApplyStatement(@statement);
  1841. statement.Reset[0] := Ord('a');
  1842. SetLength(statement.Elements,1);
  1843. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('a')],TReorderWeigthKind.Identity,0);
  1844. sequence.ApplyStatement(@statement);
  1845. wresult := nil;
  1846. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1847. //Generate updatet tables
  1848. ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
  1849. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1850. // Check c
  1851. CheckEqual('cc','c-'{*},@unicodeBook2);
  1852. CheckEqual('ccc','c-c'{*},@unicodeBook2);
  1853. CheckEqual('cca','c-a'{*},@unicodeBook2);
  1854. CheckEqual('cce','c-e'{*},@unicodeBook2);
  1855. CheckInf(['cc','c-c'{*}],@unicodeBook2);
  1856. CheckInf(['bc','bc-c'{*}],@unicodeBook2);
  1857. //check f
  1858. CheckEqual('ff','f-'{*},@unicodeBook2);
  1859. CheckEqual('fff','f-f'{*},@unicodeBook2);
  1860. CheckEqual('ffa','f-a'{*},@unicodeBook2);
  1861. CheckEqual('ffe','f-e'{*},@unicodeBook2);
  1862. CheckInf(['ff','f-f'{*}],@unicodeBook2);
  1863. CheckInf(['bf','bf-f'{*}],@unicodeBook2);
  1864. //check c and f
  1865. CheckEqual('ccf','c-f'{*},@unicodeBook2);
  1866. CheckEqual('ccff','c-f-'{*},@unicodeBook2);
  1867. CheckEqual('ccfff','c-f-f'{*},@unicodeBook2);
  1868. CheckEqual('ffcc','f-c-'{*},@unicodeBook2);
  1869. CheckEqual('ffccf','f-c-f'{*},@unicodeBook2);
  1870. CheckInf('ffccf','g'{*},@unicodeBook2);
  1871. CheckInf('a-','ab',@unicodeBook2);
  1872. // check - alone
  1873. CheckInf('l','-'{* computed are greater},@unicodeBook2);
  1874. WriteLn(' -- test 4 - ok');
  1875. // --- test 5 : Add a contraction to force the code path
  1876. sequence := sequenceClean.Clone();
  1877. SetLength(statement.Reset,1);
  1878. statement.Reset[0] := Ord('a');
  1879. SetLength(statement.Elements,1);
  1880. statement.Elements[0] := TReorderUnit.From([Ord('-'),Ord('h')],TReorderWeigthKind.Primary,0);
  1881. sequence.ApplyStatement(@statement);
  1882. statement.Reset[0] := Ord('c');
  1883. SetLength(statement.Elements,1);
  1884. statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
  1885. sequence.ApplyStatement(@statement);
  1886. wresult := nil;
  1887. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1888. //Generate updatet tables
  1889. ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
  1890. CheckInf(['a','-h','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  1891. CheckEqual('cc','c-'{*},@unicodeBook2);
  1892. CheckEqual('ccc','c-c'{*},@unicodeBook2);
  1893. CheckEqual('cca','c-a'{*},@unicodeBook2);
  1894. CheckEqual('cce','c-e'{*},@unicodeBook2);
  1895. CheckInf(['cc','c-c'{*}],@unicodeBook2);
  1896. CheckInf(['bc','bc-c'{*}],@unicodeBook2);
  1897. CheckInf(['ab','-hb'{*}],@unicodeBook2);
  1898. CheckInf(['-hb','ba'],@unicodeBook2);
  1899. CheckInf('l','-'{* computed are greater},@unicodeBook2);
  1900. WriteLn(' -- test 5 - ok');
  1901. WriteLn(' -- test - ok',sLineBreak);
  1902. end;
  1903. //-------------------------------------------------------------------------
  1904. procedure test9_prepareWeigth(var AData : TUCA_LineRecArray);
  1905. var
  1906. p : PUCA_LineRec;
  1907. begin
  1908. SetLength(AData,8);
  1909. p := @AData[Low(AData)];
  1910. p^.CodePoints := CodePointToArray($030A);//030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
  1911. p^.Weights := ToWeight($0000,$0043,$0002);
  1912. Inc(p);
  1913. p^.CodePoints := CodePointToArray($0327);//0327 ; [.0000.0056.0002.0327] # COMBINING CEDILLA
  1914. p^.Weights := ToWeight($0000,$0056,$0002);
  1915. Inc(p);
  1916. p^.CodePoints := CodePointToArray($0061);//a
  1917. p^.Weights := ToWeight($15EF,$0020,$0002);
  1918. Inc(p);
  1919. p^.CodePoints := CodePointToArray($0062);//b
  1920. p^.Weights := ToWeight($1605,$0020,$0002);
  1921. Inc(p);
  1922. p^.CodePoints := CodePointToArray($0063);//c
  1923. p^.Weights := ToWeight($161D,$0020,$0002);
  1924. Inc(p);
  1925. p^.CodePoints := CodePointToArray($0064);//d
  1926. p^.Weights := ToWeight($1631,$0020,$0002);
  1927. Inc(p);
  1928. p^.CodePoints := CodePointToArray([$0061,$030A]);//a,030A;COMBINING RING ABOVE
  1929. p^.Weights := ToWeight($164C,$0020,$0002);
  1930. Inc(p);
  1931. p^.CodePoints := CodePointToArray(Ord('k'));
  1932. p^.Weights := ToWeight($16FF,$0020,$0002);
  1933. end;
  1934. procedure test9_PopulateSequence(var ASequence : TOrderedCharacters);
  1935. var
  1936. i : Integer;
  1937. begin
  1938. ASequence := TOrderedCharacters.Create();
  1939. ASequence.Append(TReorderUnit.From($030A,TReorderWeigthKind.Tertiary,1));
  1940. ASequence.Append(TReorderUnit.From($0327,TReorderWeigthKind.Tertiary,2));
  1941. ASequence.Append(TReorderUnit.From($0061,TReorderWeigthKind.Primary,3));
  1942. ASequence.Append(TReorderUnit.From($0062,TReorderWeigthKind.Primary,4));
  1943. ASequence.Append(TReorderUnit.From($0063,TReorderWeigthKind.Primary,5));
  1944. ASequence.Append(TReorderUnit.From($0064,TReorderWeigthKind.Primary,6));
  1945. ASequence.Append(TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Primary,7));
  1946. ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  1947. for i := 0 to ASequence.ActualLength - 1 do
  1948. ASequence.Data[i].Changed := False;
  1949. end;
  1950. procedure test9();
  1951. var
  1952. sequence, sequenceClean : TOrderedCharacters;
  1953. statement : TReorderSequence;
  1954. wfirst, wresult : TUCA_LineRecArray;
  1955. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  1956. begin// Permutation with Context
  1957. statement.Clear();
  1958. test7_prepareWeigth(wfirst);
  1959. test7_PopulateSequence(sequenceClean);
  1960. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  1961. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  1962. //Generate the original tables
  1963. ConstructUnicodeBook(wfirst,'test9','first',nil,unicodeBook1);
  1964. CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064, #$0061#$030A,'k'],@unicodeBook1);
  1965. CheckInf([#$0064, #$0061#$030A#$0327#$0062,'k'],@unicodeBook1);// Permutation here $030A <=> #$0327
  1966. // --- test 2
  1967. sequence := sequenceClean.Clone();
  1968. SetLength(statement.Reset,1);
  1969. statement.Reset[0] := $0062;
  1970. SetLength(statement.Elements,1);
  1971. 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;;;;
  1972. sequence.ApplyStatement(@statement);
  1973. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  1974. wresult := nil;
  1975. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  1976. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  1977. //Generate updatet tables
  1978. ConstructUnicodeBook(wresult,'test9','second',@unicodeBook1,unicodeBook2);
  1979. unicodeBook2.Base := @unicodeBook1;
  1980. CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064,'k'],@unicodeBook2);
  1981. CheckInf([#$0061'k'#$032D ,#$0061#$0063],@unicodeBook2);
  1982. CheckNotEqual(#$0061'k'#$0327#$032D, #$0061#$0327,@unicodeBook2);
  1983. CheckInf([#$0061'k'#$0327#$032D ,#$0061#$0063],@unicodeBook2);
  1984. WriteLn(' -- test 2 - ok',sLineBreak);
  1985. end;
  1986. //------------------------------------------------------
  1987. procedure test10_prepareWeigth(var AData : TUCA_LineRecArray);
  1988. var
  1989. p : PUCA_LineRec;
  1990. begin
  1991. SetLength(AData,12);
  1992. p := @AData[Low(AData)];
  1993. p^.CodePoints := CodePointToArray(Ord('a'));
  1994. p^.Weights := ToWeight($15EF,$0020,$0002);
  1995. Inc(p);
  1996. p^.CodePoints := CodePointToArray([Ord('('),Ord('a'),Ord(')')]);
  1997. p^.Weights := ToWeight($15EF,$0020,$0006); //15EF.0020.0006.24D0
  1998. Inc(p);
  1999. p^.CodePoints := CodePointToArray(Ord('A'));
  2000. p^.Weights := ToWeight($15EF,$0020,$0008); //15EF.0020.0008.0041
  2001. Inc(p);
  2002. p^.CodePoints := CodePointToArray([Ord('('),Ord('A'),Ord(')')]);
  2003. p^.Weights := ToWeight($15EF,$0020,$000C); //15EF.0020.000C
  2004. Inc(p);
  2005. p^.CodePoints := CodePointToArray([Ord('a'),Ord('`')]);
  2006. p^.Weights := ToWeight([$15EF,$0020,$0002, $0000,$0035,$0002]); //[.15EF.0020.0002.0061][.0000.0035.0002.0300]
  2007. Inc(p);
  2008. p^.CodePoints := CodePointToArray([Ord('A'),Ord('`')]);
  2009. p^.Weights := ToWeight([$15EF,$0020,$0008, $0000,$0035,$0002]); //[.15EF.0020.0008.0041][.0000.0035.0002.0300]
  2010. Inc(p);
  2011. p^.CodePoints := CodePointToArray([Ord('a'),Ord('e')]);
  2012. p^.Weights := ToWeight([$15F0,$0020,$0002]); //[.15EF.0020.0004.00E6][.0000.0139.0004.00E6][.164C.0020.0004.00E6]
  2013. Inc(p);
  2014. p^.CodePoints := CodePointToArray([Ord(UpCase('a')),Ord(UpCase('e'))]);
  2015. p^.Weights := ToWeight([$15F0,$0020,$0006]);//[.15EF.0020.000A.00C6][.0000.0139.0004.00C6][.164C.0020.000A.00C6]
  2016. Inc(p);
  2017. p^.CodePoints := CodePointToArray(Ord('b'));
  2018. p^.Weights := ToWeight($1605,$0020,$0002);
  2019. Inc(p);
  2020. p^.CodePoints := CodePointToArray([Ord('('),Ord('b'),Ord(')')]);
  2021. p^.Weights := ToWeight($1605,$0020,$0006); //.1605.0020.0006.24D1
  2022. Inc(p);
  2023. p^.CodePoints := CodePointToArray(Ord('B'));
  2024. p^.Weights := ToWeight($1605,$0020,$0008); //1605.0020.0008.0042
  2025. Inc(p);
  2026. p^.CodePoints := CodePointToArray(Ord('c'));
  2027. p^.Weights := ToWeight($161D,$0020,$0002);
  2028. end;
  2029. procedure test10_PopulateSequence(var ASequence : TOrderedCharacters);
  2030. var
  2031. i : Integer;
  2032. begin
  2033. ASequence := TOrderedCharacters.Create();
  2034. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  2035. ASequence.Append(TReorderUnit.From([Ord('('),Ord('a'),Ord(')')],TReorderWeigthKind.Tertiary,2));
  2036. ASequence.Append(TReorderUnit.From(Ord('A'),TReorderWeigthKind.Tertiary,3));
  2037. ASequence.Append(TReorderUnit.From([Ord('('),Ord('A'),Ord(')')],TReorderWeigthKind.Tertiary,4));
  2038. //ASequence.Append(TReorderUnit.From(Ord('à'),TReorderWeigthKind.Secondary,0));
  2039. ASequence.Append(TReorderUnit.From([Ord('a'),Ord('`')],TReorderWeigthKind.Secondary,5));
  2040. //ASequence.Append(TReorderUnit.From(Ord(UpCase('à')),TReorderWeigthKind.Tertiary,0));
  2041. ASequence.Append(TReorderUnit.From([Ord('A'),Ord('`')],TReorderWeigthKind.Tertiary,6));
  2042. ASequence.Append(TReorderUnit.From([Ord('a'),Ord('e')],TReorderWeigthKind.Primary,7));
  2043. ASequence.Append(TReorderUnit.From([Ord(UpCase('a')),Ord(UpCase('e'))],TReorderWeigthKind.Tertiary,8));
  2044. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,9));
  2045. ASequence.Append(TReorderUnit.From([Ord('('),Ord('b'),Ord(')')],TReorderWeigthKind.Tertiary,10));
  2046. ASequence.Append(TReorderUnit.From(Ord('B'),TReorderWeigthKind.Tertiary,11));
  2047. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,12));
  2048. for i := 0 to ASequence.ActualLength - 1 do
  2049. ASequence.Data[i].Changed := False;
  2050. end;
  2051. procedure test10();
  2052. var
  2053. sequence, sequenceClean : TOrderedCharacters;
  2054. statement : TReorderSequence;
  2055. wfirst, wresult : TUCA_LineRecArray;
  2056. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  2057. begin
  2058. statement.Clear();
  2059. test10_prepareWeigth(wfirst);
  2060. test10_PopulateSequence(sequenceClean);
  2061. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  2062. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  2063. //Generate the original tables
  2064. ConstructUnicodeBook(wfirst,'test6','first',nil,unicodeBook1);
  2065. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook1);
  2066. // --- test 1
  2067. sequence := sequenceClean.Clone();
  2068. statement.Clear();
  2069. statement.Before := True;
  2070. SetLength(statement.Reset,2);
  2071. statement.Reset[0] := Ord('a');
  2072. statement.Reset[1] := Ord('e');
  2073. SetLength(statement.Elements,1);
  2074. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  2075. sequence.ApplyStatement(@statement);
  2076. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2077. wresult := nil;
  2078. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2079. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2080. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  2081. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
  2082. CheckInf(['gg','ae'],@unicodeBook2);
  2083. CheckInf(['gb','ae'],@unicodeBook2);
  2084. WriteLn(' -- test 1 - ok',sLineBreak);
  2085. // --- test 2
  2086. sequence := sequenceClean.Clone();
  2087. statement.Clear();
  2088. statement.Before := True;
  2089. SetLength(statement.Reset,2);
  2090. statement.Reset[0] := Ord('a');
  2091. statement.Reset[1] := Ord('e');
  2092. SetLength(statement.Elements,1);
  2093. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
  2094. sequence.ApplyStatement(@statement);
  2095. WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2096. wresult := nil;
  2097. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2098. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2099. ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
  2100. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
  2101. CheckInf(['A`B','gg'],@unicodeBook2);
  2102. CheckInf(['A`b','g'],@unicodeBook2);
  2103. WriteLn(' -- test 2 - ok',sLineBreak);
  2104. // --- test 3
  2105. sequence := sequenceClean.Clone();
  2106. statement.Clear();
  2107. statement.Before := True;
  2108. SetLength(statement.Reset,2);
  2109. statement.Reset[0] := Ord('a');
  2110. statement.Reset[1] := Ord('e');
  2111. SetLength(statement.Elements,1);
  2112. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  2113. sequence.ApplyStatement(@statement);
  2114. WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2115. wresult := nil;
  2116. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2117. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2118. ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
  2119. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
  2120. CheckInf(['A`B','gg'],@unicodeBook2);
  2121. CheckInf(['A`b','g'],@unicodeBook2);
  2122. WriteLn(' -- test 3 - ok',sLineBreak);
  2123. // --- test 4
  2124. sequence := sequenceClean.Clone();
  2125. statement.Clear();
  2126. statement.Before := True;
  2127. SetLength(statement.Reset,2);
  2128. statement.Reset[0] := Ord('A');
  2129. statement.Reset[1] := Ord('`');
  2130. SetLength(statement.Elements,1);
  2131. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  2132. sequence.ApplyStatement(@statement);
  2133. WriteLn('Statement #4.1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2134. wresult := nil;
  2135. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2136. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2137. statement.Clear();
  2138. statement.Before := True;
  2139. SetLength(statement.Reset,2);
  2140. statement.Reset[0] := Ord('A');
  2141. statement.Reset[1] := Ord('`');
  2142. SetLength(statement.Elements,1);
  2143. statement.Elements[0] := TReorderUnit.From(Ord('G'),TReorderWeigthKind.Secondary,0);
  2144. sequence.ApplyStatement(@statement);
  2145. WriteLn('Statement #4.2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2146. wresult := nil;
  2147. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2148. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2149. ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
  2150. CheckInf(['a','(a)','A','(A)', 'G','a`','g'{*},'A`', 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
  2151. CheckInf(['gg','A`B'],@unicodeBook2);
  2152. CheckInf(['g','A`b'],@unicodeBook2);
  2153. CheckInf(['A','gg'],@unicodeBook2);
  2154. CheckInf(['A','Ga'],@unicodeBook2);
  2155. WriteLn(' -- test 4 - ok',sLineBreak);
  2156. // --- test 5
  2157. sequence := sequenceClean.Clone();
  2158. statement.Clear();
  2159. statement.Before := True;
  2160. SetLength(statement.Reset,1);
  2161. statement.Reset[0] := Ord('B');
  2162. SetLength(statement.Elements,1);
  2163. statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  2164. sequence.ApplyStatement(@statement);
  2165. WriteLn('Statement #5 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2166. wresult := nil;
  2167. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2168. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2169. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  2170. CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'g'{*}, 'b','(b)','B', 'c'],@unicodeBook2);
  2171. CheckInf(['gg','b'],@unicodeBook2);
  2172. CheckInf(['ae','gb'],@unicodeBook2);
  2173. WriteLn(' -- test 5 - ok',sLineBreak);
  2174. end;
  2175. //------------------------------------------------------
  2176. procedure test11_prepareWeigth(var AData : TUCA_LineRecArray);
  2177. var
  2178. p : PUCA_LineRec;
  2179. begin
  2180. SetLength(AData,12);
  2181. p := @AData[Low(AData)];
  2182. p^.CodePoints := CodePointToArray(Ord('a'));
  2183. p^.Weights := ToWeight($15EF,$0020,$0002);
  2184. Inc(p);
  2185. p^.CodePoints := CodePointToArray(Ord('b'));
  2186. p^.Weights := ToWeight($1605,$0020,$0002);
  2187. Inc(p);
  2188. p^.CodePoints := CodePointToArray(Ord('c'));
  2189. p^.Weights := ToWeight($161D,$0020,$0002);
  2190. Inc(p);
  2191. p^.CodePoints := CodePointToArray(Ord('d'));
  2192. p^.Weights := ToWeight($1631,$0020,$0002);
  2193. Inc(p);
  2194. p^.CodePoints := CodePointToArray(Ord('e'));
  2195. p^.Weights := ToWeight($164C,$0020,$0002);
  2196. Inc(p);
  2197. p^.CodePoints := CodePointToArray(Ord('f'));
  2198. p^.Weights := ToWeight($1684,$0020,$0002);
  2199. Inc(p);
  2200. p^.CodePoints := CodePointToArray(Ord('g'));
  2201. p^.Weights := ToWeight($1691,$0020,$0002);
  2202. Inc(p);
  2203. p^.CodePoints := CodePointToArray(Ord('h'));
  2204. p^.Weights := ToWeight($16B4,$0020,$0002);
  2205. Inc(p);
  2206. p^.CodePoints := CodePointToArray(Ord('i'));
  2207. p^.Weights := ToWeight($16CD,$0020,$0002);
  2208. Inc(p);
  2209. p^.CodePoints := CodePointToArray(Ord('j'));
  2210. p^.Weights := ToWeight($16E6,$0020,$0002);
  2211. Inc(p);
  2212. p^.CodePoints := CodePointToArray(Ord('k'));
  2213. p^.Weights := ToWeight($16FF,$0020,$0002);
  2214. Inc(p);
  2215. p^.CodePoints := CodePointToArray(Ord('l'));
  2216. p^.Weights := ToWeight($1711,$0020,$0002);
  2217. end;
  2218. procedure test11_PopulateSequence(var ASequence : TOrderedCharacters);
  2219. var
  2220. i : Integer;
  2221. begin
  2222. ASequence := TOrderedCharacters.Create();
  2223. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  2224. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  2225. ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  2226. ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
  2227. ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
  2228. ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
  2229. ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
  2230. ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
  2231. ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
  2232. ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
  2233. ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
  2234. ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
  2235. for i := 0 to ASequence.ActualLength - 1 do
  2236. ASequence.Data[i].Changed := False;
  2237. end;
  2238. procedure test11();
  2239. var
  2240. sequence, sequenceClean : TOrderedCharacters;
  2241. statement : TReorderSequence;
  2242. wfirst, wresult : TUCA_LineRecArray;
  2243. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  2244. begin
  2245. statement.Clear();
  2246. test11_prepareWeigth(wfirst);
  2247. test11_PopulateSequence(sequenceClean);
  2248. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  2249. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  2250. //Generate the original tables
  2251. ConstructUnicodeBook(wfirst,'test11','first',nil,unicodeBook1);
  2252. CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook1);
  2253. // --- test 1
  2254. sequence := sequenceClean.Clone();
  2255. SetLength(statement.Reset,1);
  2256. statement.Reset[0] := Ord('c');
  2257. SetLength(statement.Elements,1);
  2258. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Tertiary,0);
  2259. statement.Elements[0].SetExpansion(Ord('h'));
  2260. sequence.ApplyStatement(@statement);
  2261. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2262. wresult := nil;
  2263. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2264. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2265. //Generate updatet tables
  2266. ConstructUnicodeBook(wresult,'test1','second',@unicodeBook1,unicodeBook2);
  2267. CheckInf(['a','b','c','x'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  2268. CheckInf('ch','x'{*},@unicodeBook2);
  2269. CheckInf('cha','xa'{*},@unicodeBook2);
  2270. CheckInf('chk','xka'{*},@unicodeBook2);
  2271. WriteLn(' -- test 1 - ok');
  2272. // --- test 2
  2273. sequence := sequenceClean.Clone();
  2274. SetLength(statement.Reset,1);
  2275. statement.Reset[0] := Ord('c');
  2276. SetLength(statement.Elements,2);
  2277. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Tertiary,0);
  2278. statement.Elements[0].SetExpansion(Ord('h'));
  2279. statement.Elements[1] := TReorderUnit.From(Ord('X'),TReorderWeigthKind.Tertiary,0);
  2280. sequence.ApplyStatement(@statement);
  2281. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2282. wresult := nil;
  2283. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2284. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2285. //Generate updatet tables
  2286. ConstructUnicodeBook(wresult,'test2','second',@unicodeBook1,unicodeBook2);
  2287. CheckInf(['a','b','c','x'{*},'X'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
  2288. CheckInf('ch','x'{*},@unicodeBook2);
  2289. CheckInf('cha','xa'{*},@unicodeBook2);
  2290. CheckInf('chk','xka'{*},@unicodeBook2);
  2291. CheckInf('ch','X'{*},@unicodeBook2);
  2292. CheckInf('cha','Xa'{*},@unicodeBook2);
  2293. CheckInf('chk','Xka'{*},@unicodeBook2);
  2294. WriteLn(' -- test 2 - ok');
  2295. end;
  2296. //------------------------------------------------------
  2297. procedure test12_prepareWeigth(var AData : TUCA_LineRecArray);
  2298. var
  2299. p : PUCA_LineRec;
  2300. begin
  2301. SetLength(AData,1);
  2302. p := @AData[Low(AData)];
  2303. p^.CodePoints := CodePointToArray(Ord('a'));
  2304. p^.Weights := ToWeight($15EF,$0120,$0002);
  2305. end;
  2306. procedure test12_PopulateSequence(var ASequence : TOrderedCharacters);
  2307. var
  2308. i : Integer;
  2309. begin
  2310. ASequence := TOrderedCharacters.Create();
  2311. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  2312. for i := 0 to ASequence.ActualLength - 1 do
  2313. ASequence.Data[i].Changed := False;
  2314. end;
  2315. procedure Check(const ACondition : Boolean; const AMsg : string);overload;
  2316. begin
  2317. if not ACondition then
  2318. raise Exception.Create(AMsg);
  2319. end;
  2320. procedure Check(
  2321. const ACondition : Boolean;
  2322. const AFormatMsg : string;
  2323. const AArgs : array of const
  2324. );overload;
  2325. begin
  2326. Check(ACondition,Format(AFormatMsg,AArgs));
  2327. end;
  2328. procedure Check(const ACondition : Boolean);overload;
  2329. begin
  2330. Check(ACondition,'Check failed.')
  2331. end;
  2332. procedure CheckSimpleProps(
  2333. AItem : PUCA_PropItemRec;
  2334. AHasCodePoint,
  2335. AIsValid : Boolean;
  2336. AChildCount : Byte;
  2337. AContextual : Boolean
  2338. );overload;
  2339. var
  2340. p : PUCA_PropItemRec;
  2341. begin
  2342. p := AItem;
  2343. Check(p<>nil,'p = nil');
  2344. Check(p^.HasCodePoint()=AHasCodePoint,'HasCodePoint');
  2345. Check(p^.IsValid()=AIsValid,'IsValid');
  2346. Check(p^.ChildCount=AChildCount,'ChildCount');
  2347. Check(p^.Contextual=AContextual,'Contextual');
  2348. end;
  2349. procedure CheckSimpleProps(
  2350. AItem : PUCA_PropItemRec;
  2351. AHasCodePoint,
  2352. AIsValid : Boolean;
  2353. AChildCount : Byte;
  2354. AContextual,
  2355. AIsDeleted : Boolean
  2356. );overload;
  2357. begin
  2358. CheckSimpleProps(AItem,AHasCodePoint,AIsValid,AChildCount,AContextual);
  2359. Check(AItem^.IsDeleted=AIsDeleted,'IsDeleted');
  2360. end;
  2361. procedure CheckWeigths(AItem : PUCA_PropItemRec; const AWeigths : array of Word);overload;
  2362. var
  2363. p : PUCA_PropItemRec;
  2364. c, i : Integer;
  2365. pb : PByte;
  2366. pw : PWord;
  2367. begin
  2368. p := AItem;
  2369. c := Length(AWeigths);
  2370. if ((c mod 3) > 0) then
  2371. Check(False,'Invalid Weigth Array.');
  2372. c := c div 3;
  2373. Check(c=p^.WeightLength,'WeightLength');
  2374. if (c = 0) then
  2375. exit;
  2376. pb := PByte(PtrUInt(p)+SizeOf(TUCA_PropItemRec));
  2377. pw := @AWeigths[Low(AWeigths)];
  2378. //First Item
  2379. Check(PWord(pb)^ = pw^, 'First Item[0]');
  2380. pw := pw + 1;
  2381. pb := pb + 2;
  2382. if (pw^ > High(Byte)) then begin
  2383. Check(PWord(pb)^ = pw^, 'First Item[1]');
  2384. pb := pb + 2;
  2385. end else begin
  2386. Check(pb^ = pw^, 'First Item[1]');
  2387. pb := pb + 1;
  2388. end;
  2389. pw := pw + 1;
  2390. if (pw^ > High(Byte)) then begin
  2391. Check(PWord(pb)^ = pw^, 'First Item[2]');
  2392. pb := pb + 2;
  2393. end else begin
  2394. Check(pb^ = pw^, 'First Item[2]');
  2395. pb := pb + 1;
  2396. end;
  2397. pw := pw + 1;
  2398. // Others
  2399. for i := 1 to c-1 do begin
  2400. Check(PWord(pb)^ = pw^, 'Item[0],i=%d',[i]);
  2401. Inc(pw);
  2402. pb := pb + 2;
  2403. Check(PWord(pb)^ = pw^, 'Item[1],i=%d',[i]);
  2404. Inc(pw);
  2405. pb := pb + 2;
  2406. Check(PWord(pb)^ = pw^, 'Item[2],i=%d',[i]);
  2407. Inc(pw);
  2408. pb := pb + 2;
  2409. end;
  2410. end;
  2411. procedure CheckWeigths(
  2412. AData : PUCA_PropWeights;
  2413. const ADataCount : Integer;
  2414. const AWeigths : array of Word
  2415. );overload;
  2416. var
  2417. c: Integer;
  2418. begin
  2419. c := Length(AWeigths);
  2420. if ((c mod 3) > 0) then
  2421. Check(False,'Invalid Weigth Array.');
  2422. c := c div 3;
  2423. Check(c=ADataCount,'WeightLength');
  2424. if (c = 0) then
  2425. exit;
  2426. if not CompareMem(AData,@AWeigths[0],(ADataCount*3*SizeOf(Word))) then
  2427. Check(False,'Weight');
  2428. end;
  2429. function CalcWeigthSize(const AWeigths : array of Word) : Integer;
  2430. var
  2431. c : Integer;
  2432. begin
  2433. c := Length(AWeigths);
  2434. if ((c mod 3) > 0) then
  2435. Check(False,'Invalid Weigth Array.');
  2436. Result := c * SizeOf(Word);
  2437. if (c>0) then begin
  2438. if (AWeigths[1] <= High(Byte)) then
  2439. Result := Result - 1;
  2440. if (AWeigths[2] <= High(Byte)) then
  2441. Result := Result - 1;
  2442. end;
  2443. end;
  2444. procedure test12_check_1(const ABook : unicodedata.TUCA_DataBook);
  2445. var
  2446. p, px : PUCA_PropItemRec;
  2447. size, sizeTotal, t: Cardinal;
  2448. begin
  2449. sizeTotal := 0;
  2450. // for 'b'
  2451. p := ABook.Props;
  2452. CheckSimpleProps(p,False,True,0,False);
  2453. CheckWeigths(p,[$15F0,0,0]);// CheckWeigths(p,[$15F0,0,0, $15F0,0,0]);
  2454. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15F0,0,0]);
  2455. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2456. Check(p^.Size = size,'size');
  2457. sizeTotal:= sizeTotal+size;
  2458. // for 'c'
  2459. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2460. CheckSimpleProps(p,False,True,0,False);
  2461. CheckWeigths(p,[$15F1,0,0]);
  2462. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15F1,0,0]);
  2463. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2464. Check(p^.Size = size,'size');
  2465. sizeTotal:= sizeTotal+size;
  2466. // for 'x'
  2467. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2468. px := p;
  2469. CheckSimpleProps(p,False,False,1,False);
  2470. CheckWeigths(p,[]);
  2471. size := SizeOf(TUCA_PropItemRec);
  2472. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2473. t := size;
  2474. sizeTotal:= sizeTotal+size;
  2475. // for 'y'
  2476. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2477. CheckSimpleProps(p,True,True,0,False);
  2478. CheckWeigths(p,[$15F2,0,0]);
  2479. size := SizeOf(TUCA_PropItemRec) +
  2480. SizeOf(UInt24) +
  2481. CalcWeigthSize([$15F2,0,0]);
  2482. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2483. Check(p^.Size = size,'size(y)');
  2484. Check(px^.Size = (t+size),'size(x)');
  2485. sizeTotal:= sizeTotal+size;
  2486. Check(ABook.PropCount = sizeTotal,'size(total)');
  2487. end;
  2488. procedure test12_check_2(const ABook : unicodedata.TUCA_DataBook);
  2489. var
  2490. p, ph : PUCA_PropItemRec;
  2491. size, sizeTotal, t: Integer;
  2492. begin
  2493. sizeTotal := 0;
  2494. // for 'b'
  2495. p := ABook.Props;
  2496. CheckSimpleProps(p,False,True,0,False);
  2497. CheckWeigths(p,[$15EF,$121,0]); //CheckWeigths(p,[$15EF,$121,0, $15EF,0,0]);
  2498. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0]);
  2499. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2500. Check(p^.Size = size,'size');
  2501. sizeTotal:= sizeTotal+size;
  2502. // for 'c'
  2503. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2504. CheckSimpleProps(p,False,True,0,False);
  2505. CheckWeigths(p,[$15EF,$122,0]);
  2506. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0]);
  2507. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2508. Check(p^.Size = size,'size');
  2509. sizeTotal:= sizeTotal+size;
  2510. // for 'h'
  2511. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2512. ph := p;
  2513. CheckSimpleProps(p,False,False,1,False);
  2514. CheckWeigths(p,[]);
  2515. size := SizeOf(TUCA_PropItemRec);
  2516. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2517. t := size;
  2518. sizeTotal:= sizeTotal+size;
  2519. // for 'i'
  2520. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2521. CheckSimpleProps(p,True,True,0,False);
  2522. CheckWeigths(p,[$15EF,$123,0]);
  2523. size := SizeOf(TUCA_PropItemRec) +
  2524. SizeOf(UInt24) +
  2525. CalcWeigthSize([$15EF,$123,0]);
  2526. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2527. Check(p^.Size = size,'size(i)');
  2528. sizeTotal:= sizeTotal+size;
  2529. Check(ph^.Size = (t+size),'size(h)');
  2530. // for 'k'
  2531. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2532. CheckSimpleProps(p,False,True,0,False);
  2533. CheckWeigths(p,[$15EF,$123,1]);
  2534. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1]);
  2535. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2536. Check(p^.Size = size,'size(k)');
  2537. sizeTotal:= sizeTotal+size;
  2538. Check(ABook.PropCount = sizeTotal,'size(total)');
  2539. end;
  2540. procedure test12_check_3(const ABook : unicodedata.TUCA_DataBook);
  2541. var
  2542. p, pc : PUCA_PropItemRec;
  2543. size, sizeTotal, t: Integer;
  2544. begin
  2545. sizeTotal := 0;
  2546. // for 'b'
  2547. p := ABook.Props;
  2548. CheckSimpleProps(p,False,True,0,False);
  2549. CheckWeigths(p,[$15EF,$121,0]);
  2550. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0]);
  2551. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2552. Check(p^.Size = size,'size');
  2553. sizeTotal:= sizeTotal+size;
  2554. // for 'c'
  2555. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2556. pc := p;
  2557. CheckSimpleProps(p,False,True,1,False);
  2558. CheckWeigths(p,[$15EF,$122,0]);
  2559. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0]);
  2560. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2561. t := size;
  2562. sizeTotal:= sizeTotal+size;
  2563. // for 'i'
  2564. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2565. CheckSimpleProps(p,True,True,0,False);
  2566. CheckWeigths(p,[$15EF,$123,0]);
  2567. size := SizeOf(TUCA_PropItemRec) +
  2568. SizeOf(UInt24) +
  2569. CalcWeigthSize([$15EF,$123,0]);
  2570. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2571. Check(p^.Size = size,'size(i)');
  2572. sizeTotal:= sizeTotal+size;
  2573. Check(pc^.Size = (t+size),'size(c)');
  2574. // for 'k'
  2575. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2576. CheckSimpleProps(p,False,True,0,False);
  2577. CheckWeigths(p,[$15EF,$123,1]);
  2578. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1]);
  2579. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2580. Check(p^.Size = size,'size(k)');
  2581. sizeTotal:= sizeTotal+size;
  2582. Check(ABook.PropCount = sizeTotal,'size(total)');
  2583. end;
  2584. procedure test12_check_4(const ABook : unicodedata.TUCA_DataBook);
  2585. var
  2586. p, pc : PUCA_PropItemRec;
  2587. size, sizeTotal, t: Integer;
  2588. begin
  2589. sizeTotal := 0;
  2590. // for 'b'
  2591. p := ABook.Props;
  2592. CheckSimpleProps(p,False,True,0,False);
  2593. CheckWeigths(p,[$15EF,$121,0]);
  2594. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0]);
  2595. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2596. Check(p^.Size = size,'size');
  2597. sizeTotal:= sizeTotal+size;
  2598. // for 'c'
  2599. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2600. pc := p;
  2601. CheckSimpleProps(p,False,True,2,False);
  2602. CheckWeigths(p,[$15EF,$122,0]);
  2603. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0]);
  2604. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2605. t := size;
  2606. sizeTotal:= sizeTotal+size;
  2607. // for 'i' as in 'ci'
  2608. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2609. CheckSimpleProps(p,True,True,0,False);
  2610. CheckWeigths(p,[$15EF,$123,0]);
  2611. size := SizeOf(TUCA_PropItemRec) +
  2612. SizeOf(UInt24) +
  2613. CalcWeigthSize([$15EF,$123,0]);
  2614. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2615. Check(p^.Size = size,'size(i)');
  2616. t := t+size;
  2617. sizeTotal:= sizeTotal+size;
  2618. // for 's' as in 'cs'
  2619. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2620. CheckSimpleProps(p,True,True,0,False);
  2621. CheckWeigths(p,[$15EF+1,0,0]);
  2622. size := SizeOf(TUCA_PropItemRec) +
  2623. SizeOf(UInt24) +
  2624. CalcWeigthSize([$15EF+1,0,0]);
  2625. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2626. Check(p^.Size = size,'size(s)');
  2627. t := t+size;
  2628. sizeTotal:= sizeTotal+size;
  2629. Check(pc^.Size = t,'size(c)');
  2630. // for 'k'
  2631. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2632. CheckSimpleProps(p,False,True,0,False);
  2633. CheckWeigths(p,[$15EF,$123,1]);
  2634. size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1]);
  2635. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2636. Check(p^.Size = size,'size(k)');
  2637. sizeTotal:= sizeTotal+size;
  2638. Check(ABook.PropCount = sizeTotal,'size(total)');
  2639. end;
  2640. procedure test12();
  2641. var
  2642. sequence, sequenceClean : TOrderedCharacters;
  2643. statement : TReorderSequence;
  2644. wfirst, wresult : TUCA_LineRecArray;
  2645. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  2646. begin
  2647. statement.Clear();
  2648. test12_prepareWeigth(wfirst);
  2649. test12_PopulateSequence(sequenceClean);
  2650. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  2651. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  2652. //Generate the original tables
  2653. ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
  2654. // --- test 1
  2655. sequence := sequenceClean.Clone();
  2656. SetLength(statement.Reset,1);
  2657. statement.Reset[0] := Ord('a');
  2658. SetLength(statement.Elements,3);
  2659. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  2660. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  2661. statement.Elements[2] := TReorderUnit.From([Ord('x'),Ord('y')],TReorderWeigthKind.Primary,0);
  2662. sequence.ApplyStatement(@statement);
  2663. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2664. wresult := nil;
  2665. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2666. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2667. //Generate updatet tables
  2668. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2669. CheckInf(['a','b','c','xy'],@unicodeBook2);
  2670. test12_check_1(unicodeBook2);
  2671. WriteLn(' -- test 1 - ok');
  2672. // --- test 2
  2673. sequence := sequenceClean.Clone();
  2674. statement.Clear();
  2675. SetLength(statement.Reset,1);
  2676. statement.Reset[0] := Ord('a');
  2677. SetLength(statement.Elements,4);
  2678. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
  2679. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
  2680. statement.Elements[2] := TReorderUnit.From([Ord('h'),Ord('i')],TReorderWeigthKind.Secondary,0);
  2681. statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
  2682. sequence.ApplyStatement(@statement);
  2683. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2684. wresult := nil;
  2685. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2686. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2687. //Generate updatet tables
  2688. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2689. CheckInf(['a','b','c','hi','k'],@unicodeBook2);
  2690. test12_check_2(unicodeBook2);
  2691. WriteLn(' -- test 2 - ok');
  2692. // --- test 3
  2693. sequence := sequenceClean.Clone();
  2694. statement.Clear();
  2695. SetLength(statement.Reset,1);
  2696. statement.Reset[0] := Ord('a');
  2697. SetLength(statement.Elements,4);
  2698. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
  2699. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
  2700. statement.Elements[2] := TReorderUnit.From([Ord('c'),Ord('i')],TReorderWeigthKind.Secondary,0);
  2701. statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
  2702. sequence.ApplyStatement(@statement);
  2703. WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2704. wresult := nil;
  2705. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2706. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2707. //Generate updatet tables
  2708. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2709. CheckInf(['a','b','c','ci','k'],@unicodeBook2);
  2710. test12_check_3(unicodeBook2);
  2711. WriteLn(' -- test 3 - ok');
  2712. // --- test 4
  2713. sequence := sequenceClean.Clone();
  2714. statement.Clear();
  2715. SetLength(statement.Reset,1);
  2716. statement.Reset[0] := Ord('a');
  2717. SetLength(statement.Elements,5);
  2718. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
  2719. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
  2720. statement.Elements[2] := TReorderUnit.From([Ord('c'),Ord('i')],TReorderWeigthKind.Secondary,0);
  2721. statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
  2722. statement.Elements[4] := TReorderUnit.From([Ord('c'),Ord('s')],TReorderWeigthKind.Primary,0);
  2723. sequence.ApplyStatement(@statement);
  2724. WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2725. wresult := nil;
  2726. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2727. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2728. //Generate updatet tables
  2729. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2730. CheckInf(['a','b','c','ci','k','cs'],@unicodeBook2);
  2731. test12_check_4(unicodeBook2);
  2732. WriteLn(' -- test 4 - ok');
  2733. end;
  2734. //------------------------------------------------------
  2735. procedure test13_prepareWeigth(var AData : TUCA_LineRecArray);
  2736. var
  2737. p : PUCA_LineRec;
  2738. begin
  2739. SetLength(AData,2);
  2740. p := @AData[Low(AData)];
  2741. p^.CodePoints := CodePointToArray(Ord('a'));
  2742. p^.Weights := ToWeight($15EF,$0120,$0002);
  2743. Inc(p);
  2744. p^.CodePoints := CodePointToArray([Ord('b')]);
  2745. p^.Weights := ToWeight($15F0,$0120,$0002);
  2746. end;
  2747. procedure test13_PopulateSequence(var ASequence : TOrderedCharacters);
  2748. var
  2749. i : Integer;
  2750. begin
  2751. ASequence := TOrderedCharacters.Create();
  2752. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  2753. ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  2754. for i := 0 to ASequence.ActualLength - 1 do
  2755. ASequence.Data[i].Changed := False;
  2756. end;
  2757. procedure test13_check_1(const ABook : unicodedata.TUCA_DataBook);
  2758. var
  2759. p, pb : PUCA_PropItemRec;
  2760. size, sizeTotal, t: Integer;
  2761. begin
  2762. sizeTotal := 0;
  2763. // for 'b'
  2764. p := ABook.Props;
  2765. pb := p;
  2766. CheckSimpleProps(p,False,True,1,False,True);
  2767. CheckWeigths(p,[]);
  2768. size := SizeOf(TUCA_PropItemRec);
  2769. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2770. t := size;
  2771. sizeTotal:= sizeTotal+size;
  2772. // for 'u' as in 'bu'
  2773. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2774. CheckSimpleProps(p,True,True,0,False,False);
  2775. CheckWeigths(p,[$15F0,0,0]);
  2776. size := SizeOf(TUCA_PropItemRec) +
  2777. SizeOf(UInt24) +
  2778. CalcWeigthSize([$15F0,0,0]);
  2779. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2780. Check(p^.Size = size,'size(u)');
  2781. t := t+size;
  2782. sizeTotal:= sizeTotal+size;
  2783. Check(pb^.Size = t,'size(c)');
  2784. Check(ABook.PropCount = sizeTotal,'size(total)');
  2785. end;
  2786. procedure test13_check_2(const ABook : unicodedata.TUCA_DataBook);
  2787. var
  2788. p, pb : PUCA_PropItemRec;
  2789. size, sizeTotal, t: Integer;
  2790. begin
  2791. sizeTotal := 0;
  2792. // for 'b'
  2793. p := ABook.Props;
  2794. pb := p;
  2795. CheckSimpleProps(p,False,True,1,False,True);
  2796. CheckWeigths(p,[]);
  2797. size := SizeOf(TUCA_PropItemRec);
  2798. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2799. t := size;
  2800. sizeTotal:= sizeTotal+size;
  2801. // for 'u' as in 'bu'
  2802. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2803. CheckSimpleProps(p,True,True,0,False,False);
  2804. CheckWeigths(p,[$15F0,0,0]);
  2805. size := SizeOf(TUCA_PropItemRec) +
  2806. SizeOf(UInt24) +
  2807. CalcWeigthSize([$15F0,0,0]);
  2808. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2809. Check(p^.Size = size,'size(u)');
  2810. t := t+size;
  2811. sizeTotal:= sizeTotal+size;
  2812. Check(pb^.Size = t,'size(c)');
  2813. // for 'c'
  2814. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2815. CheckSimpleProps(p,False,True,0,False,False);
  2816. CheckWeigths(p,[$15F1,0,0]);
  2817. size := SizeOf(TUCA_PropItemRec) +
  2818. CalcWeigthSize([$15F1,0,0]);
  2819. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2820. Check(p^.Size = size,'size(c)');
  2821. sizeTotal:= sizeTotal+size;
  2822. Check(ABook.PropCount = sizeTotal,'size(total)');
  2823. end;
  2824. procedure test13();
  2825. var
  2826. sequence, sequenceClean : TOrderedCharacters;
  2827. statement : TReorderSequence;
  2828. wfirst, wresult : TUCA_LineRecArray;
  2829. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  2830. begin
  2831. statement.Clear();
  2832. test12_prepareWeigth(wfirst);
  2833. test12_PopulateSequence(sequenceClean);
  2834. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  2835. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  2836. //Generate the original tables
  2837. ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
  2838. // --- test 1
  2839. sequence := sequenceClean.Clone();
  2840. statement.Clear();
  2841. SetLength(statement.Elements,1);
  2842. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Deletion,0);
  2843. sequence.ApplyStatement(@statement);
  2844. statement.Clear();
  2845. SetLength(statement.Reset,1);
  2846. statement.Reset[0] := Ord('a');
  2847. SetLength(statement.Elements,1);
  2848. statement.Elements[0] := TReorderUnit.From([Ord('b'),Ord('u')],TReorderWeigthKind.Primary,0);
  2849. sequence.ApplyStatement(@statement);
  2850. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2851. wresult := nil;
  2852. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2853. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2854. //Generate updatet tables
  2855. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2856. CheckInf(['a','bu','b'{because b's weigth is now computed!}],@unicodeBook2);
  2857. test13_check_1(unicodeBook2);
  2858. WriteLn(' -- test 1 - ok');
  2859. // --- test 2
  2860. sequence := sequenceClean.Clone();
  2861. statement.Clear();
  2862. SetLength(statement.Elements,1);
  2863. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Deletion,0);
  2864. sequence.ApplyStatement(@statement);
  2865. statement.Clear();
  2866. SetLength(statement.Reset,2);
  2867. statement.Reset[0] := Ord('a');
  2868. SetLength(statement.Elements,2);
  2869. statement.Elements[0] := TReorderUnit.From([Ord('b'),Ord('u')],TReorderWeigthKind.Primary,0);
  2870. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  2871. sequence.ApplyStatement(@statement);
  2872. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  2873. wresult := nil;
  2874. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  2875. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  2876. //Generate updatet tables
  2877. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  2878. CheckInf(['a','bu','c','b'{because b's weigth is now computed!}],@unicodeBook2);
  2879. test13_check_2(unicodeBook2);
  2880. WriteLn(' -- test 2 - ok');
  2881. end;
  2882. //------------------------------------------------------
  2883. procedure test14_prepareWeigth(var AData : TUCA_LineRecArray);
  2884. var
  2885. p : PUCA_LineRec;
  2886. begin
  2887. SetLength(AData,1);
  2888. p := @AData[Low(AData)];
  2889. p^.CodePoints := CodePointToArray(Ord('a'));
  2890. p^.Weights := ToWeight($15EF,$0120,$0002);
  2891. end;
  2892. procedure test14_PopulateSequence(var ASequence : TOrderedCharacters);
  2893. var
  2894. i : Integer;
  2895. begin
  2896. ASequence := TOrderedCharacters.Create();
  2897. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  2898. for i := 0 to ASequence.ActualLength - 1 do
  2899. ASequence.Data[i].Changed := False;
  2900. end;
  2901. procedure test14_check_1(const ABook : unicodedata.TUCA_DataBook);
  2902. var
  2903. p : PUCA_PropItemRec;
  2904. size, sizeTotal: Integer;
  2905. ctx : PUCA_PropItemContextTreeRec;
  2906. ctxItem : PUCA_PropItemContextTreeNodeRec;
  2907. pb : PByte;
  2908. begin
  2909. sizeTotal := 0;
  2910. // for 'b'
  2911. p := ABook.Props;
  2912. pb := PByte(p);
  2913. size := 0;
  2914. CheckSimpleProps(p,True,True,0,True,False);
  2915. size := SizeOf(TUCA_PropItemRec)+SizeOf(UInt24){codepoint};
  2916. CheckWeigths(p,[]);
  2917. ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
  2918. Check(ctx^.Size>0,'ctx^.Size');
  2919. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
  2920. Check(ctxItem<>nil,'ctxItem');
  2921. Check(ctxItem^.Left=0,'ctxItem^.Left');
  2922. Check(ctxItem^.Right=0,'ctxItem^.Right');
  2923. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  2924. Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
  2925. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  2926. Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
  2927. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  2928. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
  2929. size := SizeOf(TUCA_PropItemRec)+
  2930. SizeOf(UInt24){codepoint}+
  2931. SizeOf(TUCA_PropItemContextTreeRec.Size)+
  2932. SizeOf(TUCA_PropItemContextTreeNodeRec) +
  2933. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  2934. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  2935. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2936. sizeTotal:= sizeTotal+size;
  2937. Check(ABook.PropCount = sizeTotal,'size(total)');
  2938. end;
  2939. procedure test14_check_2(const ABook : unicodedata.TUCA_DataBook);
  2940. var
  2941. p : PUCA_PropItemRec;
  2942. size, sizeTotal : Integer;
  2943. ctx : PUCA_PropItemContextTreeRec;
  2944. ctxItem : PUCA_PropItemContextTreeNodeRec;
  2945. pb : PByte;
  2946. begin
  2947. sizeTotal := 0;
  2948. // for 'b'
  2949. p := ABook.Props;
  2950. pb := PByte(p);
  2951. size := 0;
  2952. CheckSimpleProps(p,True,True,0,True,False);
  2953. CheckWeigths(p,[]);
  2954. ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
  2955. Check(ctx^.Size>0,'ctx^.Size');
  2956. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
  2957. Check(ctxItem<>nil,'ctxItem');
  2958. Check(ctxItem^.Left=0,'ctxItem^.Left');
  2959. Check(ctxItem^.Right=0,'ctxItem^.Right');
  2960. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  2961. Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
  2962. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  2963. Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
  2964. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  2965. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
  2966. size := SizeOf(TUCA_PropItemRec)+
  2967. SizeOf(UInt24){codepoint}+
  2968. SizeOf(TUCA_PropItemContextTreeRec.Size)+
  2969. SizeOf(TUCA_PropItemContextTreeNodeRec) +
  2970. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  2971. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  2972. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2973. sizeTotal:= sizeTotal+size;
  2974. // for 'c'
  2975. p := PUCA_PropItemRec(PtrUInt(p)+size);
  2976. CheckSimpleProps(p,False,True,0,False,False);
  2977. CheckWeigths(p,[$15F0,$0,$0]);
  2978. size := SizeOf(TUCA_PropItemRec) +
  2979. CalcWeigthSize([$15F0,$0,$0]);
  2980. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  2981. Check(p^.Size = size,'size(u)');
  2982. sizeTotal:= sizeTotal+size;
  2983. Check(ABook.PropCount = sizeTotal,'size(total)');
  2984. end;
  2985. procedure test14_check_3(const ABook : unicodedata.TUCA_DataBook);
  2986. var
  2987. p : PUCA_PropItemRec;
  2988. size, sizeTotal, t: Integer;
  2989. ctx : PUCA_PropItemContextTreeRec;
  2990. ctxItem : PUCA_PropItemContextTreeNodeRec;
  2991. pb : PByte;
  2992. begin
  2993. sizeTotal := 0;
  2994. // for 'b'
  2995. p := ABook.Props;
  2996. pb := PByte(p);
  2997. size := 0;
  2998. CheckSimpleProps(p,True,True,0,True,False);
  2999. CheckWeigths(p,[]);
  3000. ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
  3001. Check(ctx^.Size>0,'ctx^.Size');
  3002. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
  3003. Check(ctxItem<>nil,'ctxItem');
  3004. Check(ctxItem^.Left=0,'ctxItem^.Left');
  3005. Check(ctxItem^.Right<>0,'ctxItem^.Right');
  3006. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  3007. Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
  3008. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  3009. Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
  3010. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  3011. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
  3012. t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
  3013. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  3014. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  3015. Check(ctxItem^.Right = t,'ctxItem^.Right');
  3016. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItem)+t);
  3017. Check(ctxItem^.Left=0,'ctxItem^.Left');
  3018. Check(ctxItem^.Right=0,'ctxItem^.Right');
  3019. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  3020. Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
  3021. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  3022. Check(Cardinal(PUInt24(pb)^)=Ord('f'),'Context CodePoint');
  3023. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  3024. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15F1,$0,$1, $1,0,0]);
  3025. size := SizeOf(TUCA_PropItemRec)+
  3026. SizeOf(UInt24){codepoint}+
  3027. SizeOf(TUCA_PropItemContextTreeRec.Size)+
  3028. t+
  3029. SizeOf(TUCA_PropItemContextTreeNodeRec) +
  3030. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  3031. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  3032. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  3033. sizeTotal:= sizeTotal+size;
  3034. // for 'e'
  3035. p := PUCA_PropItemRec(PtrUInt(p)+size);
  3036. CheckSimpleProps(p,False,True,0,False,False);
  3037. CheckWeigths(p,[$15F0,$0,$0]);
  3038. size := SizeOf(TUCA_PropItemRec) +
  3039. CalcWeigthSize([$15F0,$0,$0]);
  3040. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  3041. Check(p^.Size = size,'size(e)');
  3042. sizeTotal:= sizeTotal+size;
  3043. // for 'f'
  3044. p := PUCA_PropItemRec(PtrUInt(p)+size);
  3045. CheckSimpleProps(p,False,True,0,False,False);
  3046. CheckWeigths(p,[$15F1,$0,$0, $1,0,0]);
  3047. size := SizeOf(TUCA_PropItemRec) +
  3048. CalcWeigthSize([$15F1,$0,$0, $1,0,0]);
  3049. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  3050. Check(p^.Size = size,'size(f)');
  3051. sizeTotal:= sizeTotal+size;
  3052. Check(ABook.PropCount = sizeTotal,'size(total)');
  3053. end;
  3054. procedure test14_check_4(const ABook : unicodedata.TUCA_DataBook);
  3055. var
  3056. p : PUCA_PropItemRec;
  3057. size, sizeTotal, t, ctxSize: Integer;
  3058. ctx : PUCA_PropItemContextTreeRec;
  3059. ctxItem, ctxItemParent : PUCA_PropItemContextTreeNodeRec;
  3060. pb : PByte;
  3061. begin
  3062. sizeTotal := 0;
  3063. ctxSize := 0;
  3064. // for 'b'
  3065. p := ABook.Props;
  3066. pb := PByte(p);
  3067. size := 0;
  3068. CheckSimpleProps(p,True,True,0,True,False);
  3069. CheckWeigths(p,[]);
  3070. ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
  3071. Check(ctx^.Size>0,'ctx^.Size');
  3072. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
  3073. ctxItemParent := ctxItem;
  3074. Check(ctxItem<>nil,'ctxItem');
  3075. Check(ctxItem^.Left<>0,'ctxItem^.Left');
  3076. Check(ctxItem^.Right<>0,'ctxItem^.Right');
  3077. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  3078. Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
  3079. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  3080. Check(Cardinal(PUInt24(pb)^)=Ord('f'),'Context CodePoint');
  3081. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  3082. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15F1,$0,$1, $1,0,0]);
  3083. t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
  3084. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  3085. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  3086. ctxSize := ctxSize+t;
  3087. Check(ctxItem^.Left = t,'ctxItem^.Left');
  3088. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItem)+t);
  3089. Check(ctxItem^.Left=0,'ctxItem^.Left');
  3090. Check(ctxItem^.Right=0,'ctxItem^.Right');
  3091. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  3092. Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
  3093. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  3094. Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
  3095. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  3096. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
  3097. t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
  3098. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  3099. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  3100. ctxSize := ctxSize+t;
  3101. ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItemParent)+ctxSize);
  3102. Check(ctxItem^.Left=0,'ctxItem^.Left');
  3103. Check(ctxItem^.Right=0,'ctxItem^.Right');
  3104. Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
  3105. Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
  3106. pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
  3107. Check(Cardinal(PUInt24(pb)^)=Ord('h'),'Context CodePoint');
  3108. pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
  3109. CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15F1,$1,$1, $1,0,0]);
  3110. t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
  3111. (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
  3112. (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
  3113. ctxSize := ctxSize+t;
  3114. ctxSize := ctxSize + SizeOf(TUCA_PropItemContextTreeRec.Size);
  3115. Check(ctx^.Size = ctxSize,'ctx^.Size');
  3116. size := SizeOf(TUCA_PropItemRec)+
  3117. SizeOf(UInt24){codepoint}+
  3118. ctxSize;
  3119. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  3120. sizeTotal:= sizeTotal+size;
  3121. // for 'e'
  3122. p := PUCA_PropItemRec(PtrUInt(p)+size);
  3123. CheckSimpleProps(p,False,True,0,False,False);
  3124. CheckWeigths(p,[$15F0,$0,$0]);
  3125. size := SizeOf(TUCA_PropItemRec) +
  3126. CalcWeigthSize([$15F0,$0,$0]);
  3127. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  3128. Check(p^.Size = size,'size(e)');
  3129. sizeTotal:= sizeTotal+size;
  3130. // for 'f'
  3131. p := PUCA_PropItemRec(PtrUInt(p)+size);
  3132. CheckSimpleProps(p,False,True,0,False,False);
  3133. CheckWeigths(p,[$15F1,$0,$0, $1,0,0]);
  3134. size := SizeOf(TUCA_PropItemRec) +
  3135. CalcWeigthSize([$15F1,$0,$0, $1,0,0]);
  3136. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  3137. Check(p^.Size = size,'size(f)');
  3138. sizeTotal:= sizeTotal+size;
  3139. // for 'g'
  3140. p := PUCA_PropItemRec(PtrUInt(p)+size);
  3141. CheckSimpleProps(p,False,True,0,False,False);
  3142. CheckWeigths(p,[$15F1,$0,$2, $1,0,0]);
  3143. size := SizeOf(TUCA_PropItemRec) +
  3144. CalcWeigthSize([$15F1,$0,$2, $1,0,0]);
  3145. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  3146. Check(p^.Size = size,'size(g)');
  3147. sizeTotal:= sizeTotal+size;
  3148. // for 'h'
  3149. p := PUCA_PropItemRec(PtrUInt(p)+size);
  3150. CheckSimpleProps(p,False,True,0,False,False);
  3151. CheckWeigths(p,[$15F1,$1,$0, $1,0,0]);
  3152. size := SizeOf(TUCA_PropItemRec) +
  3153. CalcWeigthSize([$15F1,$1,$0, $1,0,0]);
  3154. Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
  3155. Check(p^.Size = size,'size(h)');
  3156. sizeTotal:= sizeTotal+size;
  3157. Check(ABook.PropCount = sizeTotal,'size(total)');
  3158. end;
  3159. procedure test14();
  3160. var
  3161. sequence, sequenceClean : TOrderedCharacters;
  3162. statement : TReorderSequence;
  3163. wfirst, wresult : TUCA_LineRecArray;
  3164. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  3165. begin
  3166. statement.Clear();
  3167. test12_prepareWeigth(wfirst);
  3168. test12_PopulateSequence(sequenceClean);
  3169. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  3170. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  3171. //Generate the original tables
  3172. ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
  3173. // --- test 1
  3174. sequence := sequenceClean.Clone();
  3175. statement.Clear();
  3176. SetLength(statement.Reset,1);
  3177. statement.Reset[0] := Ord('a');
  3178. SetLength(statement.Elements,1);
  3179. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3180. sequence.ApplyStatement(@statement);
  3181. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3182. wresult := nil;
  3183. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3184. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3185. //Generate updatet tables
  3186. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3187. test14_check_1(unicodeBook2);
  3188. WriteLn(' -- test 1 - ok');
  3189. WriteLn;
  3190. // --- test 2
  3191. sequence := sequenceClean.Clone();
  3192. statement.Clear();
  3193. SetLength(statement.Reset,1);
  3194. statement.Reset[0] := Ord('a');
  3195. SetLength(statement.Elements,2);
  3196. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3197. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  3198. sequence.ApplyStatement(@statement);
  3199. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3200. wresult := nil;
  3201. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3202. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3203. //Generate updatet tables
  3204. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3205. test14_check_2(unicodeBook2);
  3206. WriteLn(' -- test 2 - ok');
  3207. WriteLn;
  3208. // --- test 3
  3209. sequence := sequenceClean.Clone();
  3210. statement.Clear();
  3211. SetLength(statement.Reset,1);
  3212. statement.Reset[0] := Ord('a');
  3213. SetLength(statement.Elements,2);
  3214. statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
  3215. statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
  3216. sequence.ApplyStatement(@statement);
  3217. statement.Clear();
  3218. SetLength(statement.Reset,1);
  3219. statement.Reset[0] := Ord('a');
  3220. SetLength(statement.Elements,1);
  3221. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3222. sequence.ApplyStatement(@statement);
  3223. statement.Clear();
  3224. SetLength(statement.Reset,1);
  3225. statement.Reset[0] := Ord('f');
  3226. SetLength(statement.Elements,1);
  3227. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
  3228. sequence.ApplyStatement(@statement);
  3229. WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3230. wresult := nil;
  3231. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3232. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3233. //Generate updatet tables
  3234. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3235. test14_check_3(unicodeBook2);
  3236. WriteLn(' -- test 3 - ok');
  3237. WriteLn;
  3238. // --- test 4
  3239. sequence := sequenceClean.Clone();
  3240. statement.Clear();
  3241. SetLength(statement.Reset,1);
  3242. statement.Reset[0] := Ord('a');
  3243. SetLength(statement.Elements,4);
  3244. statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
  3245. statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
  3246. statement.Elements[2] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  3247. statement.Elements[3] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Secondary,0);
  3248. sequence.ApplyStatement(@statement);
  3249. statement.Clear();
  3250. SetLength(statement.Reset,1);
  3251. statement.Reset[0] := Ord('f');
  3252. SetLength(statement.Elements,1);
  3253. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
  3254. sequence.ApplyStatement(@statement);
  3255. statement.Clear();
  3256. SetLength(statement.Reset,1);
  3257. statement.Reset[0] := Ord('a');
  3258. SetLength(statement.Elements,1);
  3259. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3260. sequence.ApplyStatement(@statement);
  3261. statement.Clear();
  3262. SetLength(statement.Reset,1);
  3263. statement.Reset[0] := Ord('h');
  3264. SetLength(statement.Elements,1);
  3265. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('h')],TReorderWeigthKind.Tertiary,0);
  3266. sequence.ApplyStatement(@statement);
  3267. WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3268. wresult := nil;
  3269. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3270. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3271. //Generate updatet tables
  3272. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3273. test14_check_4(unicodeBook2);
  3274. WriteLn(' -- test 4 - ok');
  3275. WriteLn;
  3276. end;
  3277. //------------------------------------------------------
  3278. procedure test15_prepareWeigth(var AData : TUCA_LineRecArray);
  3279. var
  3280. p : PUCA_LineRec;
  3281. begin
  3282. SetLength(AData,1);
  3283. p := @AData[Low(AData)];
  3284. p^.CodePoints := CodePointToArray(Ord('a'));
  3285. p^.Weights := ToWeight($15EF,$0120,$0002);
  3286. end;
  3287. procedure test15_PopulateSequence(var ASequence : TOrderedCharacters);
  3288. var
  3289. i : Integer;
  3290. begin
  3291. ASequence := TOrderedCharacters.Create();
  3292. ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  3293. for i := 0 to ASequence.ActualLength - 1 do
  3294. ASequence.Data[i].Changed := False;
  3295. end;
  3296. function ConvertEndianFromNative(
  3297. const AData : Pointer;
  3298. const ADataLen : Integer
  3299. ) : Boolean;
  3300. type
  3301. PUCA_PropItemRec = helper.PUCA_PropItemRec;
  3302. var
  3303. s : PUCA_PropItemRec;
  3304. x, y : array of Byte;
  3305. px, py : PUCA_PropItemRec;
  3306. begin
  3307. if (ADataLen <= 0) then
  3308. exit(True);
  3309. s := PUCA_PropItemRec(AData);
  3310. SetLength(x,ADataLen);
  3311. px := PUCA_PropItemRec(@x[0]);
  3312. ReverseFromNativeEndian(s,ADataLen,px);
  3313. SetLength(y,ADataLen);
  3314. py := PUCA_PropItemRec(@y[0]);
  3315. ReverseToNativeEndian(px,ADataLen,py);
  3316. Result := CompareMem(AData,@y[0],Length(x));
  3317. end;
  3318. procedure test15();
  3319. var
  3320. sequence, sequenceClean : TOrderedCharacters;
  3321. statement : TReorderSequence;
  3322. wfirst, wresult : TUCA_LineRecArray;
  3323. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  3324. begin
  3325. statement.Clear();
  3326. test12_prepareWeigth(wfirst);
  3327. test12_PopulateSequence(sequenceClean);
  3328. WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
  3329. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  3330. //Generate the original tables
  3331. ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
  3332. // --- test 1
  3333. sequence := sequenceClean.Clone();
  3334. SetLength(statement.Reset,1);
  3335. statement.Reset[0] := Ord('a');
  3336. SetLength(statement.Elements,1);
  3337. statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  3338. sequence.ApplyStatement(@statement);
  3339. WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3340. wresult := nil;
  3341. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3342. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3343. //Generate updatet tables
  3344. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3345. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  3346. WriteLn(' -- test 1 - ok');
  3347. // --- test 2
  3348. sequence := sequenceClean.Clone();
  3349. statement.Clear();
  3350. SetLength(statement.Reset,1);
  3351. statement.Reset[0] := Ord('a');
  3352. SetLength(statement.Elements,1);
  3353. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3354. sequence.ApplyStatement(@statement);
  3355. WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3356. wresult := nil;
  3357. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3358. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3359. //Generate updatet tables
  3360. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3361. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  3362. WriteLn(' -- test 2 - ok');
  3363. WriteLn;
  3364. // --- test 3
  3365. sequence := sequenceClean.Clone();
  3366. statement.Clear();
  3367. SetLength(statement.Reset,1);
  3368. statement.Reset[0] := Ord('a');
  3369. SetLength(statement.Elements,2);
  3370. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3371. statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  3372. sequence.ApplyStatement(@statement);
  3373. WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3374. wresult := nil;
  3375. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3376. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3377. //Generate updatet tables
  3378. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3379. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  3380. WriteLn(' -- test 3 - ok');
  3381. WriteLn;
  3382. // --- test 4
  3383. sequence := sequenceClean.Clone();
  3384. statement.Clear();
  3385. SetLength(statement.Reset,1);
  3386. statement.Reset[0] := Ord('a');
  3387. SetLength(statement.Elements,2);
  3388. statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
  3389. statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
  3390. sequence.ApplyStatement(@statement);
  3391. statement.Clear();
  3392. SetLength(statement.Reset,1);
  3393. statement.Reset[0] := Ord('a');
  3394. SetLength(statement.Elements,1);
  3395. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3396. sequence.ApplyStatement(@statement);
  3397. statement.Clear();
  3398. SetLength(statement.Reset,1);
  3399. statement.Reset[0] := Ord('f');
  3400. SetLength(statement.Elements,1);
  3401. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
  3402. sequence.ApplyStatement(@statement);
  3403. WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3404. wresult := nil;
  3405. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3406. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3407. //Generate updatet tables
  3408. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3409. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  3410. WriteLn(' -- test 4 - ok');
  3411. WriteLn;
  3412. // --- test 5
  3413. sequence := sequenceClean.Clone();
  3414. statement.Clear();
  3415. SetLength(statement.Reset,1);
  3416. statement.Reset[0] := Ord('a');
  3417. SetLength(statement.Elements,4);
  3418. statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
  3419. statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
  3420. statement.Elements[2] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  3421. statement.Elements[3] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Secondary,0);
  3422. sequence.ApplyStatement(@statement);
  3423. statement.Clear();
  3424. SetLength(statement.Reset,1);
  3425. statement.Reset[0] := Ord('f');
  3426. SetLength(statement.Elements,1);
  3427. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
  3428. sequence.ApplyStatement(@statement);
  3429. statement.Clear();
  3430. SetLength(statement.Reset,1);
  3431. statement.Reset[0] := Ord('a');
  3432. SetLength(statement.Elements,1);
  3433. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3434. sequence.ApplyStatement(@statement);
  3435. statement.Clear();
  3436. SetLength(statement.Reset,1);
  3437. statement.Reset[0] := Ord('h');
  3438. SetLength(statement.Elements,1);
  3439. statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('h')],TReorderWeigthKind.Tertiary,0);
  3440. sequence.ApplyStatement(@statement);
  3441. WriteLn(' Statement #5 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3442. wresult := nil;
  3443. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3444. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3445. //Generate updatet tables
  3446. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3447. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  3448. WriteLn(' -- test 5 - ok');
  3449. WriteLn;
  3450. // --- test 6
  3451. sequence := sequenceClean.Clone();
  3452. statement.Clear();
  3453. SetLength(statement.Reset,1);
  3454. statement.Reset[0] := Ord('a');
  3455. SetLength(statement.Elements,2);
  3456. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3457. statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
  3458. sequence.ApplyStatement(@statement);
  3459. WriteLn(' Statement #6 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3460. wresult := nil;
  3461. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3462. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3463. //Generate updatet tables
  3464. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3465. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  3466. WriteLn(' -- test 6 - ok');
  3467. WriteLn;
  3468. // --- test 7
  3469. sequence := sequenceClean.Clone();
  3470. statement.Clear();
  3471. SetLength(statement.Reset,1);
  3472. statement.Reset[0] := Ord('a');
  3473. SetLength(statement.Elements,3);
  3474. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3475. statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
  3476. statement.Elements[2] := TReorderUnit.From(Ord('e'),[Ord('a'),Ord('d')],TReorderWeigthKind.Identity,0);
  3477. sequence.ApplyStatement(@statement);
  3478. WriteLn(' Statement #7 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3479. wresult := nil;
  3480. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3481. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3482. //Generate updatet tables
  3483. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3484. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  3485. WriteLn(' -- test 7 - ok');
  3486. WriteLn;
  3487. // --- test 8
  3488. sequence := sequenceClean.Clone();
  3489. statement.Clear();
  3490. SetLength(statement.Reset,1);
  3491. statement.Reset[0] := Ord('a');
  3492. SetLength(statement.Elements,3);
  3493. statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
  3494. statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('x')],TReorderWeigthKind.Primary,0);
  3495. statement.Elements[2] := TReorderUnit.From([Ord('e'),Ord('a'),Ord('r')],[Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
  3496. sequence.ApplyStatement(@statement);
  3497. WriteLn(' Statement #8 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3498. wresult := nil;
  3499. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3500. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3501. //Generate updatet tables
  3502. ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
  3503. Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
  3504. WriteLn(' -- test 8 - ok');
  3505. WriteLn;
  3506. end;
  3507. procedure test16_prepareWeigth(var AData : TUCA_LineRecArray);
  3508. var
  3509. p : PUCA_LineRec;
  3510. begin
  3511. SetLength(AData,3);
  3512. p := @AData[Low(AData)];
  3513. p^.CodePoints := CodePointToArray(Ord('a'));
  3514. p^.Weights := ToWeight($15EF,$0020,$0002);
  3515. Inc(p);
  3516. p^.CodePoints := CodePointToArray(Ord('b'));
  3517. p^.Weights := ToWeight($1605,$0020,$0002);
  3518. Inc(p);
  3519. p^.CodePoints := CodePointToArray(Ord('c'));
  3520. p^.Weights := ToWeight($161D,$0020,$0002);
  3521. end;
  3522. procedure test16a();
  3523. var
  3524. sequence : TOrderedCharacters;
  3525. statement : TReorderSequence;
  3526. wfirst, wresult : TUCA_LineRecArray;
  3527. i : Integer;
  3528. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  3529. begin
  3530. statement.Clear();
  3531. test16_prepareWeigth(wfirst);
  3532. sequence := TOrderedCharacters.Create();
  3533. sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  3534. sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  3535. sequence.Append(TReorderUnit.From(TReorderLogicalReset.LastRegular));
  3536. sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  3537. for i := 0 to sequence.ActualLength - 1 do
  3538. sequence.Data[i].Changed := False;
  3539. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3540. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  3541. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  3542. CheckInf(['a','b','c'],@unicodeBook1);
  3543. // --- test 1
  3544. SetLength(statement.Reset,1);
  3545. statement.LogicalPosition := TReorderLogicalReset.LastRegular;
  3546. SetLength(statement.Elements,1);
  3547. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
  3548. sequence.ApplyStatement(@statement);
  3549. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3550. wresult := nil;
  3551. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3552. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3553. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  3554. CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
  3555. WriteLn(' -- test 1 - ok');
  3556. end;
  3557. procedure test16b();
  3558. var
  3559. sequence : TOrderedCharacters;
  3560. statement : TReorderSequence;
  3561. wfirst, wresult : TUCA_LineRecArray;
  3562. i : Integer;
  3563. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  3564. begin
  3565. statement.Clear();
  3566. test16_prepareWeigth(wfirst);
  3567. sequence := TOrderedCharacters.Create();
  3568. sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  3569. sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  3570. sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  3571. for i := 0 to sequence.ActualLength - 1 do
  3572. sequence.Data[i].Changed := False;
  3573. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3574. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  3575. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  3576. CheckInf(['a','b','c'],@unicodeBook1);
  3577. // --- test 1
  3578. SetLength(statement.Reset,1);
  3579. statement.LogicalPosition := TReorderLogicalReset.LastRegular;
  3580. SetLength(statement.Elements,1);
  3581. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
  3582. sequence.ApplyStatement(@statement);
  3583. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3584. wresult := nil;
  3585. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3586. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3587. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  3588. CheckInf(['a','b','c','x'{*}],@unicodeBook2);
  3589. WriteLn(' -- test 1 - ok');
  3590. writeln;
  3591. writeln;
  3592. // test 2
  3593. statement.Clear();
  3594. SetLength(statement.Reset,1);
  3595. statement.Reset[0] := Ord('x');
  3596. SetLength(statement.Elements,1);
  3597. statement.Elements[0] := TReorderUnit.From(Ord('y'),TReorderWeigthKind.Primary,0);
  3598. sequence.ApplyStatement(@statement);
  3599. WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3600. wresult := nil;
  3601. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3602. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3603. ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
  3604. CheckInf(['a','b','c','x'{*},'y'{*}],@unicodeBook2);
  3605. WriteLn(' -- test 2 - ok');
  3606. end;
  3607. procedure test16c();
  3608. var
  3609. sequence : TOrderedCharacters;
  3610. statement : TReorderSequence;
  3611. wfirst, wresult : TUCA_LineRecArray;
  3612. i : Integer;
  3613. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  3614. begin
  3615. statement.Clear();
  3616. test16_prepareWeigth(wfirst);
  3617. sequence := TOrderedCharacters.Create();
  3618. sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  3619. sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  3620. sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  3621. for i := 0 to sequence.ActualLength - 1 do
  3622. sequence.Data[i].Changed := False;
  3623. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3624. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  3625. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  3626. CheckInf(['a','b','c'],@unicodeBook1);
  3627. // --- test 1
  3628. SetLength(statement.Reset,1);
  3629. statement.LogicalPosition := TReorderLogicalReset.LastRegular;
  3630. SetLength(statement.Elements,1);
  3631. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Secondary,0);
  3632. sequence.ApplyStatement(@statement);
  3633. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3634. wresult := nil;
  3635. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3636. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3637. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  3638. CheckInf(['a','b','c','x'{*}],@unicodeBook2);
  3639. WriteLn(' -- test 1 - ok');
  3640. writeln;
  3641. writeln;
  3642. // test 2
  3643. statement.Clear();
  3644. SetLength(statement.Reset,1);
  3645. statement.Reset[0] := Ord('x');
  3646. SetLength(statement.Elements,1);
  3647. statement.Elements[0] := TReorderUnit.From(Ord('y'),TReorderWeigthKind.Primary,0);
  3648. sequence.ApplyStatement(@statement);
  3649. WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3650. wresult := nil;
  3651. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3652. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3653. ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
  3654. CheckInf(['a','b','c','x'{*},'y'{*}],@unicodeBook2);
  3655. WriteLn(' -- test 2 - ok');
  3656. end;
  3657. procedure test16d();
  3658. var
  3659. sequence : TOrderedCharacters;
  3660. statement : TReorderSequence;
  3661. wfirst, wresult : TUCA_LineRecArray;
  3662. i : Integer;
  3663. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  3664. begin
  3665. statement.Clear();
  3666. test16_prepareWeigth(wfirst);
  3667. sequence := TOrderedCharacters.Create();
  3668. sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  3669. sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  3670. sequence.Append(TReorderUnit.From(TReorderLogicalReset.LastRegular));
  3671. sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  3672. for i := 0 to sequence.ActualLength - 1 do
  3673. sequence.Data[i].Changed := False;
  3674. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3675. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  3676. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  3677. CheckInf(['a','b','c'],@unicodeBook1);
  3678. // --- test 1
  3679. SetLength(statement.Reset,1);
  3680. statement.LogicalPosition := TReorderLogicalReset.LastRegular;
  3681. statement.Before := True;
  3682. SetLength(statement.Elements,1);
  3683. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
  3684. sequence.ApplyStatement(@statement);
  3685. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3686. wresult := nil;
  3687. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3688. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3689. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  3690. CheckInf(['a','x'{*},'b','c'],@unicodeBook2);
  3691. WriteLn(' -- test 1 - ok');
  3692. end;
  3693. procedure test16e_prepareWeigth(var AData : TUCA_LineRecArray);
  3694. var
  3695. p : PUCA_LineRec;
  3696. begin
  3697. SetLength(AData,5);
  3698. p := @AData[Low(AData)];
  3699. p^.CodePoints := CodePointToArray(Ord('a'));
  3700. p^.Weights := ToWeight(1,10,10);
  3701. Inc(p);
  3702. p^.CodePoints := CodePointToArray(Ord('b'));
  3703. p^.Weights := ToWeight(2,10,10);
  3704. Inc(p);
  3705. p^.CodePoints := CodePointToArray([Ord('b'),Ord('2')]);
  3706. p^.Weights := ToWeight(2,20,10);
  3707. Inc(p);
  3708. p^.CodePoints := CodePointToArray([Ord('b'),Ord('3')]);
  3709. p^.Weights := ToWeight(2,20,20);
  3710. Inc(p);
  3711. p^.CodePoints := CodePointToArray(Ord('c'));
  3712. p^.Weights := ToWeight(3,10,10);
  3713. end;
  3714. procedure test16e();
  3715. var
  3716. sequence : TOrderedCharacters;
  3717. statement : TReorderSequence;
  3718. wfirst, wresult : TUCA_LineRecArray;
  3719. i : Integer;
  3720. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  3721. begin
  3722. statement.Clear();
  3723. test16e_prepareWeigth(wfirst);
  3724. sequence := TOrderedCharacters.Create();
  3725. sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  3726. sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  3727. sequence.Append(TReorderUnit.From([Ord('b'),Ord('2')],TReorderWeigthKind.Secondary,3));
  3728. sequence.Append(TReorderUnit.From([Ord('b'),Ord('3')],TReorderWeigthKind.Tertiary,4));
  3729. sequence.Append(TReorderUnit.From(TReorderLogicalReset.LastRegular));
  3730. sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,5));
  3731. for i := 0 to sequence.ActualLength - 1 do
  3732. sequence.Data[i].Changed := False;
  3733. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3734. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  3735. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  3736. CheckInf(['a','b','b2','b3','c'],@unicodeBook1);
  3737. // --- test 1
  3738. SetLength(statement.Reset,1);
  3739. statement.LogicalPosition := TReorderLogicalReset.LastRegular;
  3740. statement.Before := True;
  3741. SetLength(statement.Elements,1);
  3742. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Secondary,0);
  3743. sequence.ApplyStatement(@statement);
  3744. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3745. wresult := nil;
  3746. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3747. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3748. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  3749. CheckInf(['a','b','x'{*},'b2','b3','c'],@unicodeBook2);
  3750. WriteLn(' -- test 1 - ok');
  3751. end;
  3752. procedure test17a_prepareWeigth(var AData : TUCA_LineRecArray);
  3753. var
  3754. p : PUCA_LineRec;
  3755. begin
  3756. SetLength(AData,3);
  3757. p := @AData[Low(AData)];
  3758. p^.CodePoints := CodePointToArray(Ord('a'));
  3759. p^.Weights := ToWeight($15EF,$0020,$0002);
  3760. Inc(p);
  3761. p^.CodePoints := CodePointToArray(Ord('b'));
  3762. p^.Weights := ToWeight([$1605,$0020,$0002, $17FE,$0300,$0400]);
  3763. Inc(p);
  3764. p^.CodePoints := CodePointToArray(Ord('c'));
  3765. p^.Weights := ToWeight($161D,$0020,$0002);
  3766. end;
  3767. procedure test17a();
  3768. var
  3769. sequence : TOrderedCharacters;
  3770. statement : TReorderSequence;
  3771. wfirst, wresult : TUCA_LineRecArray;
  3772. i : Integer;
  3773. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  3774. begin
  3775. // test17* are about "Weights" generation
  3776. statement.Clear();
  3777. test17a_prepareWeigth(wfirst);
  3778. sequence := TOrderedCharacters.Create();
  3779. sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  3780. sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  3781. sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  3782. for i := 0 to sequence.ActualLength - 1 do
  3783. sequence.Data[i].Changed := False;
  3784. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3785. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  3786. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  3787. CheckInf(['a','b','c'],@unicodeBook1);
  3788. // --- test 1
  3789. SetLength(statement.Reset,1);
  3790. statement.Reset[0] := Ord('b');
  3791. SetLength(statement.Elements,1);
  3792. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
  3793. sequence.ApplyStatement(@statement);
  3794. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3795. wresult := nil;
  3796. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3797. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3798. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  3799. CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
  3800. WriteLn(' -- test 1 - ok');
  3801. end;
  3802. procedure test17b_prepareWeigth(var AData : TUCA_LineRecArray);
  3803. var
  3804. p : PUCA_LineRec;
  3805. begin
  3806. SetLength(AData,3);
  3807. p := @AData[Low(AData)];
  3808. p^.CodePoints := CodePointToArray(Ord('a'));
  3809. p^.Weights := ToWeight($15EF,$0020,$0002);
  3810. Inc(p);
  3811. p^.CodePoints := CodePointToArray(Ord('b'));
  3812. p^.Weights := ToWeight([$1605,$0020,$0002]);
  3813. Inc(p);
  3814. p^.CodePoints := CodePointToArray(Ord('c'));
  3815. p^.Weights := ToWeight($1606,$0020,$0002);
  3816. end;
  3817. procedure test17b();
  3818. var
  3819. sequence : TOrderedCharacters;
  3820. statement : TReorderSequence;
  3821. wfirst, wresult : TUCA_LineRecArray;
  3822. i : Integer;
  3823. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  3824. begin
  3825. // test17* are about "Weights" generation
  3826. statement.Clear();
  3827. test17b_prepareWeigth(wfirst);
  3828. sequence := TOrderedCharacters.Create();
  3829. sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  3830. sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  3831. sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  3832. for i := 0 to sequence.ActualLength - 1 do
  3833. sequence.Data[i].Changed := False;
  3834. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3835. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  3836. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  3837. CheckInf(['a','b','c'],@unicodeBook1);
  3838. // --- test 1
  3839. SetLength(statement.Reset,1);
  3840. statement.Reset[0] := Ord('b');
  3841. SetLength(statement.Elements,1);
  3842. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
  3843. sequence.ApplyStatement(@statement);
  3844. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3845. wresult := nil;
  3846. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3847. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3848. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  3849. CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
  3850. WriteLn(' -- test 1 - ok');
  3851. end;
  3852. procedure test17c_prepareWeigth(var AData : TUCA_LineRecArray);
  3853. var
  3854. p : PUCA_LineRec;
  3855. begin
  3856. SetLength(AData,3);
  3857. p := @AData[Low(AData)];
  3858. p^.CodePoints := CodePointToArray(Ord('a'));
  3859. p^.Weights := ToWeight($15EF,$0020,$0002);
  3860. Inc(p);
  3861. p^.CodePoints := CodePointToArray(Ord('b'));
  3862. p^.Weights := ToWeight([$1605,$0020,$0002, $17FE,$0300,$0400]);
  3863. Inc(p);
  3864. p^.CodePoints := CodePointToArray(Ord('c'));
  3865. p^.Weights := ToWeight($1606,$0020,$0002);
  3866. end;
  3867. procedure test17c();
  3868. var
  3869. sequence : TOrderedCharacters;
  3870. statement : TReorderSequence;
  3871. wfirst, wresult : TUCA_LineRecArray;
  3872. i : Integer;
  3873. unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
  3874. begin
  3875. // test17* are about "Weights" generation
  3876. statement.Clear();
  3877. test17c_prepareWeigth(wfirst);
  3878. sequence := TOrderedCharacters.Create();
  3879. sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
  3880. sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
  3881. sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
  3882. for i := 0 to sequence.ActualLength - 1 do
  3883. sequence.Data[i].Changed := False;
  3884. WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3885. WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
  3886. ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
  3887. CheckInf(['a','b','c'],@unicodeBook1);
  3888. // --- test 1
  3889. SetLength(statement.Reset,1);
  3890. statement.Reset[0] := Ord('b');
  3891. SetLength(statement.Elements,1);
  3892. statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
  3893. sequence.ApplyStatement(@statement);
  3894. WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
  3895. wresult := nil;
  3896. ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
  3897. WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
  3898. ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
  3899. CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
  3900. WriteLn(' -- test 1 - ok');
  3901. end;
  3902. procedure CheckEqual(A,B : array of TUnicodeCodePoint; const AMsg : string);overload;
  3903. var
  3904. i : Integer;
  3905. begin
  3906. Check((Length(A)=Length(B)),'Length() <>');
  3907. if (Length(A) > 0) then begin
  3908. for i := Low(A) to High(A) do
  3909. Check(A[i] = B[i],'%s, A[%d] <>',[AMsg,i]);
  3910. end;
  3911. end;
  3912. procedure CheckEqual(A,B : TReorderUnit; const AMsg : string);overload;
  3913. var
  3914. i : Integer;
  3915. begin
  3916. Check((A.VirtualPosition=B.VirtualPosition),'VirtualPosition <>');
  3917. Check((A.InitialPosition=B.InitialPosition),'InitialPosition <>');
  3918. Check((A.Changed=B.Changed),'Changed <>');
  3919. Check((A.WeigthKind=B.WeigthKind),'WeigthKind <>');
  3920. CheckEqual(A.Context,B.Context,'Context');
  3921. CheckEqual(A.ExpansionChars,B.ExpansionChars,'ExpansionChars');
  3922. CheckEqual(A.Characters,B.Characters,'Characters');
  3923. CheckEqual(A.Context,B.Context,'Context');
  3924. end;
  3925. procedure CheckEqual(A,B : TReorderSequence);overload;
  3926. var
  3927. i : Integer;
  3928. begin
  3929. Check((A.LogicalPosition=B.LogicalPosition),'LogicalPosition <>');
  3930. Check((A.Before=B.Before),'Before <>');
  3931. CheckEqual(A.Reset,B.Reset,'Reset');
  3932. Check((Length(A.Elements)=Length(B.Elements)),'Length(Elements) <>');
  3933. for i := Low(A.Elements) to High(A.Elements) do
  3934. CheckEqual(A.Elements[i],B.Elements[i],Format('Elements[%d]',[i]));
  3935. end;
  3936. procedure CheckEqual(AActual, AExpected : UTF8String; const AMsg : string);overload;
  3937. begin
  3938. Check(
  3939. (AActual=AExpected),
  3940. Format('%s, Expected "%s" Found "%s".',[AMsg,AExpected,AActual])
  3941. );
  3942. end;
  3943. procedure CheckEqual(AActual, AExpected : TSettingRec);overload;
  3944. var
  3945. i : Integer;
  3946. begin
  3947. CheckEqual(AActual.Name,AExpected.Name,'Name');
  3948. Check((AActual.OptionValue=AExpected.OptionValue),'OptionValue <>');
  3949. Check((Length(AActual.Values)=Length(AExpected.Values)),'Length(Values) <>');
  3950. for i := Low(AActual.Values) to High(AExpected.Values) do
  3951. CheckEqual(AActual.Values[i],AExpected.Values[i],Format('Values[%d]',[i]));
  3952. end;
  3953. function CountLines(const AStr : ansistring) : Integer;
  3954. var
  3955. c, i : Integer;
  3956. begin
  3957. c := 0;
  3958. for i := 1 to Length(AStr) do begin
  3959. if (AStr[i] = #10) then
  3960. c := c+1;
  3961. end;
  3962. if (c = 0) and (AStr <> '') then
  3963. c := c+1;
  3964. Result := c;
  3965. end;
  3966. procedure do_test_parser(
  3967. AText : ansistring;
  3968. const AExpected : TReorderSequence;
  3969. const ALineCount : Integer
  3970. );overload;
  3971. var
  3972. locText : UTF8String;
  3973. locTextPointer : PAnsiChar;
  3974. locStartPosition,
  3975. locMaxLen : Integer;
  3976. locStatement : TParsedStatement;
  3977. locNextPos,
  3978. locLineCount : Integer;
  3979. begin
  3980. locText := AText;
  3981. WriteLn('Parsing "',locText,'" ...');
  3982. locTextPointer := @locText[1];
  3983. locMaxLen := Length(locText);
  3984. locStartPosition := 0;
  3985. locNextPos := 0;
  3986. locLineCount := 0;
  3987. Clear(locStatement);
  3988. Check(
  3989. ParseStatement(
  3990. locTextPointer,locStartPosition,locMaxLen,@locStatement,locNextPos,locLineCount
  3991. ),
  3992. 'Fail to Parse : "%s".', [locText]
  3993. );
  3994. Check((locStatement.Kind=TStatementKind.Sequence),'Fail to Parse(StatementKind) : "%s".', [locText]);
  3995. if (locLineCount > 1) then
  3996. WriteLn;
  3997. WriteLn(' Next Position : ',locNextPos);
  3998. WriteLn(' Line Count : ',locLineCount);
  3999. if (CountLines(locText) = 1) then
  4000. Check((locNextPos>=locMaxLen),'Next Position');
  4001. if (ALineCount > 0) then
  4002. Check((locLineCount=ALineCount),'Line Count');
  4003. CheckEqual(locStatement.ReorderSequence,AExpected);
  4004. WriteLn(' -- test ok');
  4005. end;
  4006. procedure do_test_parser(AText : ansistring; const AExpected : TReorderSequence);inline;overload;
  4007. begin
  4008. do_test_parser(AText,AExpected,1);
  4009. end;
  4010. procedure do_test_parser_for_setting(
  4011. AText : ansistring;
  4012. const ASettingName : UTF8String;
  4013. const ASettingValues : array of UTF8String;
  4014. const AOption : TSettingOption;
  4015. const ALineCount : Integer
  4016. );overload;
  4017. var
  4018. locText : UTF8String;
  4019. locTextPointer : PAnsiChar;
  4020. locStartPosition,
  4021. locMaxLen : Integer;
  4022. locStatement : TParsedStatement;
  4023. locNextPos,
  4024. locLineCount, i : Integer;
  4025. begin
  4026. locText := AText;
  4027. WriteLn('Parsing "',locText,'" ...');
  4028. locTextPointer := @locText[1];
  4029. locMaxLen := Length(locText);
  4030. locStartPosition := 0;
  4031. locNextPos := 0;
  4032. locLineCount := 0;
  4033. Clear(locStatement);
  4034. Check(
  4035. ParseStatement(
  4036. locTextPointer,locStartPosition,locMaxLen,@locStatement,locNextPos,locLineCount
  4037. ),
  4038. 'Fail to Parse : "%s".', [locText]
  4039. );
  4040. Check((locStatement.Kind=TStatementKind.Setting),'Fail to Parse(StatementKind) : "%s".', [locText]);
  4041. if (locLineCount > 1) then
  4042. WriteLn;
  4043. WriteLn(' Next Position : ',locNextPos);
  4044. WriteLn(' Line Count : ',locLineCount);
  4045. if (CountLines(locText) = 1) then
  4046. Check((locNextPos>=locMaxLen),'Next Position');
  4047. if (ALineCount > 0) then
  4048. Check((locLineCount=ALineCount),'Line Count');
  4049. CheckEqual(locStatement.Setting.Name,ASettingName,'Setting Name');
  4050. Check((Length(locStatement.Setting.Values) = Length(ASettingValues)),'Values should not be empty');
  4051. for i := 0 to Length(ASettingValues)-1 do begin
  4052. CheckEqual(locStatement.Setting.Values[i],ASettingValues[i],'Setting Value');
  4053. end;
  4054. Check((locStatement.Setting.OptionValue = AOption),'Option');
  4055. WriteLn(' -- test ok');
  4056. end;
  4057. procedure do_test_parser_for_setting(
  4058. AText : ansistring;
  4059. const ASettingName : UTF8String;
  4060. const ASettingValue : UTF8String;
  4061. const AOption : TSettingOption
  4062. );inline;overload;
  4063. begin
  4064. do_test_parser_for_setting(AText,ASettingName,ASettingValue,AOption,1);
  4065. end;
  4066. procedure test_parser_1();
  4067. var
  4068. locStatement : TReorderSequence;
  4069. begin
  4070. locStatement.Clear();
  4071. locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
  4072. locStatement.SetElementCount(1);
  4073. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
  4074. do_test_parser('& [last tertiary ignorable] = a',locStatement);
  4075. end;
  4076. procedure do_test_parser_for_setting_multi(
  4077. AText : ansistring;
  4078. const ASettings : array of TSettingRec
  4079. );overload;
  4080. var
  4081. locText : UTF8String;
  4082. locTextPointer : PAnsiChar;
  4083. locStartPosition,
  4084. locMaxLen : Integer;
  4085. locStatement : TParsedStatement;
  4086. locNextPos,
  4087. locLineCount, i, k : Integer;
  4088. locStatements : TSettingRecArray;
  4089. begin
  4090. locText := AText;
  4091. WriteLn('Parsing "',locText,'" ...');
  4092. locTextPointer := @locText[1];
  4093. locMaxLen := Length(locText);
  4094. SetLength(locStatements,12);
  4095. locStartPosition := 0;
  4096. locNextPos := 0;
  4097. locLineCount := 0;
  4098. k := 0;
  4099. while (locStartPosition < locMaxLen) do begin
  4100. Clear(locStatement);
  4101. if not ParseStatement(
  4102. locTextPointer,locStartPosition,locMaxLen,@locStatement,
  4103. locNextPos,locLineCount
  4104. )
  4105. then begin
  4106. break;
  4107. end;
  4108. if (locStatement.Kind <> TStatementKind.Setting) then
  4109. break;
  4110. locStatements[k].Assign(@locStatement.Setting);
  4111. locStartPosition := locNextPos;
  4112. k := k+1;
  4113. if (k > Length(ASettings)) then
  4114. raise Exception.CreateFmt(
  4115. '%d Statements expected, more was parsed.',
  4116. [Length(ASettings)]
  4117. );
  4118. end;
  4119. Check((k=Length(ASettings)), 'Statement Count');
  4120. for i := 0 to Length(ASettings)-1 do begin
  4121. try
  4122. CheckEqual(locStatements[i],ASettings[i]);
  4123. except
  4124. WriteLn(Format(' Setting[%d] Fails',[i]));
  4125. raise;
  4126. end;
  4127. end;
  4128. WriteLn(' -- test ok');
  4129. end;
  4130. procedure test_parser_2();
  4131. var
  4132. locStatement : TReorderSequence;
  4133. begin
  4134. locStatement.Clear();
  4135. locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
  4136. locStatement.SetElementCount(1);
  4137. locStatement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  4138. do_test_parser('& [last tertiary ignorable] < b',locStatement);
  4139. end;
  4140. procedure test_parser_3();
  4141. var
  4142. locStatement : TReorderSequence;
  4143. begin
  4144. locStatement.Clear();
  4145. locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
  4146. locStatement.SetElementCount(1);
  4147. locStatement.Elements[0] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
  4148. do_test_parser('& [last tertiary ignorable] << c',locStatement);
  4149. end;
  4150. procedure test_parser_4();
  4151. var
  4152. locStatement : TReorderSequence;
  4153. begin
  4154. locStatement.Clear();
  4155. locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
  4156. locStatement.SetElementCount(1);
  4157. locStatement.Elements[0] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Tertiary,0);
  4158. do_test_parser('& [last tertiary ignorable] <<< d',locStatement);
  4159. end;
  4160. procedure test_parser_5();
  4161. var
  4162. locStatement : TReorderSequence;
  4163. begin
  4164. locStatement.Clear();
  4165. locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
  4166. locStatement.SetElementCount(1);
  4167. locStatement.Elements[0] := TReorderUnit.From(1,TReorderWeigthKind.Primary,0);
  4168. do_test_parser('& [last tertiary ignorable] < ''\u0001''',locStatement);
  4169. end;
  4170. procedure test_parser_6();
  4171. var
  4172. locStatement : TReorderSequence;
  4173. begin
  4174. locStatement.Clear();
  4175. locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
  4176. locStatement.SetElementCount(1);
  4177. locStatement.Elements[0] := TReorderUnit.From(7,TReorderWeigthKind.Secondary,0);
  4178. do_test_parser('& [last tertiary ignorable] << ''\u0007''',locStatement);
  4179. end;
  4180. procedure test_parser_7();
  4181. var
  4182. locStatement : TReorderSequence;
  4183. begin
  4184. locStatement.Clear();
  4185. locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
  4186. locStatement.SetElementCount(1);
  4187. locStatement.Elements[0] := TReorderUnit.From(9,TReorderWeigthKind.Secondary,0);
  4188. do_test_parser('& [last tertiary ignorable] << ''\u0009''',locStatement);
  4189. end;
  4190. procedure test_parser_8();
  4191. var
  4192. locStatement : TReorderSequence;
  4193. begin
  4194. locStatement.Clear();
  4195. locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
  4196. locStatement.SetElementCount(1);
  4197. locStatement.Elements[0] := TReorderUnit.From($000110BD,TReorderWeigthKind.Primary,0);
  4198. do_test_parser('& [last tertiary ignorable] < ''\U000110BD''',locStatement);
  4199. end;
  4200. procedure test_parser_9();
  4201. var
  4202. locStatement : TReorderSequence;
  4203. begin
  4204. locStatement.Clear();
  4205. SetLength(locStatement.Reset,1);
  4206. locStatement.Reset[0] := Ord('x');
  4207. locStatement.SetElementCount(1);
  4208. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4209. do_test_parser('&x < a',locStatement);
  4210. end;
  4211. procedure test_parser_abreviating_1();
  4212. var
  4213. locStatement : TReorderSequence;
  4214. begin
  4215. locStatement.Clear();
  4216. SetLength(locStatement.Reset,1);
  4217. locStatement.Reset[0] := Ord('x');
  4218. locStatement.SetElementCount(3);
  4219. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4220. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  4221. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  4222. do_test_parser('&x <* abc',locStatement);
  4223. end;
  4224. procedure test_parser_abreviating_2();
  4225. var
  4226. locStatement : TReorderSequence;
  4227. begin
  4228. locStatement.Clear();
  4229. SetLength(locStatement.Reset,1);
  4230. locStatement.Reset[0] := Ord('x');
  4231. locStatement.SetElementCount(7);
  4232. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4233. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  4234. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  4235. locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,0);
  4236. locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
  4237. locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
  4238. locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  4239. do_test_parser('&x <* abcd-g',locStatement);
  4240. end;
  4241. procedure test_parser_abreviating_3();
  4242. var
  4243. locStatement : TReorderSequence;
  4244. begin
  4245. locStatement.Clear();
  4246. SetLength(locStatement.Reset,1);
  4247. locStatement.Reset[0] := Ord('x');
  4248. locStatement.SetElementCount(8);
  4249. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4250. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  4251. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  4252. locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,0);
  4253. locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
  4254. locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
  4255. locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  4256. locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Primary,0);
  4257. do_test_parser('&x <* abcd-gp',locStatement);
  4258. end;
  4259. procedure test_parser_abreviating_4();
  4260. var
  4261. locStatement : TReorderSequence;
  4262. begin
  4263. locStatement.Clear();
  4264. SetLength(locStatement.Reset,1);
  4265. locStatement.Reset[0] := Ord('x');
  4266. locStatement.SetElementCount(11);
  4267. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4268. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  4269. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  4270. locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,0);
  4271. locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
  4272. locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
  4273. locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
  4274. locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Primary,0);
  4275. locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Primary,0);
  4276. locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Primary,0);
  4277. locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Primary,0);
  4278. do_test_parser('&x <* abcd-gp-s',locStatement);
  4279. end;
  4280. procedure test_parser_abreviating_5();
  4281. var
  4282. locStatement : TReorderSequence;
  4283. begin
  4284. locStatement.Clear();
  4285. SetLength(locStatement.Reset,1);
  4286. locStatement.Reset[0] := Ord('x');
  4287. locStatement.SetElementCount(3);
  4288. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Secondary,0);
  4289. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
  4290. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
  4291. do_test_parser('&x <<* abc',locStatement);
  4292. end;
  4293. procedure test_parser_abreviating_6();
  4294. var
  4295. locStatement : TReorderSequence;
  4296. begin
  4297. locStatement.Clear();
  4298. SetLength(locStatement.Reset,1);
  4299. locStatement.Reset[0] := Ord('x');
  4300. locStatement.SetElementCount(11);
  4301. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Secondary,0);
  4302. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
  4303. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
  4304. locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Secondary,0);
  4305. locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Secondary,0);
  4306. locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Secondary,0);
  4307. locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
  4308. locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Secondary,0);
  4309. locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Secondary,0);
  4310. locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Secondary,0);
  4311. locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Secondary,0);
  4312. do_test_parser('&x <<* abcd-gp-s',locStatement);
  4313. end;
  4314. procedure test_parser_abreviating_7();
  4315. var
  4316. locStatement : TReorderSequence;
  4317. begin
  4318. locStatement.Clear();
  4319. SetLength(locStatement.Reset,1);
  4320. locStatement.Reset[0] := Ord('x');
  4321. locStatement.SetElementCount(3);
  4322. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Tertiary,0);
  4323. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
  4324. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
  4325. do_test_parser('&x <<<* abc',locStatement);
  4326. end;
  4327. procedure test_parser_abreviating_8();
  4328. var
  4329. locStatement : TReorderSequence;
  4330. begin
  4331. locStatement.Clear();
  4332. SetLength(locStatement.Reset,1);
  4333. locStatement.Reset[0] := Ord('x');
  4334. locStatement.SetElementCount(11);
  4335. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Tertiary,0);
  4336. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
  4337. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
  4338. locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Tertiary,0);
  4339. locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Tertiary,0);
  4340. locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Tertiary,0);
  4341. locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
  4342. locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Tertiary,0);
  4343. locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Tertiary,0);
  4344. locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Tertiary,0);
  4345. locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Tertiary,0);
  4346. do_test_parser('&x <<<* abcd-gp-s',locStatement);
  4347. end;
  4348. procedure test_parser_abreviating_9();
  4349. var
  4350. locStatement : TReorderSequence;
  4351. begin
  4352. locStatement.Clear();
  4353. SetLength(locStatement.Reset,1);
  4354. locStatement.Reset[0] := Ord('x');
  4355. locStatement.SetElementCount(3);
  4356. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
  4357. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Identity,0);
  4358. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Identity,0);
  4359. do_test_parser('&x =* abc',locStatement);
  4360. end;
  4361. procedure test_parser_abreviating_10();
  4362. var
  4363. locStatement : TReorderSequence;
  4364. begin
  4365. locStatement.Clear();
  4366. SetLength(locStatement.Reset,1);
  4367. locStatement.Reset[0] := Ord('x');
  4368. locStatement.SetElementCount(11);
  4369. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
  4370. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Identity,0);
  4371. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Identity,0);
  4372. locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Identity,0);
  4373. locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Identity,0);
  4374. locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Identity,0);
  4375. locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Identity,0);
  4376. locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Identity,0);
  4377. locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Identity,0);
  4378. locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Identity,0);
  4379. locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Identity,0);
  4380. do_test_parser('&x =* abcd-gp-s',locStatement);
  4381. end;
  4382. procedure test_parser_contraction_1();
  4383. var
  4384. locStatement : TReorderSequence;
  4385. begin
  4386. locStatement.Clear();
  4387. SetLength(locStatement.Reset,1);
  4388. locStatement.Reset[0] := Ord('k');
  4389. locStatement.SetElementCount(1);
  4390. locStatement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
  4391. do_test_parser('&k < ch',locStatement);
  4392. end;
  4393. procedure test_parser_contraction_2();
  4394. var
  4395. locStatement : TReorderSequence;
  4396. begin
  4397. locStatement.Clear();
  4398. SetLength(locStatement.Reset,3);
  4399. locStatement.Reset[0] := Ord('a');
  4400. locStatement.Reset[1] := Ord('b');
  4401. locStatement.Reset[2] := Ord('c');
  4402. locStatement.SetElementCount(1);
  4403. locStatement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
  4404. do_test_parser('&abc < ch',locStatement);
  4405. end;
  4406. procedure test_parser_expansion_1();
  4407. var
  4408. locStatement : TReorderSequence;
  4409. begin
  4410. locStatement.Clear();
  4411. SetLength(locStatement.Reset,1);
  4412. locStatement.Reset[0] := Ord('a');
  4413. locStatement.SetElementCount(1);
  4414. locStatement.Elements[0] := TReorderUnit.From(Ord('z'),TReorderWeigthKind.Primary,0);
  4415. locStatement.Elements[0].ExpansionChars := CodePointToArray(Ord('e'));
  4416. do_test_parser('&a < z/e',locStatement);
  4417. end;
  4418. procedure test_parser_special_char_1();
  4419. var
  4420. locStatement : TReorderSequence;
  4421. begin
  4422. locStatement.Clear();
  4423. SetLength(locStatement.Reset,1);
  4424. locStatement.Reset[0] := Ord('x');
  4425. locStatement.SetElementCount(1);
  4426. locStatement.Elements[0] := TReorderUnit.From(Ord('/'),TReorderWeigthKind.Primary,0);
  4427. do_test_parser('&x < ''/''',locStatement);
  4428. end;
  4429. procedure test_parser_special_char_2();
  4430. var
  4431. locStatement : TReorderSequence;
  4432. begin
  4433. locStatement.Clear();
  4434. SetLength(locStatement.Reset,1);
  4435. locStatement.Reset[0] := Ord('x');
  4436. locStatement.SetElementCount(1);
  4437. locStatement.Elements[0] := TReorderUnit.From(Ord('&'),TReorderWeigthKind.Primary,0);
  4438. do_test_parser('&x < ''&''',locStatement);
  4439. end;
  4440. procedure test_parser_special_char_3();
  4441. var
  4442. locStatement : TReorderSequence;
  4443. begin
  4444. locStatement.Clear();
  4445. SetLength(locStatement.Reset,1);
  4446. locStatement.Reset[0] := Ord('x');
  4447. locStatement.SetElementCount(1);
  4448. locStatement.Elements[0] := TReorderUnit.From(Ord('<'),TReorderWeigthKind.Primary,0);
  4449. do_test_parser('&x < ''<''',locStatement);
  4450. end;
  4451. procedure test_parser_special_char_4();
  4452. var
  4453. locStatement : TReorderSequence;
  4454. begin
  4455. locStatement.Clear();
  4456. SetLength(locStatement.Reset,1);
  4457. locStatement.Reset[0] := Ord('x');
  4458. locStatement.SetElementCount(1);
  4459. locStatement.Elements[0] := TReorderUnit.From(Ord('|'),TReorderWeigthKind.Primary,0);
  4460. do_test_parser('&x < ''|''',locStatement);
  4461. end;
  4462. procedure test_parser_special_char_5();
  4463. var
  4464. locStatement : TReorderSequence;
  4465. begin
  4466. locStatement.Clear();
  4467. SetLength(locStatement.Reset,1);
  4468. locStatement.Reset[0] := Ord('x');
  4469. locStatement.SetElementCount(1);
  4470. locStatement.Elements[0] := TReorderUnit.From(Ord('*'),TReorderWeigthKind.Primary,0);
  4471. do_test_parser('&x < ''*''',locStatement);
  4472. end;
  4473. procedure test_parser_special_char_6();
  4474. var
  4475. locStatement : TReorderSequence;
  4476. begin
  4477. locStatement.Clear();
  4478. SetLength(locStatement.Reset,1);
  4479. locStatement.Reset[0] := Ord('x');
  4480. locStatement.SetElementCount(1);
  4481. locStatement.Elements[0] := TReorderUnit.From(Ord('['),TReorderWeigthKind.Primary,0);
  4482. do_test_parser('&x < ''[''',locStatement);
  4483. end;
  4484. procedure test_parser_special_char_7();
  4485. var
  4486. locStatement : TReorderSequence;
  4487. begin
  4488. locStatement.Clear();
  4489. SetLength(locStatement.Reset,1);
  4490. locStatement.Reset[0] := Ord('x');
  4491. locStatement.SetElementCount(1);
  4492. locStatement.Elements[0] := TReorderUnit.From(Ord(']'),TReorderWeigthKind.Primary,0);
  4493. do_test_parser('&x < '']''',locStatement);
  4494. end;
  4495. procedure test_parser_special_char_8();
  4496. var
  4497. locStatement : TReorderSequence;
  4498. begin
  4499. locStatement.Clear();
  4500. SetLength(locStatement.Reset,1);
  4501. locStatement.Reset[0] := Ord('[');
  4502. locStatement.SetElementCount(1);
  4503. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
  4504. do_test_parser('&''[''=a',locStatement);
  4505. end;
  4506. procedure test_parser_special_char_9();
  4507. var
  4508. locStatement : TReorderSequence;
  4509. begin
  4510. locStatement.Clear();
  4511. SetLength(locStatement.Reset,1);
  4512. locStatement.Reset[0] := Ord('\');
  4513. locStatement.SetElementCount(1);
  4514. locStatement.Elements[0] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Identity,0);
  4515. do_test_parser('&''\\''=c',locStatement);
  4516. end;
  4517. procedure test_parser_skip_comment_1();
  4518. var
  4519. locStatement : TReorderSequence;
  4520. begin
  4521. locStatement.Clear();
  4522. SetLength(locStatement.Reset,1);
  4523. locStatement.Reset[0] := Ord('x');
  4524. locStatement.SetElementCount(1);
  4525. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4526. do_test_parser(
  4527. '&x #' + sLineBreak +
  4528. ' < a',
  4529. locStatement, 2
  4530. );
  4531. end;
  4532. procedure test_parser_skip_comment_2();
  4533. var
  4534. locStatement : TReorderSequence;
  4535. begin
  4536. locStatement.Clear();
  4537. SetLength(locStatement.Reset,1);
  4538. locStatement.Reset[0] := Ord('x');
  4539. locStatement.SetElementCount(1);
  4540. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4541. do_test_parser(
  4542. '&x # hello' + sLineBreak +
  4543. ' < a',
  4544. locStatement, 2
  4545. );
  4546. end;
  4547. procedure test_parser_skip_comment_3();
  4548. var
  4549. locStatement : TReorderSequence;
  4550. begin
  4551. locStatement.Clear();
  4552. SetLength(locStatement.Reset,1);
  4553. locStatement.Reset[0] := Ord('x');
  4554. locStatement.SetElementCount(1);
  4555. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4556. do_test_parser(
  4557. '&x # hello' + sLineBreak +
  4558. sLineBreak +
  4559. #9#9' ' + sLineBreak +
  4560. ' < a',
  4561. locStatement, 4
  4562. );
  4563. end;
  4564. procedure test_parser_quoted_string_1();
  4565. var
  4566. locStatement : TReorderSequence;
  4567. begin
  4568. locStatement.Clear();
  4569. SetLength(locStatement.Reset,1);
  4570. locStatement.Reset[0] := Ord('x');
  4571. locStatement.SetElementCount(1);
  4572. locStatement.Elements[0] :=
  4573. TReorderUnit.From(
  4574. [Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!')],
  4575. TReorderWeigthKind.Primary,0
  4576. );
  4577. do_test_parser('&x < ''<#|/!''',locStatement);
  4578. end;
  4579. procedure test_parser_quoted_string_2();
  4580. var
  4581. locStatement : TReorderSequence;
  4582. begin
  4583. locStatement.Clear();
  4584. SetLength(locStatement.Reset,1);
  4585. locStatement.Reset[0] := Ord('x');
  4586. locStatement.SetElementCount(1);
  4587. locStatement.Elements[0] :=
  4588. TReorderUnit.From(
  4589. [Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!'),Ord('A')],
  4590. TReorderWeigthKind.Primary,0
  4591. );
  4592. do_test_parser('&x < ''<#|/!''A',locStatement);
  4593. end;
  4594. procedure test_parser_quoted_string_3();
  4595. var
  4596. locStatement : TReorderSequence;
  4597. begin
  4598. locStatement.Clear();
  4599. SetLength(locStatement.Reset,1);
  4600. locStatement.Reset[0] := Ord('x');
  4601. locStatement.SetElementCount(1);
  4602. locStatement.Elements[0] :=
  4603. TReorderUnit.From(
  4604. [Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!')],
  4605. TReorderWeigthKind.Primary,0
  4606. );
  4607. do_test_parser('&x < ''<#|/!''#',locStatement);
  4608. end;
  4609. procedure test_parser_quoted_string_4();
  4610. var
  4611. locStatement : TReorderSequence;
  4612. begin
  4613. locStatement.Clear();
  4614. SetLength(locStatement.Reset,1);
  4615. locStatement.Reset[0] := Ord('x');
  4616. locStatement.SetElementCount(1);
  4617. locStatement.Elements[0] :=
  4618. TReorderUnit.From(
  4619. [Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!'),Ord('A')],
  4620. TReorderWeigthKind.Primary,0
  4621. );
  4622. do_test_parser('&x < ''<#|/!''A#',locStatement);
  4623. end;
  4624. procedure test_parser_quoted_string_5();
  4625. var
  4626. locStatement : TReorderSequence;
  4627. begin
  4628. locStatement.Clear();
  4629. SetLength(locStatement.Reset,3);
  4630. locStatement.Reset[0] := Ord('x');
  4631. locStatement.Reset[1] := Ord('-');
  4632. locStatement.Reset[2] := Ord('y');
  4633. locStatement.SetElementCount(1);
  4634. locStatement.Elements[0] :=
  4635. TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
  4636. do_test_parser('&''x''-''y''<<<k',locStatement);
  4637. end;
  4638. procedure test_parser_quoted_string_6();
  4639. var
  4640. locStatement : TReorderSequence;
  4641. begin
  4642. locStatement.Clear();
  4643. SetLength(locStatement.Reset,1);
  4644. locStatement.Reset[0] := Ord('x');
  4645. locStatement.SetElementCount(1);
  4646. locStatement.Elements[0] :=
  4647. TReorderUnit.From(Ord('|'),TReorderWeigthKind.Primary,0);
  4648. do_test_parser('&x < ''|''',locStatement);
  4649. end;
  4650. procedure test_parser_quoted_string_7();
  4651. var
  4652. locStatement : TReorderSequence;
  4653. begin
  4654. locStatement.Clear();
  4655. SetLength(locStatement.Reset,1);
  4656. locStatement.Reset[0] := Ord('x');
  4657. locStatement.SetElementCount(1);
  4658. locStatement.Elements[0] :=
  4659. TReorderUnit.From([Ord('a'),Ord('|')],TReorderWeigthKind.Primary,0);
  4660. do_test_parser('&x < a''|''',locStatement);
  4661. end;
  4662. procedure test_parser_quoted_string_8();
  4663. var
  4664. locStatement : TReorderSequence;
  4665. begin
  4666. locStatement.Clear();
  4667. SetLength(locStatement.Reset,1);
  4668. locStatement.Reset[0] := Ord('x');
  4669. locStatement.SetElementCount(1);
  4670. locStatement.Elements[0] :=
  4671. TReorderUnit.From([Ord('a'),Ord('|'),Ord('c')],TReorderWeigthKind.Primary,0);
  4672. do_test_parser('&x < a''|''c',locStatement);
  4673. end;
  4674. procedure test_parser_contexte_before_1();
  4675. var
  4676. locStatement : TReorderSequence;
  4677. begin
  4678. locStatement.Clear();
  4679. SetLength(locStatement.Reset,1);
  4680. locStatement.Reset[0] := Ord('x');
  4681. locStatement.SetElementCount(1);
  4682. locStatement.Elements[0] :=
  4683. TReorderUnit.From(Ord('-'),[Ord('a')],TReorderWeigthKind.Secondary,0);
  4684. do_test_parser('&x << a|-',locStatement);
  4685. end;
  4686. procedure test_parser_contexte_before_2();
  4687. var
  4688. locStatement : TReorderSequence;
  4689. begin
  4690. locStatement.Clear();
  4691. SetLength(locStatement.Reset,1);
  4692. locStatement.Reset[0] := Ord('a');
  4693. locStatement.SetElementCount(1);
  4694. locStatement.Elements[0] :=
  4695. TReorderUnit.From(Ord('-'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
  4696. do_test_parser('&a <<< a|-',locStatement);
  4697. end;
  4698. procedure test_parser_contexte_before_3();
  4699. var
  4700. locStatement : TReorderSequence;
  4701. begin
  4702. locStatement.Clear();
  4703. SetLength(locStatement.Reset,1);
  4704. locStatement.Reset[0] := Ord('x');
  4705. locStatement.SetElementCount(1);
  4706. locStatement.Elements[0] :=
  4707. TReorderUnit.From(
  4708. Ord('-'),[Ord('a'),Ord('z'),Ord('k')],TReorderWeigthKind.Secondary,0
  4709. );
  4710. do_test_parser('&x << azk|-',locStatement);
  4711. end;
  4712. procedure test_parser_contexte_before_4();
  4713. var
  4714. locStatement : TReorderSequence;
  4715. begin
  4716. locStatement.Clear();
  4717. SetLength(locStatement.Reset,1);
  4718. locStatement.Reset[0] := Ord('x');
  4719. locStatement.SetElementCount(1);
  4720. locStatement.Elements[0] :=
  4721. TReorderUnit.From(
  4722. [Ord('a'),Ord(':')],[Ord('a'),Ord('z'),Ord('k')],
  4723. TReorderWeigthKind.Secondary,0
  4724. );
  4725. do_test_parser('&x << azk|a:',locStatement);
  4726. end;
  4727. procedure test_parser_placement_before_1();
  4728. var
  4729. locStatement : TReorderSequence;
  4730. begin
  4731. locStatement.Clear();
  4732. SetLength(locStatement.Reset,1);
  4733. locStatement.Reset[0] := Ord('x');
  4734. locStatement.Before := True;
  4735. locStatement.SetElementCount(1);
  4736. locStatement.Elements[0] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Secondary,0);
  4737. do_test_parser('&[before 2] x << k',locStatement);
  4738. end;
  4739. procedure test_parser_placement_before_2();
  4740. var
  4741. locStatement : TReorderSequence;
  4742. begin
  4743. locStatement.Clear();
  4744. SetLength(locStatement.Reset,1);
  4745. locStatement.Reset[0] := Ord('x');
  4746. locStatement.Before := True;
  4747. locStatement.SetElementCount(1);
  4748. locStatement.Elements[0] :=
  4749. TReorderUnit.From([Ord('z'),Ord('k')],TReorderWeigthKind.Tertiary,0);
  4750. do_test_parser('&[before 3] x <<< zk',locStatement);
  4751. end;
  4752. procedure test_parser_placement_before_3();
  4753. var
  4754. locStatement : TReorderSequence;
  4755. begin
  4756. locStatement.Clear();
  4757. SetLength(locStatement.Reset,1);
  4758. locStatement.Reset[0] := Ord('x');
  4759. locStatement.Before := True;
  4760. locStatement.SetElementCount(1);
  4761. locStatement.Elements[0] := TReorderUnit.From(Ord('z'),TReorderWeigthKind.Primary,0);
  4762. do_test_parser('&[before 1] x < z',locStatement);
  4763. end;
  4764. procedure test_parser_multi_unit_statement_line_1();
  4765. var
  4766. locStatement : TReorderSequence;
  4767. begin
  4768. locStatement.Clear();
  4769. SetLength(locStatement.Reset,1);
  4770. locStatement.Reset[0] := Ord('x');
  4771. locStatement.SetElementCount(3);
  4772. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4773. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  4774. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  4775. do_test_parser('&x < a < b < c',locStatement);
  4776. do_test_parser('&x <a <b <c',locStatement);
  4777. do_test_parser('&x <a<b<c',locStatement);
  4778. end;
  4779. procedure test_parser_multi_unit_statement_line_2();
  4780. var
  4781. locStatement : TReorderSequence;
  4782. begin
  4783. locStatement.Clear();
  4784. SetLength(locStatement.Reset,1);
  4785. locStatement.Reset[0] := Ord('x');
  4786. locStatement.SetElementCount(3);
  4787. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4788. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
  4789. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
  4790. do_test_parser('&x < a << b <<< c',locStatement);
  4791. do_test_parser('&x <a <<b <<<c',locStatement);
  4792. do_test_parser('&x <a<<b<<<c',locStatement);
  4793. end;
  4794. procedure test_parser_multi_unit_statement_line_3();
  4795. var
  4796. locStatement : TReorderSequence;
  4797. begin
  4798. locStatement.Clear();
  4799. SetLength(locStatement.Reset,1);
  4800. locStatement.Reset[0] := Ord('x');
  4801. locStatement.SetElementCount(3);
  4802. locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Tertiary,0);
  4803. locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
  4804. locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
  4805. do_test_parser('&x <<< a << b <<< c',locStatement);
  4806. do_test_parser('&x <<<a <<b <<<c',locStatement);
  4807. do_test_parser('&x <<<a<<b<<<c',locStatement);
  4808. end;
  4809. procedure test_parser_multi_statement_line_1();
  4810. const STATEMENT_BUFFER : UTF8String = '&r <<a &s <<< b';
  4811. var
  4812. locStatements : array of TReorderSequence;
  4813. locStatement : TParsedStatement;
  4814. locExpectedStatement : TReorderSequence;
  4815. lineCount, i, bufferLength, k, nextPost : Integer;
  4816. buffer : PAnsiChar;
  4817. begin
  4818. buffer := @STATEMENT_BUFFER[1];
  4819. WriteLn('Parsing "',buffer,'" ...');
  4820. bufferLength := Length(buffer);
  4821. SetLength(locStatements,10);
  4822. lineCount := 0;
  4823. nextPost := 0;
  4824. i := 0;
  4825. k := 0;
  4826. while (i < bufferLength) do begin
  4827. Clear(locStatement);
  4828. if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
  4829. Break;
  4830. if (locStatement.Kind <> TStatementKind.Sequence) then
  4831. break;
  4832. locStatements[k].Assign(@locStatement.ReorderSequence);
  4833. i := nextPost;
  4834. k := k+1;
  4835. if (k > 2) then
  4836. raise Exception.Create('2 Statements expected, more was parsed.');
  4837. end;
  4838. Check((k=2), 'Statement Count');
  4839. locExpectedStatement.Clear();
  4840. SetLength(locExpectedStatement.Reset,1);
  4841. locExpectedStatement.Reset[0] := Ord('r');
  4842. locExpectedStatement.SetElementCount(1);
  4843. locExpectedStatement.Elements[0] :=
  4844. TReorderUnit.From(Ord('a'),TReorderWeigthKind.Secondary,0);
  4845. CheckEqual(locStatements[0],locExpectedStatement);
  4846. locExpectedStatement.Clear();
  4847. SetLength(locExpectedStatement.Reset,1);
  4848. locExpectedStatement.Reset[0] := Ord('s');
  4849. locExpectedStatement.SetElementCount(1);
  4850. locExpectedStatement.Elements[0] :=
  4851. TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
  4852. CheckEqual(locStatements[1],locExpectedStatement);
  4853. WriteLn(' -- test ok');
  4854. end;
  4855. procedure test_parser_multi_statement_line_2();
  4856. const STATEMENT_BUFFER : UTF8String = '&r <a <b <<B &s <<< b <c';
  4857. var
  4858. locStatements : array of TReorderSequence;
  4859. locStatement : TParsedStatement;
  4860. locExpectedStatement : TReorderSequence;
  4861. lineCount, i, bufferLength, k, nextPost : Integer;
  4862. buffer : PAnsiChar;
  4863. begin
  4864. buffer := @STATEMENT_BUFFER[1];
  4865. WriteLn('Parsing "',buffer,'" ...');
  4866. bufferLength := Length(buffer);
  4867. SetLength(locStatements,10);
  4868. lineCount := 0;
  4869. nextPost := 0;
  4870. i := 0;
  4871. k := 0;
  4872. while (i < bufferLength) do begin
  4873. Clear(locStatement);
  4874. if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
  4875. Break;
  4876. if (locStatement.Kind <> TStatementKind.Sequence) then
  4877. break;
  4878. locStatements[k].Assign(@locStatement.ReorderSequence);
  4879. i := nextPost;
  4880. k := k+1;
  4881. if (k > 2) then
  4882. raise Exception.Create('2 Statements expected, more was parsed.');
  4883. end;
  4884. Check((k=2), 'Statement Count');
  4885. locExpectedStatement.Clear();
  4886. SetLength(locExpectedStatement.Reset,1);
  4887. locExpectedStatement.Reset[0] := Ord('r');
  4888. locExpectedStatement.SetElementCount(3);
  4889. locExpectedStatement.Elements[0] :=
  4890. TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4891. locExpectedStatement.Elements[1] :=
  4892. TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  4893. locExpectedStatement.Elements[2] :=
  4894. TReorderUnit.From(Ord('B'),TReorderWeigthKind.Secondary,0);
  4895. CheckEqual(locStatements[0],locExpectedStatement);
  4896. locExpectedStatement.Clear();
  4897. SetLength(locExpectedStatement.Reset,1);
  4898. locExpectedStatement.Reset[0] := Ord('s');
  4899. locExpectedStatement.SetElementCount(2);
  4900. locExpectedStatement.Elements[0] :=
  4901. TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
  4902. locExpectedStatement.Elements[1] :=
  4903. TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  4904. CheckEqual(locStatements[1],locExpectedStatement);
  4905. WriteLn(' -- test ok');
  4906. end;
  4907. procedure test_parser_multi_statement_line_3();
  4908. const STATEMENT_BUFFER : UTF8String = '&r <a <b <<B &s <<< b <c &x <A <W';
  4909. var
  4910. locStatements : array of TReorderSequence;
  4911. locStatement : TParsedStatement;
  4912. locExpectedStatement : TReorderSequence;
  4913. lineCount, i, bufferLength, k, nextPost : Integer;
  4914. buffer : PAnsiChar;
  4915. begin
  4916. buffer := @STATEMENT_BUFFER[1];
  4917. WriteLn('Parsing "',buffer,'" ...');
  4918. bufferLength := Length(buffer);
  4919. SetLength(locStatements,10);
  4920. lineCount := 0;
  4921. nextPost := 0;
  4922. i := 0;
  4923. k := 0;
  4924. while (i < bufferLength) do begin
  4925. Clear(locStatement);
  4926. if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
  4927. Break;
  4928. if (locStatement.Kind <> TStatementKind.Sequence) then
  4929. break;
  4930. locStatements[k].Assign(@locStatement.ReorderSequence);
  4931. i := nextPost;
  4932. k := k+1;
  4933. if (k > 3) then
  4934. raise Exception.Create('3 Statements expected, more was parsed.');
  4935. end;
  4936. Check((k=3), 'Statement Count');
  4937. locExpectedStatement.Clear();
  4938. SetLength(locExpectedStatement.Reset,1);
  4939. locExpectedStatement.Reset[0] := Ord('r');
  4940. locExpectedStatement.SetElementCount(3);
  4941. locExpectedStatement.Elements[0] :=
  4942. TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  4943. locExpectedStatement.Elements[1] :=
  4944. TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  4945. locExpectedStatement.Elements[2] :=
  4946. TReorderUnit.From(Ord('B'),TReorderWeigthKind.Secondary,0);
  4947. CheckEqual(locStatements[0],locExpectedStatement);
  4948. locExpectedStatement.Clear();
  4949. SetLength(locExpectedStatement.Reset,1);
  4950. locExpectedStatement.Reset[0] := Ord('s');
  4951. locExpectedStatement.SetElementCount(2);
  4952. locExpectedStatement.Elements[0] :=
  4953. TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
  4954. locExpectedStatement.Elements[1] :=
  4955. TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  4956. CheckEqual(locStatements[1],locExpectedStatement);
  4957. locExpectedStatement.Clear();
  4958. SetLength(locExpectedStatement.Reset,1);
  4959. locExpectedStatement.Reset[0] := Ord('x');
  4960. locExpectedStatement.SetElementCount(2);
  4961. locExpectedStatement.Elements[0] :=
  4962. TReorderUnit.From(Ord('A'),TReorderWeigthKind.Primary,0);
  4963. locExpectedStatement.Elements[1] :=
  4964. TReorderUnit.From(Ord('W'),TReorderWeigthKind.Primary,0);
  4965. CheckEqual(locStatements[2],locExpectedStatement);
  4966. WriteLn(' -- test ok');
  4967. end;
  4968. procedure test_parser_multi_statement_line_4();
  4969. const STATEMENT_BUFFER : UTF8String =
  4970. ' &r <a <b <<B &s <<< b <c &x <A <W';
  4971. var
  4972. locStatements : array of TReorderSequence;
  4973. locStatement : TParsedStatement;
  4974. locExpectedStatement : TReorderSequence;
  4975. lineCount, i, bufferLength, k, nextPost : Integer;
  4976. buffer : PAnsiChar;
  4977. begin
  4978. buffer := @STATEMENT_BUFFER[1];
  4979. WriteLn('Parsing "',buffer,'" ...');
  4980. bufferLength := Length(buffer);
  4981. SetLength(locStatements,10);
  4982. lineCount := 0;
  4983. nextPost := 0;
  4984. i := 0;
  4985. k := 0;
  4986. while (i < bufferLength) do begin
  4987. Clear(locStatement);
  4988. if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
  4989. Break;
  4990. if (locStatement.Kind <> TStatementKind.Sequence) then
  4991. break;
  4992. locStatements[k].Assign(@locStatement.ReorderSequence);
  4993. i := nextPost;
  4994. k := k+1;
  4995. if (k > 3) then
  4996. raise Exception.Create('3 Statements expected, more was parsed.');
  4997. end;
  4998. Check((k=3), 'Statement Count');
  4999. locExpectedStatement.Clear();
  5000. SetLength(locExpectedStatement.Reset,1);
  5001. locExpectedStatement.Reset[0] := Ord('r');
  5002. locExpectedStatement.SetElementCount(3);
  5003. locExpectedStatement.Elements[0] :=
  5004. TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  5005. locExpectedStatement.Elements[1] :=
  5006. TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
  5007. locExpectedStatement.Elements[2] :=
  5008. TReorderUnit.From(Ord('B'),TReorderWeigthKind.Secondary,0);
  5009. CheckEqual(locStatements[0],locExpectedStatement);
  5010. locExpectedStatement.Clear();
  5011. SetLength(locExpectedStatement.Reset,1);
  5012. locExpectedStatement.Reset[0] := Ord('s');
  5013. locExpectedStatement.SetElementCount(2);
  5014. locExpectedStatement.Elements[0] :=
  5015. TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
  5016. locExpectedStatement.Elements[1] :=
  5017. TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
  5018. CheckEqual(locStatements[1],locExpectedStatement);
  5019. locExpectedStatement.Clear();
  5020. SetLength(locExpectedStatement.Reset,1);
  5021. locExpectedStatement.Reset[0] := Ord('x');
  5022. locExpectedStatement.SetElementCount(2);
  5023. locExpectedStatement.Elements[0] :=
  5024. TReorderUnit.From(Ord('A'),TReorderWeigthKind.Primary,0);
  5025. locExpectedStatement.Elements[1] :=
  5026. TReorderUnit.From(Ord('W'),TReorderWeigthKind.Primary,0);
  5027. CheckEqual(locStatements[2],locExpectedStatement);
  5028. WriteLn(' -- test ok');
  5029. end;
  5030. procedure test_parser_multi_line_statements_1();
  5031. const STATEMENT_BUFFER : UTF8String =
  5032. '&r <a #123'#10 +
  5033. '&s <<< b ';
  5034. var
  5035. locStatements : array of TReorderSequence;
  5036. locStatement : TParsedStatement;
  5037. locExpectedStatement : TReorderSequence;
  5038. lineCount, i, bufferLength, k, nextPost : Integer;
  5039. buffer : PAnsiChar;
  5040. begin
  5041. buffer := @STATEMENT_BUFFER[1];
  5042. WriteLn('Parsing "',buffer,'" ...');
  5043. bufferLength := Length(buffer);
  5044. SetLength(locStatements,10);
  5045. lineCount := 0;
  5046. nextPost := 0;
  5047. i := 0;
  5048. k := 0;
  5049. while (i < bufferLength) do begin
  5050. Clear(locStatement);
  5051. if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
  5052. Break;
  5053. if (locStatement.Kind <> TStatementKind.Sequence) then
  5054. break;
  5055. locStatements[k].Assign(@locStatement.ReorderSequence);
  5056. i := nextPost;
  5057. k := k+1;
  5058. if (k > 2) then
  5059. raise Exception.Create('2 Statements expected, more was parsed.');
  5060. end;
  5061. Check((k=2), 'Statement Count');
  5062. locExpectedStatement.Clear();
  5063. SetLength(locExpectedStatement.Reset,1);
  5064. locExpectedStatement.Reset[0] := Ord('r');
  5065. locExpectedStatement.SetElementCount(1);
  5066. locExpectedStatement.Elements[0] :=
  5067. TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
  5068. CheckEqual(locStatements[0],locExpectedStatement);
  5069. locExpectedStatement.Clear();
  5070. SetLength(locExpectedStatement.Reset,1);
  5071. locExpectedStatement.Reset[0] := Ord('s');
  5072. locExpectedStatement.SetElementCount(1);
  5073. locExpectedStatement.Elements[0] :=
  5074. TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
  5075. CheckEqual(locStatements[1],locExpectedStatement);
  5076. WriteLn(' -- test ok');
  5077. end;
  5078. procedure test_parser_setting_1;
  5079. begin
  5080. do_test_parser_for_setting('[strength 1]','strength','1',TSettingOption.Strength);
  5081. end;
  5082. procedure test_parser_setting_2;
  5083. begin
  5084. do_test_parser_for_setting('[alternate shifted]','alternate','shifted',TSettingOption.Alternate);
  5085. end;
  5086. procedure test_parser_setting_3;
  5087. begin
  5088. do_test_parser_for_setting('[alternate non-ignorable]','alternate','non-ignorable',TSettingOption.Alternate);
  5089. end;
  5090. procedure test_parser_setting_4;
  5091. begin
  5092. do_test_parser_for_setting('[reorder Grek digit]','reorder',['Grek','digit'],TSettingOption.Reorder,1);
  5093. end;
  5094. procedure test_parser_setting_5;
  5095. begin
  5096. do_test_parser_for_setting(
  5097. '[azerty one two three four five]','azerty',
  5098. ['one','two','three', 'four', 'five'],TSettingOption.Unknown, 1
  5099. );
  5100. end;
  5101. procedure test_parser_setting_6;
  5102. begin
  5103. do_test_parser_for_setting(
  5104. '[strength'+ UNICODE_LINE_BREAK +
  5105. ' 1]',
  5106. 'strength',['1'],TSettingOption.Strength,2
  5107. );
  5108. do_test_parser_for_setting(
  5109. '[ strength '+ UNICODE_LINE_BREAK +
  5110. ' 1'+ UNICODE_LINE_BREAK+' ] ',
  5111. 'strength',['1'],TSettingOption.Strength,3
  5112. );
  5113. end;
  5114. procedure test_parser_setting_7;
  5115. begin
  5116. do_test_parser_for_setting(
  5117. '[Backwards # sample comment'+ UNICODE_LINE_BREAK +
  5118. ' one]',
  5119. 'Backwards',['one'],TSettingOption.Backwards,2
  5120. );
  5121. end;
  5122. procedure test_parser_setting_8;
  5123. begin
  5124. do_test_parser_for_setting('[STRENGTH 1]','STRENGTH','1',TSettingOption.Strength);
  5125. do_test_parser_for_setting('[STRengTH 1]','STRengTH','1',TSettingOption.Strength);
  5126. end;
  5127. procedure test_parser_setting_multi_statement_1;
  5128. begin
  5129. do_test_parser_for_setting_multi(
  5130. '[strength 1]' + UNICODE_LINE_BREAK +
  5131. '[alternate shifted]',
  5132. [ TSettingRec.From('strength',['1'],TSettingOption.Strength),
  5133. TSettingRec.From('alternate',['shifted'],TSettingOption.Alternate)
  5134. ]
  5135. );
  5136. end;
  5137. procedure test_parser_setting_multi_statement_2;
  5138. begin
  5139. do_test_parser_for_setting_multi(
  5140. '[strength 1][alternate shifted]',
  5141. [ TSettingRec.From('strength',['1'],TSettingOption.Strength),
  5142. TSettingRec.From('alternate',['shifted'],TSettingOption.Alternate)
  5143. ]
  5144. );
  5145. end;
  5146. procedure test_parser_setting_multi_statement_3;
  5147. begin
  5148. do_test_parser_for_setting_multi(
  5149. '[strength 1] [alternate shifted]',
  5150. [ TSettingRec.From('strength',['1'],TSettingOption.Strength),
  5151. TSettingRec.From('alternate',['shifted'],TSettingOption.Alternate)
  5152. ]
  5153. );
  5154. end;
  5155. procedure test_parser_setting_multi_statement_4;
  5156. begin
  5157. do_test_parser_for_setting_multi(
  5158. '[strength 1] [alternate non-ignorable][normalization off]',
  5159. [ TSettingRec.From('strength',['1'],TSettingOption.Strength),
  5160. TSettingRec.From('alternate',['non-ignorable'],TSettingOption.Alternate),
  5161. TSettingRec.From('normalization',['off'],TSettingOption.Normalization)
  5162. ]
  5163. );
  5164. end;
  5165. procedure test_parser_setting_unicodeset_1;
  5166. begin
  5167. do_test_parser_for_setting(
  5168. '[suppressContractions [d-k]]','suppressContractions',
  5169. '[d-k]',TSettingOption.SuppressContractions
  5170. );
  5171. end;
  5172. procedure test_parser_setting_unicodeset_2;
  5173. begin
  5174. do_test_parser_for_setting(
  5175. '[optimize [x]]','optimize','[x]',TSettingOption.Optimize
  5176. );
  5177. end;
  5178. procedure test_parser_setting_unicodeset_3;
  5179. begin
  5180. do_test_parser_for_setting(
  5181. '[suppressContractions [a {ab} {ac}]]','suppressContractions',
  5182. '[a {ab} {ac}]',TSettingOption.SuppressContractions
  5183. );
  5184. end;
  5185. procedure test_parser_setting_unicodeset_4;
  5186. begin
  5187. do_test_parser_for_setting(
  5188. '[suppressContractions [[a-c][a {ab}]]]','suppressContractions',
  5189. '[[a-c][a {ab}]]',TSettingOption.SuppressContractions
  5190. );
  5191. end;
  5192. //----------------------------------------------------------------------------//
  5193. const
  5194. COLLATION_XML_TEXT =
  5195. '<ldml>' + UNICODE_LINE_BREAK +
  5196. ' <identity>' + UNICODE_LINE_BREAK +
  5197. ' <version number="1.2.3"/>' + UNICODE_LINE_BREAK +
  5198. ' <generation date="$Date: 2014-07-08 21:39:31 -0500 (Tue, 08 Jul 2014) $"/>' + UNICODE_LINE_BREAK +
  5199. ' <language type="xy" />' + UNICODE_LINE_BREAK +
  5200. ' </identity>' + UNICODE_LINE_BREAK +
  5201. ' <collations >' + UNICODE_LINE_BREAK +
  5202. ' <defaultCollation>one</defaultCollation>' + UNICODE_LINE_BREAK +
  5203. ' <collation type="abc" >' + UNICODE_LINE_BREAK +
  5204. ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
  5205. ' [import xy-u-co-private-two]' + UNICODE_LINE_BREAK +
  5206. ' [import xy-u-co-one]' + UNICODE_LINE_BREAK +
  5207. ' [import xy-u-co-standard]' + UNICODE_LINE_BREAK +
  5208. ' [suppressContractions [qh]]' + UNICODE_LINE_BREAK +
  5209. ' &w<u<v' + UNICODE_LINE_BREAK +
  5210. ' ]]></cr>' + UNICODE_LINE_BREAK +
  5211. ' </collation>' + UNICODE_LINE_BREAK +
  5212. ' <collation type="one" >' + UNICODE_LINE_BREAK +
  5213. ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
  5214. ' &h<z<b' + UNICODE_LINE_BREAK +
  5215. ' ]]></cr>' + UNICODE_LINE_BREAK +
  5216. ' </collation>' + UNICODE_LINE_BREAK +
  5217. ' <collation type="private-two" >' + UNICODE_LINE_BREAK +
  5218. ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
  5219. ' &f<c<<<ce' + UNICODE_LINE_BREAK +
  5220. ' &q<qh<<<p' + UNICODE_LINE_BREAK +
  5221. ' ]]></cr>' + UNICODE_LINE_BREAK +
  5222. ' </collation >' + UNICODE_LINE_BREAK +
  5223. ' <collation type="standard" >' + UNICODE_LINE_BREAK +
  5224. ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
  5225. ' &d<c<b<a' + UNICODE_LINE_BREAK +
  5226. ' ]]></cr>' + UNICODE_LINE_BREAK +
  5227. ' </collation>' + UNICODE_LINE_BREAK +
  5228. ' </collations>' + UNICODE_LINE_BREAK +
  5229. '</ldml>';
  5230. COLLATION_XML_TEXT2 =
  5231. '<ldml>' + UNICODE_LINE_BREAK +
  5232. ' <identity>' + UNICODE_LINE_BREAK +
  5233. ' <version number="1.2.3"/>' + UNICODE_LINE_BREAK +
  5234. ' <generation date="$Date: 2014-07-08 21:39:31 -0500 (Tue, 08 Jul 2014) $"/>' + UNICODE_LINE_BREAK +
  5235. ' <language type="kw" />' + UNICODE_LINE_BREAK +
  5236. ' </identity>' + UNICODE_LINE_BREAK +
  5237. ' <collations >' + UNICODE_LINE_BREAK +
  5238. ' <defaultCollation>wend</defaultCollation>' + UNICODE_LINE_BREAK +
  5239. ' <collation type="kis" >' + UNICODE_LINE_BREAK +
  5240. ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
  5241. ' &x<c<v' + UNICODE_LINE_BREAK +
  5242. ' ]]></cr>' + UNICODE_LINE_BREAK +
  5243. ' </collation>' + UNICODE_LINE_BREAK +
  5244. ' <collation type="wend" >' + UNICODE_LINE_BREAK +
  5245. ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
  5246. ' [import xy-u-co-one]' + UNICODE_LINE_BREAK +
  5247. ' [backwards 2]' + UNICODE_LINE_BREAK +
  5248. ' [alternate non-ignorable]' + UNICODE_LINE_BREAK +
  5249. ' [normalization off]' + UNICODE_LINE_BREAK +
  5250. ' [strength 2]' + UNICODE_LINE_BREAK +
  5251. ' &F<<P<<<C' + UNICODE_LINE_BREAK +
  5252. ' &L<a<<<Z' + UNICODE_LINE_BREAK +
  5253. ' ]]></cr>' + UNICODE_LINE_BREAK +
  5254. ' </collation>' + UNICODE_LINE_BREAK +
  5255. ' </collations>' + UNICODE_LINE_BREAK +
  5256. '</ldml>';
  5257. function PrepareCollationStream(const AText : string) : TStream;
  5258. begin
  5259. Result := TMemoryStream.Create();
  5260. if (AText <> '') then
  5261. Result.Write(AText[1],(Length(AText)*SizeOf(Char)));
  5262. end;
  5263. function PrepareRepositoryLoader() : ICldrCollationLoader;
  5264. var
  5265. s : array of TStream;
  5266. begin
  5267. SetLength(s,2);
  5268. s[0] := PrepareCollationStream(COLLATION_XML_TEXT);
  5269. s[1] := PrepareCollationStream(COLLATION_XML_TEXT2);
  5270. Result := TCldrCollationStreamLoader.Create(['xy','kw'],s) as ICldrCollationLoader;
  5271. end;
  5272. procedure test_collation_parser_HeaderParsing();
  5273. var
  5274. rep : TCldrCollationRepository;
  5275. col : TCldrCollation;
  5276. typ : TCldrCollationItem;
  5277. imp : TCldrImport;
  5278. begin
  5279. rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
  5280. try
  5281. Check(rep.Find('xy')=nil, 'Find() before load.');
  5282. Check(rep.Find('ab')=nil, 'Find() before load.');
  5283. col := rep.Load('xy',TCldrParserMode.HeaderParsing);
  5284. Check(col <> nil, 'load()');
  5285. Check(col.Mode=TCldrParserMode.HeaderParsing, 'Mode');
  5286. Check(rep.Find('xy') <> nil, 'Find() after load.');
  5287. Check(rep.Find('ab')=nil);
  5288. WriteLn(' - Step 1 ok');
  5289. Check(col.DefaultType='one', 'DefaultType');
  5290. Check(col.ItemCount=4, 'col.ItemCount');
  5291. Check(col.Find('one')<>nil, 'col.Find()');
  5292. Check(col.Find('private-two')<>nil, 'col.Find()');
  5293. Check(col.Find('standard')<>nil, 'col.Find()');
  5294. Check(col.Find('abc')<>nil, 'col.Find()');
  5295. WriteLn(' - Step 2 ok');
  5296. typ := col.Find('private-two');
  5297. check(typ.IsPrivate(),'IsPrivate()');
  5298. WriteLn(' - Step 3 ok');
  5299. Check(col.Find('one').Imports.Count=0, 'one.imports=0');
  5300. Check(col.Find('private-two').Imports.Count=0, 'private-two.imports=0');
  5301. Check(col.Find('standard').Imports.Count=0, 'standard.imports=0');
  5302. WriteLn(' - Step 4 ok');
  5303. typ := col.Find('abc');
  5304. check(typ.Imports.Count=0,'abc.imports=0');
  5305. WriteLn(' - Step 5 ok');
  5306. finally
  5307. rep.Free();
  5308. end;
  5309. WriteLn(' -- test ok');
  5310. end;
  5311. procedure test_collation_parser_HeaderParsing_2();
  5312. var
  5313. rep : TCldrCollationRepository;
  5314. col : TCldrCollation;
  5315. typ : TCldrCollationItem;
  5316. imp : TCldrImport;
  5317. begin
  5318. rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
  5319. try
  5320. Check(rep.Find('kw')=nil, 'Find() before load.');
  5321. Check(rep.Find('xy')=nil, 'Find() before load.');
  5322. col := rep.Load('kw',TCldrParserMode.HeaderParsing);
  5323. Check(col <> nil, 'load()');
  5324. Check(col.Mode=TCldrParserMode.HeaderParsing, 'Mode');
  5325. Check(rep.Find('kw') <> nil, 'Find() after load.');
  5326. WriteLn(' - Step 1 ok');
  5327. Check(rep.Find('xy')=nil, 'Find(xy) after load.');
  5328. WriteLn(' - Step 2 ok');
  5329. typ := col.Find('wend');
  5330. check(typ.Imports.Count=0,'wend.imports=0');
  5331. WriteLn(' - Step 3 ok');
  5332. finally
  5333. rep.Free();
  5334. end;
  5335. WriteLn(' -- test ok');
  5336. end;
  5337. function ParseSingleStatement(
  5338. const AText : UnicodeString;
  5339. var AStatement : TParsedStatement
  5340. ) : Boolean;
  5341. var
  5342. np, lc : Integer;
  5343. u8 : UTF8String;
  5344. begin
  5345. u8 := UTF8Encode(AText);
  5346. np := 0;
  5347. lc := 0;
  5348. Result := ParseStatement(@u8[1],0,Length(u8),@AStatement,np,lc);
  5349. end;
  5350. function ParseMultiStatements(
  5351. AText : UnicodeString;
  5352. AStatementList : PReorderSequence;
  5353. const AListLength : Integer
  5354. ) : Integer;
  5355. var
  5356. c, nextPos, lineCount, i : Integer;
  5357. u8 : UTF8String;
  5358. buffer : PAnsiChar;
  5359. statement, lastStatement : PReorderSequence;
  5360. ps : TParsedStatement;
  5361. begin
  5362. u8 := UTF8Encode(AText);
  5363. c := Length(u8);
  5364. buffer := @u8[1];
  5365. nextPos := 0;
  5366. i := 0;
  5367. lineCount := 0;
  5368. statement := AStatementList;
  5369. lastStatement := AStatementList+AListLength;
  5370. while (i < c) and (statement < lastStatement) do begin
  5371. Clear(ps);
  5372. if not ParseStatement(buffer,i,c,@ps,nextPos,lineCount) then
  5373. Break;
  5374. if (ps.Kind <> TStatementKind.Sequence) then
  5375. break;
  5376. statement^.Assign(@ps.ReorderSequence);
  5377. i := nextPos;
  5378. Inc(statement);
  5379. end;
  5380. Result := statement-AStatementList;
  5381. end;
  5382. type
  5383. TReorderSequenceArrayRec = record
  5384. Data : TReorderSequenceArray;
  5385. ActualLengh : Integer;
  5386. end;
  5387. PReorderSequenceArrayRec = ^TReorderSequenceArrayRec;
  5388. function CopyVisitorFunc(
  5389. ARule : PReorderSequence;
  5390. AOwner : TCldrCollationItem;
  5391. AData : Pointer
  5392. ) : Boolean;
  5393. var
  5394. p : PReorderSequenceArrayRec;
  5395. begin
  5396. p := PReorderSequenceArrayRec(AData);
  5397. Result := (p^.ActualLengh < Length(p^.Data));
  5398. if Result then begin
  5399. p^.Data[p^.ActualLengh].Assign(ARule);
  5400. p^.ActualLengh := p^.ActualLengh+1;
  5401. end;
  5402. end;
  5403. procedure test_collation_parser_FullParsing();
  5404. var
  5405. rep : TCldrCollationRepository;
  5406. col : TCldrCollation;
  5407. typ : TCldrCollationItem;
  5408. imp : TCldrImport;
  5409. locStatement : TParsedStatement;
  5410. locStatementList : TReorderSequenceArray;
  5411. c, i : Integer;
  5412. begin
  5413. rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
  5414. try
  5415. Check(rep.Find('xy')=nil, 'Find() before load.');
  5416. Check(rep.Find('ab')=nil, 'Find() before load.');
  5417. col := rep.Load('xy',TCldrParserMode.FullParsing);
  5418. Check(col <> nil, 'load()');
  5419. Check(col.Mode=TCldrParserMode.FullParsing, 'Mode');
  5420. Check(rep.Find('xy') <> nil, 'Find() after load.');
  5421. Check(rep.Find('ab')=nil);
  5422. WriteLn(' - Step 1 ok');
  5423. Check(col.DefaultType='one', 'DefaultType');
  5424. Check(col.ItemCount=4, 'col.ItemCount');
  5425. Check(col.Find('one')<>nil, 'col.Find()');
  5426. Check(col.Find('private-two')<>nil, 'col.Find()');
  5427. Check(col.Find('standard')<>nil, 'col.Find()');
  5428. Check(col.Find('abc')<>nil, 'col.Find()');
  5429. WriteLn(' - Step 2 ok');
  5430. typ := col.Find('private-two');
  5431. check(typ.IsPrivate(),'IsPrivate()');
  5432. WriteLn(' - Step 3 ok');
  5433. Check(col.Find('one').Imports.Count=0, 'one.imports=0');
  5434. Check(col.Find('private-two').Imports.Count=0, 'private-two.imports=0');
  5435. Check(col.Find('standard').Imports.Count=0, 'standard.imports=0');
  5436. WriteLn(' - Step 4 ok');
  5437. typ := col.Find('abc');
  5438. check(typ.Imports.Count=3,'abc.imports=3');
  5439. imp := typ.Imports[0];
  5440. check(imp<>nil, 'abc.Imports[0]');
  5441. check(
  5442. (imp.Source = 'xy') and (imp.TypeName = 'private-two'),
  5443. 'abc.Imports[0]'
  5444. );
  5445. imp := typ.Imports[1];
  5446. check(imp<>nil, 'abc.Imports[1]');
  5447. check(
  5448. (imp.Source = 'xy') and (imp.TypeName = 'one'),
  5449. 'abc.Imports[1]'
  5450. );
  5451. imp := typ.Imports[2];
  5452. check(imp<>nil, 'abc.Imports[2]');
  5453. check(
  5454. (imp.Source = 'xy') and (imp.TypeName = 'standard'),
  5455. 'abc.Imports[2]'
  5456. );
  5457. Check((typ.ChangedFields = []), 'ChangedFields');
  5458. Check(Length(typ.Rules)=5,'Length(abc.Rules)=5');
  5459. Check((typ.Rules[3].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[3].Kind=ReorderSequence');
  5460. Check(Length(typ.Rules[3].Reorder.Elements)=2,'Length(typ.Rules[3].Elements)=2');
  5461. Check(typ.Rules[3].Reorder.Elements[0].WeigthKind=TReorderWeigthKind.Deletion,'typ.Rules[3].Elements[0].WeigthKind=TReorderWeigthKind.Deletion');
  5462. Check(Length(typ.Rules[3].Reorder.Elements[0].Characters)=1,'Length(typ.Rules[3].Elements[0].Characters)=1');
  5463. Check(typ.Rules[3].Reorder.Elements[0].Characters[0]=Ord('h'),'typ.Rules[3].Elements[0].Characters[0]=h');
  5464. Check(typ.Rules[3].Reorder.Elements[1].Characters[0]=Ord('q'),'typ.Rules[3].Elements[1].Characters[0]=q');
  5465. WriteLn(' - Step 5 ok');
  5466. typ := col.Find('one');
  5467. Check(Length(typ.Rules)>0, 'one.Rules <> nil');
  5468. Clear(locStatement);
  5469. Check(ParseSingleStatement('&h<z<b',locStatement));
  5470. Check((locStatement.Kind = TStatementKind.Sequence));
  5471. Check(typ.Rules[0].Kind=TCldrCollationRuleKind.ReorderSequence);
  5472. CheckEqual(locStatement.ReorderSequence,typ.Rules[0].Reorder);
  5473. WriteLn(' - Step 6 ok');
  5474. typ := col.Find('private-two');
  5475. Check(Length(typ.Rules)>0, 'private-two.Rules <> nil');
  5476. c := 2;
  5477. SetLength(locStatementList,5);
  5478. Check(
  5479. ParseMultiStatements(
  5480. '&f<c<<<ce' + UNICODE_LINE_BREAK+'&q<qh<<<p ',
  5481. @locStatementList[0],
  5482. Length(locStatementList)
  5483. ) = c
  5484. );
  5485. for i := 0 to c-1 do begin
  5486. Check(typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence);
  5487. CheckEqual(locStatementList[i],typ.Rules[i].Reorder);
  5488. end;
  5489. WriteLn(' - Step 7 ok');
  5490. typ := col.Find('standard');
  5491. Check((typ.Backwards = False), 'typ.Backwards = False');
  5492. Check((typ.Normalization = True), 'typ.Normalization = True');
  5493. Check((typ.Strength = TComparisonStrength.Tertiary), 'typ.Strength = Tertiary');
  5494. Check((typ.VariableWeight = Low(helper.TUCA_VariableKind)), 'typ.VariableWeight = Low(TUCA_VariableKind)');
  5495. Check(Length(typ.Rules)>0, 'standard.Rules <> nil');
  5496. Clear(locStatement);
  5497. Check(ParseSingleStatement('&d<c<b<a',locStatement));
  5498. Check((locStatement.Kind = TStatementKind.Sequence));
  5499. Check(typ.Rules[0].Kind=TCldrCollationRuleKind.ReorderSequence);
  5500. CheckEqual(locStatement.ReorderSequence,typ.Rules[0].Reorder);
  5501. WriteLn(' - Step 8 ok');
  5502. finally
  5503. rep.Free();
  5504. end;
  5505. WriteLn(' -- test ok');
  5506. end;
  5507. procedure test_collation_parser_FullParsing_2();
  5508. var
  5509. rep : TCldrCollationRepository;
  5510. col : TCldrCollation;
  5511. typ : TCldrCollationItem;
  5512. imp : TCldrImport;
  5513. locStatementList : TReorderSequenceArray;
  5514. c, i : Integer;
  5515. begin
  5516. rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
  5517. try
  5518. Check(rep.Find('kw')=nil, 'Find() before load.');
  5519. Check(rep.Find('xy')=nil, 'Find() before load.');
  5520. col := rep.Load('kw',TCldrParserMode.FullParsing);
  5521. Check(col <> nil, 'load()');
  5522. Check(col.Mode=TCldrParserMode.FullParsing, 'Mode');
  5523. Check(rep.Find('kw') <> nil, 'Find() after load.');
  5524. WriteLn(' - Step 1 ok');
  5525. typ := col.Find('wend');
  5526. check(typ.Imports.Count=1,'wend.imports=1');
  5527. imp := typ.Imports[0];
  5528. check(imp<>nil, 'wend.Imports[0]');
  5529. check(
  5530. (imp.Source = 'xy') and (imp.TypeName = 'one'),
  5531. 'wend.Imports[0]'
  5532. );
  5533. Check(Length(typ.Rules)>0, 'wend.Rules <> nil');
  5534. Check((typ.Backwards = True),'typ.Backwards = True');
  5535. Check((typ.Normalization = False), 'typ.Normalization = False');
  5536. Check((typ.Strength = TComparisonStrength.Secondary), 'typ.Strength = Secondary');
  5537. Check((typ.VariableWeight = ucaNonIgnorable), 'typ.VariableWeight = ucaNonIgnorable');
  5538. Check(
  5539. (typ.ChangedFields =
  5540. [ cldrhelper.TCollationField.BackWards,cldrhelper.TCollationField.Alternate,
  5541. cldrhelper.TCollationField.Normalization,cldrhelper.TCollationField.Strength
  5542. ]
  5543. ),
  5544. 'ChangedFields'
  5545. );
  5546. c := 2;
  5547. SetLength(locStatementList,5);
  5548. Check(
  5549. ParseMultiStatements(
  5550. '&F<<P<<<C' + UNICODE_LINE_BREAK+'&L<a<<<Z ',
  5551. @locStatementList[0],
  5552. Length(locStatementList)
  5553. ) = c
  5554. );
  5555. Check((typ.Rules[0].Kind=TCldrCollationRuleKind.Import),'typ.Rules[0].Kind=Import');
  5556. for i := 0 to c-1 do begin
  5557. Check((typ.Rules[i+1{Import}].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i+1{Import}].Kind=ReorderSequence');
  5558. CheckEqual(locStatementList[i],typ.Rules[i+1{Import}].Reorder);
  5559. end;
  5560. WriteLn(' - Step 2 ok');
  5561. finally
  5562. rep.Free();
  5563. end;
  5564. WriteLn(' -- test ok');
  5565. end;
  5566. procedure test_collation_parser_complete_rules();
  5567. var
  5568. rep : TCldrCollationRepository;
  5569. col : TCldrCollation;
  5570. typ, xtyp : TCldrCollationItem;
  5571. c, i, k : Integer;
  5572. locData : TReorderSequenceArrayRec;
  5573. begin
  5574. rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
  5575. try
  5576. col := rep.Load('xy',TCldrParserMode.FullParsing);
  5577. SetLength(locData.Data,23);
  5578. typ := col.Find('one');
  5579. locData.ActualLengh := 0;
  5580. Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(one) - 1');
  5581. Check(locData.ActualLengh = 1, 'ForEachRule(one) - 2');
  5582. Check((typ.Rules[0].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[0].Kind=ReorderSequence');
  5583. CheckEqual(locData.Data[0],typ.Rules[0].Reorder);
  5584. WriteLn(' - Step 1 ok');
  5585. typ := col.Find('private-two');
  5586. locData.ActualLengh := 0;
  5587. Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(private-two) - 1');
  5588. Check(locData.ActualLengh = 2, 'ForEachRule(private-two) - 2');
  5589. for i := 0 to locData.ActualLengh-1 do begin
  5590. Check((typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i].Kind=ReorderSequence');
  5591. CheckEqual(locData.Data[i],typ.Rules[i].Reorder);
  5592. end;
  5593. WriteLn(' - Step 2 ok');
  5594. typ := col.Find('abc');
  5595. locData.ActualLengh := 0;
  5596. SetLength(locData.Data,23);
  5597. Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(abc) - 1');
  5598. Check(
  5599. locData.ActualLengh = 2+2{private-two}+1{one}+1{standard},
  5600. 'ForEachRule(abc) - 2'
  5601. );
  5602. xtyp := col.Find('private-two');
  5603. c := 0;
  5604. for i := 0 to Length(xtyp.Rules)-1 do begin
  5605. Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
  5606. CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
  5607. end;
  5608. c := c+Length(xtyp.Rules);
  5609. xtyp := col.Find('one');
  5610. for i := 0 to Length(xtyp.Rules)-1 do begin
  5611. Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
  5612. CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
  5613. end;
  5614. c := c+Length(xtyp.Rules);
  5615. xtyp := col.Find('standard');
  5616. for i := 0 to Length(xtyp.Rules)-1 do begin
  5617. Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
  5618. CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
  5619. end;
  5620. k := 3{import statemnts};
  5621. c := c+Length(xtyp.Rules);
  5622. for i := k to Length(typ.Rules)-1 do begin
  5623. Check((typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i].Kind=ReorderSequence');
  5624. CheckEqual(locData.Data[c+(i-k)],typ.Rules[i].Reorder);
  5625. end;
  5626. WriteLn(' - Step 3 ok');
  5627. finally
  5628. rep.Free();
  5629. end;
  5630. WriteLn(' -- test ok');
  5631. end;
  5632. procedure test_collation_parser_complete_rules_2();
  5633. var
  5634. rep : TCldrCollationRepository;
  5635. col, xcol : TCldrCollation;
  5636. typ, xtyp : TCldrCollationItem;
  5637. locData : TReorderSequenceArrayRec;
  5638. c, i, k : Integer;
  5639. begin
  5640. rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
  5641. try
  5642. col := rep.Load('kw',TCldrParserMode.FullParsing);
  5643. SetLength(locData.Data,23);
  5644. typ := col.Find('wend');
  5645. locData.ActualLengh := 0;
  5646. Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(wend) - 1');
  5647. Check(locData.ActualLengh = 2+1{one}, 'ForEachRule(wend) - 2');
  5648. xcol := rep.Find('xy');
  5649. Check(xcol <> nil);
  5650. xtyp := xcol.Find('one');
  5651. Check(xtyp <> nil);
  5652. Check(Length(xtyp.Rules)=1);
  5653. c := 0;
  5654. for i := 0 to Length(xtyp.Rules)-1 do begin
  5655. Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
  5656. CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
  5657. end;
  5658. k := 1 {imports};
  5659. c := c+Length(xtyp.Rules);
  5660. for i := k to Length(typ.Rules)-1 do begin
  5661. Check((typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i].Kind=ReorderSequence');
  5662. CheckEqual(locData.Data[c+i-k],typ.Rules[i].Reorder);
  5663. end;
  5664. WriteLn(' - Step 1 ok');
  5665. finally
  5666. rep.Free();
  5667. end;
  5668. WriteLn(' -- test ok');
  5669. end;
  5670. procedure test_unicode_set_1();
  5671. var
  5672. x : TUnicodeSet;
  5673. i : Integer;
  5674. s : string;
  5675. begin
  5676. x := TUnicodeSet.Create();
  5677. try
  5678. for i := 0 to 256-1 do
  5679. Check(not x.Contains(AnsiChar(i)));
  5680. WriteLn(' - Stept 1 ok');
  5681. s := 'azerty';
  5682. x.AddPattern(Format('[%s]',[s]));
  5683. for i := 1 to Length(s) do
  5684. Check(x.Contains(s[i]));
  5685. WriteLn(' - Stept 2 ok');
  5686. finally
  5687. x.Free();
  5688. end;
  5689. WriteLn(' -- test ok');
  5690. end;
  5691. procedure test_unicode_set_2();
  5692. var
  5693. x : TUnicodeSet;
  5694. i : Integer;
  5695. begin
  5696. x := TUnicodeSet.Create();
  5697. try
  5698. x.AddPattern('[d-h]');
  5699. for i := Ord('d') to Ord('h') do
  5700. Check(x.Contains(Char(i)));
  5701. WriteLn(' - Stept 1 ok');
  5702. for i := Ord('a') to Ord('d')-1 do
  5703. Check(not x.Contains(Char(i)));
  5704. WriteLn(' - Stept 2 ok');
  5705. for i := Ord('h')+1 to 256-1 do
  5706. Check(not x.Contains(Char(i)));
  5707. WriteLn(' - Stept 3 ok');
  5708. finally
  5709. x.Free();
  5710. end;
  5711. WriteLn(' -- test ok');
  5712. end;
  5713. procedure test_unicode_set_3();
  5714. var
  5715. x : TUnicodeSet;
  5716. s, s1 : string;
  5717. begin
  5718. x := TUnicodeSet.Create();
  5719. try
  5720. s := 'azerty';
  5721. x.AddPattern(Format('[{%s}]',[s]));
  5722. Check(x.Contains(s));
  5723. WriteLn(' - Stept 1 ok');
  5724. Check(not x.Contains(s+'12'));
  5725. WriteLn(' - Stept 2 ok');
  5726. Check(not x.Contains('qs'+s));
  5727. WriteLn(' - Stept 3 ok');
  5728. s1 := s+'x';
  5729. x.AddPattern(Format('[{%s}]',[s1]));
  5730. Check(x.Contains(s));
  5731. Check(x.Contains(s1));
  5732. WriteLn(' - Stept 4 ok');
  5733. finally
  5734. x.Free();
  5735. end;
  5736. WriteLn(' -- test ok');
  5737. end;
  5738. procedure test_collation_table_empty();
  5739. {var
  5740. stackItem : TCollationTable; }
  5741. begin
  5742. end;
  5743. end.