1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169 |
- { 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 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();
- 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]' + 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)=2,'Length(abc.Rules)=2');
- Check(Length(typ.Rules[0].Elements)=2,'Length(typ.Rules[0].Elements)=2');
- Check(typ.Rules[0].Elements[0].WeigthKind=TReorderWeigthKind.Deletion,'typ.Rules[0].Elements[0].WeigthKind=TReorderWeigthKind.Deletion');
- Check(Length(typ.Rules[0].Elements[0].Characters)=1,'Length(typ.Rules[0].Elements[0].Characters)=1');
- Check(typ.Rules[0].Elements[0].Characters[0]=Ord('h'),'typ.Rules[0].Elements[0].Characters[0]=h');
- Check(typ.Rules[0].Elements[1].Characters[0]=Ord('q'),'typ.Rules[0].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));
- CheckEqual(locStatement.ReorderSequence,typ.Rules[0]);
- 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
- CheckEqual(locStatementList[i],typ.Rules[i]);
- 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));
- CheckEqual(locStatement.ReorderSequence,typ.Rules[0]);
- 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
- );
- for i := 0 to c-1 do
- CheckEqual(locStatementList[i],typ.Rules[i]);
- 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 : 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');
- CheckEqual(locData.Data[0],typ.Rules[0]);
- 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
- CheckEqual(locData.Data[i],typ.Rules[i]);
- 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
- CheckEqual(locData.Data[c+i],xtyp.Rules[i]);
- c := c+Length(xtyp.Rules);
- xtyp := col.Find('one');
- for i := 0 to Length(xtyp.Rules)-1 do
- CheckEqual(locData.Data[c+i],xtyp.Rules[i]);
- c := c+Length(xtyp.Rules);
- xtyp := col.Find('standard');
- for i := 0 to Length(xtyp.Rules)-1 do
- CheckEqual(locData.Data[c+i],xtyp.Rules[i]);
- c := c+Length(xtyp.Rules);
- for i := 0 to Length(typ.Rules)-1 do
- CheckEqual(locData.Data[c+i],typ.Rules[i]);
- WriteLn(' - Step 2 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 : 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
- CheckEqual(locData.Data[c+i],xtyp.Rules[i]);
- c := c+Length(xtyp.Rules);
- for i := 0 to Length(typ.Rules)-1 do
- CheckEqual(locData.Data[c+i],typ.Rules[i]);
- 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.
|