12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206 |
- { CLDR collation Algorithm test routines.
- Copyright (c) 2013-2015 by Inoussa OUEDRAOGO
- The source code is distributed under the Library GNU
- General Public License with the following modification:
- - object files and libraries linked into an application may be
- distributed without source code.
- If you didn't receive a copy of the file COPYING, contact:
- Free Software Foundation
- 675 Mass Ave
- Cambridge, MA 02139
- USA
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- }
- unit cldrtest;
- {$mode objfpc}{$H+}
- {$typedaddress on}
- {$warn 4056 off} //Conversion between ordinals and pointers is not portable
- interface
- uses
- Classes, SysUtils,
- unicodeset, helper, cldrhelper, unicodedata, cldrtxt, cldrxml;
- function ToAnsiChars(const AValue : array of TUnicodeCodePoint) : string;
- function DumpSequenceAnsi(const ASequence : TOrderedCharacters) : string;
- function DumpWeigth(const AItem : TUCA_WeightRec) : string;overload;
- function DumpWeigth(const AItems : array of TUCA_WeightRec) : string;overload;
- function DumpLine(ALine : TUCA_LineRec) : string;
- function DumpLines(ALines : TUCA_LineRecArray) : string;
- function CodePointToArray(const ACodePoint : TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
- function CodePointToArray(const ACodePoints : array of TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
- function ToWeight(const APrimary, ASecondary, ATertiary : Cardinal) : TUCA_WeightRecArray;overload;
- function ToWeight(const AWeigths : array of Cardinal) : TUCA_WeightRecArray;overload;
- procedure exec_tests(const APropagateException : Boolean = True);
- procedure test1();
- procedure test2();
- procedure test3();
- procedure test4();
- procedure test5();
- procedure test6();
- procedure test7();
- procedure test8();
- procedure test9();
- procedure test10();
- procedure test11();
- procedure test12();
- procedure test13();
- procedure test14();
- procedure test15();
- procedure test16a();
- procedure test16b();
- procedure test16c();
- procedure test16d();
- procedure test16e();
- procedure test17a();
- procedure test17b();
- procedure test17c();
- procedure test_parser_1();
- procedure test_parser_2();
- procedure test_parser_3();
- procedure test_parser_4();
- procedure test_parser_5();
- procedure test_parser_6();
- procedure test_parser_7();
- procedure test_parser_8();
- procedure test_parser_9();
- procedure test_parser_abreviating_1();
- procedure test_parser_abreviating_2();
- procedure test_parser_abreviating_3();
- procedure test_parser_abreviating_4();
- procedure test_parser_abreviating_5();
- procedure test_parser_abreviating_6();
- procedure test_parser_abreviating_7();
- procedure test_parser_abreviating_8();
- procedure test_parser_abreviating_9();
- procedure test_parser_abreviating_10();
- procedure test_parser_contraction_1();
- procedure test_parser_contraction_2();
- procedure test_parser_expansion_1();
- procedure test_parser_special_char_1();
- procedure test_parser_special_char_2();
- procedure test_parser_special_char_3();
- procedure test_parser_special_char_4();
- procedure test_parser_special_char_5();
- procedure test_parser_special_char_6();
- procedure test_parser_special_char_7();
- procedure test_parser_special_char_8();
- procedure test_parser_special_char_9();
- procedure test_parser_skip_comment_1();
- procedure test_parser_skip_comment_2();
- procedure test_parser_skip_comment_3();
- procedure test_parser_quoted_string_1();
- procedure test_parser_quoted_string_2();
- procedure test_parser_quoted_string_3();
- procedure test_parser_quoted_string_4();
- procedure test_parser_quoted_string_5();
- procedure test_parser_quoted_string_6();
- procedure test_parser_quoted_string_7();
- procedure test_parser_quoted_string_8();
- procedure test_parser_contexte_before_1();
- procedure test_parser_contexte_before_2();
- procedure test_parser_contexte_before_3();
- procedure test_parser_contexte_before_4();
- procedure test_parser_placement_before_1();
- procedure test_parser_placement_before_2();
- procedure test_parser_placement_before_3();
- procedure test_parser_multi_unit_statement_line_1();
- procedure test_parser_multi_unit_statement_line_2();
- procedure test_parser_multi_unit_statement_line_3();
- procedure test_parser_multi_statement_line_1();
- procedure test_parser_multi_statement_line_2();
- procedure test_parser_multi_statement_line_3();
- procedure test_parser_multi_statement_line_4();
- procedure test_parser_multi_line_statements_1();
- procedure test_parser_setting_1();
- procedure test_parser_setting_2();
- procedure test_parser_setting_3();
- procedure test_parser_setting_4();
- procedure test_parser_setting_5();
- procedure test_parser_setting_6();
- procedure test_parser_setting_7();
- procedure test_parser_setting_8();
- procedure test_parser_setting_multi_statement_1();
- procedure test_parser_setting_multi_statement_2();
- procedure test_parser_setting_multi_statement_3();
- procedure test_parser_setting_multi_statement_4();
- procedure test_parser_setting_unicodeset_1();
- procedure test_parser_setting_unicodeset_2();
- procedure test_parser_setting_unicodeset_3();
- procedure test_parser_setting_unicodeset_4();
- procedure test_collation_parser_HeaderParsing();
- procedure test_collation_parser_HeaderParsing_2();
- procedure test_collation_parser_FullParsing();
- procedure test_collation_parser_FullParsing_2();
- procedure test_collation_parser_complete_rules();
- procedure test_collation_parser_complete_rules_2();
- procedure test_unicode_set_1();
- procedure test_unicode_set_2();
- procedure test_unicode_set_3();
- const
- UNICODE_LINE_BREAK = #10;
- implementation
- uses
- typinfo;
- function ComputeWeigths(
- const AData : PReorderUnit;
- const ADataLen : Integer;
- const ADataWeigths : TUCA_LineRecArray;
- out AResult : TUCA_LineRecArray
- ) : Integer;
- begin
- Result := cldrhelper.ComputeWeigths(AData,ADataLen,ADataWeigths,[],AResult);
- end;
- function inner_do_exec_test(
- ATest : TProcedure;
- const APropagateException : Boolean
- ) : Boolean;
- begin
- Result := False;
- if APropagateException then begin
- ATest();
- Result := True;
- end else begin
- try
- ATest();
- Result := True;
- except
- on e : Exception do begin
- writeln('Failure:');
- writeln(e.Message);
- end;
- end;
- end;
- end;
- procedure exec_utils_tests(
- const APropagateException : Boolean;
- out ATotal,
- AErrors : Integer
- );
- procedure do_exec_test(
- ATest : TProcedure;
- const APropagateException : Boolean
- );
- begin
- ATotal := ATotal+1;
- if not inner_do_exec_test(ATest,APropagateException) then
- AErrors := AErrors+1;
- end;
- begin
- ATotal := 0;
- AErrors := 0;
- WriteLn;WriteLn;WriteLn;WriteLn;
- WriteLn('UTILITIES TESTS - START');
- WriteLn('***************************** TEST UNICODESET 1 ******************');
- do_exec_test(@test_unicode_set_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST UNICODESET 2 ******************');
- do_exec_test(@test_unicode_set_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST UNICODESET 3 ******************');
- do_exec_test(@test_unicode_set_3,APropagateException);
- WriteLn;
- WriteLn('UTILITIES TESTS - START');
- WriteLn;
- WriteLn;
- end;
- procedure exec_parser_tests(
- const APropagateException : Boolean;
- out ATotal,
- AErrors : Integer
- );
- procedure do_exec_test(
- ATest : TProcedure;
- const APropagateException : Boolean
- );
- begin
- ATotal := ATotal+1;
- if not inner_do_exec_test(ATest,APropagateException) then
- AErrors := AErrors+1;
- end;
- begin
- ATotal := 0;
- AErrors := 0;
- WriteLn;WriteLn;WriteLn;WriteLn;
- WriteLn('PARSER TESTS');
- WriteLn('***************************** TEST PARSER 1 ******************');
- do_exec_test(@test_parser_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST PARSER 2 ******************');
- do_exec_test(@test_parser_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST PARSER 3 ******************');
- do_exec_test(@test_parser_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST PARSER 4 ******************');
- do_exec_test(@test_parser_4,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST PARSER 5 ******************');
- do_exec_test(@test_parser_5,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST PARSER 6 ******************');
- do_exec_test(@test_parser_6,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST PARSER 7 ******************');
- do_exec_test(@test_parser_7,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST PARSER 8 ******************');
- do_exec_test(@test_parser_7,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST PARSER 9 ******************');
- do_exec_test(@test_parser_9,APropagateException);
- WriteLn;
- WriteLn;
- WriteLn('***************************** TEST ABREVIATING 1 ******************');
- do_exec_test(@test_parser_abreviating_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST ABREVIATING 2 ******************');
- do_exec_test(@test_parser_abreviating_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST ABREVIATING 3 ******************');
- do_exec_test(@test_parser_abreviating_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST ABREVIATING 4 ******************');
- do_exec_test(@test_parser_abreviating_4,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST ABREVIATING 5 ******************');
- do_exec_test(@test_parser_abreviating_5,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST ABREVIATING 6 ******************');
- do_exec_test(@test_parser_abreviating_6,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST ABREVIATING 7 ******************');
- do_exec_test(@test_parser_abreviating_7,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST ABREVIATING 8 ******************');
- do_exec_test(@test_parser_abreviating_8,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST ABREVIATING 9 ******************');
- do_exec_test(@test_parser_abreviating_9,APropagateException);
- WriteLn;
- WriteLn;
- WriteLn('***************************** TEST ABREVIATING 10 ******************');
- do_exec_test(@test_parser_abreviating_10,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST CONTRACTION 1 ******************');
- do_exec_test(@test_parser_contraction_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST CONTRACTION 2 ******************');
- do_exec_test(@test_parser_contraction_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST EXPANSION 1 ******************');
- do_exec_test(@test_parser_expansion_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SPECIAL CHAR 1 ******************');
- do_exec_test(@test_parser_special_char_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SPECIAL CHAR 2 ******************');
- do_exec_test(@test_parser_special_char_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SPECIAL CHAR 3 ******************');
- do_exec_test(@test_parser_special_char_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SPECIAL CHAR 4 ******************');
- do_exec_test(@test_parser_special_char_4,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SPECIAL CHAR 5 ******************');
- do_exec_test(@test_parser_special_char_5,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SPECIAL CHAR 6 ******************');
- do_exec_test(@test_parser_special_char_6,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SPECIAL CHAR 7 ******************');
- do_exec_test(@test_parser_special_char_7,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SPECIAL CHAR 8 ******************');
- do_exec_test(@test_parser_special_char_8,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SPECIAL CHAR 9 ******************');
- do_exec_test(@test_parser_special_char_9,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SKIP COMMENT 1 ******************');
- do_exec_test(@test_parser_skip_comment_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SKIP COMMENT 2 ******************');
- do_exec_test(@test_parser_skip_comment_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SKIP COMMENT 3 ******************');
- do_exec_test(@test_parser_skip_comment_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST QUOTED STRING 1 ******************');
- do_exec_test(@test_parser_quoted_string_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST QUOTED STRING 2 ******************');
- do_exec_test(@test_parser_quoted_string_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST QUOTED STRING 3 ******************');
- do_exec_test(@test_parser_quoted_string_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST QUOTED STRING 4 ******************');
- do_exec_test(@test_parser_quoted_string_4,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST QUOTED STRING 5 ******************');
- do_exec_test(@test_parser_quoted_string_5,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST QUOTED STRING 6 ******************');
- do_exec_test(@test_parser_quoted_string_6,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST QUOTED STRING 7 ******************');
- do_exec_test(@test_parser_quoted_string_7,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST QUOTED STRING 8 ******************');
- do_exec_test(@test_parser_quoted_string_8,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST CONTEXT BEFORE 1 ******************');
- do_exec_test(@test_parser_contexte_before_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST CONTEXT BEFORE 2 ******************');
- do_exec_test(@test_parser_contexte_before_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST CONTEXT BEFORE 3 ******************');
- do_exec_test(@test_parser_contexte_before_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST CONTEXT BEFORE 4 ******************');
- do_exec_test(@test_parser_contexte_before_4,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST PLACEMENT BEFORE 1 ******************');
- do_exec_test(@test_parser_placement_before_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST PLACEMENT BEFORE 2 ******************');
- do_exec_test(@test_parser_placement_before_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST PLACEMENT BEFORE 3 ******************');
- do_exec_test(@test_parser_placement_before_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST MULTI UNIT STATEMENT LINE 1 ******************');
- do_exec_test(@test_parser_multi_unit_statement_line_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST MULTI UNIT STATEMENT LINE 2 ******************');
- do_exec_test(@test_parser_multi_unit_statement_line_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST MULTI UNIT STATEMENT LINE 3 ******************');
- do_exec_test(@test_parser_multi_unit_statement_line_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST MULTI STATEMENT LINE 1 ******************');
- do_exec_test(@test_parser_multi_statement_line_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST MULTI STATEMENT LINE 2 ******************');
- do_exec_test(@test_parser_multi_statement_line_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST MULTI STATEMENT LINE 3 ******************');
- do_exec_test(@test_parser_multi_statement_line_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST MULTI STATEMENT LINE 4 ******************');
- do_exec_test(@test_parser_multi_statement_line_4,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST MULTI LINE STATEMENTS 1 ******************');
- do_exec_test(@test_parser_multi_line_statements_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING STATEMENT 1 ******************');
- do_exec_test(@test_parser_setting_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING STATEMENT 2 ******************');
- do_exec_test(@test_parser_setting_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING STATEMENT 3 ******************');
- do_exec_test(@test_parser_setting_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING STATEMENT 4 ******************');
- do_exec_test(@test_parser_setting_4,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING STATEMENT 5 ******************');
- do_exec_test(@test_parser_setting_5,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING STATEMENT 6 ******************');
- do_exec_test(@test_parser_setting_6,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING STATEMENT 7 ******************');
- do_exec_test(@test_parser_setting_7,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING STATEMENT 8 ******************');
- do_exec_test(@test_parser_setting_8,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING MULTI STATEMENT 1 ******************');
- do_exec_test(@test_parser_setting_multi_statement_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING MULTI STATEMENT 2 ******************');
- do_exec_test(@test_parser_setting_multi_statement_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING MULTI STATEMENT 3 ******************');
- do_exec_test(@test_parser_setting_multi_statement_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING MULTI STATEMENT 4 ******************');
- do_exec_test(@test_parser_setting_multi_statement_4,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING UNICODE SET 1 ******************');
- do_exec_test(@test_parser_setting_unicodeset_1,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING UNICODE SET 2 ******************');
- do_exec_test(@test_parser_setting_unicodeset_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING UNICODE SET 3 ******************');
- do_exec_test(@test_parser_setting_unicodeset_3,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST SETTING UNICODE SET 4 ******************');
- do_exec_test(@test_parser_setting_unicodeset_4,APropagateException);
- WriteLn;
- WriteLn;
- WriteLn('***************************** TEST REPOSITORY 1 ******************');
- do_exec_test(@test_collation_parser_HeaderParsing,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST REPOSITORY 2 ******************');
- do_exec_test(@test_collation_parser_FullParsing,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST REPOSITORY 3 ******************');
- do_exec_test(@test_collation_parser_complete_rules,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST REPOSITORY 4 ******************');
- do_exec_test(@test_collation_parser_HeaderParsing_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST REPOSITORY 5 ******************');
- do_exec_test(@test_collation_parser_FullParsing_2,APropagateException);
- WriteLn;
- WriteLn('***************************** TEST REPOSITORY 6 ******************');
- do_exec_test(@test_collation_parser_complete_rules_2,APropagateException);
- WriteLn;
- WriteLn;
- WriteLn;
- WriteLn('END PARSER TESTS');
- WriteLn('*******************************************************');
- end;
- procedure exec_basic_tests(
- const APropagateException : Boolean;
- out ATotal,
- AErrors : Integer
- );
- procedure do_exec_test(
- ATest : TProcedure;
- const APropagateException : Boolean
- );
- begin
- ATotal := ATotal+1;
- if not inner_do_exec_test(ATest,APropagateException) then
- AErrors := AErrors+1;
- end;
- begin
- ATotal := 0;
- AErrors := 0;
- WriteLn('***************************** TEST 1 ******************');
- do_exec_test(@test1,APropagateException);
- WriteLn('***************************** TEST 2 ******************');
- do_exec_test(@test2,APropagateException);
- WriteLn('***************************** TEST 3 ******************');
- do_exec_test(@test3,APropagateException);
- WriteLn('***************************** TEST 4 ******************');
- do_exec_test(@test4,APropagateException);
- WriteLn('***************************** TEST 5 ******************');
- do_exec_test(@test5,APropagateException);
- WriteLn('***************************** TEST 6 ******************');
- do_exec_test(@test6,APropagateException);
- WriteLn('***************************** TEST 7 ******************');
- do_exec_test(@test7,APropagateException);
- WriteLn('***************************** TEST 8 ******************');
- do_exec_test(@test8,APropagateException);
- WriteLn('***************************** TEST 9 ******************');
- do_exec_test(@test9,APropagateException);
- WriteLn('***************************** TEST 10 ******************');
- do_exec_test(@test10,APropagateException);
- WriteLn('***************************** TEST 11 ******************');
- do_exec_test(@test11,APropagateException);
- WriteLn('***************************** TEST 12 ******************');
- do_exec_test(@test12,APropagateException);
- WriteLn('***************************** TEST 13 ******************');
- do_exec_test(@test13,APropagateException);
- WriteLn('***************************** TEST 14 ******************');
- do_exec_test(@test14,APropagateException);
- WriteLn('***************************** TEST 15 ******************');
- do_exec_test(@test15,APropagateException);
- WriteLn('***************************** TEST 16 A ******************');
- do_exec_test(@test16a,APropagateException);
- WriteLn('***************************** TEST 16 B ******************');
- do_exec_test(@test16b,APropagateException);
- WriteLn('***************************** TEST 16 C ******************');
- do_exec_test(@test16c,APropagateException);
- WriteLn('***************************** TEST 16 D ******************');
- do_exec_test(@test16d,APropagateException);
- WriteLn('***************************** TEST 16 E ******************');
- do_exec_test(@test16e,APropagateException);
- WriteLn('***************************** TEST 17 A ******************');
- do_exec_test(@test17a,APropagateException);
- WriteLn('***************************** TEST 17 B ******************');
- do_exec_test(@test17b,APropagateException);
- WriteLn('***************************** TEST 17 C ******************');
- do_exec_test(@test17c,APropagateException);
- end;
- procedure exec_tests(const APropagateException : Boolean);
- var
- total, errors, t, e : Integer;
- begin
- total := 0;
- errors := 0;
- exec_utils_tests(APropagateException,t,e);
- total := total+t;
- errors := errors+e;
- exec_parser_tests(APropagateException,t,e);
- total := total+t;
- errors := errors+e;
- exec_basic_tests(APropagateException,t,e);
- total := total+t;
- errors := errors+e;
- WriteLn('**** END TESTS',sLineBreak,sLineBreak);
- WriteLn('------------------ RESULTS => START ------------------------------');
- WriteLn(Format(' %d Total tests',[total]));
- WriteLn(Format(' %d tests failed',[errors]));
- WriteLn('------------------ RESULTS => END ------------------------------');
- end;
- function ToAnsiChars(const AValue : array of TUnicodeCodePoint) : string;
- var
- i : Integer;
- s : string;
- begin
- Result := '';
- for i := Low(AValue) to High(AValue) do begin
- if (AValue[i] <= 127) then
- Result := Result + AnsiChar(AValue[i])
- else
- begin
- s := Format('%x',[AValue[i]]);
- if (Length(s) < 4) then
- s := StringOfChar('0',4-Length(s)) + s;
- Result := Result + '$' + s;
- end;
- end;
- end;
- function DumpSequenceAnsi(const ASequence : TOrderedCharacters) : string;
- var
- i : Integer;
- s : string;
- p : PReorderUnit;
- begin
- s := '';
- if (ASequence.ActualLength < 1) then
- exit;
- p := @ASequence.Data[0];
- i := 0;
- while (i < ASequence.ActualLength) do begin
- if (p^.WeigthKind <> TReorderWeigthKind.Deletion) then
- Break;
- WriteStr(s,s, ' ',ToAnsiChars(p^.Characters),'- ');
- Inc(p);
- Inc(i);
- end;
- if (i < ASequence.ActualLength) then begin
- s := s + ' ' + ToAnsiChars(p^.Characters) + ' ';
- Inc(i);
- Inc(p);
- for i := i to ASequence.ActualLength - 1 do begin
- //WriteStr(s,s,AnsiChar(p^.Characters[0]),' <',(1+Ord(p^.WeigthKind)),' ');
- if p^.IsVirtual() then
- WriteStr(s,s,' [',GetEnumName(TypeInfo(TReorderLogicalReset),Ord(p^.VirtualPosition)),'] ')
- else
- WriteStr(s,s,'<',(1+Ord(p^.WeigthKind)),' ',ToAnsiChars(p^.Characters));
- if (Length(p^.Context) > 0) then
- WriteStr(s,s,'[',ToAnsiChars(p^.Context),']');
- WriteStr(s,s,' ');
- Inc(p);
- end;
- end;
- Result := s;
- end;
- function DumpWeigth(const AItem : TUCA_WeightRec) : string;overload;
- var
- r : string;
- begin
- r := '[';
- if AItem.Variable then
- r := r + '*'
- else
- r := r + '.';
- r := r + Format('%x.%x.%x',[AItem.Weights[0],AItem.Weights[1],AItem.Weights[2]]);
- r := r + ']';
- Result := r;
- end;
- function DumpWeigth(const AItems : array of TUCA_WeightRec) : string;
- var
- r : string;
- i : Integer;
- begin
- r := '';
- for i := 0 to Length(AItems) - 1 do
- r := r + ' ' +DumpWeigth(AItems[i]);
- Result := Trim(r);
- end;
- function DumpKey(const AItem : TUCASortKey) : string;
- var
- i : Integer;
- r : string;
- begin
- r := '';
- for i := Low(AItem) to High(AItem) do
- r := Trim(r) + ' ' + Format('%4x',[AItem[i]]);
- Result := r;
- end;
- function DumpLine(ALine : TUCA_LineRec) : string;
- var
- i : Integer;
- r : string;
- ctxItem : TUCA_LineContextItemRec;
- begin
- r := '';
- if ALine.HasContext() then begin
- r := r + '*';
- for i := 0 to Length(ALine.Context.Data) - 1 do begin
- ctxItem := ALine.Context.Data[i];
- r := r + sLineBreak +
- ' ' + ToAnsiChars(ctxItem.CodePoints) + ' => ' + DumpWeigth(ctxItem.Weights);
- end;
- r := r + sLineBreak + ' ';
- end;
- if (Length(ALine.Weights) = 0) then begin
- r := r + '[]';
- end else begin
- for i := Low(ALine.Weights) to High(ALine.Weights) do
- r := r + DumpWeigth(ALine.Weights[i]);
- end;
- Result := Format('%s %s',[ToAnsiChars(ALine.CodePoints),r]);
- end;
- function DumpLines(ALines : TUCA_LineRecArray) : string;
- var
- i : Integer;
- r : string;
- begin
- r := '';
- for i := Low(ALines) to High(ALines) do
- r := r + ' ' + DumpLine(ALines[i]) + sLineBreak;
- Result := r;
- end;
- function CodePointToArray(const ACodePoint : TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
- begin
- SetLength(Result,1);
- Result[0] := ACodePoint;
- end;
- function CodePointToArray(const ACodePoints : array of TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
- var
- i : Integer;
- begin
- SetLength(Result,Length(ACodePoints));
- for i := 0 to length(ACodePoints) - 1 do
- Result[i] := ACodePoints[i];
- end;
- function ToWeight(const APrimary, ASecondary, ATertiary : Cardinal) : TUCA_WeightRecArray;overload;
- begin
- SetLength(Result,1);
- Result[0].Weights[0] := APrimary;
- Result[0].Weights[1] := ASecondary;
- Result[0].Weights[2] := ATertiary;
- Result[0].Weights[3] := 0;
- end;
- function ToWeight(const AWeigths : array of Cardinal) : TUCA_WeightRecArray;overload;
- var
- i, k, c : Integer;
- begin
- c := Length(AWeigths);
- SetLength(Result,(c div 3));
- k := 0;
- for i := 0 to (c div 3) - 1 do begin
- Result[i].Weights[0] := AWeigths[k+0];
- Result[i].Weights[1] := AWeigths[k+1];
- Result[i].Weights[2] := AWeigths[k+2];
- Result[i].Weights[3] := 0;
- k := k + 3;
- end;
- end;
- procedure constructPropBook(
- var ABook : unicodedata.TUCA_DataBook;
- const AFirstTable : TucaBmpFirstTable;
- const ASecondTable : TucaBmpSecondTable;
- const AOFirstTable : TucaOBmpFirstTable;
- const AOSecondTable : TucaOBmpSecondTable;
- const AInitDataBook : helper.TUCA_DataBook;
- const AInitPropBook : helper.PUCA_PropBook
- );
- var
- c, i, k, ci : Integer;
- begin
- c := Length(AFirstTable);
- if (c > 0) then begin
- ABook.BMP_Table1 := AllocMem(c);
- Move(AFirstTable[0],ABook.BMP_Table1^,c);
- end;
- c := Length(ASecondTable);
- if (c > 0) then begin
- ABook.BMP_Table2 := AllocMem(c*SizeOf(UInt24)*256);
- for i := 0 to c - 1 do begin
- for k := 0 to 255 do
- ABook.BMP_Table2[(i*256)+k] := ASecondTable[i][k];
- end;
- end;
- c := Length(AOFirstTable);
- if (c > 0) then begin
- ABook.OBMP_Table1 := AllocMem(c*SizeOf(Word));
- Move(AOFirstTable[0],ABook.OBMP_Table1^,(c*SizeOf(Word)));
- end;
- c := Length(AOSecondTable);
- if (c > 0) then begin
- ci := Length(AOSecondTable[0]);
- ABook.OBMP_Table2 := AllocMem(c*SizeOf(UInt24)*ci);
- for i := 0 to c - 1 do begin
- for k := 0 to ci - 1 do
- ABook.OBMP_Table2[(i*ci)+k] := AOSecondTable[i][k];
- end;
- end;
- StringToByteArray(AInitDataBook.Version,PByte(@ABook.Version[1]),Length(ABook.Version));
- ABook.VariableWeight := unicodedata.TUCA_VariableKind(Ord(AInitDataBook.VariableWeight));
- ABook.Backwards := AInitDataBook.Backwards;
- ABook.PropCount := AInitPropBook^.ItemSize;
- ABook.Props := Pointer(AInitPropBook^.Items);
- ABook.VariableLowLimit := AInitPropBook^.VariableLowLimit;
- ABook.VariableHighLimit := AInitPropBook^.VariableHighLimit;
- end;
- procedure ConstructUnicodeBook(
- const AWeitghs : TUCA_LineRecArray;
- const AVersion : string;
- const ACollationName : string;
- const ABase : unicodedata.PUCA_DataBook;
- var AUnicodeBook : unicodedata.TUCA_DataBook
- );
- var
- dataBook : helper.TUCA_DataBook;
- propBook : helper.PUCA_PropBook;
- firstTable : TucaBmpFirstTable;
- secondTable : TucaBmpSecondTable;
- ofirstTable : TucaOBmpFirstTable;
- osecondTable : TucaOBmpSecondTable;
- i : Integer;
- begin
- FillByte(dataBook,SizeOf(dataBook),0);
- dataBook.Version := AVersion;
- SetLength(dataBook.Lines,Length(AWeitghs));
- for i := 0 to Length(AWeitghs)-1 do begin
- dataBook.Lines[i] := AWeitghs[i];
- dataBook.Lines[i].Stored := True;
- end;
- MakeUCA_Props(@dataBook,propBook);
- FillChar(firstTable,SizeOf(firstTable),0);
- secondTable := nil;
- FillChar(ofirstTable,SizeOf(ofirstTable),0);
- osecondTable := nil;
- MakeUCA_BmpTables(firstTable,secondTable,propBook);
- MakeUCA_OBmpTables(ofirstTable,osecondTable,propBook);
- FillByte(AUnicodeBook,SizeOf(AUnicodeBook),0);
- constructPropBook(
- AUnicodeBook,firstTable,secondTable,ofirstTable,osecondTable,
- dataBook,propBook
- );
- StringToByteArray(ACollationName,PByte(@AUnicodeBook.CollationName[1]),Length(AUnicodeBook.CollationName));
- AUnicodeBook.Base := ABase;
- end;
- procedure CheckEqual(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
- var
- keyA, keyB : TUCASortKey;
- s : string;
- begin
- keyA := ComputeSortKey(A,ACollation);
- keyB := ComputeSortKey(B,ACollation);
- if (CompareSortKey(keyA,keyB) <> 0) then begin
- s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
- s := Format('"%s" <>= "%s" %s%s',[A,B,sLineBreak,s]);
- raise Exception.Create(s);
- end;
- end;
- procedure CheckNotEqual(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
- var
- keyA, keyB : TUCASortKey;
- s : string;
- begin
- keyA := ComputeSortKey(A,ACollation);
- keyB := ComputeSortKey(B,ACollation);
- if (CompareSortKey(keyA,keyB) = 0) then begin
- s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
- s := Format('"%s" = "%s" %s%s',[A,B,sLineBreak,s]);
- raise Exception.Create(s);
- end;
- end;
- procedure CheckInf(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
- var
- keyA, keyB : TUCASortKey;
- s : string;
- begin
- keyA := ComputeSortKey(A,ACollation);
- keyB := ComputeSortKey(B,ACollation);
- if (CompareSortKey(keyA,keyB) >= 0) then begin
- s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
- s := Format('"%s" >= "%s" %s%s',[A,B,sLineBreak,s])+sLineBreak;
- raise Exception.Create(s);
- end;
- end;
- procedure CheckInf(AStrings : array of UnicodeString; ACollation : unicodedata.PUCA_DataBook);
- var
- c, i : Integer;
- keyA, keyB : TUCASortKey;
- s : string;
- begin
- c := Length(AStrings);
- if (c < 2) then
- exit;
- keyA := ComputeSortKey(AStrings[0],ACollation);
- for i := 1 to c - 1 do begin
- keyB := ComputeSortKey(AStrings[i],ACollation);
- if (CompareSortKey(keyA,keyB) >= 0) then begin
- s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
- s := Format('"%s" >= "%s" %s%s',[AStrings[i-1],AStrings[i],sLineBreak,s]);
- raise Exception.Create(s);
- end;
- keyA := keyB;
- end;
- end;
- procedure test1_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,12);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight($161D,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('d'));
- p^.Weights := ToWeight($1631,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('e'));
- p^.Weights := ToWeight($164C,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('f'));
- p^.Weights := ToWeight($1684,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('g'));
- p^.Weights := ToWeight($1691,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('h'));
- p^.Weights := ToWeight($16B4,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('i'));
- p^.Weights := ToWeight($16CD,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('j'));
- p^.Weights := ToWeight($16E6,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('k'));
- p^.Weights := ToWeight($16FF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('l'));
- p^.Weights := ToWeight($1711,$0020,$0002);
- end;
- procedure test1();
- var
- sequence : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test1_prepareWeigth(wfirst);
- sequence := TOrderedCharacters.Create();
- sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
- sequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
- sequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
- sequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
- sequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
- sequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
- sequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
- sequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
- sequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
- sequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
- for i := 0 to sequence.ActualLength - 1 do
- sequence.Data[i].Changed := False;
- WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
- CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook1);
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- statement.SetElementCount(1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','g'{*},'b','c','d','e','f','h','i','j','k','l'],@unicodeBook2);
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- statement.SetElementCount(2);
- statement.Elements[0] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','h'{*},'k'{*},'g'{*},'b','c','d','e','f','i','j','l'],@unicodeBook2);
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('h');
- statement.SetElementCount(1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence));
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','h'{*},'g'{*},'k'{*},'b','c','d','e','f','i','j','l'],@unicodeBook2);
- end;
- procedure test2_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,11);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('('),Ord('a'),Ord(')')]);
- p^.Weights := ToWeight($15EF,$0020,$0006); //15EF.0020.0006.24D0
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('A'));
- p^.Weights := ToWeight($15EF,$0020,$0008); //15EF.0020.0008.0041
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('('),Ord('A'),Ord(')')]);
- p^.Weights := ToWeight($15EF,$0020,$000C); //15EF.0020.000C
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('a'),Ord('`')]);
- p^.Weights := ToWeight([$15EF,$0020,$0002, $0000,$0035,$0002]); //[.15EF.0020.0002.0061][.0000.0035.0002.0300]
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('A'),Ord('`')]);
- p^.Weights := ToWeight([$15EF,$0020,$0008, $0000,$0035,$0002]); //[.15EF.0020.0008.0041][.0000.0035.0002.0300]
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('a'),Ord('e')]);
- p^.Weights := ToWeight([$15F0,$0020,$0002]); //[.15EF.0020.0004.00E6][.0000.0139.0004.00E6][.164C.0020.0004.00E6]
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord(UpCase('a')),Ord(UpCase('e'))]);
- p^.Weights := ToWeight([$15F0,$0020,$0006]);//[.15EF.0020.000A.00C6][.0000.0139.0004.00C6][.164C.0020.000A.00C6]
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('('),Ord('b'),Ord(')')]);
- p^.Weights := ToWeight($1605,$0020,$0006); //.1605.0020.0006.24D1
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('B'));
- p^.Weights := ToWeight($1605,$0020,$0008); //1605.0020.0008.0042
- end;
- procedure test2();
- var
- sequenceClean, sequence : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test2_prepareWeigth(wfirst);
- sequenceClean := TOrderedCharacters.Create();
- sequenceClean.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('a'),Ord(')')],TReorderWeigthKind.Tertiary,2));
- sequenceClean.Append(TReorderUnit.From(Ord('A'),TReorderWeigthKind.Tertiary,3));
- sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('A'),Ord(')')],TReorderWeigthKind.Tertiary,4));
- //sequenceClean.Append(TReorderUnit.From(Ord('à'),TReorderWeigthKind.Secondary,0));
- sequenceClean.Append(TReorderUnit.From([Ord('a'),Ord('`')],TReorderWeigthKind.Secondary,5));
- //sequenceClean.Append(TReorderUnit.From(Ord(UpCase('à')),TReorderWeigthKind.Tertiary,0));
- sequenceClean.Append(TReorderUnit.From([Ord('A'),Ord('`')],TReorderWeigthKind.Tertiary,6));
- sequenceClean.Append(TReorderUnit.From([Ord('a'),Ord('e')],TReorderWeigthKind.Primary,7));
- sequenceClean.Append(TReorderUnit.From([Ord(UpCase('a')),Ord(UpCase('e'))],TReorderWeigthKind.Tertiary,8));
- sequenceClean.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,9));
- sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('b'),Ord(')')],TReorderWeigthKind.Tertiary,10));
- sequenceClean.Append(TReorderUnit.From(Ord('B'),TReorderWeigthKind.Tertiary,11));
- for i := 0 to sequenceClean.ActualLength - 1 do
- sequenceClean.Data[i].Changed := False;
- WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
- CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook1);
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B'],@unicodeBook2);
- CheckInf(['gg','ae'],@unicodeBook2);
- CheckInf(['gb','ae'],@unicodeBook2);
- //CheckInf(['aeae','AE'],@unicodeBook2);
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','(a)','A','(A)', 'g'{*}, 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
- CheckInf(['(A)a','ga'],@unicodeBook2);
- CheckInf(['g','ae'],@unicodeBook2);
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a', 'g'{*},'(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
- CheckInf(['aa','ga'],@unicodeBook2);
- CheckInf(['ga','(a)a'],@unicodeBook2);
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,2);
- statement.Reset[0] := Ord('a');
- statement.Reset[1] := Ord('`');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','(a)','A','(A)', 'a`', 'g'{*},'A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
- CheckInf(['a`a','ga'],@unicodeBook2);
- CheckInf(['ga','ae'],@unicodeBook2);
- end;
- //------------------------------------------------------
- procedure test3_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,12);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight($161D,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('d'));
- p^.Weights := ToWeight($1631,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('e'));
- p^.Weights := ToWeight($164C,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('f'));
- p^.Weights := ToWeight($1684,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('g'));
- p^.Weights := ToWeight($1691,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('h'));
- p^.Weights := ToWeight($16B4,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('i'));
- p^.Weights := ToWeight($16CD,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('j'));
- p^.Weights := ToWeight($16E6,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('k'));
- p^.Weights := ToWeight($16FF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('l'));
- p^.Weights := ToWeight($1711,$0020,$0002);
- end;
- procedure PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
- ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
- ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
- ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
- ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
- ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
- ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
- ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
- ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
- ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- procedure test3();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- keyA, keyB : TUCASortKey;
- us : UnicodeString;
- begin //'a','b','c','d','e','f','g','h','i','j','k','l'
- statement.Clear();
- test3_prepareWeigth(wfirst);
- PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test3','first',nil,unicodeBook1);
- us := 'a';
- keyA := ComputeSortKey(us,@unicodeBook1);
- for i := Ord('b') to Ord('l') do begin
- us := unicodeChar(i);
- keyB := ComputeSortKey(us,@unicodeBook1);
- if (CompareSortKey(keyA,keyB) >= 0) then
- raise Exception.CreateFmt('"%s" >= "%s" !',[AnsiChar(i-1),AnsiChar(i)]);
- keyA := keyB;
- end;
- // --- test 1
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('b');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','g'{*}, 'c','d','e','f','h','i','j','k','l'],@unicodeBook2);
- CheckInf(['bb','g'{*}],@unicodeBook2);
- CheckInf(['bc','g'{*}],@unicodeBook2);
- CheckInf(['bc','gg'{*}],@unicodeBook2);
- CheckInf(['bg','bc'{*}],@unicodeBook2);
- WriteLn(' -- test 1 - ok');
- // --- test 2
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('c');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','ch'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
- CheckInf(['ca','ch'{*}],@unicodeBook2);
- CheckInf(['cc','ch'{*}],@unicodeBook2);
- CheckInf(['cd','ch'{*}],@unicodeBook2);
- CheckInf(['ce','ch'{*}],@unicodeBook2);
- CheckInf(['cf','ch'{*}],@unicodeBook2);
- CheckInf(['ci','ch'{*}],@unicodeBook2);
- CheckInf(['cj','ch'{*}],@unicodeBook2);
- CheckInf(['ck','ch'{*}],@unicodeBook2);
- CheckInf(['cl','ch'{*}],@unicodeBook2);
- CheckInf(['ac','ach'{*}],@unicodeBook2);
- CheckInf(['aci','achat'{*}],@unicodeBook2);
- WriteLn(' -- test 2 - ok');
- // --- test 3
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('c');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Identity,0);
- sequence.ApplyStatement(@statement);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','k'{*},'d','e','f','g','h','i','j','l'],@unicodeBook2);
- CheckInf(['a','b','c'{*},'d','e','f','g','h','i','j','l'],@unicodeBook2);
- CheckEqual('c','k',@unicodeBook2);
- CheckEqual('cc','kk',@unicodeBook2);
- CheckEqual('ck','kc',@unicodeBook2);
- CheckEqual('kc','kk',@unicodeBook2);
- CheckEqual('cckkc','kckcc',@unicodeBook2);
- CheckInf(['acb','akc'{*}],@unicodeBook2);
- WriteLn(' -- test 3 - ok');
- // --- test 4
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From([Ord('c')],TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- statement.Reset[0] := Ord('c');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','c'{*},'ch'{*},'b','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
- CheckInf(['ca','ch'{*}],@unicodeBook2);
- CheckInf(['cc','ch'{*}],@unicodeBook2);
- CheckInf(['cd','ch'{*}],@unicodeBook2);
- CheckInf(['ce','ch'{*}],@unicodeBook2);
- CheckInf(['cf','ch'{*}],@unicodeBook2);
- CheckInf(['ci','ch'{*}],@unicodeBook2);
- CheckInf(['cj','ch'{*}],@unicodeBook2);
- CheckInf(['ck','ch'{*}],@unicodeBook2);
- CheckInf(['cl','ch'{*}],@unicodeBook2);
- CheckInf(['ac','ach'{*}],@unicodeBook2);
- CheckInf(['aci','achat'{*}],@unicodeBook2);
- WriteLn(' -- test 4 - ok');
- end;
- //------------------------------------------------------
- procedure test4_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,12);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c')); {*}
- p^.Weights := ToWeight($1606,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('d'));
- p^.Weights := ToWeight($1631,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('e'));
- p^.Weights := ToWeight($164C,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('f'));
- p^.Weights := ToWeight($1684,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('g'));
- p^.Weights := ToWeight($1691,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('h'));
- p^.Weights := ToWeight($16B4,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('i'));
- p^.Weights := ToWeight($16CD,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('j'));
- p^.Weights := ToWeight($16E6,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('k'));
- p^.Weights := ToWeight($16FF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('l'));
- p^.Weights := ToWeight($1711,$0020,$0002);
- end;
- procedure test4();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- keyA, keyB : TUCASortKey;
- us : UnicodeString;
- begin
- statement.Clear();
- test4_prepareWeigth(wfirst);
- PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test4','first',nil,unicodeBook1);
- us := 'a';
- keyA := ComputeSortKey(us,@unicodeBook1);
- for i := Ord('b') to Ord('l') do begin
- us := unicodeChar(i);
- keyB := ComputeSortKey(us,@unicodeBook1);
- if (CompareSortKey(keyA,keyB) >= 0) then
- raise Exception.CreateFmt('"%s" >= "%s" !',[AnsiChar(i-1),AnsiChar(i)]);
- keyA := keyB;
- end;
- // --- test 1
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('b');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test4','second',@unicodeBook1,unicodeBook2);
- unicodeBook2.Base := @unicodeBook1;
- CheckInf(['a','b','g'{*}, 'c','d','e','f','h','i','j','k','l'],@unicodeBook2);
- CheckInf(['g'{*}, 'c'],@unicodeBook2);
- CheckInf(['gg'{*}, 'c'],@unicodeBook2);
- CheckInf(['gg'{*}, 'cc'],@unicodeBook2);
- CheckInf(['g'{*}, 'ca'],@unicodeBook2);
- CheckInf(['gg'{*}, 'ca'],@unicodeBook2);
- CheckInf(['bb','g'{*}],@unicodeBook2);
- CheckInf(['bc','g'{*}],@unicodeBook2);
- CheckInf(['bc','gg'{*}],@unicodeBook2);
- CheckInf(['bg','bc'{*}],@unicodeBook2);
- WriteLn(' -- test 1 - ok',sLineBreak);
- // --- test 2
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('b');
- SetLength(statement.Elements,2);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test4','second',@unicodeBook1,unicodeBook2);
- unicodeBook2.Base := @unicodeBook1;
- CheckInf(['a','b','g'{*},'k'{*}, 'c','d','e','f','h','i','j','l'],@unicodeBook2);
- CheckInf(['g'{*}, 'c'],@unicodeBook2);
- CheckInf(['k'{*}, 'c'],@unicodeBook2);
- CheckInf(['b','kk'{*}],@unicodeBook2);
- CheckInf(['bb','kk'{*}],@unicodeBook2);
- CheckInf(['b','kkk'{*}],@unicodeBook2);
- CheckInf(['gk','kk'{*}],@unicodeBook2);
- CheckInf(['gk','k'{*}],@unicodeBook2);
- CheckInf(['gk','kkk'{*}],@unicodeBook2);
- CheckInf(['gg'{*}, 'c'],@unicodeBook2);
- CheckInf(['gg'{*}, 'cc'],@unicodeBook2);
- CheckInf(['g'{*}, 'ca'],@unicodeBook2);
- CheckInf(['gg'{*}, 'ca'],@unicodeBook2);
- CheckInf(['bb','g'{*}],@unicodeBook2);
- CheckInf(['bc','g'{*}],@unicodeBook2);
- CheckInf(['bc','gg'{*}],@unicodeBook2);
- CheckInf(['bg','bc'{*}],@unicodeBook2);
- WriteLn(' -- test 2 - ok');
- end;
- //-------------------------------------------------------------------------
- procedure test5_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,6);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('a'),Ord('d'),Ord('a')]);
- p^.Weights := ToWeight($1609,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight($161D,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('d'));
- p^.Weights := ToWeight($1631,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('e'));
- p^.Weights := ToWeight($164C,$0020,$0002);
- end;
- procedure test5_PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Primary,3));
- ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,4));
- ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,5));
- ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,6));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- procedure test5();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test5_prepareWeigth(wfirst);
- test5_PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test5','first',nil,unicodeBook1);
- CheckInf(['a','b','ada','c','d','e'],@unicodeBook1);
- CheckInf(['ba','adaa'],@unicodeBook1);
- // --- test 1
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,0);
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Deletion,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test5','second',@unicodeBook1,unicodeBook2);
- unicodeBook2.Base := @unicodeBook1;
- CheckInf(['a','b','ada','d','e', 'c'{* deleted !}],@unicodeBook2);
- CheckInf(['ee','ca'],@unicodeBook2);
- WriteLn(' -- test 1 - ok',sLineBreak);
- // --- test 2
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,0);
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test5','second',@unicodeBook1,unicodeBook2);
- unicodeBook2.Base := @unicodeBook1;
- CheckInf(['a', 'adac'{* deleted !}, 'b','c','d','e'],@unicodeBook2);
- CheckInf(['a','ada'],@unicodeBook2);
- CheckInf(['ada','b'],@unicodeBook2);
- CheckInf(['ac','ada'],@unicodeBook2);
- CheckInf(['ac','adac'],@unicodeBook2);
- CheckInf(['abe','ada'],@unicodeBook2);
- CheckInf(['abe','adae'],@unicodeBook2);
- WriteLn(' -- test 2 - ok',sLineBreak);
- end;
- //-------------------------------------------------------------------------
- procedure test6_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,7);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('a'),Ord('d')]);
- p^.Weights := ToWeight($1609,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('a'),Ord('d'),Ord('a')]);
- p^.Weights := ToWeight($1613,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight($161D,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('d'));
- p^.Weights := ToWeight($1631,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('e'));
- p^.Weights := ToWeight($164C,$0020,$0002);
- end;
- procedure test6_PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,3));
- ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Primary,4));
- ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,5));
- ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,6));
- ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,7));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- procedure test6();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- unicodeBook1, unicodeBook2, unicodeBook3 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test6_prepareWeigth(wfirst);
- test6_PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test6','first',nil,unicodeBook1);
- CheckInf(['a','b','ad','ada','c','d','e'],@unicodeBook1);
- CheckInf(['ba','ad'],@unicodeBook1);
- CheckInf(['ba','adaa'],@unicodeBook1);
- // --- test 1
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,0);
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Deletion,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test6','second',@unicodeBook1,unicodeBook2);
- unicodeBook2.Base := @unicodeBook1;
- CheckInf(['a', 'ad'{*},'ada', 'b','c','d','e'],@unicodeBook2);
- CheckInf(['ab','ad'],@unicodeBook2);
- CheckInf(['ab','adb'],@unicodeBook2);
- CheckInf(['ad','ba'],@unicodeBook2);
- CheckInf(['adaa','ba'],@unicodeBook2);
- WriteLn(' -- test 1 - ok',sLineBreak);
- // --- test 2
- //sequence := sequenceClean.Clone();
- SetLength(statement.Reset,0);
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test6','second',@unicodeBook2,unicodeBook3);
- unicodeBook3.Base := @unicodeBook2;
- CheckInf(['a', 'ad'{*},'ada'{*}, 'b','c','d','e'],@unicodeBook3);
- CheckInf(['ab','ad'],@unicodeBook3);
- CheckInf(['ab','adb'],@unicodeBook3);
- CheckInf(['ab','ada'],@unicodeBook3);
- WriteLn(' -- test 2 - ok',sLineBreak);
- // --- test 3
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,0);
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test6','second',@unicodeBook1,unicodeBook2);
- unicodeBook2.Base := @unicodeBook1;
- CheckInf(['a', 'b', 'ad', 'c','d','e'],@unicodeBook2);
- CheckInf(['ad','ada'],@unicodeBook2);
- WriteLn(' -- test 3 - ok',sLineBreak);
- end;
- //-------------------------------------------------------------------------
- procedure test7_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,8);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray($030A);//030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
- p^.Weights := ToWeight($0000,$0043,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray($0327);//0327 ; [.0000.0056.0002.0327] # COMBINING CEDILLA
- p^.Weights := ToWeight($0000,$0056,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray($0061);//a
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray($0062);//b
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray($0063);//c
- p^.Weights := ToWeight($161D,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray($0064);//d
- p^.Weights := ToWeight($1631,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray([$0061,$030A]);//a,030A;COMBINING RING ABOVE
- p^.Weights := ToWeight($164C,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('k'));
- p^.Weights := ToWeight($16FF,$0020,$0002);
- end;
- procedure test7_PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From($030A,TReorderWeigthKind.Tertiary,1));
- ASequence.Append(TReorderUnit.From($0327,TReorderWeigthKind.Tertiary,2));
- ASequence.Append(TReorderUnit.From($0061,TReorderWeigthKind.Primary,3));
- ASequence.Append(TReorderUnit.From($0062,TReorderWeigthKind.Primary,4));
- ASequence.Append(TReorderUnit.From($0063,TReorderWeigthKind.Primary,5));
- ASequence.Append(TReorderUnit.From($0064,TReorderWeigthKind.Primary,6));
- ASequence.Append(TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Primary,7));
- ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- procedure test7();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin // Permutation simple test
- statement.Clear();
- test7_prepareWeigth(wfirst);
- test7_PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test7','first',nil,unicodeBook1);
- CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064, #$0061#$030A,'k'],@unicodeBook1);
- CheckInf([#$0064, #$0061#$030A#$0327#$0062,'k'],@unicodeBook1);// Permutation here $030A <=> #$0327
- CheckInf([#$0064, #$0061#$0327#$030A#$0062,'k'],@unicodeBook1);
- CheckEqual(#$0061#$030A#$0327, #$0061#$0327#$030A,@unicodeBook1);
- // --- test 2
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,0);
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Deletion,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test7','second',@unicodeBook1,unicodeBook2);
- unicodeBook2.Base := @unicodeBook1;
- CheckInf([#$030A,#$0327,#$0061,#$0061#$030A ,#$0062,#$0063,#$0064,'k'],@unicodeBook2);
- CheckInf([#$0061, #$0061#$030A#$0327#$0062,#$0062,#$0064],@unicodeBook2);
- CheckInf([#$0061, #$0061#$030A#$0062#$0327,#$0062,#$0064],@unicodeBook2);
- WriteLn(' -- test 2 - ok',sLineBreak);
- end;
- //-------------------------------------------------------------------------
- procedure test8_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,12);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight($161D,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('d'));
- p^.Weights := ToWeight($1631,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('e'));
- p^.Weights := ToWeight($164C,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('f'));
- p^.Weights := ToWeight($1684,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('g'));
- p^.Weights := ToWeight($1691,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('h'));
- p^.Weights := ToWeight($16B4,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('i'));
- p^.Weights := ToWeight($16CD,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('j'));
- p^.Weights := ToWeight($16E6,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('k'));
- p^.Weights := ToWeight($16FF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('l'));
- p^.Weights := ToWeight($1711,$0020,$0002);
- end;
- procedure test8_PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
- ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
- ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
- ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
- ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
- ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
- ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
- ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
- ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
- ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- procedure test8();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test8_prepareWeigth(wfirst);
- test8_PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test8','first',nil,unicodeBook1);
- CheckInf('l','-'{* computed are greater},@unicodeBook1);
- // --- test 1
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('c');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
- sequence.ApplyStatement(@statement);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
- CheckEqual('cc','c-'{*},@unicodeBook2);
- CheckEqual('ccc','c-c'{*},@unicodeBook2);
- CheckEqual('cca','c-a'{*},@unicodeBook2);
- CheckEqual('cce','c-e'{*},@unicodeBook2);
- CheckInf(['cc','c-c'{*}],@unicodeBook2);
- CheckInf(['bc','bc-c'{*}],@unicodeBook2);
- CheckInf('l','-'{* computed are greater},@unicodeBook2);
- WriteLn(' -- test 1 - ok');
- // --- test 2
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('c');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
- CheckInf('cc','c-'{*},@unicodeBook2);
- CheckInf('ccl','c-'{*},@unicodeBook2);
- CheckInf('ccc','c-c'{*},@unicodeBook2);
- CheckInf('cca','c-a'{*},@unicodeBook2);
- CheckInf('cce','c-e'{*},@unicodeBook2);
- CheckInf(['cc','c-c'{*}],@unicodeBook2);
- CheckInf(['bc','bc-c'{*}],@unicodeBook2);
- CheckInf('l','-'{* computed are greater},@unicodeBook2);
- WriteLn(' -- test 2 - ok');
- // --- test 3
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('c');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From([Ord('-'),Ord('+')],[Ord('c')],TReorderWeigthKind.Identity,0);
- sequence.ApplyStatement(@statement);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
- CheckEqual('cc','c-+'{*},@unicodeBook2);
- CheckEqual('ccc','c-+c'{*},@unicodeBook2);
- CheckEqual('cca','c-+a'{*},@unicodeBook2);
- CheckEqual('cce','c-+e'{*},@unicodeBook2);
- CheckInf(['cc','c-+c'{*}],@unicodeBook2);
- CheckInf(['bc','bc-+c'{*}],@unicodeBook2);
- CheckInf('l','-+'{* computed are greater},@unicodeBook2);
- WriteLn(' -- test 3 - ok');
- // --- test 4 : '-' has 3 contexts to force the context tree to have at least
- // a "Left" and a "Right"
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('c');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
- sequence.ApplyStatement(@statement);
- statement.Reset[0] := Ord('f');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('f')],TReorderWeigthKind.Identity,0);
- sequence.ApplyStatement(@statement);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('a')],TReorderWeigthKind.Identity,0);
- sequence.ApplyStatement(@statement);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
- // Check c
- CheckEqual('cc','c-'{*},@unicodeBook2);
- CheckEqual('ccc','c-c'{*},@unicodeBook2);
- CheckEqual('cca','c-a'{*},@unicodeBook2);
- CheckEqual('cce','c-e'{*},@unicodeBook2);
- CheckInf(['cc','c-c'{*}],@unicodeBook2);
- CheckInf(['bc','bc-c'{*}],@unicodeBook2);
- //check f
- CheckEqual('ff','f-'{*},@unicodeBook2);
- CheckEqual('fff','f-f'{*},@unicodeBook2);
- CheckEqual('ffa','f-a'{*},@unicodeBook2);
- CheckEqual('ffe','f-e'{*},@unicodeBook2);
- CheckInf(['ff','f-f'{*}],@unicodeBook2);
- CheckInf(['bf','bf-f'{*}],@unicodeBook2);
- //check c and f
- CheckEqual('ccf','c-f'{*},@unicodeBook2);
- CheckEqual('ccff','c-f-'{*},@unicodeBook2);
- CheckEqual('ccfff','c-f-f'{*},@unicodeBook2);
- CheckEqual('ffcc','f-c-'{*},@unicodeBook2);
- CheckEqual('ffccf','f-c-f'{*},@unicodeBook2);
- CheckInf('ffccf','g'{*},@unicodeBook2);
- CheckInf('a-','ab',@unicodeBook2);
- // check - alone
- CheckInf('l','-'{* computed are greater},@unicodeBook2);
- WriteLn(' -- test 4 - ok');
- // --- test 5 : Add a contraction to force the code path
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From([Ord('-'),Ord('h')],TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- statement.Reset[0] := Ord('c');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
- sequence.ApplyStatement(@statement);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','-h','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
- CheckEqual('cc','c-'{*},@unicodeBook2);
- CheckEqual('ccc','c-c'{*},@unicodeBook2);
- CheckEqual('cca','c-a'{*},@unicodeBook2);
- CheckEqual('cce','c-e'{*},@unicodeBook2);
- CheckInf(['cc','c-c'{*}],@unicodeBook2);
- CheckInf(['bc','bc-c'{*}],@unicodeBook2);
- CheckInf(['ab','-hb'{*}],@unicodeBook2);
- CheckInf(['-hb','ba'],@unicodeBook2);
- CheckInf('l','-'{* computed are greater},@unicodeBook2);
- WriteLn(' -- test 5 - ok');
- WriteLn(' -- test - ok',sLineBreak);
- end;
- //-------------------------------------------------------------------------
- procedure test9_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,8);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray($030A);//030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
- p^.Weights := ToWeight($0000,$0043,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray($0327);//0327 ; [.0000.0056.0002.0327] # COMBINING CEDILLA
- p^.Weights := ToWeight($0000,$0056,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray($0061);//a
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray($0062);//b
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray($0063);//c
- p^.Weights := ToWeight($161D,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray($0064);//d
- p^.Weights := ToWeight($1631,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray([$0061,$030A]);//a,030A;COMBINING RING ABOVE
- p^.Weights := ToWeight($164C,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('k'));
- p^.Weights := ToWeight($16FF,$0020,$0002);
- end;
- procedure test9_PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From($030A,TReorderWeigthKind.Tertiary,1));
- ASequence.Append(TReorderUnit.From($0327,TReorderWeigthKind.Tertiary,2));
- ASequence.Append(TReorderUnit.From($0061,TReorderWeigthKind.Primary,3));
- ASequence.Append(TReorderUnit.From($0062,TReorderWeigthKind.Primary,4));
- ASequence.Append(TReorderUnit.From($0063,TReorderWeigthKind.Primary,5));
- ASequence.Append(TReorderUnit.From($0064,TReorderWeigthKind.Primary,6));
- ASequence.Append(TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Primary,7));
- ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- procedure test9();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin// Permutation with Context
- statement.Clear();
- test7_prepareWeigth(wfirst);
- test7_PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test9','first',nil,unicodeBook1);
- CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064, #$0061#$030A,'k'],@unicodeBook1);
- CheckInf([#$0064, #$0061#$030A#$0327#$0062,'k'],@unicodeBook1);// Permutation here $030A <=> #$0327
- // --- test 2
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := $0062;
- SetLength(statement.Elements,1);
- 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;;;;
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test9','second',@unicodeBook1,unicodeBook2);
- unicodeBook2.Base := @unicodeBook1;
- CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064,'k'],@unicodeBook2);
- CheckInf([#$0061'k'#$032D ,#$0061#$0063],@unicodeBook2);
- CheckNotEqual(#$0061'k'#$0327#$032D, #$0061#$0327,@unicodeBook2);
- CheckInf([#$0061'k'#$0327#$032D ,#$0061#$0063],@unicodeBook2);
- WriteLn(' -- test 2 - ok',sLineBreak);
- end;
- //------------------------------------------------------
- procedure test10_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,12);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('('),Ord('a'),Ord(')')]);
- p^.Weights := ToWeight($15EF,$0020,$0006); //15EF.0020.0006.24D0
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('A'));
- p^.Weights := ToWeight($15EF,$0020,$0008); //15EF.0020.0008.0041
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('('),Ord('A'),Ord(')')]);
- p^.Weights := ToWeight($15EF,$0020,$000C); //15EF.0020.000C
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('a'),Ord('`')]);
- p^.Weights := ToWeight([$15EF,$0020,$0002, $0000,$0035,$0002]); //[.15EF.0020.0002.0061][.0000.0035.0002.0300]
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('A'),Ord('`')]);
- p^.Weights := ToWeight([$15EF,$0020,$0008, $0000,$0035,$0002]); //[.15EF.0020.0008.0041][.0000.0035.0002.0300]
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('a'),Ord('e')]);
- p^.Weights := ToWeight([$15F0,$0020,$0002]); //[.15EF.0020.0004.00E6][.0000.0139.0004.00E6][.164C.0020.0004.00E6]
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord(UpCase('a')),Ord(UpCase('e'))]);
- p^.Weights := ToWeight([$15F0,$0020,$0006]);//[.15EF.0020.000A.00C6][.0000.0139.0004.00C6][.164C.0020.000A.00C6]
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('('),Ord('b'),Ord(')')]);
- p^.Weights := ToWeight($1605,$0020,$0006); //.1605.0020.0006.24D1
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('B'));
- p^.Weights := ToWeight($1605,$0020,$0008); //1605.0020.0008.0042
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight($161D,$0020,$0002);
- end;
- procedure test10_PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- ASequence.Append(TReorderUnit.From([Ord('('),Ord('a'),Ord(')')],TReorderWeigthKind.Tertiary,2));
- ASequence.Append(TReorderUnit.From(Ord('A'),TReorderWeigthKind.Tertiary,3));
- ASequence.Append(TReorderUnit.From([Ord('('),Ord('A'),Ord(')')],TReorderWeigthKind.Tertiary,4));
- //ASequence.Append(TReorderUnit.From(Ord('à'),TReorderWeigthKind.Secondary,0));
- ASequence.Append(TReorderUnit.From([Ord('a'),Ord('`')],TReorderWeigthKind.Secondary,5));
- //ASequence.Append(TReorderUnit.From(Ord(UpCase('à')),TReorderWeigthKind.Tertiary,0));
- ASequence.Append(TReorderUnit.From([Ord('A'),Ord('`')],TReorderWeigthKind.Tertiary,6));
- ASequence.Append(TReorderUnit.From([Ord('a'),Ord('e')],TReorderWeigthKind.Primary,7));
- ASequence.Append(TReorderUnit.From([Ord(UpCase('a')),Ord(UpCase('e'))],TReorderWeigthKind.Tertiary,8));
- ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,9));
- ASequence.Append(TReorderUnit.From([Ord('('),Ord('b'),Ord(')')],TReorderWeigthKind.Tertiary,10));
- ASequence.Append(TReorderUnit.From(Ord('B'),TReorderWeigthKind.Tertiary,11));
- ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,12));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- procedure test10();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test10_prepareWeigth(wfirst);
- test10_PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test6','first',nil,unicodeBook1);
- CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook1);
- // --- test 1
- sequence := sequenceClean.Clone();
- statement.Clear();
- statement.Before := True;
- SetLength(statement.Reset,2);
- statement.Reset[0] := Ord('a');
- statement.Reset[1] := Ord('e');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
- CheckInf(['gg','ae'],@unicodeBook2);
- CheckInf(['gb','ae'],@unicodeBook2);
- WriteLn(' -- test 1 - ok',sLineBreak);
- // --- test 2
- sequence := sequenceClean.Clone();
- statement.Clear();
- statement.Before := True;
- SetLength(statement.Reset,2);
- statement.Reset[0] := Ord('a');
- statement.Reset[1] := Ord('e');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
- CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
- CheckInf(['A`B','gg'],@unicodeBook2);
- CheckInf(['A`b','g'],@unicodeBook2);
- WriteLn(' -- test 2 - ok',sLineBreak);
- // --- test 3
- sequence := sequenceClean.Clone();
- statement.Clear();
- statement.Before := True;
- SetLength(statement.Reset,2);
- statement.Reset[0] := Ord('a');
- statement.Reset[1] := Ord('e');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
- CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
- CheckInf(['A`B','gg'],@unicodeBook2);
- CheckInf(['A`b','g'],@unicodeBook2);
- WriteLn(' -- test 3 - ok',sLineBreak);
- // --- test 4
- sequence := sequenceClean.Clone();
- statement.Clear();
- statement.Before := True;
- SetLength(statement.Reset,2);
- statement.Reset[0] := Ord('A');
- statement.Reset[1] := Ord('`');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #4.1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- statement.Clear();
- statement.Before := True;
- SetLength(statement.Reset,2);
- statement.Reset[0] := Ord('A');
- statement.Reset[1] := Ord('`');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('G'),TReorderWeigthKind.Secondary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #4.2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
- CheckInf(['a','(a)','A','(A)', 'G','a`','g'{*},'A`', 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
- CheckInf(['gg','A`B'],@unicodeBook2);
- CheckInf(['g','A`b'],@unicodeBook2);
- CheckInf(['A','gg'],@unicodeBook2);
- CheckInf(['A','Ga'],@unicodeBook2);
- WriteLn(' -- test 4 - ok',sLineBreak);
- // --- test 5
- sequence := sequenceClean.Clone();
- statement.Clear();
- statement.Before := True;
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('B');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #5 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'g'{*}, 'b','(b)','B', 'c'],@unicodeBook2);
- CheckInf(['gg','b'],@unicodeBook2);
- CheckInf(['ae','gb'],@unicodeBook2);
- WriteLn(' -- test 5 - ok',sLineBreak);
- end;
- //------------------------------------------------------
- procedure test11_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,12);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight($161D,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('d'));
- p^.Weights := ToWeight($1631,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('e'));
- p^.Weights := ToWeight($164C,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('f'));
- p^.Weights := ToWeight($1684,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('g'));
- p^.Weights := ToWeight($1691,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('h'));
- p^.Weights := ToWeight($16B4,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('i'));
- p^.Weights := ToWeight($16CD,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('j'));
- p^.Weights := ToWeight($16E6,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('k'));
- p^.Weights := ToWeight($16FF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('l'));
- p^.Weights := ToWeight($1711,$0020,$0002);
- end;
- procedure test11_PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
- ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
- ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
- ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
- ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
- ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
- ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
- ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
- ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
- ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- procedure test11();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test11_prepareWeigth(wfirst);
- test11_PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test11','first',nil,unicodeBook1);
- CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook1);
- // --- test 1
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('c');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Tertiary,0);
- statement.Elements[0].SetExpansion(Ord('h'));
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test1','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','x'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
- CheckInf('ch','x'{*},@unicodeBook2);
- CheckInf('cha','xa'{*},@unicodeBook2);
- CheckInf('chk','xka'{*},@unicodeBook2);
- WriteLn(' -- test 1 - ok');
- // --- test 2
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('c');
- SetLength(statement.Elements,2);
- statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Tertiary,0);
- statement.Elements[0].SetExpansion(Ord('h'));
- statement.Elements[1] := TReorderUnit.From(Ord('X'),TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test2','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','x'{*},'X'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
- CheckInf('ch','x'{*},@unicodeBook2);
- CheckInf('cha','xa'{*},@unicodeBook2);
- CheckInf('chk','xka'{*},@unicodeBook2);
- CheckInf('ch','X'{*},@unicodeBook2);
- CheckInf('cha','Xa'{*},@unicodeBook2);
- CheckInf('chk','Xka'{*},@unicodeBook2);
- WriteLn(' -- test 2 - ok');
- end;
- //------------------------------------------------------
- procedure test12_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,1);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0120,$0002);
- end;
- procedure test12_PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- procedure Check(const ACondition : Boolean; const AMsg : string);overload;
- begin
- if not ACondition then
- raise Exception.Create(AMsg);
- end;
- procedure Check(
- const ACondition : Boolean;
- const AFormatMsg : string;
- const AArgs : array of const
- );overload;
- begin
- Check(ACondition,Format(AFormatMsg,AArgs));
- end;
- procedure Check(const ACondition : Boolean);overload;
- begin
- Check(ACondition,'Check failed.')
- end;
- procedure CheckSimpleProps(
- AItem : PUCA_PropItemRec;
- AHasCodePoint,
- AIsValid : Boolean;
- AChildCount : Byte;
- AContextual : Boolean
- );overload;
- var
- p : PUCA_PropItemRec;
- begin
- p := AItem;
- Check(p<>nil,'p = nil');
- Check(p^.HasCodePoint()=AHasCodePoint,'HasCodePoint');
- Check(p^.IsValid()=AIsValid,'IsValid');
- Check(p^.ChildCount=AChildCount,'ChildCount');
- Check(p^.Contextual=AContextual,'Contextual');
- end;
- procedure CheckSimpleProps(
- AItem : PUCA_PropItemRec;
- AHasCodePoint,
- AIsValid : Boolean;
- AChildCount : Byte;
- AContextual,
- AIsDeleted : Boolean
- );overload;
- begin
- CheckSimpleProps(AItem,AHasCodePoint,AIsValid,AChildCount,AContextual);
- Check(AItem^.IsDeleted=AIsDeleted,'IsDeleted');
- end;
- procedure CheckWeigths(AItem : PUCA_PropItemRec; const AWeigths : array of Word);overload;
- var
- p : PUCA_PropItemRec;
- c, i : Integer;
- pb : PByte;
- pw : PWord;
- begin
- p := AItem;
- c := Length(AWeigths);
- if ((c mod 3) > 0) then
- Check(False,'Invalid Weigth Array.');
- c := c div 3;
- Check(c=p^.WeightLength,'WeightLength');
- if (c = 0) then
- exit;
- pb := PByte(PtrUInt(p)+SizeOf(TUCA_PropItemRec));
- pw := @AWeigths[Low(AWeigths)];
- //First Item
- Check(PWord(pb)^ = pw^, 'First Item[0]');
- pw := pw + 1;
- pb := pb + 2;
- if (pw^ > High(Byte)) then begin
- Check(PWord(pb)^ = pw^, 'First Item[1]');
- pb := pb + 2;
- end else begin
- Check(pb^ = pw^, 'First Item[1]');
- pb := pb + 1;
- end;
- pw := pw + 1;
- if (pw^ > High(Byte)) then begin
- Check(PWord(pb)^ = pw^, 'First Item[2]');
- pb := pb + 2;
- end else begin
- Check(pb^ = pw^, 'First Item[2]');
- pb := pb + 1;
- end;
- pw := pw + 1;
- // Others
- for i := 1 to c-1 do begin
- Check(PWord(pb)^ = pw^, 'Item[0],i=%d',[i]);
- Inc(pw);
- pb := pb + 2;
- Check(PWord(pb)^ = pw^, 'Item[1],i=%d',[i]);
- Inc(pw);
- pb := pb + 2;
- Check(PWord(pb)^ = pw^, 'Item[2],i=%d',[i]);
- Inc(pw);
- pb := pb + 2;
- end;
- end;
- procedure CheckWeigths(
- AData : PUCA_PropWeights;
- const ADataCount : Integer;
- const AWeigths : array of Word
- );overload;
- var
- c: Integer;
- begin
- c := Length(AWeigths);
- if ((c mod 3) > 0) then
- Check(False,'Invalid Weigth Array.');
- c := c div 3;
- Check(c=ADataCount,'WeightLength');
- if (c = 0) then
- exit;
- if not CompareMem(AData,@AWeigths[0],(ADataCount*3*SizeOf(Word))) then
- Check(False,'Weight');
- end;
- function CalcWeigthSize(const AWeigths : array of Word) : Integer;
- var
- c : Integer;
- begin
- c := Length(AWeigths);
- if ((c mod 3) > 0) then
- Check(False,'Invalid Weigth Array.');
- Result := c * SizeOf(Word);
- if (c>0) then begin
- if (AWeigths[1] <= High(Byte)) then
- Result := Result - 1;
- if (AWeigths[2] <= High(Byte)) then
- Result := Result - 1;
- end;
- end;
- procedure test12_check_1(const ABook : unicodedata.TUCA_DataBook);
- var
- p, px : PUCA_PropItemRec;
- size, sizeTotal, t: Cardinal;
- begin
- sizeTotal := 0;
- // for 'b'
- p := ABook.Props;
- CheckSimpleProps(p,False,True,0,False);
- CheckWeigths(p,[$15F0,0,0]);// CheckWeigths(p,[$15F0,0,0, $15F0,0,0]);
- size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15F0,0,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size');
- sizeTotal:= sizeTotal+size;
- // for 'c'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False);
- CheckWeigths(p,[$15F1,0,0]);
- size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15F1,0,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size');
- sizeTotal:= sizeTotal+size;
- // for 'x'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- px := p;
- CheckSimpleProps(p,False,False,1,False);
- CheckWeigths(p,[]);
- size := SizeOf(TUCA_PropItemRec);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- t := size;
- sizeTotal:= sizeTotal+size;
- // for 'y'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,True,True,0,False);
- CheckWeigths(p,[$15F2,0,0]);
- size := SizeOf(TUCA_PropItemRec) +
- SizeOf(UInt24) +
- CalcWeigthSize([$15F2,0,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(y)');
- Check(px^.Size = (t+size),'size(x)');
- sizeTotal:= sizeTotal+size;
- Check(ABook.PropCount = sizeTotal,'size(total)');
- end;
- procedure test12_check_2(const ABook : unicodedata.TUCA_DataBook);
- var
- p, ph : PUCA_PropItemRec;
- size, sizeTotal, t: Integer;
- begin
- sizeTotal := 0;
- // for 'b'
- p := ABook.Props;
- CheckSimpleProps(p,False,True,0,False);
- CheckWeigths(p,[$15EF,$121,0]); //CheckWeigths(p,[$15EF,$121,0, $15EF,0,0]);
- size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size');
- sizeTotal:= sizeTotal+size;
- // for 'c'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False);
- CheckWeigths(p,[$15EF,$122,0]);
- size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size');
- sizeTotal:= sizeTotal+size;
- // for 'h'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- ph := p;
- CheckSimpleProps(p,False,False,1,False);
- CheckWeigths(p,[]);
- size := SizeOf(TUCA_PropItemRec);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- t := size;
- sizeTotal:= sizeTotal+size;
- // for 'i'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,True,True,0,False);
- CheckWeigths(p,[$15EF,$123,0]);
- size := SizeOf(TUCA_PropItemRec) +
- SizeOf(UInt24) +
- CalcWeigthSize([$15EF,$123,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(i)');
- sizeTotal:= sizeTotal+size;
- Check(ph^.Size = (t+size),'size(h)');
- // for 'k'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False);
- CheckWeigths(p,[$15EF,$123,1]);
- size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(k)');
- sizeTotal:= sizeTotal+size;
- Check(ABook.PropCount = sizeTotal,'size(total)');
- end;
- procedure test12_check_3(const ABook : unicodedata.TUCA_DataBook);
- var
- p, pc : PUCA_PropItemRec;
- size, sizeTotal, t: Integer;
- begin
- sizeTotal := 0;
- // for 'b'
- p := ABook.Props;
- CheckSimpleProps(p,False,True,0,False);
- CheckWeigths(p,[$15EF,$121,0]);
- size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size');
- sizeTotal:= sizeTotal+size;
- // for 'c'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- pc := p;
- CheckSimpleProps(p,False,True,1,False);
- CheckWeigths(p,[$15EF,$122,0]);
- size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- t := size;
- sizeTotal:= sizeTotal+size;
- // for 'i'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,True,True,0,False);
- CheckWeigths(p,[$15EF,$123,0]);
- size := SizeOf(TUCA_PropItemRec) +
- SizeOf(UInt24) +
- CalcWeigthSize([$15EF,$123,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(i)');
- sizeTotal:= sizeTotal+size;
- Check(pc^.Size = (t+size),'size(c)');
- // for 'k'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False);
- CheckWeigths(p,[$15EF,$123,1]);
- size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(k)');
- sizeTotal:= sizeTotal+size;
- Check(ABook.PropCount = sizeTotal,'size(total)');
- end;
- procedure test12_check_4(const ABook : unicodedata.TUCA_DataBook);
- var
- p, pc : PUCA_PropItemRec;
- size, sizeTotal, t: Integer;
- begin
- sizeTotal := 0;
- // for 'b'
- p := ABook.Props;
- CheckSimpleProps(p,False,True,0,False);
- CheckWeigths(p,[$15EF,$121,0]);
- size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size');
- sizeTotal:= sizeTotal+size;
- // for 'c'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- pc := p;
- CheckSimpleProps(p,False,True,2,False);
- CheckWeigths(p,[$15EF,$122,0]);
- size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- t := size;
- sizeTotal:= sizeTotal+size;
- // for 'i' as in 'ci'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,True,True,0,False);
- CheckWeigths(p,[$15EF,$123,0]);
- size := SizeOf(TUCA_PropItemRec) +
- SizeOf(UInt24) +
- CalcWeigthSize([$15EF,$123,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(i)');
- t := t+size;
- sizeTotal:= sizeTotal+size;
- // for 's' as in 'cs'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,True,True,0,False);
- CheckWeigths(p,[$15EF+1,0,0]);
- size := SizeOf(TUCA_PropItemRec) +
- SizeOf(UInt24) +
- CalcWeigthSize([$15EF+1,0,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(s)');
- t := t+size;
- sizeTotal:= sizeTotal+size;
- Check(pc^.Size = t,'size(c)');
- // for 'k'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False);
- CheckWeigths(p,[$15EF,$123,1]);
- size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(k)');
- sizeTotal:= sizeTotal+size;
- Check(ABook.PropCount = sizeTotal,'size(total)');
- end;
- procedure test12();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test12_prepareWeigth(wfirst);
- test12_PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
- // --- test 1
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,3);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- statement.Elements[2] := TReorderUnit.From([Ord('x'),Ord('y')],TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','xy'],@unicodeBook2);
- test12_check_1(unicodeBook2);
- WriteLn(' -- test 1 - ok');
- // --- test 2
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,4);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
- statement.Elements[2] := TReorderUnit.From([Ord('h'),Ord('i')],TReorderWeigthKind.Secondary,0);
- statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','hi','k'],@unicodeBook2);
- test12_check_2(unicodeBook2);
- WriteLn(' -- test 2 - ok');
- // --- test 3
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,4);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
- statement.Elements[2] := TReorderUnit.From([Ord('c'),Ord('i')],TReorderWeigthKind.Secondary,0);
- statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','ci','k'],@unicodeBook2);
- test12_check_3(unicodeBook2);
- WriteLn(' -- test 3 - ok');
- // --- test 4
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,5);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
- statement.Elements[2] := TReorderUnit.From([Ord('c'),Ord('i')],TReorderWeigthKind.Secondary,0);
- statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
- statement.Elements[4] := TReorderUnit.From([Ord('c'),Ord('s')],TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','ci','k','cs'],@unicodeBook2);
- test12_check_4(unicodeBook2);
- WriteLn(' -- test 4 - ok');
- end;
- //------------------------------------------------------
- procedure test13_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,2);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0120,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('b')]);
- p^.Weights := ToWeight($15F0,$0120,$0002);
- end;
- procedure test13_PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- procedure test13_check_1(const ABook : unicodedata.TUCA_DataBook);
- var
- p, pb : PUCA_PropItemRec;
- size, sizeTotal, t: Integer;
- begin
- sizeTotal := 0;
- // for 'b'
- p := ABook.Props;
- pb := p;
- CheckSimpleProps(p,False,True,1,False,True);
- CheckWeigths(p,[]);
- size := SizeOf(TUCA_PropItemRec);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- t := size;
- sizeTotal:= sizeTotal+size;
- // for 'u' as in 'bu'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,True,True,0,False,False);
- CheckWeigths(p,[$15F0,0,0]);
- size := SizeOf(TUCA_PropItemRec) +
- SizeOf(UInt24) +
- CalcWeigthSize([$15F0,0,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(u)');
- t := t+size;
- sizeTotal:= sizeTotal+size;
- Check(pb^.Size = t,'size(c)');
- Check(ABook.PropCount = sizeTotal,'size(total)');
- end;
- procedure test13_check_2(const ABook : unicodedata.TUCA_DataBook);
- var
- p, pb : PUCA_PropItemRec;
- size, sizeTotal, t: Integer;
- begin
- sizeTotal := 0;
- // for 'b'
- p := ABook.Props;
- pb := p;
- CheckSimpleProps(p,False,True,1,False,True);
- CheckWeigths(p,[]);
- size := SizeOf(TUCA_PropItemRec);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- t := size;
- sizeTotal:= sizeTotal+size;
- // for 'u' as in 'bu'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,True,True,0,False,False);
- CheckWeigths(p,[$15F0,0,0]);
- size := SizeOf(TUCA_PropItemRec) +
- SizeOf(UInt24) +
- CalcWeigthSize([$15F0,0,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(u)');
- t := t+size;
- sizeTotal:= sizeTotal+size;
- Check(pb^.Size = t,'size(c)');
- // for 'c'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False,False);
- CheckWeigths(p,[$15F1,0,0]);
- size := SizeOf(TUCA_PropItemRec) +
- CalcWeigthSize([$15F1,0,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(c)');
- sizeTotal:= sizeTotal+size;
- Check(ABook.PropCount = sizeTotal,'size(total)');
- end;
- procedure test13();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test12_prepareWeigth(wfirst);
- test12_PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
- // --- test 1
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Deletion,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From([Ord('b'),Ord('u')],TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','bu','b'{because b's weigth is now computed!}],@unicodeBook2);
- test13_check_1(unicodeBook2);
- WriteLn(' -- test 1 - ok');
- // --- test 2
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Deletion,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,2);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,2);
- statement.Elements[0] := TReorderUnit.From([Ord('b'),Ord('u')],TReorderWeigthKind.Primary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- CheckInf(['a','bu','c','b'{because b's weigth is now computed!}],@unicodeBook2);
- test13_check_2(unicodeBook2);
- WriteLn(' -- test 2 - ok');
- end;
- //------------------------------------------------------
- procedure test14_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,1);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0120,$0002);
- end;
- procedure test14_PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- procedure test14_check_1(const ABook : unicodedata.TUCA_DataBook);
- var
- p : PUCA_PropItemRec;
- size, sizeTotal: Integer;
- ctx : PUCA_PropItemContextTreeRec;
- ctxItem : PUCA_PropItemContextTreeNodeRec;
- pb : PByte;
- begin
- sizeTotal := 0;
- // for 'b'
- p := ABook.Props;
- pb := PByte(p);
- size := 0;
- CheckSimpleProps(p,True,True,0,True,False);
- size := SizeOf(TUCA_PropItemRec)+SizeOf(UInt24){codepoint};
- CheckWeigths(p,[]);
- ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
- Check(ctx^.Size>0,'ctx^.Size');
- ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
- Check(ctxItem<>nil,'ctxItem');
- Check(ctxItem^.Left=0,'ctxItem^.Left');
- Check(ctxItem^.Right=0,'ctxItem^.Right');
- Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
- Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
- pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
- Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
- pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
- CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
- size := SizeOf(TUCA_PropItemRec)+
- SizeOf(UInt24){codepoint}+
- SizeOf(TUCA_PropItemContextTreeRec.Size)+
- SizeOf(TUCA_PropItemContextTreeNodeRec) +
- (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
- (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- sizeTotal:= sizeTotal+size;
- Check(ABook.PropCount = sizeTotal,'size(total)');
- end;
- procedure test14_check_2(const ABook : unicodedata.TUCA_DataBook);
- var
- p : PUCA_PropItemRec;
- size, sizeTotal : Integer;
- ctx : PUCA_PropItemContextTreeRec;
- ctxItem : PUCA_PropItemContextTreeNodeRec;
- pb : PByte;
- begin
- sizeTotal := 0;
- // for 'b'
- p := ABook.Props;
- pb := PByte(p);
- size := 0;
- CheckSimpleProps(p,True,True,0,True,False);
- CheckWeigths(p,[]);
- ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
- Check(ctx^.Size>0,'ctx^.Size');
- ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
- Check(ctxItem<>nil,'ctxItem');
- Check(ctxItem^.Left=0,'ctxItem^.Left');
- Check(ctxItem^.Right=0,'ctxItem^.Right');
- Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
- Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
- pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
- Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
- pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
- CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
- size := SizeOf(TUCA_PropItemRec)+
- SizeOf(UInt24){codepoint}+
- SizeOf(TUCA_PropItemContextTreeRec.Size)+
- SizeOf(TUCA_PropItemContextTreeNodeRec) +
- (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
- (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- sizeTotal:= sizeTotal+size;
- // for 'c'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False,False);
- CheckWeigths(p,[$15F0,$0,$0]);
- size := SizeOf(TUCA_PropItemRec) +
- CalcWeigthSize([$15F0,$0,$0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(u)');
- sizeTotal:= sizeTotal+size;
- Check(ABook.PropCount = sizeTotal,'size(total)');
- end;
- procedure test14_check_3(const ABook : unicodedata.TUCA_DataBook);
- var
- p : PUCA_PropItemRec;
- size, sizeTotal, t: Integer;
- ctx : PUCA_PropItemContextTreeRec;
- ctxItem : PUCA_PropItemContextTreeNodeRec;
- pb : PByte;
- begin
- sizeTotal := 0;
- // for 'b'
- p := ABook.Props;
- pb := PByte(p);
- size := 0;
- CheckSimpleProps(p,True,True,0,True,False);
- CheckWeigths(p,[]);
- ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
- Check(ctx^.Size>0,'ctx^.Size');
- ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
- Check(ctxItem<>nil,'ctxItem');
- Check(ctxItem^.Left=0,'ctxItem^.Left');
- Check(ctxItem^.Right<>0,'ctxItem^.Right');
- Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
- Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
- pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
- Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
- pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
- CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
- t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
- (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
- (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
- Check(ctxItem^.Right = t,'ctxItem^.Right');
- ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItem)+t);
- Check(ctxItem^.Left=0,'ctxItem^.Left');
- Check(ctxItem^.Right=0,'ctxItem^.Right');
- Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
- Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
- pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
- Check(Cardinal(PUInt24(pb)^)=Ord('f'),'Context CodePoint');
- pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
- CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15F1,$0,$1, $1,0,0]);
- size := SizeOf(TUCA_PropItemRec)+
- SizeOf(UInt24){codepoint}+
- SizeOf(TUCA_PropItemContextTreeRec.Size)+
- t+
- SizeOf(TUCA_PropItemContextTreeNodeRec) +
- (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
- (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- sizeTotal:= sizeTotal+size;
- // for 'e'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False,False);
- CheckWeigths(p,[$15F0,$0,$0]);
- size := SizeOf(TUCA_PropItemRec) +
- CalcWeigthSize([$15F0,$0,$0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(e)');
- sizeTotal:= sizeTotal+size;
- // for 'f'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False,False);
- CheckWeigths(p,[$15F1,$0,$0, $1,0,0]);
- size := SizeOf(TUCA_PropItemRec) +
- CalcWeigthSize([$15F1,$0,$0, $1,0,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(f)');
- sizeTotal:= sizeTotal+size;
- Check(ABook.PropCount = sizeTotal,'size(total)');
- end;
- procedure test14_check_4(const ABook : unicodedata.TUCA_DataBook);
- var
- p : PUCA_PropItemRec;
- size, sizeTotal, t, ctxSize: Integer;
- ctx : PUCA_PropItemContextTreeRec;
- ctxItem, ctxItemParent : PUCA_PropItemContextTreeNodeRec;
- pb : PByte;
- begin
- sizeTotal := 0;
- ctxSize := 0;
- // for 'b'
- p := ABook.Props;
- pb := PByte(p);
- size := 0;
- CheckSimpleProps(p,True,True,0,True,False);
- CheckWeigths(p,[]);
- ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
- Check(ctx^.Size>0,'ctx^.Size');
- ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
- ctxItemParent := ctxItem;
- Check(ctxItem<>nil,'ctxItem');
- Check(ctxItem^.Left<>0,'ctxItem^.Left');
- Check(ctxItem^.Right<>0,'ctxItem^.Right');
- Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
- Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
- pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
- Check(Cardinal(PUInt24(pb)^)=Ord('f'),'Context CodePoint');
- pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
- CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15F1,$0,$1, $1,0,0]);
- t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
- (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
- (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
- ctxSize := ctxSize+t;
- Check(ctxItem^.Left = t,'ctxItem^.Left');
- ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItem)+t);
- Check(ctxItem^.Left=0,'ctxItem^.Left');
- Check(ctxItem^.Right=0,'ctxItem^.Right');
- Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
- Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
- pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
- Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
- pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
- CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
- t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
- (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
- (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
- ctxSize := ctxSize+t;
- ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItemParent)+ctxSize);
- Check(ctxItem^.Left=0,'ctxItem^.Left');
- Check(ctxItem^.Right=0,'ctxItem^.Right');
- Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
- Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
- pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
- Check(Cardinal(PUInt24(pb)^)=Ord('h'),'Context CodePoint');
- pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
- CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15F1,$1,$1, $1,0,0]);
- t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
- (ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
- (ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
- ctxSize := ctxSize+t;
- ctxSize := ctxSize + SizeOf(TUCA_PropItemContextTreeRec.Size);
- Check(ctx^.Size = ctxSize,'ctx^.Size');
- size := SizeOf(TUCA_PropItemRec)+
- SizeOf(UInt24){codepoint}+
- ctxSize;
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- sizeTotal:= sizeTotal+size;
- // for 'e'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False,False);
- CheckWeigths(p,[$15F0,$0,$0]);
- size := SizeOf(TUCA_PropItemRec) +
- CalcWeigthSize([$15F0,$0,$0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(e)');
- sizeTotal:= sizeTotal+size;
- // for 'f'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False,False);
- CheckWeigths(p,[$15F1,$0,$0, $1,0,0]);
- size := SizeOf(TUCA_PropItemRec) +
- CalcWeigthSize([$15F1,$0,$0, $1,0,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(f)');
- sizeTotal:= sizeTotal+size;
- // for 'g'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False,False);
- CheckWeigths(p,[$15F1,$0,$2, $1,0,0]);
- size := SizeOf(TUCA_PropItemRec) +
- CalcWeigthSize([$15F1,$0,$2, $1,0,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(g)');
- sizeTotal:= sizeTotal+size;
- // for 'h'
- p := PUCA_PropItemRec(PtrUInt(p)+size);
- CheckSimpleProps(p,False,True,0,False,False);
- CheckWeigths(p,[$15F1,$1,$0, $1,0,0]);
- size := SizeOf(TUCA_PropItemRec) +
- CalcWeigthSize([$15F1,$1,$0, $1,0,0]);
- Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
- Check(p^.Size = size,'size(h)');
- sizeTotal:= sizeTotal+size;
- Check(ABook.PropCount = sizeTotal,'size(total)');
- end;
- procedure test14();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test12_prepareWeigth(wfirst);
- test12_PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
- // --- test 1
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- test14_check_1(unicodeBook2);
- WriteLn(' -- test 1 - ok');
- WriteLn;
- // --- test 2
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,2);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- test14_check_2(unicodeBook2);
- WriteLn(' -- test 2 - ok');
- WriteLn;
- // --- test 3
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,2);
- statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('f');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- test14_check_3(unicodeBook2);
- WriteLn(' -- test 3 - ok');
- WriteLn;
- // --- test 4
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,4);
- statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
- statement.Elements[2] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
- statement.Elements[3] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Secondary,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('f');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('h');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('h')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- test14_check_4(unicodeBook2);
- WriteLn(' -- test 4 - ok');
- WriteLn;
- end;
- //------------------------------------------------------
- procedure test15_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,1);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0120,$0002);
- end;
- procedure test15_PopulateSequence(var ASequence : TOrderedCharacters);
- var
- i : Integer;
- begin
- ASequence := TOrderedCharacters.Create();
- ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- for i := 0 to ASequence.ActualLength - 1 do
- ASequence.Data[i].Changed := False;
- end;
- function ConvertEndianFromNative(
- const AData : Pointer;
- const ADataLen : Integer
- ) : Boolean;
- type
- PUCA_PropItemRec = helper.PUCA_PropItemRec;
- var
- s : PUCA_PropItemRec;
- x, y : array of Byte;
- px, py : PUCA_PropItemRec;
- begin
- if (ADataLen <= 0) then
- exit(True);
- s := PUCA_PropItemRec(AData);
- SetLength(x,ADataLen);
- px := PUCA_PropItemRec(@x[0]);
- ReverseFromNativeEndian(s,ADataLen,px);
- SetLength(y,ADataLen);
- py := PUCA_PropItemRec(@y[0]);
- ReverseToNativeEndian(px,ADataLen,py);
- Result := CompareMem(AData,@y[0],Length(x));
- end;
- procedure test15();
- var
- sequence, sequenceClean : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test12_prepareWeigth(wfirst);
- test12_PopulateSequence(sequenceClean);
- WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- //Generate the original tables
- ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
- // --- test 1
- sequence := sequenceClean.Clone();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
- WriteLn(' -- test 1 - ok');
- // --- test 2
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
- WriteLn(' -- test 2 - ok');
- WriteLn;
- // --- test 3
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,2);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
- WriteLn(' -- test 3 - ok');
- WriteLn;
- // --- test 4
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,2);
- statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('f');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
- WriteLn(' -- test 4 - ok');
- WriteLn;
- // --- test 5
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,4);
- statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
- statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
- statement.Elements[2] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
- statement.Elements[3] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Secondary,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('f');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('h');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('h')],TReorderWeigthKind.Tertiary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #5 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
- WriteLn(' -- test 5 - ok');
- WriteLn;
- // --- test 6
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,2);
- statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
- statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #6 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
- WriteLn(' -- test 6 - ok');
- WriteLn;
- // --- test 7
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,3);
- statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
- statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
- statement.Elements[2] := TReorderUnit.From(Ord('e'),[Ord('a'),Ord('d')],TReorderWeigthKind.Identity,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #7 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
- WriteLn(' -- test 7 - ok');
- WriteLn;
- // --- test 8
- sequence := sequenceClean.Clone();
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('a');
- SetLength(statement.Elements,3);
- statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
- statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('x')],TReorderWeigthKind.Primary,0);
- statement.Elements[2] := TReorderUnit.From([Ord('e'),Ord('a'),Ord('r')],[Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn(' Statement #8 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- //Generate updatet tables
- ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
- Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
- WriteLn(' -- test 8 - ok');
- WriteLn;
- end;
- procedure test16_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,3);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight($1605,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight($161D,$0020,$0002);
- end;
- procedure test16a();
- var
- sequence : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test16_prepareWeigth(wfirst);
- sequence := TOrderedCharacters.Create();
- sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- sequence.Append(TReorderUnit.From(TReorderLogicalReset.LastRegular));
- sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
- for i := 0 to sequence.ActualLength - 1 do
- sequence.Data[i].Changed := False;
- WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
- CheckInf(['a','b','c'],@unicodeBook1);
- // --- test 1
- SetLength(statement.Reset,1);
- statement.LogicalPosition := TReorderLogicalReset.LastRegular;
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
- WriteLn(' -- test 1 - ok');
- end;
- procedure test16b();
- var
- sequence : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test16_prepareWeigth(wfirst);
- sequence := TOrderedCharacters.Create();
- sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
- for i := 0 to sequence.ActualLength - 1 do
- sequence.Data[i].Changed := False;
- WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
- CheckInf(['a','b','c'],@unicodeBook1);
- // --- test 1
- SetLength(statement.Reset,1);
- statement.LogicalPosition := TReorderLogicalReset.LastRegular;
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','x'{*}],@unicodeBook2);
- WriteLn(' -- test 1 - ok');
- writeln;
- writeln;
- // test 2
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('x');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('y'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','x'{*},'y'{*}],@unicodeBook2);
- WriteLn(' -- test 2 - ok');
- end;
- procedure test16c();
- var
- sequence : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test16_prepareWeigth(wfirst);
- sequence := TOrderedCharacters.Create();
- sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
- for i := 0 to sequence.ActualLength - 1 do
- sequence.Data[i].Changed := False;
- WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
- CheckInf(['a','b','c'],@unicodeBook1);
- // --- test 1
- SetLength(statement.Reset,1);
- statement.LogicalPosition := TReorderLogicalReset.LastRegular;
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Secondary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','x'{*}],@unicodeBook2);
- WriteLn(' -- test 1 - ok');
- writeln;
- writeln;
- // test 2
- statement.Clear();
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('x');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('y'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','c','x'{*},'y'{*}],@unicodeBook2);
- WriteLn(' -- test 2 - ok');
- end;
- procedure test16d();
- var
- sequence : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test16_prepareWeigth(wfirst);
- sequence := TOrderedCharacters.Create();
- sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- sequence.Append(TReorderUnit.From(TReorderLogicalReset.LastRegular));
- sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
- for i := 0 to sequence.ActualLength - 1 do
- sequence.Data[i].Changed := False;
- WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
- CheckInf(['a','b','c'],@unicodeBook1);
- // --- test 1
- SetLength(statement.Reset,1);
- statement.LogicalPosition := TReorderLogicalReset.LastRegular;
- statement.Before := True;
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','x'{*},'b','c'],@unicodeBook2);
- WriteLn(' -- test 1 - ok');
- end;
- procedure test16e_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,5);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight(1,10,10);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight(2,10,10);
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('b'),Ord('2')]);
- p^.Weights := ToWeight(2,20,10);
- Inc(p);
- p^.CodePoints := CodePointToArray([Ord('b'),Ord('3')]);
- p^.Weights := ToWeight(2,20,20);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight(3,10,10);
- end;
- procedure test16e();
- var
- sequence : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- statement.Clear();
- test16e_prepareWeigth(wfirst);
- sequence := TOrderedCharacters.Create();
- sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- sequence.Append(TReorderUnit.From([Ord('b'),Ord('2')],TReorderWeigthKind.Secondary,3));
- sequence.Append(TReorderUnit.From([Ord('b'),Ord('3')],TReorderWeigthKind.Tertiary,4));
- sequence.Append(TReorderUnit.From(TReorderLogicalReset.LastRegular));
- sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,5));
- for i := 0 to sequence.ActualLength - 1 do
- sequence.Data[i].Changed := False;
- WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
- CheckInf(['a','b','b2','b3','c'],@unicodeBook1);
- // --- test 1
- SetLength(statement.Reset,1);
- statement.LogicalPosition := TReorderLogicalReset.LastRegular;
- statement.Before := True;
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Secondary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','x'{*},'b2','b3','c'],@unicodeBook2);
- WriteLn(' -- test 1 - ok');
- end;
- procedure test17a_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,3);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight([$1605,$0020,$0002, $17FE,$0300,$0400]);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight($161D,$0020,$0002);
- end;
- procedure test17a();
- var
- sequence : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- // test17* are about "Weights" generation
- statement.Clear();
- test17a_prepareWeigth(wfirst);
- sequence := TOrderedCharacters.Create();
- sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
- for i := 0 to sequence.ActualLength - 1 do
- sequence.Data[i].Changed := False;
- WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
- CheckInf(['a','b','c'],@unicodeBook1);
- // --- test 1
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('b');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
- WriteLn(' -- test 1 - ok');
- end;
- procedure test17b_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,3);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight([$1605,$0020,$0002]);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight($1606,$0020,$0002);
- end;
- procedure test17b();
- var
- sequence : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- // test17* are about "Weights" generation
- statement.Clear();
- test17b_prepareWeigth(wfirst);
- sequence := TOrderedCharacters.Create();
- sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
- for i := 0 to sequence.ActualLength - 1 do
- sequence.Data[i].Changed := False;
- WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
- CheckInf(['a','b','c'],@unicodeBook1);
- // --- test 1
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('b');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
- WriteLn(' -- test 1 - ok');
- end;
- procedure test17c_prepareWeigth(var AData : TUCA_LineRecArray);
- var
- p : PUCA_LineRec;
- begin
- SetLength(AData,3);
- p := @AData[Low(AData)];
- p^.CodePoints := CodePointToArray(Ord('a'));
- p^.Weights := ToWeight($15EF,$0020,$0002);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('b'));
- p^.Weights := ToWeight([$1605,$0020,$0002, $17FE,$0300,$0400]);
- Inc(p);
- p^.CodePoints := CodePointToArray(Ord('c'));
- p^.Weights := ToWeight($1606,$0020,$0002);
- end;
- procedure test17c();
- var
- sequence : TOrderedCharacters;
- statement : TReorderSequence;
- wfirst, wresult : TUCA_LineRecArray;
- i : Integer;
- unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
- begin
- // test17* are about "Weights" generation
- statement.Clear();
- test17c_prepareWeigth(wfirst);
- sequence := TOrderedCharacters.Create();
- sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
- sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
- sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
- for i := 0 to sequence.ActualLength - 1 do
- sequence.Data[i].Changed := False;
- WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
- CheckInf(['a','b','c'],@unicodeBook1);
- // --- test 1
- SetLength(statement.Reset,1);
- statement.Reset[0] := Ord('b');
- SetLength(statement.Elements,1);
- statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
- sequence.ApplyStatement(@statement);
- WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
- wresult := nil;
- ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
- WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
- ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
- CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
- WriteLn(' -- test 1 - ok');
- end;
- procedure CheckEqual(A,B : array of TUnicodeCodePoint; const AMsg : string);overload;
- var
- i : Integer;
- begin
- Check((Length(A)=Length(B)),'Length() <>');
- if (Length(A) > 0) then begin
- for i := Low(A) to High(A) do
- Check(A[i] = B[i],'%s, A[%d] <>',[AMsg,i]);
- end;
- end;
- procedure CheckEqual(A,B : TReorderUnit; const AMsg : string);overload;
- var
- i : Integer;
- begin
- Check((A.VirtualPosition=B.VirtualPosition),'VirtualPosition <>');
- Check((A.InitialPosition=B.InitialPosition),'InitialPosition <>');
- Check((A.Changed=B.Changed),'Changed <>');
- Check((A.WeigthKind=B.WeigthKind),'WeigthKind <>');
- CheckEqual(A.Context,B.Context,'Context');
- CheckEqual(A.ExpansionChars,B.ExpansionChars,'ExpansionChars');
- CheckEqual(A.Characters,B.Characters,'Characters');
- CheckEqual(A.Context,B.Context,'Context');
- end;
- procedure CheckEqual(A,B : TReorderSequence);overload;
- var
- i : Integer;
- begin
- Check((A.LogicalPosition=B.LogicalPosition),'LogicalPosition <>');
- Check((A.Before=B.Before),'Before <>');
- CheckEqual(A.Reset,B.Reset,'Reset');
- Check((Length(A.Elements)=Length(B.Elements)),'Length(Elements) <>');
- for i := Low(A.Elements) to High(A.Elements) do
- CheckEqual(A.Elements[i],B.Elements[i],Format('Elements[%d]',[i]));
- end;
- procedure CheckEqual(AActual, AExpected : UTF8String; const AMsg : string);overload;
- begin
- Check(
- (AActual=AExpected),
- Format('%s, Expected "%s" Found "%s".',[AMsg,AExpected,AActual])
- );
- end;
- procedure CheckEqual(AActual, AExpected : TSettingRec);overload;
- var
- i : Integer;
- begin
- CheckEqual(AActual.Name,AExpected.Name,'Name');
- Check((AActual.OptionValue=AExpected.OptionValue),'OptionValue <>');
- Check((Length(AActual.Values)=Length(AExpected.Values)),'Length(Values) <>');
- for i := Low(AActual.Values) to High(AExpected.Values) do
- CheckEqual(AActual.Values[i],AExpected.Values[i],Format('Values[%d]',[i]));
- end;
- function CountLines(const AStr : ansistring) : Integer;
- var
- c, i : Integer;
- begin
- c := 0;
- for i := 1 to Length(AStr) do begin
- if (AStr[i] = #10) then
- c := c+1;
- end;
- if (c = 0) and (AStr <> '') then
- c := c+1;
- Result := c;
- end;
- procedure do_test_parser(
- AText : ansistring;
- const AExpected : TReorderSequence;
- const ALineCount : Integer
- );overload;
- var
- locText : UTF8String;
- locTextPointer : PAnsiChar;
- locStartPosition,
- locMaxLen : Integer;
- locStatement : TParsedStatement;
- locNextPos,
- locLineCount : Integer;
- begin
- locText := AText;
- WriteLn('Parsing "',locText,'" ...');
- locTextPointer := @locText[1];
- locMaxLen := Length(locText);
- locStartPosition := 0;
- locNextPos := 0;
- locLineCount := 0;
- Clear(locStatement);
- Check(
- ParseStatement(
- locTextPointer,locStartPosition,locMaxLen,@locStatement,locNextPos,locLineCount
- ),
- 'Fail to Parse : "%s".', [locText]
- );
- Check((locStatement.Kind=TStatementKind.Sequence),'Fail to Parse(StatementKind) : "%s".', [locText]);
- if (locLineCount > 1) then
- WriteLn;
- WriteLn(' Next Position : ',locNextPos);
- WriteLn(' Line Count : ',locLineCount);
- if (CountLines(locText) = 1) then
- Check((locNextPos>=locMaxLen),'Next Position');
- if (ALineCount > 0) then
- Check((locLineCount=ALineCount),'Line Count');
- CheckEqual(locStatement.ReorderSequence,AExpected);
- WriteLn(' -- test ok');
- end;
- procedure do_test_parser(AText : ansistring; const AExpected : TReorderSequence);inline;overload;
- begin
- do_test_parser(AText,AExpected,1);
- end;
- procedure do_test_parser_for_setting(
- AText : ansistring;
- const ASettingName : UTF8String;
- const ASettingValues : array of UTF8String;
- const AOption : TSettingOption;
- const ALineCount : Integer
- );overload;
- var
- locText : UTF8String;
- locTextPointer : PAnsiChar;
- locStartPosition,
- locMaxLen : Integer;
- locStatement : TParsedStatement;
- locNextPos,
- locLineCount, i : Integer;
- begin
- locText := AText;
- WriteLn('Parsing "',locText,'" ...');
- locTextPointer := @locText[1];
- locMaxLen := Length(locText);
- locStartPosition := 0;
- locNextPos := 0;
- locLineCount := 0;
- Clear(locStatement);
- Check(
- ParseStatement(
- locTextPointer,locStartPosition,locMaxLen,@locStatement,locNextPos,locLineCount
- ),
- 'Fail to Parse : "%s".', [locText]
- );
- Check((locStatement.Kind=TStatementKind.Setting),'Fail to Parse(StatementKind) : "%s".', [locText]);
- if (locLineCount > 1) then
- WriteLn;
- WriteLn(' Next Position : ',locNextPos);
- WriteLn(' Line Count : ',locLineCount);
- if (CountLines(locText) = 1) then
- Check((locNextPos>=locMaxLen),'Next Position');
- if (ALineCount > 0) then
- Check((locLineCount=ALineCount),'Line Count');
- CheckEqual(locStatement.Setting.Name,ASettingName,'Setting Name');
- Check((Length(locStatement.Setting.Values) = Length(ASettingValues)),'Values should not be empty');
- for i := 0 to Length(ASettingValues)-1 do begin
- CheckEqual(locStatement.Setting.Values[i],ASettingValues[i],'Setting Value');
- end;
- Check((locStatement.Setting.OptionValue = AOption),'Option');
- WriteLn(' -- test ok');
- end;
- procedure do_test_parser_for_setting(
- AText : ansistring;
- const ASettingName : UTF8String;
- const ASettingValue : UTF8String;
- const AOption : TSettingOption
- );inline;overload;
- begin
- do_test_parser_for_setting(AText,ASettingName,ASettingValue,AOption,1);
- end;
- procedure test_parser_1();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
- do_test_parser('& [last tertiary ignorable] = a',locStatement);
- end;
- procedure do_test_parser_for_setting_multi(
- AText : ansistring;
- const ASettings : array of TSettingRec
- );overload;
- var
- locText : UTF8String;
- locTextPointer : PAnsiChar;
- locStartPosition,
- locMaxLen : Integer;
- locStatement : TParsedStatement;
- locNextPos,
- locLineCount, i, k : Integer;
- locStatements : TSettingRecArray;
- begin
- locText := AText;
- WriteLn('Parsing "',locText,'" ...');
- locTextPointer := @locText[1];
- locMaxLen := Length(locText);
- SetLength(locStatements,12);
- locStartPosition := 0;
- locNextPos := 0;
- locLineCount := 0;
- k := 0;
- while (locStartPosition < locMaxLen) do begin
- Clear(locStatement);
- if not ParseStatement(
- locTextPointer,locStartPosition,locMaxLen,@locStatement,
- locNextPos,locLineCount
- )
- then begin
- break;
- end;
- if (locStatement.Kind <> TStatementKind.Setting) then
- break;
- locStatements[k].Assign(@locStatement.Setting);
- locStartPosition := locNextPos;
- k := k+1;
- if (k > Length(ASettings)) then
- raise Exception.CreateFmt(
- '%d Statements expected, more was parsed.',
- [Length(ASettings)]
- );
- end;
- Check((k=Length(ASettings)), 'Statement Count');
- for i := 0 to Length(ASettings)-1 do begin
- try
- CheckEqual(locStatements[i],ASettings[i]);
- except
- WriteLn(Format(' Setting[%d] Fails',[i]));
- raise;
- end;
- end;
- WriteLn(' -- test ok');
- end;
- procedure test_parser_2();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
- do_test_parser('& [last tertiary ignorable] < b',locStatement);
- end;
- procedure test_parser_3();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
- do_test_parser('& [last tertiary ignorable] << c',locStatement);
- end;
- procedure test_parser_4();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Tertiary,0);
- do_test_parser('& [last tertiary ignorable] <<< d',locStatement);
- end;
- procedure test_parser_5();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(1,TReorderWeigthKind.Primary,0);
- do_test_parser('& [last tertiary ignorable] < ''\u0001''',locStatement);
- end;
- procedure test_parser_6();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(7,TReorderWeigthKind.Secondary,0);
- do_test_parser('& [last tertiary ignorable] << ''\u0007''',locStatement);
- end;
- procedure test_parser_7();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(9,TReorderWeigthKind.Secondary,0);
- do_test_parser('& [last tertiary ignorable] << ''\u0009''',locStatement);
- end;
- procedure test_parser_8();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From($000110BD,TReorderWeigthKind.Primary,0);
- do_test_parser('& [last tertiary ignorable] < ''\U000110BD''',locStatement);
- end;
- procedure test_parser_9();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x < a',locStatement);
- end;
- procedure test_parser_abreviating_1();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(3);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x <* abc',locStatement);
- end;
- procedure test_parser_abreviating_2();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(7);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x <* abcd-g',locStatement);
- end;
- procedure test_parser_abreviating_3();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(8);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x <* abcd-gp',locStatement);
- end;
- procedure test_parser_abreviating_4();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(11);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x <* abcd-gp-s',locStatement);
- end;
- procedure test_parser_abreviating_5();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(3);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
- do_test_parser('&x <<* abc',locStatement);
- end;
- procedure test_parser_abreviating_6();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(11);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Secondary,0);
- do_test_parser('&x <<* abcd-gp-s',locStatement);
- end;
- procedure test_parser_abreviating_7();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(3);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
- do_test_parser('&x <<<* abc',locStatement);
- end;
- procedure test_parser_abreviating_8();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(11);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Tertiary,0);
- do_test_parser('&x <<<* abcd-gp-s',locStatement);
- end;
- procedure test_parser_abreviating_9();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(3);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Identity,0);
- do_test_parser('&x =* abc',locStatement);
- end;
- procedure test_parser_abreviating_10();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(11);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Identity,0);
- locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Identity,0);
- do_test_parser('&x =* abcd-gp-s',locStatement);
- end;
- procedure test_parser_contraction_1();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('k');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
- do_test_parser('&k < ch',locStatement);
- end;
- procedure test_parser_contraction_2();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,3);
- locStatement.Reset[0] := Ord('a');
- locStatement.Reset[1] := Ord('b');
- locStatement.Reset[2] := Ord('c');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
- do_test_parser('&abc < ch',locStatement);
- end;
- procedure test_parser_expansion_1();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('a');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('z'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[0].ExpansionChars := CodePointToArray(Ord('e'));
- do_test_parser('&a < z/e',locStatement);
- end;
- procedure test_parser_special_char_1();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('/'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x < ''/''',locStatement);
- end;
- procedure test_parser_special_char_2();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('&'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x < ''&''',locStatement);
- end;
- procedure test_parser_special_char_3();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('<'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x < ''<''',locStatement);
- end;
- procedure test_parser_special_char_4();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('|'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x < ''|''',locStatement);
- end;
- procedure test_parser_special_char_5();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('*'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x < ''*''',locStatement);
- end;
- procedure test_parser_special_char_6();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('['),TReorderWeigthKind.Primary,0);
- do_test_parser('&x < ''[''',locStatement);
- end;
- procedure test_parser_special_char_7();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord(']'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x < '']''',locStatement);
- end;
- procedure test_parser_special_char_8();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('[');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
- do_test_parser('&''[''=a',locStatement);
- end;
- procedure test_parser_special_char_9();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('\');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Identity,0);
- do_test_parser('&''\\''=c',locStatement);
- end;
- procedure test_parser_skip_comment_1();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- do_test_parser(
- '&x #' + sLineBreak +
- ' < a',
- locStatement, 2
- );
- end;
- procedure test_parser_skip_comment_2();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- do_test_parser(
- '&x # hello' + sLineBreak +
- ' < a',
- locStatement, 2
- );
- end;
- procedure test_parser_skip_comment_3();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- do_test_parser(
- '&x # hello' + sLineBreak +
- sLineBreak +
- #9#9' ' + sLineBreak +
- ' < a',
- locStatement, 4
- );
- end;
- procedure test_parser_quoted_string_1();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From(
- [Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!')],
- TReorderWeigthKind.Primary,0
- );
- do_test_parser('&x < ''<#|/!''',locStatement);
- end;
- procedure test_parser_quoted_string_2();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From(
- [Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!'),Ord('A')],
- TReorderWeigthKind.Primary,0
- );
- do_test_parser('&x < ''<#|/!''A',locStatement);
- end;
- procedure test_parser_quoted_string_3();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From(
- [Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!')],
- TReorderWeigthKind.Primary,0
- );
- do_test_parser('&x < ''<#|/!''#',locStatement);
- end;
- procedure test_parser_quoted_string_4();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From(
- [Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!'),Ord('A')],
- TReorderWeigthKind.Primary,0
- );
- do_test_parser('&x < ''<#|/!''A#',locStatement);
- end;
- procedure test_parser_quoted_string_5();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,3);
- locStatement.Reset[0] := Ord('x');
- locStatement.Reset[1] := Ord('-');
- locStatement.Reset[2] := Ord('y');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
- do_test_parser('&''x''-''y''<<<k',locStatement);
- end;
- procedure test_parser_quoted_string_6();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From(Ord('|'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x < ''|''',locStatement);
- end;
- procedure test_parser_quoted_string_7();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From([Ord('a'),Ord('|')],TReorderWeigthKind.Primary,0);
- do_test_parser('&x < a''|''',locStatement);
- end;
- procedure test_parser_quoted_string_8();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From([Ord('a'),Ord('|'),Ord('c')],TReorderWeigthKind.Primary,0);
- do_test_parser('&x < a''|''c',locStatement);
- end;
- procedure test_parser_contexte_before_1();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From(Ord('-'),[Ord('a')],TReorderWeigthKind.Secondary,0);
- do_test_parser('&x << a|-',locStatement);
- end;
- procedure test_parser_contexte_before_2();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('a');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From(Ord('-'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
- do_test_parser('&a <<< a|-',locStatement);
- end;
- procedure test_parser_contexte_before_3();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From(
- Ord('-'),[Ord('a'),Ord('z'),Ord('k')],TReorderWeigthKind.Secondary,0
- );
- do_test_parser('&x << azk|-',locStatement);
- end;
- procedure test_parser_contexte_before_4();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From(
- [Ord('a'),Ord(':')],[Ord('a'),Ord('z'),Ord('k')],
- TReorderWeigthKind.Secondary,0
- );
- do_test_parser('&x << azk|a:',locStatement);
- end;
- procedure test_parser_placement_before_1();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.Before := True;
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Secondary,0);
- do_test_parser('&[before 2] x << k',locStatement);
- end;
- procedure test_parser_placement_before_2();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.Before := True;
- locStatement.SetElementCount(1);
- locStatement.Elements[0] :=
- TReorderUnit.From([Ord('z'),Ord('k')],TReorderWeigthKind.Tertiary,0);
- do_test_parser('&[before 3] x <<< zk',locStatement);
- end;
- procedure test_parser_placement_before_3();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.Before := True;
- locStatement.SetElementCount(1);
- locStatement.Elements[0] := TReorderUnit.From(Ord('z'),TReorderWeigthKind.Primary,0);
- do_test_parser('&[before 1] x < z',locStatement);
- end;
- procedure test_parser_multi_unit_statement_line_1();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(3);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- do_test_parser('&x < a < b < c',locStatement);
- do_test_parser('&x <a <b <c',locStatement);
- do_test_parser('&x <a<b<c',locStatement);
- end;
- procedure test_parser_multi_unit_statement_line_2();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(3);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
- do_test_parser('&x < a << b <<< c',locStatement);
- do_test_parser('&x <a <<b <<<c',locStatement);
- do_test_parser('&x <a<<b<<<c',locStatement);
- end;
- procedure test_parser_multi_unit_statement_line_3();
- var
- locStatement : TReorderSequence;
- begin
- locStatement.Clear();
- SetLength(locStatement.Reset,1);
- locStatement.Reset[0] := Ord('x');
- locStatement.SetElementCount(3);
- locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Tertiary,0);
- locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
- locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
- do_test_parser('&x <<< a << b <<< c',locStatement);
- do_test_parser('&x <<<a <<b <<<c',locStatement);
- do_test_parser('&x <<<a<<b<<<c',locStatement);
- end;
- procedure test_parser_multi_statement_line_1();
- const STATEMENT_BUFFER : UTF8String = '&r <<a &s <<< b';
- var
- locStatements : array of TReorderSequence;
- locStatement : TParsedStatement;
- locExpectedStatement : TReorderSequence;
- lineCount, i, bufferLength, k, nextPost : Integer;
- buffer : PAnsiChar;
- begin
- buffer := @STATEMENT_BUFFER[1];
- WriteLn('Parsing "',buffer,'" ...');
- bufferLength := Length(buffer);
- SetLength(locStatements,10);
- lineCount := 0;
- nextPost := 0;
- i := 0;
- k := 0;
- while (i < bufferLength) do begin
- Clear(locStatement);
- if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
- Break;
- if (locStatement.Kind <> TStatementKind.Sequence) then
- break;
- locStatements[k].Assign(@locStatement.ReorderSequence);
- i := nextPost;
- k := k+1;
- if (k > 2) then
- raise Exception.Create('2 Statements expected, more was parsed.');
- end;
- Check((k=2), 'Statement Count');
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('r');
- locExpectedStatement.SetElementCount(1);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('a'),TReorderWeigthKind.Secondary,0);
- CheckEqual(locStatements[0],locExpectedStatement);
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('s');
- locExpectedStatement.SetElementCount(1);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
- CheckEqual(locStatements[1],locExpectedStatement);
- WriteLn(' -- test ok');
- end;
- procedure test_parser_multi_statement_line_2();
- const STATEMENT_BUFFER : UTF8String = '&r <a <b <<B &s <<< b <c';
- var
- locStatements : array of TReorderSequence;
- locStatement : TParsedStatement;
- locExpectedStatement : TReorderSequence;
- lineCount, i, bufferLength, k, nextPost : Integer;
- buffer : PAnsiChar;
- begin
- buffer := @STATEMENT_BUFFER[1];
- WriteLn('Parsing "',buffer,'" ...');
- bufferLength := Length(buffer);
- SetLength(locStatements,10);
- lineCount := 0;
- nextPost := 0;
- i := 0;
- k := 0;
- while (i < bufferLength) do begin
- Clear(locStatement);
- if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
- Break;
- if (locStatement.Kind <> TStatementKind.Sequence) then
- break;
- locStatements[k].Assign(@locStatement.ReorderSequence);
- i := nextPost;
- k := k+1;
- if (k > 2) then
- raise Exception.Create('2 Statements expected, more was parsed.');
- end;
- Check((k=2), 'Statement Count');
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('r');
- locExpectedStatement.SetElementCount(3);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- locExpectedStatement.Elements[1] :=
- TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
- locExpectedStatement.Elements[2] :=
- TReorderUnit.From(Ord('B'),TReorderWeigthKind.Secondary,0);
- CheckEqual(locStatements[0],locExpectedStatement);
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('s');
- locExpectedStatement.SetElementCount(2);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
- locExpectedStatement.Elements[1] :=
- TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- CheckEqual(locStatements[1],locExpectedStatement);
- WriteLn(' -- test ok');
- end;
- procedure test_parser_multi_statement_line_3();
- const STATEMENT_BUFFER : UTF8String = '&r <a <b <<B &s <<< b <c &x <A <W';
- var
- locStatements : array of TReorderSequence;
- locStatement : TParsedStatement;
- locExpectedStatement : TReorderSequence;
- lineCount, i, bufferLength, k, nextPost : Integer;
- buffer : PAnsiChar;
- begin
- buffer := @STATEMENT_BUFFER[1];
- WriteLn('Parsing "',buffer,'" ...');
- bufferLength := Length(buffer);
- SetLength(locStatements,10);
- lineCount := 0;
- nextPost := 0;
- i := 0;
- k := 0;
- while (i < bufferLength) do begin
- Clear(locStatement);
- if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
- Break;
- if (locStatement.Kind <> TStatementKind.Sequence) then
- break;
- locStatements[k].Assign(@locStatement.ReorderSequence);
- i := nextPost;
- k := k+1;
- if (k > 3) then
- raise Exception.Create('3 Statements expected, more was parsed.');
- end;
- Check((k=3), 'Statement Count');
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('r');
- locExpectedStatement.SetElementCount(3);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- locExpectedStatement.Elements[1] :=
- TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
- locExpectedStatement.Elements[2] :=
- TReorderUnit.From(Ord('B'),TReorderWeigthKind.Secondary,0);
- CheckEqual(locStatements[0],locExpectedStatement);
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('s');
- locExpectedStatement.SetElementCount(2);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
- locExpectedStatement.Elements[1] :=
- TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- CheckEqual(locStatements[1],locExpectedStatement);
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('x');
- locExpectedStatement.SetElementCount(2);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('A'),TReorderWeigthKind.Primary,0);
- locExpectedStatement.Elements[1] :=
- TReorderUnit.From(Ord('W'),TReorderWeigthKind.Primary,0);
- CheckEqual(locStatements[2],locExpectedStatement);
- WriteLn(' -- test ok');
- end;
- procedure test_parser_multi_statement_line_4();
- const STATEMENT_BUFFER : UTF8String =
- ' &r <a <b <<B &s <<< b <c &x <A <W';
- var
- locStatements : array of TReorderSequence;
- locStatement : TParsedStatement;
- locExpectedStatement : TReorderSequence;
- lineCount, i, bufferLength, k, nextPost : Integer;
- buffer : PAnsiChar;
- begin
- buffer := @STATEMENT_BUFFER[1];
- WriteLn('Parsing "',buffer,'" ...');
- bufferLength := Length(buffer);
- SetLength(locStatements,10);
- lineCount := 0;
- nextPost := 0;
- i := 0;
- k := 0;
- while (i < bufferLength) do begin
- Clear(locStatement);
- if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
- Break;
- if (locStatement.Kind <> TStatementKind.Sequence) then
- break;
- locStatements[k].Assign(@locStatement.ReorderSequence);
- i := nextPost;
- k := k+1;
- if (k > 3) then
- raise Exception.Create('3 Statements expected, more was parsed.');
- end;
- Check((k=3), 'Statement Count');
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('r');
- locExpectedStatement.SetElementCount(3);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- locExpectedStatement.Elements[1] :=
- TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
- locExpectedStatement.Elements[2] :=
- TReorderUnit.From(Ord('B'),TReorderWeigthKind.Secondary,0);
- CheckEqual(locStatements[0],locExpectedStatement);
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('s');
- locExpectedStatement.SetElementCount(2);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
- locExpectedStatement.Elements[1] :=
- TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
- CheckEqual(locStatements[1],locExpectedStatement);
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('x');
- locExpectedStatement.SetElementCount(2);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('A'),TReorderWeigthKind.Primary,0);
- locExpectedStatement.Elements[1] :=
- TReorderUnit.From(Ord('W'),TReorderWeigthKind.Primary,0);
- CheckEqual(locStatements[2],locExpectedStatement);
- WriteLn(' -- test ok');
- end;
- procedure test_parser_multi_line_statements_1();
- const STATEMENT_BUFFER : UTF8String =
- '&r <a #123'#10 +
- '&s <<< b ';
- var
- locStatements : array of TReorderSequence;
- locStatement : TParsedStatement;
- locExpectedStatement : TReorderSequence;
- lineCount, i, bufferLength, k, nextPost : Integer;
- buffer : PAnsiChar;
- begin
- buffer := @STATEMENT_BUFFER[1];
- WriteLn('Parsing "',buffer,'" ...');
- bufferLength := Length(buffer);
- SetLength(locStatements,10);
- lineCount := 0;
- nextPost := 0;
- i := 0;
- k := 0;
- while (i < bufferLength) do begin
- Clear(locStatement);
- if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
- Break;
- if (locStatement.Kind <> TStatementKind.Sequence) then
- break;
- locStatements[k].Assign(@locStatement.ReorderSequence);
- i := nextPost;
- k := k+1;
- if (k > 2) then
- raise Exception.Create('2 Statements expected, more was parsed.');
- end;
- Check((k=2), 'Statement Count');
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('r');
- locExpectedStatement.SetElementCount(1);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
- CheckEqual(locStatements[0],locExpectedStatement);
- locExpectedStatement.Clear();
- SetLength(locExpectedStatement.Reset,1);
- locExpectedStatement.Reset[0] := Ord('s');
- locExpectedStatement.SetElementCount(1);
- locExpectedStatement.Elements[0] :=
- TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
- CheckEqual(locStatements[1],locExpectedStatement);
- WriteLn(' -- test ok');
- end;
- procedure test_parser_setting_1;
- begin
- do_test_parser_for_setting('[strength 1]','strength','1',TSettingOption.Strength);
- end;
- procedure test_parser_setting_2;
- begin
- do_test_parser_for_setting('[alternate shifted]','alternate','shifted',TSettingOption.Alternate);
- end;
- procedure test_parser_setting_3;
- begin
- do_test_parser_for_setting('[alternate non-ignorable]','alternate','non-ignorable',TSettingOption.Alternate);
- end;
- procedure test_parser_setting_4;
- begin
- do_test_parser_for_setting('[reorder Grek digit]','reorder',['Grek','digit'],TSettingOption.Reorder,1);
- end;
- procedure test_parser_setting_5;
- begin
- do_test_parser_for_setting(
- '[azerty one two three four five]','azerty',
- ['one','two','three', 'four', 'five'],TSettingOption.Unknown, 1
- );
- end;
- procedure test_parser_setting_6;
- begin
- do_test_parser_for_setting(
- '[strength'+ UNICODE_LINE_BREAK +
- ' 1]',
- 'strength',['1'],TSettingOption.Strength,2
- );
- do_test_parser_for_setting(
- '[ strength '+ UNICODE_LINE_BREAK +
- ' 1'+ UNICODE_LINE_BREAK+' ] ',
- 'strength',['1'],TSettingOption.Strength,3
- );
- end;
- procedure test_parser_setting_7;
- begin
- do_test_parser_for_setting(
- '[Backwards # sample comment'+ UNICODE_LINE_BREAK +
- ' one]',
- 'Backwards',['one'],TSettingOption.Backwards,2
- );
- end;
- procedure test_parser_setting_8;
- begin
- do_test_parser_for_setting('[STRENGTH 1]','STRENGTH','1',TSettingOption.Strength);
- do_test_parser_for_setting('[STRengTH 1]','STRengTH','1',TSettingOption.Strength);
- end;
- procedure test_parser_setting_multi_statement_1;
- begin
- do_test_parser_for_setting_multi(
- '[strength 1]' + UNICODE_LINE_BREAK +
- '[alternate shifted]',
- [ TSettingRec.From('strength',['1'],TSettingOption.Strength),
- TSettingRec.From('alternate',['shifted'],TSettingOption.Alternate)
- ]
- );
- end;
- procedure test_parser_setting_multi_statement_2;
- begin
- do_test_parser_for_setting_multi(
- '[strength 1][alternate shifted]',
- [ TSettingRec.From('strength',['1'],TSettingOption.Strength),
- TSettingRec.From('alternate',['shifted'],TSettingOption.Alternate)
- ]
- );
- end;
- procedure test_parser_setting_multi_statement_3;
- begin
- do_test_parser_for_setting_multi(
- '[strength 1] [alternate shifted]',
- [ TSettingRec.From('strength',['1'],TSettingOption.Strength),
- TSettingRec.From('alternate',['shifted'],TSettingOption.Alternate)
- ]
- );
- end;
- procedure test_parser_setting_multi_statement_4;
- begin
- do_test_parser_for_setting_multi(
- '[strength 1] [alternate non-ignorable][normalization off]',
- [ TSettingRec.From('strength',['1'],TSettingOption.Strength),
- TSettingRec.From('alternate',['non-ignorable'],TSettingOption.Alternate),
- TSettingRec.From('normalization',['off'],TSettingOption.Normalization)
- ]
- );
- end;
- procedure test_parser_setting_unicodeset_1;
- begin
- do_test_parser_for_setting(
- '[suppressContractions [d-k]]','suppressContractions',
- '[d-k]',TSettingOption.SuppressContractions
- );
- end;
- procedure test_parser_setting_unicodeset_2;
- begin
- do_test_parser_for_setting(
- '[optimize [x]]','optimize','[x]',TSettingOption.Optimize
- );
- end;
- procedure test_parser_setting_unicodeset_3;
- begin
- do_test_parser_for_setting(
- '[suppressContractions [a {ab} {ac}]]','suppressContractions',
- '[a {ab} {ac}]',TSettingOption.SuppressContractions
- );
- end;
- procedure test_parser_setting_unicodeset_4;
- begin
- do_test_parser_for_setting(
- '[suppressContractions [[a-c][a {ab}]]]','suppressContractions',
- '[[a-c][a {ab}]]',TSettingOption.SuppressContractions
- );
- end;
- //----------------------------------------------------------------------------//
- const
- COLLATION_XML_TEXT =
- '<ldml>' + UNICODE_LINE_BREAK +
- ' <identity>' + UNICODE_LINE_BREAK +
- ' <version number="1.2.3"/>' + UNICODE_LINE_BREAK +
- ' <generation date="$Date: 2014-07-08 21:39:31 -0500 (Tue, 08 Jul 2014) $"/>' + UNICODE_LINE_BREAK +
- ' <language type="xy" />' + UNICODE_LINE_BREAK +
- ' </identity>' + UNICODE_LINE_BREAK +
- ' <collations >' + UNICODE_LINE_BREAK +
- ' <defaultCollation>one</defaultCollation>' + UNICODE_LINE_BREAK +
- ' <collation type="abc" >' + UNICODE_LINE_BREAK +
- ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
- ' [import xy-u-co-private-two]' + UNICODE_LINE_BREAK +
- ' [import xy-u-co-one]' + UNICODE_LINE_BREAK +
- ' [import xy-u-co-standard]' + UNICODE_LINE_BREAK +
- ' [suppressContractions [qh]]' + UNICODE_LINE_BREAK +
- ' &w<u<v' + UNICODE_LINE_BREAK +
- ' ]]></cr>' + UNICODE_LINE_BREAK +
- ' </collation>' + UNICODE_LINE_BREAK +
- ' <collation type="one" >' + UNICODE_LINE_BREAK +
- ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
- ' &h<z<b' + UNICODE_LINE_BREAK +
- ' ]]></cr>' + UNICODE_LINE_BREAK +
- ' </collation>' + UNICODE_LINE_BREAK +
- ' <collation type="private-two" >' + UNICODE_LINE_BREAK +
- ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
- ' &f<c<<<ce' + UNICODE_LINE_BREAK +
- ' &q<qh<<<p' + UNICODE_LINE_BREAK +
- ' ]]></cr>' + UNICODE_LINE_BREAK +
- ' </collation >' + UNICODE_LINE_BREAK +
- ' <collation type="standard" >' + UNICODE_LINE_BREAK +
- ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
- ' &d<c<b<a' + UNICODE_LINE_BREAK +
- ' ]]></cr>' + UNICODE_LINE_BREAK +
- ' </collation>' + UNICODE_LINE_BREAK +
- ' </collations>' + UNICODE_LINE_BREAK +
- '</ldml>';
- COLLATION_XML_TEXT2 =
- '<ldml>' + UNICODE_LINE_BREAK +
- ' <identity>' + UNICODE_LINE_BREAK +
- ' <version number="1.2.3"/>' + UNICODE_LINE_BREAK +
- ' <generation date="$Date: 2014-07-08 21:39:31 -0500 (Tue, 08 Jul 2014) $"/>' + UNICODE_LINE_BREAK +
- ' <language type="kw" />' + UNICODE_LINE_BREAK +
- ' </identity>' + UNICODE_LINE_BREAK +
- ' <collations >' + UNICODE_LINE_BREAK +
- ' <defaultCollation>wend</defaultCollation>' + UNICODE_LINE_BREAK +
- ' <collation type="kis" >' + UNICODE_LINE_BREAK +
- ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
- ' &x<c<v' + UNICODE_LINE_BREAK +
- ' ]]></cr>' + UNICODE_LINE_BREAK +
- ' </collation>' + UNICODE_LINE_BREAK +
- ' <collation type="wend" >' + UNICODE_LINE_BREAK +
- ' <cr><![CDATA[' + UNICODE_LINE_BREAK +
- ' [import xy-u-co-one]' + UNICODE_LINE_BREAK +
- ' [backwards 2]' + UNICODE_LINE_BREAK +
- ' [alternate non-ignorable]' + UNICODE_LINE_BREAK +
- ' [normalization off]' + UNICODE_LINE_BREAK +
- ' [strength 2]' + UNICODE_LINE_BREAK +
- ' &F<<P<<<C' + UNICODE_LINE_BREAK +
- ' &L<a<<<Z' + UNICODE_LINE_BREAK +
- ' ]]></cr>' + UNICODE_LINE_BREAK +
- ' </collation>' + UNICODE_LINE_BREAK +
- ' </collations>' + UNICODE_LINE_BREAK +
- '</ldml>';
- function PrepareCollationStream(const AText : string) : TStream;
- begin
- Result := TMemoryStream.Create();
- if (AText <> '') then
- Result.Write(AText[1],(Length(AText)*SizeOf(Char)));
- end;
- function PrepareRepositoryLoader() : ICldrCollationLoader;
- var
- s : array of TStream;
- begin
- SetLength(s,2);
- s[0] := PrepareCollationStream(COLLATION_XML_TEXT);
- s[1] := PrepareCollationStream(COLLATION_XML_TEXT2);
- Result := TCldrCollationStreamLoader.Create(['xy','kw'],s) as ICldrCollationLoader;
- end;
- procedure test_collation_parser_HeaderParsing();
- var
- rep : TCldrCollationRepository;
- col : TCldrCollation;
- typ : TCldrCollationItem;
- imp : TCldrImport;
- begin
- rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
- try
- Check(rep.Find('xy')=nil, 'Find() before load.');
- Check(rep.Find('ab')=nil, 'Find() before load.');
- col := rep.Load('xy',TCldrParserMode.HeaderParsing);
- Check(col <> nil, 'load()');
- Check(col.Mode=TCldrParserMode.HeaderParsing, 'Mode');
- Check(rep.Find('xy') <> nil, 'Find() after load.');
- Check(rep.Find('ab')=nil);
- WriteLn(' - Step 1 ok');
- Check(col.DefaultType='one', 'DefaultType');
- Check(col.ItemCount=4, 'col.ItemCount');
- Check(col.Find('one')<>nil, 'col.Find()');
- Check(col.Find('private-two')<>nil, 'col.Find()');
- Check(col.Find('standard')<>nil, 'col.Find()');
- Check(col.Find('abc')<>nil, 'col.Find()');
- WriteLn(' - Step 2 ok');
- typ := col.Find('private-two');
- check(typ.IsPrivate(),'IsPrivate()');
- WriteLn(' - Step 3 ok');
- Check(col.Find('one').Imports.Count=0, 'one.imports=0');
- Check(col.Find('private-two').Imports.Count=0, 'private-two.imports=0');
- Check(col.Find('standard').Imports.Count=0, 'standard.imports=0');
- WriteLn(' - Step 4 ok');
- typ := col.Find('abc');
- check(typ.Imports.Count=0,'abc.imports=0');
- WriteLn(' - Step 5 ok');
- finally
- rep.Free();
- end;
- WriteLn(' -- test ok');
- end;
- procedure test_collation_parser_HeaderParsing_2();
- var
- rep : TCldrCollationRepository;
- col : TCldrCollation;
- typ : TCldrCollationItem;
- imp : TCldrImport;
- begin
- rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
- try
- Check(rep.Find('kw')=nil, 'Find() before load.');
- Check(rep.Find('xy')=nil, 'Find() before load.');
- col := rep.Load('kw',TCldrParserMode.HeaderParsing);
- Check(col <> nil, 'load()');
- Check(col.Mode=TCldrParserMode.HeaderParsing, 'Mode');
- Check(rep.Find('kw') <> nil, 'Find() after load.');
- WriteLn(' - Step 1 ok');
- Check(rep.Find('xy')=nil, 'Find(xy) after load.');
- WriteLn(' - Step 2 ok');
- typ := col.Find('wend');
- check(typ.Imports.Count=0,'wend.imports=0');
- WriteLn(' - Step 3 ok');
- finally
- rep.Free();
- end;
- WriteLn(' -- test ok');
- end;
- function ParseSingleStatement(
- const AText : UnicodeString;
- var AStatement : TParsedStatement
- ) : Boolean;
- var
- np, lc : Integer;
- u8 : UTF8String;
- begin
- u8 := UTF8Encode(AText);
- np := 0;
- lc := 0;
- Result := ParseStatement(@u8[1],0,Length(u8),@AStatement,np,lc);
- end;
- function ParseMultiStatements(
- AText : UnicodeString;
- AStatementList : PReorderSequence;
- const AListLength : Integer
- ) : Integer;
- var
- c, nextPos, lineCount, i : Integer;
- u8 : UTF8String;
- buffer : PAnsiChar;
- statement, lastStatement : PReorderSequence;
- ps : TParsedStatement;
- begin
- u8 := UTF8Encode(AText);
- c := Length(u8);
- buffer := @u8[1];
- nextPos := 0;
- i := 0;
- lineCount := 0;
- statement := AStatementList;
- lastStatement := AStatementList+AListLength;
- while (i < c) and (statement < lastStatement) do begin
- Clear(ps);
- if not ParseStatement(buffer,i,c,@ps,nextPos,lineCount) then
- Break;
- if (ps.Kind <> TStatementKind.Sequence) then
- break;
- statement^.Assign(@ps.ReorderSequence);
- i := nextPos;
- Inc(statement);
- end;
- Result := statement-AStatementList;
- end;
- type
- TReorderSequenceArrayRec = record
- Data : TReorderSequenceArray;
- ActualLengh : Integer;
- end;
- PReorderSequenceArrayRec = ^TReorderSequenceArrayRec;
- function CopyVisitorFunc(
- ARule : PReorderSequence;
- AOwner : TCldrCollationItem;
- AData : Pointer
- ) : Boolean;
- var
- p : PReorderSequenceArrayRec;
- begin
- p := PReorderSequenceArrayRec(AData);
- Result := (p^.ActualLengh < Length(p^.Data));
- if Result then begin
- p^.Data[p^.ActualLengh].Assign(ARule);
- p^.ActualLengh := p^.ActualLengh+1;
- end;
- end;
- procedure test_collation_parser_FullParsing();
- var
- rep : TCldrCollationRepository;
- col : TCldrCollation;
- typ : TCldrCollationItem;
- imp : TCldrImport;
- locStatement : TParsedStatement;
- locStatementList : TReorderSequenceArray;
- c, i : Integer;
- begin
- rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
- try
- Check(rep.Find('xy')=nil, 'Find() before load.');
- Check(rep.Find('ab')=nil, 'Find() before load.');
- col := rep.Load('xy',TCldrParserMode.FullParsing);
- Check(col <> nil, 'load()');
- Check(col.Mode=TCldrParserMode.FullParsing, 'Mode');
- Check(rep.Find('xy') <> nil, 'Find() after load.');
- Check(rep.Find('ab')=nil);
- WriteLn(' - Step 1 ok');
- Check(col.DefaultType='one', 'DefaultType');
- Check(col.ItemCount=4, 'col.ItemCount');
- Check(col.Find('one')<>nil, 'col.Find()');
- Check(col.Find('private-two')<>nil, 'col.Find()');
- Check(col.Find('standard')<>nil, 'col.Find()');
- Check(col.Find('abc')<>nil, 'col.Find()');
- WriteLn(' - Step 2 ok');
- typ := col.Find('private-two');
- check(typ.IsPrivate(),'IsPrivate()');
- WriteLn(' - Step 3 ok');
- Check(col.Find('one').Imports.Count=0, 'one.imports=0');
- Check(col.Find('private-two').Imports.Count=0, 'private-two.imports=0');
- Check(col.Find('standard').Imports.Count=0, 'standard.imports=0');
- WriteLn(' - Step 4 ok');
- typ := col.Find('abc');
- check(typ.Imports.Count=3,'abc.imports=3');
- imp := typ.Imports[0];
- check(imp<>nil, 'abc.Imports[0]');
- check(
- (imp.Source = 'xy') and (imp.TypeName = 'private-two'),
- 'abc.Imports[0]'
- );
- imp := typ.Imports[1];
- check(imp<>nil, 'abc.Imports[1]');
- check(
- (imp.Source = 'xy') and (imp.TypeName = 'one'),
- 'abc.Imports[1]'
- );
- imp := typ.Imports[2];
- check(imp<>nil, 'abc.Imports[2]');
- check(
- (imp.Source = 'xy') and (imp.TypeName = 'standard'),
- 'abc.Imports[2]'
- );
- Check((typ.ChangedFields = []), 'ChangedFields');
- Check(Length(typ.Rules)=5,'Length(abc.Rules)=5');
- Check((typ.Rules[3].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[3].Kind=ReorderSequence');
- Check(Length(typ.Rules[3].Reorder.Elements)=2,'Length(typ.Rules[3].Elements)=2');
- Check(typ.Rules[3].Reorder.Elements[0].WeigthKind=TReorderWeigthKind.Deletion,'typ.Rules[3].Elements[0].WeigthKind=TReorderWeigthKind.Deletion');
- Check(Length(typ.Rules[3].Reorder.Elements[0].Characters)=1,'Length(typ.Rules[3].Elements[0].Characters)=1');
- Check(typ.Rules[3].Reorder.Elements[0].Characters[0]=Ord('h'),'typ.Rules[3].Elements[0].Characters[0]=h');
- Check(typ.Rules[3].Reorder.Elements[1].Characters[0]=Ord('q'),'typ.Rules[3].Elements[1].Characters[0]=q');
- WriteLn(' - Step 5 ok');
- typ := col.Find('one');
- Check(Length(typ.Rules)>0, 'one.Rules <> nil');
- Clear(locStatement);
- Check(ParseSingleStatement('&h<z<b',locStatement));
- Check((locStatement.Kind = TStatementKind.Sequence));
- Check(typ.Rules[0].Kind=TCldrCollationRuleKind.ReorderSequence);
- CheckEqual(locStatement.ReorderSequence,typ.Rules[0].Reorder);
- WriteLn(' - Step 6 ok');
- typ := col.Find('private-two');
- Check(Length(typ.Rules)>0, 'private-two.Rules <> nil');
- c := 2;
- SetLength(locStatementList,5);
- Check(
- ParseMultiStatements(
- '&f<c<<<ce' + UNICODE_LINE_BREAK+'&q<qh<<<p ',
- @locStatementList[0],
- Length(locStatementList)
- ) = c
- );
- for i := 0 to c-1 do begin
- Check(typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence);
- CheckEqual(locStatementList[i],typ.Rules[i].Reorder);
- end;
- WriteLn(' - Step 7 ok');
- typ := col.Find('standard');
- Check((typ.Backwards = False), 'typ.Backwards = False');
- Check((typ.Normalization = True), 'typ.Normalization = True');
- Check((typ.Strength = TComparisonStrength.Tertiary), 'typ.Strength = Tertiary');
- Check((typ.VariableWeight = Low(helper.TUCA_VariableKind)), 'typ.VariableWeight = Low(TUCA_VariableKind)');
- Check(Length(typ.Rules)>0, 'standard.Rules <> nil');
- Clear(locStatement);
- Check(ParseSingleStatement('&d<c<b<a',locStatement));
- Check((locStatement.Kind = TStatementKind.Sequence));
- Check(typ.Rules[0].Kind=TCldrCollationRuleKind.ReorderSequence);
- CheckEqual(locStatement.ReorderSequence,typ.Rules[0].Reorder);
- WriteLn(' - Step 8 ok');
- finally
- rep.Free();
- end;
- WriteLn(' -- test ok');
- end;
- procedure test_collation_parser_FullParsing_2();
- var
- rep : TCldrCollationRepository;
- col : TCldrCollation;
- typ : TCldrCollationItem;
- imp : TCldrImport;
- locStatementList : TReorderSequenceArray;
- c, i : Integer;
- begin
- rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
- try
- Check(rep.Find('kw')=nil, 'Find() before load.');
- Check(rep.Find('xy')=nil, 'Find() before load.');
- col := rep.Load('kw',TCldrParserMode.FullParsing);
- Check(col <> nil, 'load()');
- Check(col.Mode=TCldrParserMode.FullParsing, 'Mode');
- Check(rep.Find('kw') <> nil, 'Find() after load.');
- WriteLn(' - Step 1 ok');
- typ := col.Find('wend');
- check(typ.Imports.Count=1,'wend.imports=1');
- imp := typ.Imports[0];
- check(imp<>nil, 'wend.Imports[0]');
- check(
- (imp.Source = 'xy') and (imp.TypeName = 'one'),
- 'wend.Imports[0]'
- );
- Check(Length(typ.Rules)>0, 'wend.Rules <> nil');
- Check((typ.Backwards = True),'typ.Backwards = True');
- Check((typ.Normalization = False), 'typ.Normalization = False');
- Check((typ.Strength = TComparisonStrength.Secondary), 'typ.Strength = Secondary');
- Check((typ.VariableWeight = ucaNonIgnorable), 'typ.VariableWeight = ucaNonIgnorable');
- Check(
- (typ.ChangedFields =
- [ cldrhelper.TCollationField.BackWards,cldrhelper.TCollationField.Alternate,
- cldrhelper.TCollationField.Normalization,cldrhelper.TCollationField.Strength
- ]
- ),
- 'ChangedFields'
- );
- c := 2;
- SetLength(locStatementList,5);
- Check(
- ParseMultiStatements(
- '&F<<P<<<C' + UNICODE_LINE_BREAK+'&L<a<<<Z ',
- @locStatementList[0],
- Length(locStatementList)
- ) = c
- );
- Check((typ.Rules[0].Kind=TCldrCollationRuleKind.Import),'typ.Rules[0].Kind=Import');
- for i := 0 to c-1 do begin
- Check((typ.Rules[i+1{Import}].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i+1{Import}].Kind=ReorderSequence');
- CheckEqual(locStatementList[i],typ.Rules[i+1{Import}].Reorder);
- end;
- WriteLn(' - Step 2 ok');
- finally
- rep.Free();
- end;
- WriteLn(' -- test ok');
- end;
- procedure test_collation_parser_complete_rules();
- var
- rep : TCldrCollationRepository;
- col : TCldrCollation;
- typ, xtyp : TCldrCollationItem;
- c, i, k : Integer;
- locData : TReorderSequenceArrayRec;
- begin
- rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
- try
- col := rep.Load('xy',TCldrParserMode.FullParsing);
- SetLength(locData.Data,23);
- typ := col.Find('one');
- locData.ActualLengh := 0;
- Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(one) - 1');
- Check(locData.ActualLengh = 1, 'ForEachRule(one) - 2');
- Check((typ.Rules[0].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[0].Kind=ReorderSequence');
- CheckEqual(locData.Data[0],typ.Rules[0].Reorder);
- WriteLn(' - Step 1 ok');
- typ := col.Find('private-two');
- locData.ActualLengh := 0;
- Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(private-two) - 1');
- Check(locData.ActualLengh = 2, 'ForEachRule(private-two) - 2');
- for i := 0 to locData.ActualLengh-1 do begin
- Check((typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i].Kind=ReorderSequence');
- CheckEqual(locData.Data[i],typ.Rules[i].Reorder);
- end;
- WriteLn(' - Step 2 ok');
- typ := col.Find('abc');
- locData.ActualLengh := 0;
- SetLength(locData.Data,23);
- Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(abc) - 1');
- Check(
- locData.ActualLengh = 2+2{private-two}+1{one}+1{standard},
- 'ForEachRule(abc) - 2'
- );
- xtyp := col.Find('private-two');
- c := 0;
- for i := 0 to Length(xtyp.Rules)-1 do begin
- Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
- CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
- end;
- c := c+Length(xtyp.Rules);
- xtyp := col.Find('one');
- for i := 0 to Length(xtyp.Rules)-1 do begin
- Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
- CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
- end;
- c := c+Length(xtyp.Rules);
- xtyp := col.Find('standard');
- for i := 0 to Length(xtyp.Rules)-1 do begin
- Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
- CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
- end;
- k := 3{import statemnts};
- c := c+Length(xtyp.Rules);
- for i := k to Length(typ.Rules)-1 do begin
- Check((typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i].Kind=ReorderSequence');
- CheckEqual(locData.Data[c+(i-k)],typ.Rules[i].Reorder);
- end;
- WriteLn(' - Step 3 ok');
- finally
- rep.Free();
- end;
- WriteLn(' -- test ok');
- end;
- procedure test_collation_parser_complete_rules_2();
- var
- rep : TCldrCollationRepository;
- col, xcol : TCldrCollation;
- typ, xtyp : TCldrCollationItem;
- locData : TReorderSequenceArrayRec;
- c, i, k : Integer;
- begin
- rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
- try
- col := rep.Load('kw',TCldrParserMode.FullParsing);
- SetLength(locData.Data,23);
- typ := col.Find('wend');
- locData.ActualLengh := 0;
- Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(wend) - 1');
- Check(locData.ActualLengh = 2+1{one}, 'ForEachRule(wend) - 2');
- xcol := rep.Find('xy');
- Check(xcol <> nil);
- xtyp := xcol.Find('one');
- Check(xtyp <> nil);
- Check(Length(xtyp.Rules)=1);
- c := 0;
- for i := 0 to Length(xtyp.Rules)-1 do begin
- Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
- CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
- end;
- k := 1 {imports};
- c := c+Length(xtyp.Rules);
- for i := k to Length(typ.Rules)-1 do begin
- Check((typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i].Kind=ReorderSequence');
- CheckEqual(locData.Data[c+i-k],typ.Rules[i].Reorder);
- end;
- WriteLn(' - Step 1 ok');
- finally
- rep.Free();
- end;
- WriteLn(' -- test ok');
- end;
- procedure test_unicode_set_1();
- var
- x : TUnicodeSet;
- i : Integer;
- s : string;
- begin
- x := TUnicodeSet.Create();
- try
- for i := 0 to 256-1 do
- Check(not x.Contains(AnsiChar(i)));
- WriteLn(' - Stept 1 ok');
- s := 'azerty';
- x.AddPattern(Format('[%s]',[s]));
- for i := 1 to Length(s) do
- Check(x.Contains(s[i]));
- WriteLn(' - Stept 2 ok');
- finally
- x.Free();
- end;
- WriteLn(' -- test ok');
- end;
- procedure test_unicode_set_2();
- var
- x : TUnicodeSet;
- i : Integer;
- begin
- x := TUnicodeSet.Create();
- try
- x.AddPattern('[d-h]');
- for i := Ord('d') to Ord('h') do
- Check(x.Contains(Char(i)));
- WriteLn(' - Stept 1 ok');
- for i := Ord('a') to Ord('d')-1 do
- Check(not x.Contains(Char(i)));
- WriteLn(' - Stept 2 ok');
- for i := Ord('h')+1 to 256-1 do
- Check(not x.Contains(Char(i)));
- WriteLn(' - Stept 3 ok');
- finally
- x.Free();
- end;
- WriteLn(' -- test ok');
- end;
- procedure test_unicode_set_3();
- var
- x : TUnicodeSet;
- s, s1 : string;
- begin
- x := TUnicodeSet.Create();
- try
- s := 'azerty';
- x.AddPattern(Format('[{%s}]',[s]));
- Check(x.Contains(s));
- WriteLn(' - Stept 1 ok');
- Check(not x.Contains(s+'12'));
- WriteLn(' - Stept 2 ok');
- Check(not x.Contains('qs'+s));
- WriteLn(' - Stept 3 ok');
- s1 := s+'x';
- x.AddPattern(Format('[{%s}]',[s1]));
- Check(x.Contains(s));
- Check(x.Contains(s1));
- WriteLn(' - Stept 4 ok');
- finally
- x.Free();
- end;
- WriteLn(' -- test ok');
- end;
- procedure test_collation_table_empty();
- {var
- stackItem : TCollationTable; }
- begin
- end;
- end.
|