Oberon.Execution.Test 203 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827
  1. # Oberon language test and validation suite
  2. # options --mayTrap --prolog="Compiler.Compile -p=Win32G TesterInput.txt" --command="SystemTools.Free Test Dummy B A;SystemTools.Load Test" --logFile="FoxExecutionTest.Log" --result="Oberon.Execution.Test.Diff"
  3. # test halt and assert statements and simple procedure call (basics for the test suite)
  4. positive: empty module
  5. MODULE Test;
  6. END Test.
  7. negative: simple halt
  8. MODULE Test;
  9. BEGIN HALT (1234);
  10. END Test.
  11. positive: satisified assertion
  12. MODULE Test;
  13. VAR b: BOOLEAN;
  14. BEGIN b := TRUE; ASSERT (b);
  15. END Test.
  16. negative: unsatisified assertion
  17. MODULE Test;
  18. VAR b: BOOLEAN;
  19. BEGIN b := FALSE; ASSERT (b);
  20. END Test.
  21. negative: simple halt in global procedure
  22. MODULE Test;
  23. PROCEDURE Procedure;
  24. BEGIN HALT (1234);
  25. END Procedure;
  26. BEGIN Procedure;
  27. END Test.
  28. positive: satisified assertion in global procedure
  29. MODULE Test;
  30. PROCEDURE Procedure;
  31. VAR b: BOOLEAN;
  32. BEGIN b := TRUE; ASSERT (b);
  33. END Procedure;
  34. BEGIN Procedure;
  35. END Test.
  36. negative: unsatisified assertion in global procedure
  37. MODULE Test;
  38. PROCEDURE Procedure;
  39. VAR b: BOOLEAN;
  40. BEGIN b := FALSE; ASSERT (b);
  41. END Procedure;
  42. BEGIN Procedure;
  43. END Test.
  44. positive: parameterless procedure call
  45. MODULE Test;
  46. VAR called: BOOLEAN;
  47. PROCEDURE P;
  48. BEGIN
  49. called := TRUE;
  50. END P;
  51. BEGIN
  52. called := FALSE;
  53. P;
  54. ASSERT(called);
  55. END Test.
  56. # basic types storage test
  57. positive: Char stored in PAF
  58. MODULE Test;
  59. PROCEDURE Char;
  60. VAR a,b: CHAR;
  61. BEGIN
  62. a := 'a';
  63. b := a;
  64. ASSERT(b = 'a');
  65. END Char;
  66. BEGIN
  67. Char;
  68. END Test.
  69. positive: Shortint stored in PAF
  70. MODULE Test;
  71. PROCEDURE Shortint;
  72. VAR a,b: SHORTINT;
  73. BEGIN
  74. a := 13;
  75. b := a;
  76. ASSERT(b = 13);
  77. END Shortint;
  78. BEGIN
  79. Shortint;
  80. END Test.
  81. positive: Integer stored in PAF
  82. MODULE Test;
  83. PROCEDURE Integer;
  84. VAR a,b: INTEGER;
  85. BEGIN
  86. a := 2233;
  87. b := a;
  88. ASSERT(b = 2233);
  89. END Integer;
  90. BEGIN
  91. Integer;
  92. END Test.
  93. positive: Longint stored in PAF
  94. MODULE Test;
  95. PROCEDURE Longint;
  96. VAR a,b: LONGINT;
  97. BEGIN
  98. a := 70800;
  99. b := a;
  100. ASSERT(b = 70800);
  101. END Longint;
  102. BEGIN
  103. Longint;
  104. END Test.
  105. positive: Hugeint stored in PAF
  106. MODULE Test;
  107. PROCEDURE Hugeint;
  108. VAR a,b: HUGEINT;
  109. BEGIN
  110. a := 70800;
  111. b := a;
  112. ASSERT(b = 70800);
  113. END Hugeint;
  114. BEGIN
  115. Hugeint;
  116. END Test.
  117. positive: Real stored in PAF
  118. MODULE Test;
  119. PROCEDURE Real;
  120. VAR a,b: REAL;
  121. BEGIN
  122. a := 888;
  123. b := a;
  124. ASSERT(b = 888);
  125. END Real;
  126. BEGIN
  127. Real;
  128. END Test.
  129. positive: Longreal stored in PAF
  130. MODULE Test;
  131. PROCEDURE Longreal;
  132. VAR a,b: LONGREAL;
  133. BEGIN
  134. a := 888;
  135. b := a;
  136. ASSERT(b = 888);
  137. END Longreal;
  138. BEGIN
  139. Longreal;
  140. END Test.
  141. positive: Set stored in PAF
  142. MODULE Test;
  143. PROCEDURE Set;
  144. VAR a,b: SET;
  145. BEGIN
  146. a := {1,2,8,9,31};
  147. b := a;
  148. ASSERT(b = {1,2,8,9,31});
  149. END Set;
  150. BEGIN
  151. Set;
  152. END Test.
  153. positive: Boolean stored in PAF
  154. MODULE Test;
  155. PROCEDURE Boolean;
  156. VAR a,b,c: BOOLEAN;
  157. BEGIN
  158. a := FALSE;
  159. b := TRUE;
  160. c := FALSE;
  161. ASSERT(b = TRUE);
  162. END Boolean;
  163. BEGIN
  164. Boolean;
  165. END Test.
  166. # constant declarations
  167. positive: expression containing a constant
  168. MODULE Test;
  169. CONST N = 10000;
  170. VAR i: INTEGER;
  171. BEGIN i := N - 1; ASSERT (i = 9999);
  172. END Test.
  173. positive: lengths of string constants
  174. MODULE Test;
  175. CONST String = "This string is not empty";
  176. CONST Copy = String;
  177. PROCEDURE Assert (CONST str: ARRAY OF CHAR);
  178. BEGIN ASSERT (LEN (str) # 0);
  179. END Assert;
  180. BEGIN Assert (String); Assert (Copy);
  181. END Test.
  182. # basic type declarations
  183. positive: constant boolean assignment
  184. MODULE Test;
  185. VAR b: BOOLEAN;
  186. BEGIN b := TRUE; ASSERT (b = TRUE);
  187. END Test.
  188. positive: variable boolean assignment
  189. MODULE Test;
  190. VAR b1, b2: BOOLEAN;
  191. BEGIN b1 := TRUE; b2 := FALSE; b2 := b1; ASSERT (b2 = TRUE);
  192. END Test.
  193. positive: boolean equality
  194. MODULE Test;
  195. VAR b1, b2: BOOLEAN;
  196. BEGIN b1 := TRUE; b2 := b1; ASSERT (b1 = b2); b1 := FALSE; b2 := b1; ASSERT (b1 = b2);
  197. END Test.
  198. positive: array of boolean values
  199. MODULE Test;
  200. VAR b: ARRAY 2 OF BOOLEAN;
  201. BEGIN b[1] := TRUE; ASSERT (b[1]);
  202. END Test.
  203. positive: constant character assignment
  204. MODULE Test;
  205. VAR c: CHAR;
  206. BEGIN c := 'c'; ASSERT (c = 'c');
  207. END Test.
  208. positive: variable character assignment
  209. MODULE Test;
  210. VAR c1, c2: CHAR;
  211. BEGIN c1 := 'A'; c2 := 'B'; c2 := c1; ASSERT (c2 = 'A');
  212. END Test.
  213. positive: char array variable assignment
  214. MODULE Test;
  215. VAR v: ARRAY 2 OF CHAR;
  216. BEGIN v[0] := CHR(92); ASSERT (ORD(v[0]) = 92);
  217. END Test.
  218. positive: heximal character value assignment
  219. MODULE Test;
  220. VAR c: CHAR;
  221. BEGIN c := 020X; ASSERT (c = ' ');
  222. END Test.
  223. positive: constant integer assignment
  224. MODULE Test;
  225. VAR i: INTEGER;
  226. BEGIN i := 2; ASSERT (i = 2);
  227. END Test.
  228. positive: variable integer assignment
  229. MODULE Test;
  230. VAR i1, i2: INTEGER;
  231. BEGIN i1 := 45; i2 := 64; i2 := i1; ASSERT (i1 = 45);
  232. END Test.
  233. positive: constant real assignment
  234. MODULE Test;
  235. VAR r: REAL;
  236. BEGIN r := 2; ASSERT (r = 2);
  237. END Test.
  238. positive: variable real assignment
  239. MODULE Test;
  240. VAR r1, r2: REAL;
  241. BEGIN r1 := 2.25; r2 := 3.75; r2 := r1; ASSERT (r1 = 2.25);
  242. END Test.
  243. positive: real value assignment to real variable
  244. MODULE Test;
  245. VAR r: REAL;
  246. BEGIN r := 1.25; ASSERT (r = 1.25);
  247. END Test.
  248. positive: constant set assignment
  249. MODULE Test;
  250. VAR s: SET;
  251. BEGIN s := {1}; ASSERT (1 IN s);
  252. END Test.
  253. positive: variable set assignment
  254. MODULE Test;
  255. VAR s1, s2: SET; i: INTEGER;
  256. BEGIN i := 5; s1 := {i}; s2 := {}; s2 := s1; ASSERT (i IN s2);
  257. END Test.
  258. positive: set inclusions
  259. MODULE Test;
  260. VAR s: SET; i, j, k: INTEGER;
  261. BEGIN i := 1; j := 3; k := 7; s := {1, 3, 5..8}; ASSERT ((i IN s) & (j IN s) & (k IN s));
  262. END Test.
  263. negative: set value out of bounds at maximum
  264. MODULE Test;
  265. VAR n: INTEGER; s: SET;
  266. BEGIN n := MAX(SET) + 1; s := {n};
  267. END Test.
  268. negative: set value out of bounds at minimum
  269. MODULE Test;
  270. VAR n: INTEGER; s: SET;
  271. BEGIN n := MIN(SET) - 1; s := {n};
  272. END Test.
  273. # array type declarations
  274. negative: array out of bounds while reading
  275. MODULE Test;
  276. VAR a: ARRAY 1 OF INTEGER; r, i: INTEGER;
  277. BEGIN a[0] := 0; i := 1; r := a[i];
  278. END Test.
  279. negative: array out of bounds while writing
  280. MODULE Test;
  281. VAR a: ARRAY 1 OF INTEGER; i: INTEGER;
  282. BEGIN i := 1; a[i] := 0;
  283. END Test.
  284. positive: index of array element is record variable
  285. MODULE Test;
  286. TYPE R = RECORD i: INTEGER END;
  287. VAR ai: ARRAY 2 OF INTEGER; ar: ARRAY 2 OF R;
  288. BEGIN ai[0] := 0; ai[1] := 5; ar[0].i := 1; ASSERT (ai[ar[ai[0]].i] = 5);
  289. END Test.
  290. positive: one-dimensional array element assignment
  291. MODULE Test;
  292. VAR a: ARRAY 2 OF CHAR;
  293. BEGIN a[1] := 'c'; ASSERT (a[1] = 'c');
  294. END Test.
  295. positive: two-dimensional array element assignment
  296. MODULE Test;
  297. VAR a: ARRAY 2, 2 OF BOOLEAN;
  298. BEGIN a[1, 1] := TRUE; ASSERT (a[1, 1] = TRUE);
  299. END Test.
  300. # record type declarations
  301. positive: record initialization
  302. MODULE Test;
  303. VAR r: RECORD i: INTEGER END;
  304. BEGIN r.i := 5; ASSERT (r.i = 5);
  305. END Test.
  306. positive: record copies
  307. MODULE Test;
  308. VAR a, b: RECORD i, j: INTEGER END;
  309. BEGIN a.i := 1; a.j := 2; b := a; ASSERT (b.i = 1); ASSERT (b.j = 2);
  310. END Test.
  311. # pointer type declarations
  312. positive: dynamic record allocation with new
  313. MODULE Test;
  314. VAR p: POINTER TO RECORD x: INTEGER END;
  315. BEGIN NEW (p); ASSERT (p # NIL); p.x := 3; ASSERT (p.x = 3);
  316. END Test.
  317. positive: valid type guard test
  318. MODULE Test;
  319. TYPE R1 = RECORD END; R2 = RECORD (R1) END; P1 = POINTER TO R1; P2 = POINTER TO R2;
  320. VAR p1: P1; p2: P2;
  321. BEGIN NEW (p2); p1 := p2; p2 := p1(P2);
  322. END Test.
  323. # procedure type declarations
  324. positive: procedure type with value parameter INTEGER
  325. MODULE Test;
  326. VAR a: ARRAY 5 OF INTEGER; i: INTEGER; r: INTEGER;
  327. PROCEDURE Iterate (VAR a: ARRAY OF INTEGER; p : PROCEDURE (r: INTEGER));
  328. VAR i: LONGINT;
  329. BEGIN FOR i := 0 TO LEN (a) - 1 DO p (a[i]) END;
  330. END Iterate;
  331. PROCEDURE Accummulate (v: INTEGER);
  332. BEGIN r := r + v;
  333. END Accummulate;
  334. BEGIN FOR i := 0 TO 4 DO a[i] := i END; r := 0; Iterate (a, Accummulate); ASSERT (r = 10);
  335. END Test.
  336. positive: procedure type with value parameter REAL
  337. MODULE Test;
  338. VAR a: ARRAY 5 OF REAL; i: INTEGER; r: REAL;
  339. PROCEDURE Iterate (VAR a: ARRAY OF REAL; p : PROCEDURE (r: REAL));
  340. VAR i: LONGINT;
  341. BEGIN FOR i := 0 TO LEN (a) - 1 DO p (a[i]) END;
  342. END Iterate;
  343. PROCEDURE Accummulate (v: REAL);
  344. BEGIN r := r + v;
  345. END Accummulate;
  346. BEGIN FOR i := 0 TO 4 DO a[i] := i END; r := 0; Iterate (a, Accummulate); ASSERT (r = 10);
  347. END Test.
  348. positive: procedure type with var parameter INTEGER
  349. MODULE Test;
  350. VAR i: INTEGER; k: INTEGER; p: PROCEDURE (VAR r: INTEGER; b: INTEGER);
  351. PROCEDURE Accummulate (VAR r: INTEGER; v: INTEGER);
  352. BEGIN r := r + v;
  353. END Accummulate;
  354. BEGIN k := 0; p := Accummulate; FOR i := 0 TO 4 DO p (k, i) END; ASSERT (k = 10);
  355. END Test.
  356. positive: procedure type with var parameter REAL
  357. MODULE Test;
  358. VAR i: INTEGER; k: REAL; p: PROCEDURE (VAR r: REAL; b: REAL);
  359. PROCEDURE Accummulate (VAR r: REAL; v: REAL);
  360. BEGIN r := r + v;
  361. END Accummulate;
  362. BEGIN k := 0; p := Accummulate; FOR i := 0 TO 4 DO p (k, i) END; ASSERT (k = 10);
  363. END Test.
  364. positive: procedure type with result type INTEGER
  365. MODULE Test;
  366. VAR r: INTEGER; p: PROCEDURE (a, b: INTEGER): INTEGER;
  367. PROCEDURE Add (a, b: INTEGER): INTEGER;
  368. BEGIN RETURN a + b;
  369. END Add;
  370. BEGIN p := Add; r := p (3, 4); ASSERT (r = 7);
  371. END Test.
  372. positive: procedure type with result type REAL
  373. MODULE Test;
  374. VAR r: REAL; p: PROCEDURE (a, b: REAL): REAL;
  375. PROCEDURE Add (a, b: REAL): REAL;
  376. BEGIN RETURN a + b;
  377. END Add;
  378. BEGIN p := Add; r := p (3, 4); ASSERT (r = 7);
  379. END Test.
  380. positive: procedure type with result type in record INTEGER
  381. MODULE Test;
  382. VAR r: INTEGER; p: RECORD p: PROCEDURE (a, b: INTEGER): INTEGER END;
  383. PROCEDURE Add (a, b: INTEGER): INTEGER;
  384. BEGIN RETURN a + b;
  385. END Add;
  386. BEGIN p.p := Add; r := p.p (3, 4); ASSERT (r = 7);
  387. END Test.
  388. positive: procedure type with result type in record REAL
  389. MODULE Test;
  390. VAR r: REAL; p: RECORD p: PROCEDURE (a, b: REAL): REAL END;
  391. PROCEDURE Add (a, b: REAL): REAL;
  392. BEGIN RETURN a + b;
  393. END Add;
  394. BEGIN p.p := Add; r := p.p (3, 4); ASSERT (r = 7);
  395. END Test.
  396. positive: procedure array
  397. MODULE Test;
  398. VAR i: INTEGER; a: ARRAY 10 OF PROCEDURE (VAR a: INTEGER);
  399. PROCEDURE Add3 (VAR v: INTEGER);
  400. BEGIN INC (v, 3);
  401. END Add3;
  402. BEGIN i := 3; a[6] := Add3; a[6] (i); ASSERT (i = 6); a[i](i); ASSERT (i = 9);
  403. END Test.
  404. positive: procedure array with return type
  405. MODULE Test;
  406. VAR i: INTEGER; a: ARRAY 10 OF PROCEDURE (i: INTEGER): INTEGER;
  407. PROCEDURE Add2 (v: INTEGER): INTEGER;
  408. BEGIN RETURN v + 2;
  409. END Add2;
  410. BEGIN a[3] := Add2; i := a[3](1); ASSERT (i = 3); INC (i, a[i](i)); ASSERT (i = 8);
  411. END Test.
  412. # conversions
  413. positive: constant positive real to integer conversion
  414. MODULE Test;
  415. VAR i: LONGINT;
  416. BEGIN i := ENTIER (3.5); ASSERT (i = 3);
  417. END Test.
  418. positive: constant negative real to integer conversion
  419. MODULE Test;
  420. VAR i: LONGINT;
  421. BEGIN i := ENTIER (-3.5); ASSERT (i = -4);
  422. END Test.
  423. positive: positive real to integer conversion
  424. MODULE Test;
  425. VAR r: REAL; i: LONGINT;
  426. BEGIN r := 3.5; i := ENTIER (r); ASSERT (i = 3);
  427. END Test.
  428. positive: negative real to integer conversion
  429. MODULE Test;
  430. VAR r: REAL; i: LONGINT;
  431. BEGIN r := -3.5; i := ENTIER (r); ASSERT (i = -4);
  432. END Test.
  433. # variable declarations
  434. positive: two-dimensional array assignment
  435. MODULE Test;
  436. VAR a: ARRAY 8, 12 OF INTEGER;
  437. BEGIN a[1, 2] := 3; ASSERT (a[1][2] = 3);
  438. END Test.
  439. positive: two-dimensional open array assignment
  440. MODULE Test;
  441. VAR a: ARRAY 8, 12 OF INTEGER;
  442. PROCEDURE P (VAR b: ARRAY OF ARRAY OF INTEGER);
  443. BEGIN b[1][2] := 3;
  444. END P;
  445. BEGIN P (a); ASSERT (a[1][2] = 3);
  446. END Test.
  447. # operations
  448. positive: logical operations
  449. MODULE Test;
  450. VAR a, b: BOOLEAN;
  451. BEGIN
  452. a := FALSE; ASSERT (~a);
  453. b := FALSE; ASSERT (~a & ~b); ASSERT (~a OR ~b);
  454. b := TRUE; ASSERT (~a & b); ASSERT (~a OR b);
  455. a := TRUE; ASSERT (a);
  456. b := FALSE; ASSERT (a & ~b); ASSERT (a OR ~b);
  457. b := TRUE; ASSERT (a & b); ASSERT (a OR b);
  458. END Test.
  459. positive: arithmetic operations
  460. MODULE Test;
  461. VAR a, b: INTEGER;
  462. BEGIN
  463. a := 9; b := 7;
  464. ASSERT (+a = 9); ASSERT (+b = 7);
  465. ASSERT (-a = -9); ASSERT (-b = -7);
  466. ASSERT (a + b = 16); ASSERT (b + a = 16);
  467. ASSERT (a - b = 2); ASSERT (b - a = -2);
  468. ASSERT (a * b = 63); ASSERT (b * a = 63);
  469. ASSERT (a DIV b = 1); ASSERT (b DIV a = 0);
  470. ASSERT (a MOD b = 2); ASSERT (b MOD a = 7);
  471. END Test.
  472. positive: set operations
  473. MODULE Test;
  474. VAR a, b, c: SET;
  475. BEGIN
  476. a := {0, 1, 2}; ASSERT (a = {0..2}); ASSERT ((0 IN a) & (1 IN a) & (2 IN a) & ~(3 IN a) & ~(4 IN a));
  477. b := {2, 3, 4}; ASSERT (b = {2..4}); ASSERT (~(0 IN b) & ~(1 IN b) & (2 IN b) & (3 IN b) & (4 IN b));
  478. c := a + b; ASSERT (c = {0..4}); ASSERT ((0 IN c) & (1 IN c) & (2 IN c) & (3 IN c) & (4 IN c));
  479. c := a - b; ASSERT (c = {0..1}); ASSERT ((0 IN c) & (1 IN c) & ~(2 IN c) & ~(3 IN c) & ~(4 IN c));
  480. c := a * b; ASSERT (c = {2..2}); ASSERT (~(0 IN c) & ~(1 IN c) & (2 IN c) & ~(3 IN c) & ~(4 IN c));
  481. c := a / b; ASSERT (c = {0..1, 3..4}); ASSERT ((0 IN c) & (1 IN c) & ~(2 IN c) & (3 IN c) & (4 IN c));
  482. END Test.
  483. positive: relations
  484. MODULE Test;
  485. VAR ai, bi: INTEGER; as, bs: SET; ar, br: REAL;
  486. BEGIN
  487. ai := 0; bi := 1; ASSERT (~(ai = bi)); ASSERT (ai # bi); ASSERT (ai < bi); ASSERT (ai <= bi); ASSERT (~(ai > bi)); ASSERT (~(ai >= bi));
  488. as := {1}; bs := {1, 2}; ASSERT (~(as = bs)); ASSERT (as # bs); ASSERT (as < bs); ASSERT (as <= bs); ASSERT (~(as > bs)); ASSERT (~(as >= bs));
  489. ar := 0; br := 1; ASSERT (~(ar = br)); ASSERT (ar # br); ASSERT (ar < br); ASSERT (ar <= br); ASSERT (~(ar > br)); ASSERT (~(ar >= br));
  490. END Test.
  491. # complement
  492. positive: complement on booleans
  493. MODULE Test;
  494. VAR value: BOOLEAN;
  495. BEGIN
  496. value := TRUE; ASSERT (value); ASSERT (~~value);
  497. value := FALSE; ASSERT (~value); ASSERT (~~~value);
  498. END Test.
  499. # relational operations
  500. positive: relational operations on booleans
  501. MODULE Test;
  502. VAR value: BOOLEAN;
  503. BEGIN
  504. value := TRUE;
  505. ASSERT (value = TRUE); ASSERT (~(value = FALSE)); ASSERT (value = value);
  506. ASSERT (value # FALSE); ASSERT (~(value # TRUE)); ASSERT (~(value # value));
  507. value := FALSE;
  508. ASSERT (value = FALSE); ASSERT (~(value = TRUE)); ASSERT (value = value);
  509. ASSERT (value # TRUE); ASSERT (~(value # FALSE)); ASSERT (~(value # value));
  510. END Test.
  511. positive: relational operations on characters
  512. MODULE Test;
  513. VAR value: CHAR;
  514. BEGIN
  515. value := 'a';
  516. ASSERT (value = 'a'); ASSERT (~(value = 'b')); ASSERT (value = value);
  517. ASSERT (value # 'b'); ASSERT (~(value # 'a')); ASSERT (~(value # value));
  518. ASSERT (value < 'z'); ASSERT (~(value < 0X)); ASSERT (~(value < value));
  519. ASSERT (value <= 'z'); ASSERT (~(value <= 0X)); ASSERT (value <= value);
  520. ASSERT (value > 0X); ASSERT (~(value > 'z')); ASSERT (~(value > value));
  521. ASSERT (value >= 0X); ASSERT (~(value >= 'z')); ASSERT (value >= value);
  522. END Test.
  523. positive: relational operations on short integers
  524. MODULE Test;
  525. VAR value: SHORTINT;
  526. BEGIN
  527. value := 5;
  528. ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
  529. ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
  530. ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
  531. ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
  532. ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
  533. ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
  534. END Test.
  535. positive: relational operations on integers
  536. MODULE Test;
  537. VAR value: INTEGER;
  538. BEGIN
  539. value := 5;
  540. ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
  541. ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
  542. ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
  543. ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
  544. ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
  545. ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
  546. END Test.
  547. positive: relational operations on long integers
  548. MODULE Test;
  549. VAR value: LONGINT;
  550. BEGIN
  551. value := 5;
  552. ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
  553. ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
  554. ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
  555. ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
  556. ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
  557. ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
  558. END Test.
  559. positive: relational operations on huge integers
  560. MODULE Test;
  561. VAR value: HUGEINT;
  562. BEGIN
  563. value := 5;
  564. ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
  565. ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
  566. ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
  567. ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
  568. ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
  569. ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
  570. END Test.
  571. positive: relational operations on reals
  572. MODULE Test;
  573. VAR value: REAL;
  574. BEGIN
  575. value := 5;
  576. ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
  577. ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
  578. ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
  579. ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
  580. ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
  581. ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
  582. END Test.
  583. positive: relational operations on long reals
  584. MODULE Test;
  585. VAR value: LONGREAL;
  586. BEGIN
  587. value := 5;
  588. ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
  589. ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
  590. ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
  591. ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
  592. ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
  593. ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
  594. END Test.
  595. positive: relational operations on sets
  596. MODULE Test;
  597. VAR value: SET;
  598. BEGIN
  599. value := {1, 2};
  600. ASSERT (value = {1, 2}); ASSERT (~(value = {2})); ASSERT (value = value);
  601. ASSERT (value # {2}); ASSERT (~(value # {1, 2})); ASSERT (~(value # value));
  602. ASSERT (value < {1, 2, 3}); ASSERT (~(value < {2})); ASSERT (~(value < value));
  603. ASSERT (value <= {1, 2, 3}); ASSERT (~(value <= {2})); ASSERT (value <= value);
  604. ASSERT (value > {2}); ASSERT (~(value > {1, 2, 3})); ASSERT (~(value > value));
  605. ASSERT (value >= {2}); ASSERT (~(value >= {1, 2, 3})); ASSERT (value >= value);
  606. END Test.
  607. positive: relational operations on character arrays
  608. MODULE Test;
  609. VAR value: ARRAY 10 OF CHAR;
  610. BEGIN
  611. value := "text";
  612. ASSERT (value = "text"); ASSERT (~(value = "abc")); ASSERT (value = value);
  613. ASSERT (value # "abc"); ASSERT (~(value # "text")); ASSERT (~(value # value));
  614. ASSERT (value < "xyz"); ASSERT (~(value < "abc")); ASSERT (~(value < value));
  615. ASSERT (value <= "xyz"); ASSERT (~(value <= "abc")); ASSERT (value <= value);
  616. ASSERT (value > "abc"); ASSERT (~(value > "xyz")); ASSERT (~(value > value));
  617. ASSERT (value >= "abc"); ASSERT (~(value >= "xyz")); ASSERT (value >= value);
  618. ASSERT (value[0] = 't'); ASSERT (value[1] = 'e'); ASSERT (value[2] = 'x'); ASSERT (value[3] = 't'); ASSERT (value[4] = 0X);
  619. END Test.
  620. # negation
  621. positive: negation on short integers
  622. MODULE Test;
  623. VAR value: SHORTINT;
  624. BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
  625. END Test.
  626. positive: negation on integers
  627. MODULE Test;
  628. VAR value: INTEGER;
  629. BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
  630. END Test.
  631. positive: negation on long integers
  632. MODULE Test;
  633. VAR value: LONGINT;
  634. BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
  635. END Test.
  636. positive: negation on huge integers
  637. MODULE Test;
  638. VAR value: HUGEINT;
  639. BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
  640. END Test.
  641. positive: negation on reals
  642. MODULE Test;
  643. VAR value: REAL;
  644. BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
  645. END Test.
  646. positive: negation on long reals
  647. MODULE Test;
  648. VAR value: LONGREAL;
  649. BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
  650. END Test.
  651. positive: negation on sets
  652. MODULE Test;
  653. VAR value: SET;
  654. BEGIN value := {1, 2}; ASSERT (-value = {0, 3 .. MAX (SET)}); ASSERT (-(-value) = {1, 2}); ASSERT (-(-value) = value)
  655. END Test.
  656. # absolute value
  657. positive: absolute value of short integer
  658. MODULE Test;
  659. VAR value: SHORTINT;
  660. BEGIN
  661. value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
  662. value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
  663. END Test.
  664. positive: absolute value of integer
  665. MODULE Test;
  666. VAR value: INTEGER;
  667. BEGIN
  668. value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
  669. value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
  670. END Test.
  671. positive: absolute value of long integer
  672. MODULE Test;
  673. VAR value: LONGINT;
  674. BEGIN
  675. value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
  676. value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
  677. END Test.
  678. positive: absolute value of huge integer
  679. MODULE Test;
  680. VAR value: HUGEINT;
  681. BEGIN
  682. value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
  683. value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
  684. END Test.
  685. positive: absolute value of real
  686. MODULE Test;
  687. VAR value: REAL;
  688. BEGIN
  689. value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
  690. value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
  691. END Test.
  692. positive: absolute value of long real
  693. MODULE Test;
  694. VAR value: LONGREAL;
  695. BEGIN
  696. value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
  697. value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
  698. END Test.
  699. # logical operations
  700. positive: logical and on booleans
  701. MODULE Test;
  702. VAR a, b: BOOLEAN;
  703. BEGIN
  704. a := FALSE; b := FALSE; ASSERT (a & b = FALSE);
  705. a := FALSE; b := TRUE; ASSERT (a & b = FALSE);
  706. a := TRUE; b := FALSE; ASSERT (a & b = FALSE);
  707. a := TRUE; b := TRUE; ASSERT (a & b = TRUE);
  708. END Test.
  709. positive: logical and on boolean return values
  710. MODULE Test;
  711. PROCEDURE True (): BOOLEAN; BEGIN RETURN TRUE; END True;
  712. PROCEDURE False (): BOOLEAN; BEGIN RETURN FALSE; END False;
  713. BEGIN
  714. ASSERT (False () & False () = FALSE);
  715. ASSERT (False () & True () = FALSE);
  716. ASSERT (True () & False () = FALSE);
  717. ASSERT (True () & True () = TRUE);
  718. END Test.
  719. positive: logical or on booleans
  720. MODULE Test;
  721. VAR a, b: BOOLEAN;
  722. BEGIN
  723. a := FALSE; b := FALSE; ASSERT (a OR b = FALSE);
  724. a := FALSE; b := TRUE; ASSERT (a OR b = TRUE);
  725. a := TRUE; b := FALSE; ASSERT (a OR b = TRUE);
  726. a := TRUE; b := TRUE; ASSERT (a OR b = TRUE);
  727. END Test.
  728. positive: logical or on boolean return values
  729. MODULE Test;
  730. PROCEDURE True (): BOOLEAN; BEGIN RETURN TRUE; END True;
  731. PROCEDURE False (): BOOLEAN; BEGIN RETURN FALSE; END False;
  732. BEGIN
  733. ASSERT (False () OR False () = FALSE);
  734. ASSERT (False () OR True () = TRUE);
  735. ASSERT (True () OR False () = TRUE);
  736. ASSERT (True () OR True () = TRUE);
  737. END Test.
  738. positive: short-circuit evaluation
  739. MODULE Test;
  740. PROCEDURE True (): BOOLEAN; BEGIN RETURN TRUE; END True;
  741. PROCEDURE False (): BOOLEAN; BEGIN RETURN FALSE; END False;
  742. PROCEDURE Halt (): BOOLEAN; BEGIN HALT (1234); END Halt;
  743. BEGIN
  744. ASSERT (False () & Halt () = FALSE);
  745. ASSERT (True () OR Halt () = TRUE);
  746. END Test.
  747. # capital letter operation
  748. positive: capital letter of character
  749. MODULE Test;
  750. VAR value: CHAR;
  751. BEGIN
  752. value := '0'; ASSERT (CAP (value) = '0'); ASSERT (CAP (value) = CAP ('0'));
  753. value := '9'; ASSERT (CAP (value) = '9'); ASSERT (CAP (value) = CAP ('9'));
  754. value := 'a'; ASSERT (CAP (value) = 'A'); ASSERT (CAP (value) = CAP ('a'));
  755. value := 'z'; ASSERT (CAP (value) = 'Z'); ASSERT (CAP (value) = CAP ('z'));
  756. value := 'A'; ASSERT (CAP (value) = 'A'); ASSERT (CAP (value) = CAP ('A'));
  757. value := 'Z'; ASSERT (CAP (value) = 'Z'); ASSERT (CAP (value) = CAP ('Z'));
  758. END Test.
  759. # character annd ordinal value operations
  760. positive: ordinal value of character
  761. MODULE Test;
  762. VAR value: CHAR; i: INTEGER;
  763. BEGIN
  764. value := '0'; ASSERT (ORD (value) = ORD ('0'));
  765. value := '9'; ASSERT (ORD (value) = ORD ('9'));
  766. value := 'a'; ASSERT (ORD (value) = ORD ('a'));
  767. value := 'z'; ASSERT (ORD (value) = ORD ('z'));
  768. value := 'A'; ASSERT (ORD (value) = ORD ('A'));
  769. value := 'Z'; ASSERT (ORD (value) = ORD ('Z'));
  770. FOR i := ORD (0X) TO ORD (0FFX) DO value := CHR (i); ASSERT (ORD (value) = i); END;
  771. END Test.
  772. positive: character value of short integer
  773. MODULE Test;
  774. VAR value: SHORTINT;
  775. BEGIN
  776. value := ORD ('0'); ASSERT (CHR (value) = '0');
  777. value := ORD ('9'); ASSERT (CHR (value) = '9');
  778. value := ORD ('a'); ASSERT (CHR (value) = 'a');
  779. value := ORD ('z'); ASSERT (CHR (value) = 'z');
  780. value := ORD ('A'); ASSERT (CHR (value) = 'A');
  781. value := ORD ('Z'); ASSERT (CHR (value) = 'Z');
  782. END Test.
  783. positive: character value of integer
  784. MODULE Test;
  785. VAR value: INTEGER;
  786. BEGIN
  787. value := ORD ('0'); ASSERT (CHR (value) = '0');
  788. value := ORD ('9'); ASSERT (CHR (value) = '9');
  789. value := ORD ('a'); ASSERT (CHR (value) = 'a');
  790. value := ORD ('z'); ASSERT (CHR (value) = 'z');
  791. value := ORD ('A'); ASSERT (CHR (value) = 'A');
  792. value := ORD ('Z'); ASSERT (CHR (value) = 'Z');
  793. END Test.
  794. positive: character value of long integer
  795. MODULE Test;
  796. VAR value: LONGINT;
  797. BEGIN
  798. value := ORD ('0'); ASSERT (CHR (value) = '0');
  799. value := ORD ('9'); ASSERT (CHR (value) = '9');
  800. value := ORD ('a'); ASSERT (CHR (value) = 'a');
  801. value := ORD ('z'); ASSERT (CHR (value) = 'z');
  802. value := ORD ('A'); ASSERT (CHR (value) = 'A');
  803. value := ORD ('Z'); ASSERT (CHR (value) = 'Z');
  804. END Test.
  805. positive: character value of huge integer
  806. MODULE Test;
  807. VAR value: HUGEINT;
  808. BEGIN
  809. value := ORD ('0'); ASSERT (CHR (value) = '0');
  810. value := ORD ('9'); ASSERT (CHR (value) = '9');
  811. value := ORD ('a'); ASSERT (CHR (value) = 'a');
  812. value := ORD ('z'); ASSERT (CHR (value) = 'z');
  813. value := ORD ('A'); ASSERT (CHR (value) = 'A');
  814. value := ORD ('Z'); ASSERT (CHR (value) = 'Z');
  815. END Test.
  816. # set element operations
  817. positive: short integer as set element
  818. MODULE Test;
  819. VAR element: SHORTINT; set: SET;
  820. BEGIN
  821. element := MIN (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
  822. element := MIN (SET) + 2; set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
  823. element := MAX (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
  824. element := MAX (SET) - 2; set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
  825. END Test.
  826. negative: short integer as too small set element
  827. MODULE Test;
  828. VAR element: SHORTINT; set: SET;
  829. BEGIN element := MIN (SET) - 1; set := {element};
  830. END Test.
  831. negative: short integer as too large set element
  832. MODULE Test;
  833. VAR element: SHORTINT; set: SET;
  834. BEGIN element := MAX (SET) + 1; set := {element};
  835. END Test.
  836. positive: short integer as first set element
  837. MODULE Test;
  838. VAR element: SHORTINT; set: SET;
  839. BEGIN
  840. element := MIN (SET); set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
  841. element := MIN (SET); set := {element .. MIN (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MIN (SET)}); ASSERT (set = {element}); ASSERT (set = {MIN (SET)});
  842. element := MIN (SET) + 2; set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) + 2 .. MAX (SET)}); ASSERT (-set = {MIN (SET), MIN (SET) + 1});
  843. element := MIN (SET) + 2; set := {element .. MIN (SET)}; ASSERT (~(element IN set)); ASSERT (set = {element .. MIN (SET)}); ASSERT (set = {});
  844. END Test.
  845. negative: short integer as too small first set element
  846. MODULE Test;
  847. VAR element: SHORTINT; set: SET;
  848. BEGIN element := MIN (SET) - 1;set := {element .. MAX (SET)};
  849. END Test.
  850. negative: short integer as too large first set element
  851. MODULE Test;
  852. VAR element: SHORTINT; set: SET;
  853. BEGIN element := MAX (SET) + 1;set := {element .. MAX (SET)};
  854. END Test.
  855. positive: short integer as last set element
  856. MODULE Test;
  857. VAR element: SHORTINT; set: SET;
  858. BEGIN
  859. element := MAX (SET); set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
  860. element := MAX (SET); set := {MAX (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MAX (SET) .. MAX (SET)}); ASSERT (set = {MAX (SET)});
  861. element := MAX (SET) - 2; set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET) - 2}); ASSERT (-set = {MAX (SET) - 1, MAX (SET)});
  862. element := MAX (SET) - 2; set := {MAX (SET).. element}; ASSERT (~(element IN set)); ASSERT (set = {MAX (SET) .. element}); ASSERT (set = {});
  863. END Test.
  864. negative: short integer as too small last set element
  865. MODULE Test;
  866. VAR element: SHORTINT; set: SET;
  867. BEGIN element := MIN (SET) - 1;set := {MIN (SET) .. element};
  868. END Test.
  869. negative: short integer as too large last set element
  870. MODULE Test;
  871. VAR element: SHORTINT; set: SET;
  872. BEGIN element := MAX (SET) + 1;set := {MIN (SET) .. element};
  873. END Test.
  874. positive: short integers as set elements
  875. MODULE Test;
  876. VAR first, last: SHORTINT; set: SET;
  877. BEGIN
  878. first := MIN (SET); last := MAX (SET); set := {first .. last}; ASSERT (set = {MIN (SET) .. MAX (SET)});
  879. ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {});
  880. first := MIN (SET) + 2; last := MAX (SET) - 2; set := {first .. last}; ASSERT (set = {MIN (SET) + 2 .. MAX (SET) - 2});
  881. ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {MIN (SET), MIN (SET) + 1, MAX (SET) - 1, MAX (SET)});
  882. first := MIN (SET) + 2; last := first; set := {first .. last}; ASSERT (set = {first});
  883. first := MIN (SET) + 2; last := first + 1; set := {first .. last}; ASSERT (set = {first, last});
  884. first := MIN (SET) + 2; last := first - 1; set := {first .. last}; ASSERT (set = {});
  885. END Test.
  886. positive: integer as set element
  887. MODULE Test;
  888. VAR element: INTEGER; set: SET;
  889. BEGIN
  890. element := MIN (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
  891. element := MAX (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
  892. END Test.
  893. negative: integer as too small set element
  894. MODULE Test;
  895. VAR element: INTEGER; set: SET;
  896. BEGIN element := MIN (SET) - 1; set := {element};
  897. END Test.
  898. negative: integer as too large set element
  899. MODULE Test;
  900. VAR element: INTEGER; set: SET;
  901. BEGIN element := MAX (SET) + 1; set := {element};
  902. END Test.
  903. positive: integer as first set element
  904. MODULE Test;
  905. VAR element: INTEGER; set: SET;
  906. BEGIN
  907. element := MIN (SET); set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
  908. element := MIN (SET); set := {element .. MIN (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MIN (SET)}); ASSERT (set = {element}); ASSERT (set = {MIN (SET)});
  909. element := MIN (SET) + 2; set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) + 2 .. MAX (SET)}); ASSERT (-set = {MIN (SET), MIN (SET) + 1});
  910. element := MIN (SET) + 2; set := {element .. MIN (SET)}; ASSERT (~(element IN set)); ASSERT (set = {element .. MIN (SET)}); ASSERT (set = {});
  911. END Test.
  912. negative: integer as too small first set element
  913. MODULE Test;
  914. VAR element: INTEGER; set: SET;
  915. BEGIN element := MIN (SET) - 1;set := {element .. MAX (SET)};
  916. END Test.
  917. negative: integer as too large first set element
  918. MODULE Test;
  919. VAR element: INTEGER; set: SET;
  920. BEGIN element := MAX (SET) + 1;set := {element .. MAX (SET)};
  921. END Test.
  922. positive: integer as last set element
  923. MODULE Test;
  924. VAR element: INTEGER; set: SET;
  925. BEGIN
  926. element := MAX (SET); set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
  927. element := MAX (SET); set := {MAX (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MAX (SET) .. MAX (SET)}); ASSERT (set = {MAX (SET)});
  928. element := MAX (SET) - 2; set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET) - 2}); ASSERT (-set = {MAX (SET) - 1, MAX (SET)});
  929. element := MAX (SET) - 2; set := {MAX (SET).. element}; ASSERT (~(element IN set)); ASSERT (set = {MAX (SET) .. element}); ASSERT (set = {});
  930. END Test.
  931. negative: integer as too small last set element
  932. MODULE Test;
  933. VAR element: INTEGER; set: SET;
  934. BEGIN element := MIN (SET) - 1;set := {MIN (SET) .. element};
  935. END Test.
  936. negative: integer as too large last set element
  937. MODULE Test;
  938. VAR element: INTEGER; set: SET;
  939. BEGIN element := MAX (SET) + 1;set := {MIN (SET) .. element};
  940. END Test.
  941. positive: integers as set elements
  942. MODULE Test;
  943. VAR first, last: INTEGER; set: SET;
  944. BEGIN
  945. first := MIN (SET); last := MAX (SET); set := {first .. last}; ASSERT (set = {MIN (SET) .. MAX (SET)});
  946. ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {});
  947. first := MIN (SET) + 2; last := MAX (SET) - 2; set := {first .. last}; ASSERT (set = {MIN (SET) + 2 .. MAX (SET) - 2});
  948. ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {MIN (SET), MIN (SET) + 1, MAX (SET) - 1, MAX (SET)});
  949. first := MIN (SET) + 2; last := first; set := {first .. last}; ASSERT (set = {first});
  950. first := MIN (SET) + 2; last := first + 1; set := {first .. last}; ASSERT (set = {first, last});
  951. first := MIN (SET) + 2; last := first - 1; set := {first .. last}; ASSERT (set = {});
  952. END Test.
  953. positive: long integer as set element
  954. MODULE Test;
  955. VAR element: LONGINT; set: SET;
  956. BEGIN
  957. element := MIN (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
  958. element := MAX (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
  959. END Test.
  960. negative: long integer as too small set element
  961. MODULE Test;
  962. VAR element: LONGINT; set: SET;
  963. BEGIN element := MIN (SET) - 1; set := {element};
  964. END Test.
  965. negative: long integer as too large set element
  966. MODULE Test;
  967. VAR element: LONGINT; set: SET;
  968. BEGIN element := MAX (SET) + 1; set := {element};
  969. END Test.
  970. positive: long integer as first set element
  971. MODULE Test;
  972. VAR element: LONGINT; set: SET;
  973. BEGIN
  974. element := MIN (SET); set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
  975. element := MIN (SET); set := {element .. MIN (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MIN (SET)}); ASSERT (set = {element}); ASSERT (set = {MIN (SET)});
  976. element := MIN (SET) + 2; set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) + 2 .. MAX (SET)}); ASSERT (-set = {MIN (SET), MIN (SET) + 1});
  977. element := MIN (SET) + 2; set := {element .. MIN (SET)}; ASSERT (~(element IN set)); ASSERT (set = {element .. MIN (SET)}); ASSERT (set = {});
  978. END Test.
  979. negative: long integer as too small first set element
  980. MODULE Test;
  981. VAR element: LONGINT; set: SET;
  982. BEGIN element := MIN (SET) - 1;set := {element .. MAX (SET)};
  983. END Test.
  984. negative: long integer as too large first set element
  985. MODULE Test;
  986. VAR element: LONGINT; set: SET;
  987. BEGIN element := MAX (SET) + 1;set := {element .. MAX (SET)};
  988. END Test.
  989. positive: long integer as last set element
  990. MODULE Test;
  991. VAR element: LONGINT; set: SET;
  992. BEGIN
  993. element := MAX (SET); set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
  994. element := MAX (SET); set := {MAX (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MAX (SET) .. MAX (SET)}); ASSERT (set = {MAX (SET)});
  995. element := MAX (SET) - 2; set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET) - 2}); ASSERT (-set = {MAX (SET) - 1, MAX (SET)});
  996. element := MAX (SET) - 2; set := {MAX (SET).. element}; ASSERT (~(element IN set)); ASSERT (set = {MAX (SET) .. element}); ASSERT (set = {});
  997. END Test.
  998. negative: long integer as too small last set element
  999. MODULE Test;
  1000. VAR element: LONGINT; set: SET;
  1001. BEGIN element := MIN (SET) - 1;set := {MIN (SET) .. element};
  1002. END Test.
  1003. negative: long integer as too large last set element
  1004. MODULE Test;
  1005. VAR element: LONGINT; set: SET;
  1006. BEGIN element := MAX (SET) + 1;set := {MIN (SET) .. element};
  1007. END Test.
  1008. positive: long integers as set elements
  1009. MODULE Test;
  1010. VAR first, last: LONGINT; set: SET;
  1011. BEGIN
  1012. first := MIN (SET); last := MAX (SET); set := {first .. last}; ASSERT (set = {MIN (SET) .. MAX (SET)});
  1013. ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {});
  1014. first := MIN (SET) + 2; last := MAX (SET) - 2; set := {first .. last}; ASSERT (set = {MIN (SET) + 2 .. MAX (SET) - 2});
  1015. ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {MIN (SET), MIN (SET) + 1, MAX (SET) - 1, MAX (SET)});
  1016. first := MIN (SET) + 2; last := first; set := {first .. last}; ASSERT (set = {first});
  1017. first := MIN (SET) + 2; last := first + 1; set := {first .. last}; ASSERT (set = {first, last});
  1018. first := MIN (SET) + 2; last := first - 1; set := {first .. last}; ASSERT (set = {});
  1019. END Test.
  1020. positive: huge integer as set element
  1021. MODULE Test;
  1022. VAR element: HUGEINT; set: SET;
  1023. BEGIN
  1024. element := MIN (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
  1025. element := MAX (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
  1026. END Test.
  1027. negative: huge integer as too small set element
  1028. MODULE Test;
  1029. VAR element: HUGEINT; set: SET;
  1030. BEGIN element := MIN (SET) - 1; set := {element};
  1031. END Test.
  1032. negative: huge integer as too large set element
  1033. MODULE Test;
  1034. VAR element: HUGEINT; set: SET;
  1035. BEGIN element := MAX (SET) + 1; set := {element};
  1036. END Test.
  1037. positive: huge integer as first set element
  1038. MODULE Test;
  1039. VAR element: HUGEINT; set: SET;
  1040. BEGIN
  1041. element := MIN (SET); set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
  1042. element := MIN (SET); set := {element .. MIN (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MIN (SET)}); ASSERT (set = {element}); ASSERT (set = {MIN (SET)});
  1043. element := MIN (SET) + 2; set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) + 2 .. MAX (SET)}); ASSERT (-set = {MIN (SET), MIN (SET) + 1});
  1044. element := MIN (SET) + 2; set := {element .. MIN (SET)}; ASSERT (~(element IN set)); ASSERT (set = {element .. MIN (SET)}); ASSERT (set = {});
  1045. END Test.
  1046. negative: huge integer as too small first set element
  1047. MODULE Test;
  1048. VAR element: HUGEINT; set: SET;
  1049. BEGIN element := MIN (SET) - 1;set := {element .. MAX (SET)};
  1050. END Test.
  1051. negative: huge integer as too large first set element
  1052. MODULE Test;
  1053. VAR element: HUGEINT; set: SET;
  1054. BEGIN element := MAX (SET) + 1;set := {element .. MAX (SET)};
  1055. END Test.
  1056. positive: huge integer as last set element
  1057. MODULE Test;
  1058. VAR element: HUGEINT; set: SET;
  1059. BEGIN
  1060. element := MAX (SET); set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
  1061. element := MAX (SET); set := {MAX (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MAX (SET) .. MAX (SET)}); ASSERT (set = {MAX (SET)});
  1062. element := MAX (SET) - 2; set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET) - 2}); ASSERT (-set = {MAX (SET) - 1, MAX (SET)});
  1063. element := MAX (SET) - 2; set := {MAX (SET).. element}; ASSERT (~(element IN set)); ASSERT (set = {MAX (SET) .. element}); ASSERT (set = {});
  1064. END Test.
  1065. negative: huge integer as too small last set element
  1066. MODULE Test;
  1067. VAR element: HUGEINT; set: SET;
  1068. BEGIN element := MIN (SET) - 1;set := {MIN (SET) .. element};
  1069. END Test.
  1070. negative: huge integer as too large last set element
  1071. MODULE Test;
  1072. VAR element: HUGEINT; set: SET;
  1073. BEGIN element := MAX (SET) + 1;set := {MIN (SET) .. element};
  1074. END Test.
  1075. positive: huge integers as set elements
  1076. MODULE Test;
  1077. VAR first, last: HUGEINT; set: SET;
  1078. BEGIN
  1079. first := MIN (SET); last := MAX (SET); set := {first .. last}; ASSERT (set = {MIN (SET) .. MAX (SET)});
  1080. ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {});
  1081. first := MIN (SET) + 2; last := MAX (SET) - 2; set := {first .. last}; ASSERT (set = {MIN (SET) + 2 .. MAX (SET) - 2});
  1082. ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {MIN (SET), MIN (SET) + 1, MAX (SET) - 1, MAX (SET)});
  1083. first := MIN (SET) + 2; last := first; set := {first .. last}; ASSERT (set = {first});
  1084. first := MIN (SET) + 2; last := first + 1; set := {first .. last}; ASSERT (set = {first, last});
  1085. first := MIN (SET) + 2; last := first - 1; set := {first .. last}; ASSERT (set = {});
  1086. END Test.
  1087. # odd test
  1088. positive: odd test on short integer
  1089. MODULE Test;
  1090. VAR value: SHORTINT;
  1091. BEGIN
  1092. value := 0; ASSERT (~ODD (value)); ASSERT (ODD (value + 1));
  1093. value := 5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
  1094. value := -5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
  1095. END Test.
  1096. positive: odd test on integer
  1097. MODULE Test;
  1098. VAR value: INTEGER;
  1099. BEGIN
  1100. value := 0; ASSERT (~ODD (value)); ASSERT (ODD (value + 1));
  1101. value := 5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
  1102. value := -5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
  1103. END Test.
  1104. positive: odd test on long integer
  1105. MODULE Test;
  1106. VAR value: LONGINT;
  1107. BEGIN
  1108. value := 0; ASSERT (~ODD (value)); ASSERT (ODD (value + 1));
  1109. value := 5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
  1110. value := -5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
  1111. END Test.
  1112. positive: odd test on huge integer
  1113. MODULE Test;
  1114. VAR value: HUGEINT;
  1115. BEGIN
  1116. value := 0; ASSERT (~ODD (value)); ASSERT (ODD (value + 1));
  1117. value := 5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
  1118. value := -5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
  1119. END Test.
  1120. # explicit basic type conversions
  1121. positive: long on short integer
  1122. MODULE Test;
  1123. VAR value: SHORTINT;
  1124. BEGIN value := 11H; ASSERT (LONG (value) = 11H); ASSERT (LONG (value) = LONG (11H));
  1125. END Test.
  1126. positive: long on integer
  1127. MODULE Test;
  1128. VAR value: INTEGER;
  1129. BEGIN value := 1122H; ASSERT (LONG (value) = 1122H); ASSERT (LONG (value) = LONG (1122H));
  1130. END Test.
  1131. positive: long on long integer
  1132. MODULE Test;
  1133. VAR value: LONGINT;
  1134. BEGIN value := 11223344H; ASSERT (LONG (value) = 11223344H); ASSERT (LONG (value) = LONG (11223344H));
  1135. END Test.
  1136. positive: short on integer
  1137. MODULE Test;
  1138. VAR value: INTEGER;
  1139. BEGIN value := 1122H; ASSERT (SHORT (value) = SHORT (INTEGER(1122H)));
  1140. END Test.
  1141. positive: short on long integer
  1142. MODULE Test;
  1143. VAR value: LONGINT;
  1144. BEGIN value := 11223344H;ASSERT (SHORT (value) = SHORT (LONGINT(11223344H)));
  1145. END Test.
  1146. positive: short on huge integer
  1147. MODULE Test;
  1148. VAR value: HUGEINT;
  1149. BEGIN value := 1122334455667788H; ASSERT (SHORT (value) = SHORT (HUGEINT(1122334455667788H)));
  1150. END Test.
  1151. positive: entier on reals
  1152. MODULE Test;
  1153. VAR value: REAL;
  1154. BEGIN
  1155. value := 0; ASSERT (ENTIER (value) = 0);
  1156. value := 1; ASSERT (ENTIER (value) = 1);
  1157. value := 1.75; ASSERT (ENTIER (value) = 1);
  1158. value := -1; ASSERT (ENTIER (value) = -1);
  1159. value := -1.75; ASSERT (ENTIER (value) = -2);
  1160. END Test.
  1161. positive: entier on long reals
  1162. MODULE Test;
  1163. VAR value: LONGREAL;
  1164. BEGIN
  1165. value := 0; ASSERT (ENTIER (value) = 0);
  1166. value := 1; ASSERT (ENTIER (value) = 1);
  1167. value := 1.75; ASSERT (ENTIER (value) = 1);
  1168. value := -1; ASSERT (ENTIER (value) = -1);
  1169. value := -1.75; ASSERT (ENTIER (value) = -2);
  1170. END Test.
  1171. # arithmetic operations
  1172. positive: addition on short integers
  1173. MODULE Test;
  1174. VAR a, b: SHORTINT;
  1175. BEGIN
  1176. a := 3; b := 2; ASSERT (a + b = +5); ASSERT (a + b = 3 + 2);
  1177. a := -3; b := 2; ASSERT (a + b = -1); ASSERT (a + b = (-3) + 2);
  1178. a := 3; b := -2; ASSERT (a + b = +1); ASSERT (a + b = 3 + (-2));
  1179. a := -3; b := -2; ASSERT (a + b = -5); ASSERT (a + b = (-3) + (-2));
  1180. a := MAX (SHORTINT); b := MIN (SHORTINT) + 1; ASSERT (a + b = 0); ASSERT (a + b = MAX (SHORTINT) + MIN (SHORTINT) + 1);
  1181. END Test.
  1182. positive: addition on integers
  1183. MODULE Test;
  1184. VAR a, b: INTEGER;
  1185. BEGIN
  1186. a := 3; b := 2; ASSERT (a + b = +5); ASSERT (a + b = 3 + 2);
  1187. a := -3; b := 2; ASSERT (a + b = -1); ASSERT (a + b = (-3) + 2);
  1188. a := 3; b := -2; ASSERT (a + b = +1); ASSERT (a + b = 3 + (-2));
  1189. a := -3; b := -2; ASSERT (a + b = -5); ASSERT (a + b = (-3) + (-2));
  1190. a := MAX (INTEGER); b := MIN (INTEGER) + 1; ASSERT (a + b = 0); ASSERT (a + b = MAX (INTEGER) + MIN (INTEGER) + 1);
  1191. END Test.
  1192. positive: addition on long integers
  1193. MODULE Test;
  1194. VAR a, b: LONGINT;
  1195. BEGIN
  1196. a := 3; b := 2; ASSERT (a + b = +5); ASSERT (a + b = 3 + 2);
  1197. a := -3; b := 2; ASSERT (a + b = -1); ASSERT (a + b = (-3) + 2);
  1198. a := 3; b := -2; ASSERT (a + b = +1); ASSERT (a + b = 3 + (-2));
  1199. a := -3; b := -2; ASSERT (a + b = -5); ASSERT (a + b = (-3) + (-2));
  1200. a := MAX (LONGINT); b := MIN (LONGINT) + 1; ASSERT (a + b = 0); ASSERT (a + b = MAX (LONGINT) + MIN (LONGINT) + 1);
  1201. END Test.
  1202. positive: addition on huge integers
  1203. MODULE Test;
  1204. VAR a, b: HUGEINT;
  1205. BEGIN
  1206. a := 3; b := 2; ASSERT (a + b = +5); ASSERT (a + b = 3 + 2);
  1207. a := -3; b := 2; ASSERT (a + b = -1); ASSERT (a + b = (-3) + 2);
  1208. a := 3; b := -2; ASSERT (a + b = +1); ASSERT (a + b = 3 + (-2));
  1209. a := -3; b := -2; ASSERT (a + b = -5); ASSERT (a + b = (-3) + (-2));
  1210. a := MAX (HUGEINT); b := MIN (HUGEINT) + 1; ASSERT (a + b = 0); ASSERT (a + b = MAX (HUGEINT) + MIN (HUGEINT) + 1);
  1211. END Test.
  1212. positive: addition on reals
  1213. MODULE Test;
  1214. VAR a, b: REAL;
  1215. BEGIN
  1216. a := 3.5; b := 2.5; ASSERT (a + b = +6); ASSERT (a + b = 3.5 + 2.5);
  1217. a := -3.5; b := 2.5; ASSERT (a + b = -1); ASSERT (a + b = (-3.5) + 2.5);
  1218. a := 3.5; b := -2.5; ASSERT (a + b = +1); ASSERT (a + b = 3.5 + (-2.5));
  1219. a := -3.5; b := -2.5; ASSERT (a + b = -6); ASSERT (a + b = (-3.5) + (-2.5));
  1220. END Test.
  1221. positive: addition on long reals
  1222. MODULE Test;
  1223. VAR a, b: LONGREAL;
  1224. BEGIN
  1225. a := 3; b := 2; ASSERT (a + b = +5); ASSERT (a + b = 3 + 2);
  1226. a := -3; b := 2; ASSERT (a + b = -1); ASSERT (a + b = (-3) + 2);
  1227. a := 3; b := -2; ASSERT (a + b = +1); ASSERT (a + b = 3 + (-2));
  1228. a := -3; b := -2; ASSERT (a + b = -5); ASSERT (a + b = (-3) + (-2));
  1229. END Test.
  1230. positive: subtraction on short integers
  1231. MODULE Test;
  1232. VAR a, b: SHORTINT;
  1233. BEGIN
  1234. a := 3; b := 2; ASSERT (a - b = +1); ASSERT (a - b = 3 - 2);
  1235. a := -3; b := 2; ASSERT (a - b = -5); ASSERT (a - b = (-3) - 2);
  1236. a := 3; b := -2; ASSERT (a - b = +5); ASSERT (a - b = 3 - (-2));
  1237. a := -3; b := -2; ASSERT (a - b = -1); ASSERT (a - b = (-3) - (-2));
  1238. a := MIN (SHORTINT) + 1; b := MAX (SHORTINT); ASSERT (a - b = 2); ASSERT (a - b = SHORT (INTEGER(MIN (SHORTINT) + 1 - MAX (SHORTINT))));
  1239. END Test.
  1240. positive: subtraction on integers
  1241. MODULE Test;
  1242. VAR a, b: INTEGER;
  1243. BEGIN
  1244. a := 3; b := 2; ASSERT (a - b = +1); ASSERT (a - b = 3 - 2);
  1245. a := -3; b := 2; ASSERT (a - b = -5); ASSERT (a - b = (-3) - 2);
  1246. a := 3; b := -2; ASSERT (a - b = +5); ASSERT (a - b = 3 - (-2));
  1247. a := -3; b := -2; ASSERT (a - b = -1); ASSERT (a - b = (-3) - (-2));
  1248. a := MIN (INTEGER) + 1; b := MAX (INTEGER); ASSERT (a - b = 2); ASSERT (a - b = SHORT (LONGINT(MIN (INTEGER) + 1 - MAX (INTEGER))));
  1249. END Test.
  1250. positive: subtraction on long integers
  1251. MODULE Test;
  1252. VAR a, b: LONGINT;
  1253. BEGIN
  1254. a := 3; b := 2; ASSERT (a - b = +1); ASSERT (a - b = 3 - 2);
  1255. a := -3; b := 2; ASSERT (a - b = -5); ASSERT (a - b = (-3) - 2);
  1256. a := 3; b := -2; ASSERT (a - b = +5); ASSERT (a - b = 3 - (-2));
  1257. a := -3; b := -2; ASSERT (a - b = -1); ASSERT (a - b = (-3) - (-2));
  1258. a := MIN (LONGINT) + 1; b := MAX (LONGINT); ASSERT (a - b = 2);
  1259. (* ASSERT (a - b = SHORT (MIN (LONGINT) + 1 - MAX (LONGINT))); *)
  1260. END Test.
  1261. positive: subtraction on huge integers
  1262. MODULE Test;
  1263. VAR a, b: HUGEINT;
  1264. BEGIN
  1265. a := 3; b := 2; ASSERT (a - b = +1); ASSERT (a - b = 3 - 2);
  1266. a := -3; b := 2; ASSERT (a - b = -5); ASSERT (a - b = (-3) - 2);
  1267. a := 3; b := -2; ASSERT (a - b = +5); ASSERT (a - b = 3 - (-2));
  1268. a := -3; b := -2; ASSERT (a - b = -1); ASSERT (a - b = (-3) - (-2));
  1269. a := MIN (HUGEINT) + 1; b := MAX (HUGEINT); ASSERT (a - b = 2); ASSERT (a - b = MIN (HUGEINT) + 1 - MAX (HUGEINT));
  1270. END Test.
  1271. positive: subtraction on reals
  1272. MODULE Test;
  1273. VAR a, b: REAL;
  1274. BEGIN
  1275. a := 3.5; b := 2.5; ASSERT (a - b = +1); ASSERT (a - b = 3.5 - 2.5);
  1276. a := -3.5; b := 2.5; ASSERT (a - b = -6); ASSERT (a - b = (-3.5) - 2.5);
  1277. a := 3.5; b := -2.5; ASSERT (a - b = +6); ASSERT (a - b = 3.5 - (-2.5));
  1278. a := -3.5; b := -2.5; ASSERT (a - b = -1); ASSERT (a - b = (-3.5) - (-2.5));
  1279. END Test.
  1280. positive: subtraction on long reals
  1281. MODULE Test;
  1282. VAR a, b: LONGREAL;
  1283. BEGIN
  1284. a := 3.5; b := 2.5; ASSERT (a - b = +1); ASSERT (a - b = 3.5 - 2.5);
  1285. a := -3.5; b := 2.5; ASSERT (a - b = -6); ASSERT (a - b = (-3.5) - 2.5);
  1286. a := 3.5; b := -2.5; ASSERT (a - b = +6); ASSERT (a - b = 3.5 - (-2.5));
  1287. a := -3.5; b := -2.5; ASSERT (a - b = -1); ASSERT (a - b = (-3.5) - (-2.5));
  1288. END Test.
  1289. positive: multiplication on short integers
  1290. MODULE Test;
  1291. VAR a, b: SHORTINT;
  1292. BEGIN
  1293. a := 3; b := 2; ASSERT (a * b = +6); ASSERT (a * b = 3 * 2);
  1294. a := -3; b := 2; ASSERT (a * b = -6); ASSERT (a * b = (-3) * 2);
  1295. a := 3; b := -2; ASSERT (a * b = -6); ASSERT (a * b = 3 * (-2));
  1296. a := -3; b := -2; ASSERT (a * b = +6); ASSERT (a * b = (-3) * (-2));
  1297. a := MAX (SHORTINT); b := MAX (SHORTINT); ASSERT (a * b = 1); ASSERT (a * b = SHORT (INTEGER(MAX (SHORTINT) * MAX (SHORTINT))));
  1298. END Test.
  1299. positive: multiplication on integers
  1300. MODULE Test;
  1301. VAR a, b: INTEGER;
  1302. BEGIN
  1303. a := 3; b := 2; ASSERT (a * b = +6); ASSERT (a * b = 3 * 2);
  1304. a := -3; b := 2; ASSERT (a * b = -6); ASSERT (a * b = (-3) * 2);
  1305. a := 3; b := -2; ASSERT (a * b = -6); ASSERT (a * b = 3 * (-2));
  1306. a := -3; b := -2; ASSERT (a * b = +6); ASSERT (a * b = (-3) * (-2));
  1307. a := MAX (INTEGER); b := MAX (INTEGER); ASSERT (a * b = 1); ASSERT (a * b = SHORT (LONGINT(MAX (INTEGER) * MAX (INTEGER))));
  1308. END Test.
  1309. positive: multiplication on long integers
  1310. MODULE Test;
  1311. VAR a, b: LONGINT;
  1312. BEGIN
  1313. a := 3; b := 2; ASSERT (a * b = +6); ASSERT (a * b = 3 * 2);
  1314. a := -3; b := 2; ASSERT (a * b = -6); ASSERT (a * b = (-3) * 2);
  1315. a := 3; b := -2; ASSERT (a * b = -6); ASSERT (a * b = 3 * (-2));
  1316. a := -3; b := -2; ASSERT (a * b = +6); ASSERT (a * b = (-3) * (-2));
  1317. a := MAX (LONGINT); b := MAX (LONGINT); ASSERT (a * b = 1);
  1318. (*ASSERT (a * b = SHORT (HUGEINT(MAX (LONGINT) * MAX (LONGINT))));*)
  1319. END Test.
  1320. positive: multiplication on huge integers
  1321. MODULE Test;
  1322. VAR a, b: HUGEINT;
  1323. BEGIN
  1324. a := 3; b := 2; ASSERT (a * b = +6); ASSERT (a * b = 3 * 2);
  1325. a := -3; b := 2; ASSERT (a * b = -6); ASSERT (a * b = (-3) * 2);
  1326. a := 3; b := -2; ASSERT (a * b = -6); ASSERT (a * b = 3 * (-2));
  1327. a := -3; b := -2; ASSERT (a * b = +6); ASSERT (a * b = (-3) * (-2));
  1328. a := MAX (HUGEINT); b := MAX (HUGEINT); ASSERT (a * b = 1); ASSERT (a * b = MAX (HUGEINT) * MAX (HUGEINT));
  1329. END Test.
  1330. positive: multiplication on reals
  1331. MODULE Test;
  1332. VAR a, b: REAL;
  1333. BEGIN
  1334. a := 3.5; b := 2.5; ASSERT (a * b = +8.75); ASSERT (a * b = 3.5 * 2.5);
  1335. a := -3.5; b := 2.5; ASSERT (a * b = -8.75); ASSERT (a * b = (-3.5) * 2.5);
  1336. a := 3.5; b := -2.5; ASSERT (a * b = -8.75); ASSERT (a * b = 3.5 * (-2.5));
  1337. a := -3.5; b := -2.5; ASSERT (a * b = +8.75); ASSERT (a * b = (-3.5) * (-2.5));
  1338. END Test.
  1339. positive: multiplication on long reals
  1340. MODULE Test;
  1341. VAR a, b: LONGREAL;
  1342. BEGIN
  1343. a := 3.5; b := 2.5; ASSERT (a * b = +8.75); ASSERT (a * b = 3.5 * 2.5);
  1344. a := -3.5; b := 2.5; ASSERT (a * b = -8.75); ASSERT (a * b = (-3.5) * 2.5);
  1345. a := 3.5; b := -2.5; ASSERT (a * b = -8.75); ASSERT (a * b = 3.5 * (-2.5));
  1346. a := -3.5; b := -2.5; ASSERT (a * b = +8.75); ASSERT (a * b = (-3.5) * (-2.5));
  1347. END Test.
  1348. positive: integer division on short integers with positive divisor
  1349. MODULE Test;
  1350. VAR a, b: SHORTINT;
  1351. BEGIN
  1352. a := 3; b := 2; ASSERT (a DIV b = +1); ASSERT (a DIV b = 3 DIV 2);
  1353. a := -3; b := 2; ASSERT (a DIV b = -2); ASSERT (a DIV b = (-3) DIV 2);
  1354. a := 2; b := 3; ASSERT (a DIV b = +0); ASSERT (a DIV b = 2 DIV 3);
  1355. a := -2; b := 3; ASSERT (a DIV b = -1); ASSERT (a DIV b = (-2) DIV 3);
  1356. a := MAX (SHORTINT); b := MAX (SHORTINT); ASSERT (a DIV b = 1); ASSERT (a DIV b = MAX (SHORTINT) DIV MAX (SHORTINT));
  1357. END Test.
  1358. negative: integer division on short integers with negative divisor
  1359. MODULE Test;
  1360. VAR a, b, c: SHORTINT;
  1361. BEGIN
  1362. a := 3; b := -2; c := a DIV b;
  1363. END Test.
  1364. negative: integer division by zero on short integer
  1365. MODULE Test;
  1366. VAR a, b, r: SHORTINT;
  1367. BEGIN a := 3; b := 0; r := a DIV b;
  1368. END Test.
  1369. positive: integer division on integers with positive divisor
  1370. MODULE Test;
  1371. VAR a, b: INTEGER;
  1372. BEGIN
  1373. a := 3; b := 2; ASSERT (a DIV b = +1); ASSERT (a DIV b = 3 DIV 2);
  1374. a := -3; b := 2; ASSERT (a DIV b = -2); ASSERT (a DIV b = (-3) DIV 2);
  1375. a := 2; b := 3; ASSERT (a DIV b = +0); ASSERT (a DIV b = 2 DIV 3);
  1376. a := -2; b := 3; ASSERT (a DIV b = -1); ASSERT (a DIV b = (-2) DIV 3);
  1377. a := MAX (INTEGER); b := MAX (INTEGER); ASSERT (a DIV b = 1); ASSERT (a DIV b = MAX (INTEGER) DIV MAX (INTEGER));
  1378. END Test.
  1379. negative: integer division on integers with negative divisor
  1380. MODULE Test;
  1381. VAR a, b, c: INTEGER;
  1382. BEGIN
  1383. a := 3; b := -2; c := a DIV b;
  1384. END Test.
  1385. negative: integer division by zero on integer
  1386. MODULE Test;
  1387. VAR a, b, r: INTEGER;
  1388. BEGIN a := 3; b := 0; r := a DIV b;
  1389. END Test.
  1390. positive: integer division on long integers with positive divisor
  1391. MODULE Test;
  1392. VAR a, b: LONGINT;
  1393. BEGIN
  1394. a := 3; b := 2; ASSERT (a DIV b = +1); ASSERT (a DIV b = 3 DIV 2);
  1395. a := -3; b := 2; ASSERT (a DIV b = -2); ASSERT (a DIV b = (-3) DIV 2);
  1396. a := 2; b := 3; ASSERT (a DIV b = +0); ASSERT (a DIV b = 2 DIV 3);
  1397. a := -2; b := 3; ASSERT (a DIV b = -1); ASSERT (a DIV b = (-2) DIV 3);
  1398. a := MAX (LONGINT); b := MAX (LONGINT); ASSERT (a DIV b = 1); ASSERT (a DIV b = MAX (LONGINT) DIV MAX (LONGINT));
  1399. END Test.
  1400. negative: integer division on long integers with negative divisor
  1401. MODULE Test;
  1402. VAR a, b, c: LONGINT;
  1403. BEGIN
  1404. a := 3; b := -2; c := a DIV b;
  1405. END Test.
  1406. negative: integer division by zero on long integer
  1407. MODULE Test;
  1408. VAR a, b, r: LONGINT;
  1409. BEGIN a := 3; b := 0; r := a DIV b;
  1410. END Test.
  1411. positive: integer division on huge integers with positive divisor
  1412. MODULE Test;
  1413. VAR a, b: HUGEINT;
  1414. BEGIN
  1415. a := 3; b := 2; ASSERT (a DIV b = +1); ASSERT (a DIV b = 3 DIV 2);
  1416. a := -3; b := 2; ASSERT (a DIV b = -2); ASSERT (a DIV b = (-3) DIV 2);
  1417. a := 2; b := 3; ASSERT (a DIV b = +0); ASSERT (a DIV b = 2 DIV 3);
  1418. a := -2; b := 3; ASSERT (a DIV b = -1); ASSERT (a DIV b = (-2) DIV 3);
  1419. a := MAX (HUGEINT); b := MAX (HUGEINT); ASSERT (a DIV b = 1); ASSERT (a DIV b = MAX (HUGEINT) DIV MAX (HUGEINT));
  1420. END Test.
  1421. negative: integer division on huge integers with negative divisor
  1422. MODULE Test;
  1423. VAR a, b, c: HUGEINT;
  1424. BEGIN
  1425. a := 3; b := -2; c := a DIV b;
  1426. END Test.
  1427. negative: integer division by zero on huge integer
  1428. MODULE Test;
  1429. VAR a, b, r: HUGEINT;
  1430. BEGIN a := 3; b := 0; r := a DIV b;
  1431. END Test.
  1432. positive: real division on short integers
  1433. MODULE Test;
  1434. VAR a, b: SHORTINT;
  1435. BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
  1436. END Test.
  1437. positive: real division on integers
  1438. MODULE Test;
  1439. VAR a, b: INTEGER;
  1440. BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
  1441. END Test.
  1442. positive: real division on long integers
  1443. MODULE Test;
  1444. VAR a, b: LONGINT;
  1445. BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
  1446. END Test.
  1447. positive: real division on huge integers
  1448. MODULE Test;
  1449. VAR a, b: HUGEINT;
  1450. BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
  1451. END Test.
  1452. positive: real division on reals
  1453. MODULE Test;
  1454. VAR a, b: REAL;
  1455. BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
  1456. END Test.
  1457. positive: real division on long reals
  1458. MODULE Test;
  1459. VAR a, b: LONGREAL;
  1460. BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
  1461. END Test.
  1462. positive: modulo on short integers
  1463. MODULE Test;
  1464. VAR a, b: SHORTINT;
  1465. BEGIN
  1466. a := 3; b := 2; ASSERT (a MOD b = +1); ASSERT (3 MOD b = +1); ASSERT (a MOD 2 = +1); ASSERT (a MOD b = 3 MOD 2);
  1467. a := -3; b := 2; ASSERT (a MOD b = +1); ASSERT ((-3) MOD b = +1); ASSERT (a MOD 2 = +1); ASSERT (a MOD b = (-3) MOD 2);
  1468. a := 2; b := 3; ASSERT (a MOD b = +2); ASSERT (2 MOD b = +2); ASSERT (a MOD 3 = +2); ASSERT (a MOD b = 2 MOD 3);
  1469. a := -2; b := 3; ASSERT (a MOD b = 1); ASSERT ((-2) MOD b = 1); ASSERT (a MOD 3 = 1); ASSERT (a MOD b = (-2) MOD 3);
  1470. a := MAX (SHORTINT); b := MAX (SHORTINT); ASSERT (a MOD b = 0); ASSERT (a MOD b = MAX (SHORTINT) MOD MAX (SHORTINT));
  1471. END Test.
  1472. negative: modulo by zero on short integer
  1473. MODULE Test;
  1474. VAR a, b, r: SHORTINT;
  1475. BEGIN a := 3; b := 0; r := a MOD b;
  1476. END Test.
  1477. positive: modulo on integers
  1478. MODULE Test;
  1479. VAR a, b: INTEGER;
  1480. BEGIN
  1481. a := 3; b := 2; ASSERT (a MOD b = +1); ASSERT (3 MOD b = +1); ASSERT (a MOD 2 = +1); ASSERT (a MOD b = 3 MOD 2);
  1482. a := -3; b := 2; ASSERT (a MOD b = +1); ASSERT ((-3) MOD b = +1); ASSERT (a MOD 2 = +1); ASSERT (a MOD b = (-3) MOD 2);
  1483. a := 2; b := 3; ASSERT (a MOD b = +2); ASSERT (2 MOD b = +2); ASSERT (a MOD 3 = +2); ASSERT (a MOD b = 2 MOD 3);
  1484. a := -2; b := 3; ASSERT (a MOD b = 1); ASSERT ((-2) MOD b = 1); ASSERT (a MOD 3 = 1); ASSERT (a MOD b = (-2) MOD 3);
  1485. a := MAX (INTEGER); b := MAX (INTEGER); ASSERT (a MOD b = 0); ASSERT (a MOD b = MAX (INTEGER) MOD MAX (INTEGER));
  1486. END Test.
  1487. negative: modulo by zero on integer
  1488. MODULE Test;
  1489. VAR a, b, r: INTEGER;
  1490. BEGIN a := 3; b := 0; r := a MOD b;
  1491. END Test.
  1492. positive: modulo on long integers
  1493. MODULE Test;
  1494. VAR a, b: LONGINT;
  1495. BEGIN
  1496. a := 3; b := 2; ASSERT (a MOD b = +1); ASSERT (3 MOD b = +1); ASSERT (a MOD 2 = +1); ASSERT (a MOD b = 3 MOD 2);
  1497. a := -3; b := 2; ASSERT (a MOD b = +1); ASSERT ((-3) MOD b = +1); ASSERT (a MOD 2 = +1); ASSERT (a MOD b = (-3) MOD 2);
  1498. a := 2; b := 3; ASSERT (a MOD b = +2); ASSERT (2 MOD b = +2); ASSERT (a MOD 3 = +2); ASSERT (a MOD b = 2 MOD 3);
  1499. a := -2; b := 3; ASSERT (a MOD b = 1); ASSERT ((-2) MOD b = 1); ASSERT (a MOD 3 = 1); ASSERT (a MOD b = (-2) MOD 3);
  1500. a := MAX (LONGINT); b := MAX (LONGINT); ASSERT (a MOD b = 0); ASSERT (a MOD b = MAX (LONGINT) MOD MAX (LONGINT));
  1501. END Test.
  1502. negative: modulo by zero on long integer
  1503. MODULE Test;
  1504. VAR a, b, r: LONGINT;
  1505. BEGIN a := 3; b := 0; r := a MOD b;
  1506. END Test.
  1507. positive: modulo on huge integers
  1508. MODULE Test;
  1509. VAR a, b: HUGEINT;
  1510. BEGIN
  1511. a := 3; b := 2; ASSERT (a MOD b = +1); ASSERT (3 MOD b = +1); ASSERT (a MOD 2 = +1); ASSERT (a MOD b = 3 MOD 2);
  1512. a := -3; b := 2; ASSERT (a MOD b = +1); ASSERT ((-3) MOD b = +1); ASSERT (a MOD 2 = +1); ASSERT (a MOD b = (-3) MOD 2);
  1513. a := 2; b := 3; ASSERT (a MOD b = +2); ASSERT (2 MOD b = +2); ASSERT (a MOD 3 = +2); ASSERT (a MOD b = 2 MOD 3);
  1514. a := -2; b := 3; ASSERT (a MOD b = 1); ASSERT ((-2) MOD b = 1); ASSERT (a MOD 3 = 1); ASSERT (a MOD b = (-2) MOD 3);
  1515. a := MAX (HUGEINT); b := MAX (HUGEINT); ASSERT (a MOD b = 0); ASSERT (a MOD b = MAX (HUGEINT) MOD MAX (HUGEINT));
  1516. END Test.
  1517. negative: modulo by zero on huge integer
  1518. MODULE Test;
  1519. VAR a, b, r: HUGEINT;
  1520. BEGIN a := 3; b := 0; r := a MOD b;
  1521. END Test.
  1522. positive: arithmetic shift on short integer
  1523. MODULE Test;
  1524. VAR a, b: SHORTINT;
  1525. BEGIN
  1526. a := 6; b := 2; ASSERT (ASH (a, b) = 24); ASSERT (ASH (a, b) = ASH (a, 2)); ASSERT (ASH (a, b) = ASH (6, 2));
  1527. a := 6; b := 0; ASSERT (ASH (a, b) = 6); ASSERT (ASH (a, b) = ASH (a, 0)); ASSERT (ASH (a, b) = ASH (6, 0));
  1528. a := 6; b := -2; ASSERT (ASH (a, b) = 1); ASSERT (ASH (a, b) = ASH (a, -2)); ASSERT (ASH (a, b) = ASH (6, -2));
  1529. END Test.
  1530. positive: arithmetic shift on integer
  1531. MODULE Test;
  1532. VAR a, b: INTEGER;
  1533. BEGIN
  1534. a := 6; b := 2; ASSERT (ASH (a, b) = 24); ASSERT (ASH (a, b) = ASH (a, 2)); ASSERT (ASH (a, b) = ASH (6, 2));
  1535. a := 6; b := 0; ASSERT (ASH (a, b) = 6); ASSERT (ASH (a, b) = ASH (a, 0)); ASSERT (ASH (a, b) = ASH (6, 0));
  1536. a := 6; b := -2; ASSERT (ASH (a, b) = 1); ASSERT (ASH (a, b) = ASH (a, -2)); ASSERT (ASH (a, b) = ASH (6, -2));
  1537. END Test.
  1538. positive: arithmetic shift on long integer
  1539. MODULE Test;
  1540. VAR a, b: LONGINT;
  1541. BEGIN
  1542. a := 6; b := 2; ASSERT (ASH (a, b) = 24); ASSERT (ASH (a, b) = ASH (a, 2)); ASSERT (ASH (a, b) = ASH (6, 2));
  1543. a := 6; b := 0; ASSERT (ASH (a, b) = 6); ASSERT (ASH (a, b) = ASH (a, 0)); ASSERT (ASH (a, b) = ASH (6, 0));
  1544. a := 6; b := -2; ASSERT (ASH (a, b) = 1); ASSERT (ASH (a, b) = ASH (a, -2)); ASSERT (ASH (a, b) = ASH (6, -2));
  1545. END Test.
  1546. positive: arithmetic shift on huge integer
  1547. MODULE Test;
  1548. VAR a, b: HUGEINT;
  1549. BEGIN
  1550. a := 6; b := 2; ASSERT (ASH (a, b) = 24); ASSERT (ASH (a, b) = ASH (a, 2)); ASSERT (ASH (a, b) = ASH (6, 2));
  1551. a := 6; b := 0; ASSERT (ASH (a, b) = 6); ASSERT (ASH (a, b) = ASH (a, 0)); ASSERT (ASH (a, b) = ASH (6, 0));
  1552. a := 6; b := -2; ASSERT (ASH (a, b) = 1); ASSERT (ASH (a, b) = ASH (a, -2)); ASSERT (ASH (a, b) = ASH (6, -2));
  1553. END Test.
  1554. # set operators
  1555. positive: set union
  1556. MODULE Test;
  1557. VAR a, b: SET;
  1558. BEGIN
  1559. a := {}; b := {}; ASSERT (a + b = {}); ASSERT (a + b = {} + {});
  1560. a := {1, 2}; b := {}; ASSERT (a + b = {1, 2}); ASSERT (a + b = {1, 2} + {});
  1561. a := {}; b := {2, 3}; ASSERT (a + b = {2, 3}); ASSERT (a + b = {} + {2, 3});
  1562. a := {1, 2}; b := {2, 3}; ASSERT (a + b = {1..3}); ASSERT (a + b = {1, 2} + {2, 3});
  1563. a := {}; b := {}; ASSERT (a + {} = {}); ASSERT ({} + b = {} + {});
  1564. a := {1, 2}; b := {}; ASSERT (a + {} = {1, 2}); ASSERT ({1,2} + b = {1, 2} + {});
  1565. a := {}; b := {2, 3}; ASSERT (a + {2,3} = {2, 3}); ASSERT ({} + b = {} + {2, 3});
  1566. a := {1, 2}; b := {2, 3}; ASSERT (a + {2,3} = {1..3}); ASSERT ({1,2} + b = {1, 2} + {2, 3});
  1567. END Test.
  1568. positive: set difference
  1569. MODULE Test;
  1570. VAR a, b: SET;
  1571. BEGIN
  1572. a := {}; b := {}; ASSERT (a - b = {}); ASSERT (a - b = {} - {});
  1573. a := {1, 2}; b := {}; ASSERT (a - b = {1, 2}); ASSERT (a - b = {1, 2} - {});
  1574. a := {}; b := {2, 3}; ASSERT (a - b = {}); ASSERT (a - b = {} - {2, 3});
  1575. a := {1, 2}; b := {2, 3}; ASSERT (a - b = {1}); ASSERT (a - b = {1, 2} - {2, 3});
  1576. a := {}; b := {}; ASSERT (a - {} = {}); ASSERT ({} - b = {} - {});
  1577. a := {1, 2}; b := {}; ASSERT (a - {} = {1, 2}); ASSERT ({1,2} - b = {1, 2} - {});
  1578. a := {}; b := {2, 3}; ASSERT (a - {2,3} = {}); ASSERT ({} - b = {} - {2, 3});
  1579. a := {1, 2}; b := {2, 3}; ASSERT (a - {2,3} = {1}); ASSERT ({1,2} - b = {1, 2} - {2, 3});
  1580. END Test.
  1581. positive: set intersection
  1582. MODULE Test;
  1583. VAR a, b: SET;
  1584. BEGIN
  1585. a := {}; b := {}; ASSERT (a * b = {}); ASSERT (a * b = {} * {});
  1586. a := {1, 2}; b := {}; ASSERT (a * b = {}); ASSERT (a * b = {1, 2} * {});
  1587. a := {}; b := {2, 3}; ASSERT (a * b = {}); ASSERT (a * b = {} * {2, 3});
  1588. a := {1, 2}; b := {2, 3}; ASSERT (a * b = {2}); ASSERT (a * b = {1, 2} * {2, 3});
  1589. a := {}; b := {}; ASSERT ({} * b = {}); ASSERT (a * {} = {} * {});
  1590. a := {1, 2}; b := {}; ASSERT ({1,2} * b = {}); ASSERT (a * {} = {1, 2} * {});
  1591. a := {}; b := {2, 3}; ASSERT (a * {2,3} = {}); ASSERT ({} * b = {} * {2, 3});
  1592. a := {1, 2}; b := {2, 3}; ASSERT ({1,2} * b = {2}); ASSERT (a * {2,3} = {1, 2} * {2, 3});
  1593. END Test.
  1594. positive: symmetric set difference
  1595. MODULE Test;
  1596. VAR a, b: SET;
  1597. BEGIN
  1598. a := {}; b := {}; ASSERT (a / b = {}); ASSERT (a / b = {} / {});
  1599. a := {1, 2}; b := {}; ASSERT (a / b = {1, 2}); ASSERT (a / b = {1, 2} / {});
  1600. a := {}; b := {2, 3}; ASSERT (a / b = {2, 3}); ASSERT (a / b = {} / {2, 3});
  1601. a := {1, 2}; b := {2, 3}; ASSERT (a / b = {1, 3}); ASSERT (a / b = {1, 2} / {2, 3});
  1602. a := {}; b := {}; ASSERT (a / {} = {}); ASSERT (a / {} = {} / {});
  1603. a := {1, 2}; b := {}; ASSERT ({1,2} / b = {1, 2}); ASSERT (a / {} = {1, 2} / {});
  1604. a := {}; b := {2, 3}; ASSERT ({} / b = {2, 3}); ASSERT (a / {2,3} = {} / {2, 3});
  1605. a := {1, 2}; b := {2, 3}; ASSERT ({1,2} / b = {1, 3}); ASSERT (a / {2,3} = {1, 2} / {2, 3});
  1606. END Test.
  1607. # type guards
  1608. positive: type guard on same global record
  1609. MODULE Test;
  1610. TYPE R = RECORD b: BOOLEAN END;
  1611. VAR r: R;
  1612. BEGIN r.b := TRUE; ASSERT (r(R).b);
  1613. END Test.
  1614. positive: type guard on same local record
  1615. MODULE Test;
  1616. PROCEDURE Procedure;
  1617. TYPE R = RECORD b: BOOLEAN END;
  1618. VAR r: R;
  1619. BEGIN r.b := TRUE; ASSERT (r(R).b);
  1620. END Procedure;
  1621. BEGIN Procedure;
  1622. END Test.
  1623. positive: type guard on same parameter record
  1624. MODULE Test;
  1625. TYPE R = RECORD b: BOOLEAN END;
  1626. VAR r: R;
  1627. PROCEDURE Procedure (r: R); BEGIN ASSERT (r(R).b); END Procedure;
  1628. BEGIN r.b := TRUE; Procedure (r);
  1629. END Test.
  1630. positive: type guard on same variable parameter record
  1631. MODULE Test;
  1632. TYPE R = RECORD b: BOOLEAN END;
  1633. VAR r: R;
  1634. PROCEDURE Procedure (VAR r: R); BEGIN ASSERT (r(R).b); END Procedure;
  1635. BEGIN r.b := TRUE; Procedure (r);
  1636. END Test.
  1637. positive: type guard on same constant parameter record
  1638. MODULE Test;
  1639. TYPE R = RECORD b: BOOLEAN END;
  1640. VAR r: R;
  1641. PROCEDURE Procedure (CONST r: R); BEGIN ASSERT (r(R).b); END Procedure;
  1642. BEGIN r.b := TRUE; Procedure (r);
  1643. END Test.
  1644. positive: type guard on variable parameter record
  1645. MODULE Test;
  1646. TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
  1647. VAR r: R1;
  1648. PROCEDURE Procedure (VAR r: R0); BEGIN ASSERT (r(R1).b); END Procedure;
  1649. BEGIN r.b := TRUE; Procedure (r);
  1650. END Test.
  1651. negative: unsatisfied type guard on variable parameter record
  1652. MODULE Test;
  1653. TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
  1654. VAR r: R0;
  1655. PROCEDURE Procedure (VAR r: R0); BEGIN ASSERT (r(R1).b); END Procedure;
  1656. BEGIN Procedure (r);
  1657. END Test.
  1658. positive: type guard on constant parameter record
  1659. MODULE Test;
  1660. TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
  1661. VAR r: R1;
  1662. PROCEDURE Procedure (CONST r: R0); BEGIN ASSERT (r(R1).b); END Procedure;
  1663. BEGIN r.b := TRUE; Procedure (r);
  1664. END Test.
  1665. negative: unsatisfied type guard on constant parameter record
  1666. MODULE Test;
  1667. TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
  1668. VAR r: R0;
  1669. PROCEDURE Procedure (CONST r: R0); BEGIN ASSERT (r(R1).b); END Procedure;
  1670. BEGIN Procedure (r);
  1671. END Test.
  1672. positive: type guard on same pointer to record
  1673. MODULE Test;
  1674. TYPE R = RECORD b: BOOLEAN END; P = POINTER TO R;
  1675. VAR p: P;
  1676. BEGIN NEW (p); p.b := TRUE; ASSERT (p(P).b); ASSERT (p^(R).b);
  1677. END Test.
  1678. positive: type guard on pointer to record
  1679. MODULE Test;
  1680. TYPE R0 = RECORD END; P0 = POINTER TO R0
  1681. TYPE R1 = RECORD (R0) b: BOOLEAN END; P1 = POINTER TO R1;
  1682. VAR p0: P0; p1: P1;
  1683. BEGIN NEW (p1); p1.b := TRUE; p0 := p1; ASSERT (p0(P1).b); ASSERT (p0^(R1).b);
  1684. END Test.
  1685. positive: type guard on returned pointer to record
  1686. MODULE Test;
  1687. TYPE R0 = RECORD END; P0 = POINTER TO R0
  1688. TYPE R1 = RECORD (R0) b: BOOLEAN END; P1 = POINTER TO R1;
  1689. VAR p1: P1;
  1690. PROCEDURE Function (): P0;
  1691. BEGIN NEW (p1); p1.b := TRUE; RETURN p1;
  1692. END Function;
  1693. BEGIN ASSERT (Function ()(P1).b); ASSERT (Function ()^(R1).b);
  1694. END Test.
  1695. negative: unsatisfied type guard on pointer to record
  1696. MODULE Test;
  1697. TYPE R0 = RECORD END; P0 = POINTER TO R0;
  1698. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  1699. VAR p0: P0; p1: P1;
  1700. BEGIN NEW (p0); p1 := p0(P1);
  1701. END Test.
  1702. positive: type guard on nil pointer to same record
  1703. MODULE Test;
  1704. TYPE R = RECORD END; P = POINTER TO R;
  1705. VAR p: P;
  1706. BEGIN p := NIL; p := p(P);
  1707. END Test.
  1708. negative: type guard on nil pointer to record
  1709. MODULE Test;
  1710. TYPE R0 = RECORD END; P0 = POINTER TO R0;
  1711. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  1712. VAR p0: P0; p1: P1;
  1713. BEGIN p0 := NIL; p1 := p0(P1);
  1714. END Test.
  1715. negative: type guard on returned nil pointer to record
  1716. MODULE Test;
  1717. TYPE R0 = RECORD END; P0 = POINTER TO R0
  1718. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  1719. VAR p1: P1;
  1720. PROCEDURE Function (): P0;
  1721. BEGIN RETURN NIL;
  1722. END Function;
  1723. BEGIN p1 := Function ()(P1);
  1724. END Test.
  1725. positive: type guard on same object
  1726. MODULE Test;
  1727. TYPE O = OBJECT VAR b: BOOLEAN END O;
  1728. VAR o: O;
  1729. BEGIN NEW (o); o.b := TRUE; ASSERT (o(O).b);
  1730. END Test.
  1731. positive: type guard on object
  1732. MODULE Test;
  1733. TYPE O0 = OBJECT END O0;
  1734. TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
  1735. VAR o0: O0; o1: O1;
  1736. BEGIN NEW (o1); o1.b := TRUE; o0 := o1; ASSERT (o0(O1).b);
  1737. END Test.
  1738. positive: type guard on returned object
  1739. MODULE Test;
  1740. TYPE O0 = OBJECT END O0;
  1741. TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
  1742. VAR o1: O1;
  1743. PROCEDURE Function (): O0;
  1744. BEGIN NEW (o1); o1.b := TRUE; RETURN o1;
  1745. END Function;
  1746. BEGIN ASSERT (Function ()(O1).b);
  1747. END Test.
  1748. negative: unsatisfied type guard on object
  1749. MODULE Test;
  1750. TYPE O0 = OBJECT END O0;
  1751. TYPE O1 = OBJECT (O0) END O1;
  1752. VAR o0: O0; o1: O1;
  1753. BEGIN NEW (o0); o1 := o0(O1);
  1754. END Test.
  1755. positive: type guard on same nil object
  1756. MODULE Test;
  1757. TYPE O = OBJECT END O;
  1758. VAR o: O;
  1759. BEGIN o := NIL; o := o(O);
  1760. END Test.
  1761. negative: type guard on nil object
  1762. MODULE Test;
  1763. TYPE O0 = OBJECT END O0;
  1764. TYPE O1 = OBJECT (O0) END O1;
  1765. VAR o0: O0; o1: O1;
  1766. BEGIN o0 := NIL; o1 := o0(O1);
  1767. END Test.
  1768. negative: type guard on returned nil object
  1769. MODULE Test;
  1770. TYPE O0 = OBJECT END O0;
  1771. TYPE O1 = OBJECT (O0) END O1;
  1772. VAR o1: O1;
  1773. PROCEDURE Function (): O0;
  1774. BEGIN RETURN NIL;
  1775. END Function;
  1776. BEGIN o1 := Function ()(O1);
  1777. END Test.
  1778. positive: type guard on base object
  1779. MODULE Test;
  1780. TYPE O0 = OBJECT;
  1781. TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
  1782. VAR o0: O0; o1: O1;
  1783. BEGIN NEW (o1); o1.b := TRUE; o0 := o1; ASSERT (o0(O1).b);
  1784. END Test.
  1785. positive: type guard on returned base object
  1786. MODULE Test;
  1787. TYPE O0 = OBJECT;
  1788. TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
  1789. VAR o1: O1;
  1790. PROCEDURE Function (): O0;
  1791. BEGIN NEW (o1); o1.b := TRUE; RETURN o1;
  1792. END Function;
  1793. BEGIN ASSERT (Function ()(O1).b);
  1794. END Test.
  1795. negative: type guard on nil base object
  1796. MODULE Test;
  1797. TYPE O0 = OBJECT;
  1798. TYPE O1 = OBJECT (O0) END O1;
  1799. VAR o0: O0; o1: O1;
  1800. BEGIN o0 := NIL; o1 := o0(O1);
  1801. END Test.
  1802. negative: type guard on returned nil base object
  1803. MODULE Test;
  1804. TYPE O0 = OBJECT;
  1805. TYPE O1 = OBJECT (O0) END O1;
  1806. VAR o1: O1;
  1807. PROCEDURE Function (): O0;
  1808. BEGIN RETURN NIL;
  1809. END Function;
  1810. BEGIN o1 := Function ()(O1);
  1811. END Test.
  1812. # type tests
  1813. positive: type test on same global record
  1814. MODULE Test;
  1815. TYPE R = RECORD END;
  1816. VAR r: R;
  1817. BEGIN ASSERT (r IS R);
  1818. END Test.
  1819. positive: type test on same local record
  1820. MODULE Test;
  1821. PROCEDURE Procedure;
  1822. TYPE R = RECORD END;
  1823. VAR r: R;
  1824. BEGIN ASSERT (r IS R);
  1825. END Procedure;
  1826. BEGIN Procedure;
  1827. END Test.
  1828. positive: type test on same parameter record
  1829. MODULE Test;
  1830. TYPE R = RECORD END;
  1831. VAR r: R;
  1832. PROCEDURE Procedure (r: R); BEGIN ASSERT (r IS R); END Procedure;
  1833. BEGIN Procedure (r);
  1834. END Test.
  1835. positive: type test on same variable parameter record
  1836. MODULE Test;
  1837. TYPE R = RECORD END;
  1838. VAR r: R;
  1839. PROCEDURE Procedure (VAR r: R); BEGIN ASSERT (r IS R); END Procedure;
  1840. BEGIN Procedure (r);
  1841. END Test.
  1842. positive: type test on same constant parameter record
  1843. MODULE Test;
  1844. TYPE R = RECORD END;
  1845. VAR r: R;
  1846. PROCEDURE Procedure (CONST r: R); BEGIN ASSERT (r IS R); END Procedure;
  1847. BEGIN Procedure (r);
  1848. END Test.
  1849. positive: type test on variable parameter record
  1850. MODULE Test;
  1851. TYPE R0 = RECORD END; R1 = RECORD (R0) END;
  1852. VAR r: R1;
  1853. PROCEDURE Procedure (VAR r: R0); BEGIN ASSERT (r IS R1); END Procedure;
  1854. BEGIN Procedure (r);
  1855. END Test.
  1856. positive: unsatisfied type test on variable parameter record
  1857. MODULE Test;
  1858. TYPE R0 = RECORD END; R1 = RECORD (R0) END;
  1859. VAR r: R0;
  1860. PROCEDURE Procedure (VAR r: R0); BEGIN ASSERT (~(r IS R1)); END Procedure;
  1861. BEGIN Procedure (r);
  1862. END Test.
  1863. positive: type test on constant parameter record
  1864. MODULE Test;
  1865. TYPE R0 = RECORD END; R1 = RECORD (R0) END;
  1866. VAR r: R1;
  1867. PROCEDURE Procedure (CONST r: R0); BEGIN ASSERT (r IS R1); END Procedure;
  1868. BEGIN Procedure (r);
  1869. END Test.
  1870. positive: unsatisfied type test on constant parameter record
  1871. MODULE Test;
  1872. TYPE R0 = RECORD END; R1 = RECORD (R0) END;
  1873. VAR r: R0;
  1874. PROCEDURE Procedure (CONST r: R0); BEGIN ASSERT (~(r IS R1)); END Procedure;
  1875. BEGIN Procedure (r);
  1876. END Test.
  1877. positive: type test on same pointer to record
  1878. MODULE Test;
  1879. TYPE R = RECORD END; P = POINTER TO R;
  1880. VAR p: P;
  1881. BEGIN NEW (p); ASSERT (p IS P); ASSERT (p^ IS R);
  1882. END Test.
  1883. positive: type test on pointer to record
  1884. MODULE Test;
  1885. TYPE R0 = RECORD END; P0 = POINTER TO R0
  1886. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  1887. VAR p0: P0; p1: P1;
  1888. BEGIN NEW (p1); p0 := p1; ASSERT (p0 IS P1); ASSERT (p0^ IS R1);
  1889. END Test.
  1890. positive: type test on returned pointer to record
  1891. MODULE Test;
  1892. TYPE R0 = RECORD END; P0 = POINTER TO R0
  1893. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  1894. VAR p1: P1;
  1895. PROCEDURE Function (): P0;
  1896. BEGIN NEW (p1); RETURN p1;
  1897. END Function;
  1898. BEGIN ASSERT (Function () IS P1); ASSERT (Function ()^ IS R1);
  1899. END Test.
  1900. positive: unsatisfied type test on pointer to record
  1901. MODULE Test;
  1902. TYPE R0 = RECORD END; P0 = POINTER TO R0
  1903. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  1904. VAR p0: P0;
  1905. BEGIN NEW (p0); ASSERT (~(p0 IS P1)); ASSERT (~(p0^ IS R1));
  1906. END Test.
  1907. positive: unsatisfied type test on returned pointer to record
  1908. MODULE Test;
  1909. TYPE R0 = RECORD END; P0 = POINTER TO R0
  1910. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  1911. VAR p0: P0;
  1912. PROCEDURE Function (): P0;
  1913. BEGIN NEW (p0); RETURN p0;
  1914. END Function;
  1915. BEGIN ASSERT (~(Function () IS P1)); ASSERT (~(Function ()^ IS R1));
  1916. END Test.
  1917. positive: type test on nil pointer to same record
  1918. MODULE Test;
  1919. TYPE R = RECORD END; P = POINTER TO R;
  1920. VAR p: P; result: BOOLEAN
  1921. BEGIN p := NIL; result := p IS P;
  1922. END Test.
  1923. negative: type test on nil pointer to record
  1924. MODULE Test;
  1925. TYPE R0 = RECORD END; P0 = POINTER TO R0;
  1926. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  1927. VAR p0: P0; result: BOOLEAN
  1928. BEGIN p0 := NIL; result := p0 IS P1;
  1929. END Test.
  1930. negative: type test on returned nil pointer to record
  1931. MODULE Test;
  1932. TYPE R0 = RECORD END; P0 = POINTER TO R0;
  1933. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  1934. VAR result: BOOLEAN
  1935. PROCEDURE Function (): P0;
  1936. BEGIN RETURN NIL;
  1937. END Function;
  1938. BEGIN result := Function () IS P1;
  1939. END Test.
  1940. positive: type test on same object
  1941. MODULE Test;
  1942. TYPE O = OBJECT END O;
  1943. VAR o: O;
  1944. BEGIN NEW (o); ASSERT (o IS O);
  1945. END Test.
  1946. positive: type test on object
  1947. MODULE Test;
  1948. TYPE O0 = OBJECT END O0;
  1949. TYPE O1 = OBJECT (O0) END O1;
  1950. VAR o0: O0; o1: O1;
  1951. BEGIN NEW (o1); o0 := o1; ASSERT (o0 IS O1);
  1952. END Test.
  1953. positive: type test on returned object
  1954. MODULE Test;
  1955. TYPE O0 = OBJECT END O0;
  1956. TYPE O1 = OBJECT (O0) END O1;
  1957. VAR o1: O1;
  1958. PROCEDURE Function (): O0;
  1959. BEGIN NEW (o1); RETURN o1;
  1960. END Function;
  1961. BEGIN ASSERT (Function () IS O1);
  1962. END Test.
  1963. positive: unsatisfied type test on object
  1964. MODULE Test;
  1965. TYPE O0 = OBJECT END O0;
  1966. TYPE O1 = OBJECT (O0) END O1;
  1967. VAR o0: O0;
  1968. BEGIN NEW (o0); ASSERT (~(o0 IS O1));
  1969. END Test.
  1970. positive: unsatisfied type test on returned object
  1971. MODULE Test;
  1972. TYPE O0 = OBJECT END O0;
  1973. TYPE O1 = OBJECT (O0) END O1;
  1974. VAR o0: O0;
  1975. PROCEDURE Function (): O0;
  1976. BEGIN NEW (o0); RETURN o0;
  1977. END Function;
  1978. BEGIN ASSERT (~(Function () IS O1));
  1979. END Test.
  1980. positive: type test on same nil object
  1981. MODULE Test;
  1982. TYPE O = OBJECT END O;
  1983. VAR o: O; result: BOOLEAN;
  1984. BEGIN o := NIL; result := o IS O;
  1985. END Test.
  1986. negative: type test on nil object
  1987. MODULE Test;
  1988. TYPE O0 = OBJECT END O0;
  1989. TYPE O1 = OBJECT (O0) END O1;
  1990. VAR o0: O0; result: BOOLEAN;
  1991. BEGIN o0 := NIL; result := o0 IS O1;
  1992. END Test.
  1993. negative: type test on returned nil object
  1994. MODULE Test;
  1995. TYPE O0 = OBJECT END O0;
  1996. TYPE O1 = OBJECT (O0) END O1;
  1997. VAR result: BOOLEAN;
  1998. PROCEDURE Function (): O0;
  1999. BEGIN RETURN NIL;
  2000. END Function;
  2001. BEGIN result := Function () IS O1;
  2002. END Test.
  2003. positive: type test on base object
  2004. MODULE Test;
  2005. TYPE O0 = OBJECT;
  2006. TYPE O1 = OBJECT (O0) END O1;
  2007. VAR o0: O0; o1: O1;
  2008. BEGIN NEW (o1); o0 := o1; ASSERT (o0 IS O1);
  2009. END Test.
  2010. positive: type test on returned base object
  2011. MODULE Test;
  2012. TYPE O0 = OBJECT;
  2013. TYPE O1 = OBJECT (O0) END O1;
  2014. VAR o1: O1;
  2015. PROCEDURE Function (): O0;
  2016. BEGIN NEW (o1); RETURN o1;
  2017. END Function;
  2018. BEGIN ASSERT (Function () IS O1);
  2019. END Test.
  2020. negative: type test on nil base object
  2021. MODULE Test;
  2022. TYPE O0 = OBJECT;
  2023. TYPE O1 = OBJECT (O0) END O1;
  2024. VAR o0: O0; result: BOOLEAN;
  2025. BEGIN o0 := NIL; result := o0 IS O1;
  2026. END Test.
  2027. negative: type test on returned nil base object
  2028. MODULE Test;
  2029. TYPE O0 = OBJECT;
  2030. TYPE O1 = OBJECT (O0) END O1;
  2031. VAR result: BOOLEAN;
  2032. PROCEDURE Function (): O0;
  2033. BEGIN RETURN NIL;
  2034. END Function;
  2035. BEGIN result := Function () IS O1;
  2036. END Test.
  2037. # dereferencing
  2038. positive: explicit dereference on pointer to record
  2039. MODULE Test;
  2040. VAR p: POINTER TO RECORD a: INTEGER END;
  2041. BEGIN NEW (p); p^.a := 45; ASSERT (p.a = 45);
  2042. END Test.
  2043. negative: explicit dereference of nil pointer to record
  2044. MODULE Test;
  2045. VAR p: POINTER TO RECORD a: INTEGER END;
  2046. BEGIN p := NIL; p^.a := 45;
  2047. END Test.
  2048. positive: implicit dereference on pointer to record
  2049. MODULE Test;
  2050. VAR p: POINTER TO RECORD a: INTEGER END;
  2051. BEGIN NEW (p); p.a := 45; ASSERT (p^.a = 45);
  2052. END Test.
  2053. negative: implicit dereference of nil pointer to record
  2054. MODULE Test;
  2055. VAR p: POINTER TO RECORD a: INTEGER END;
  2056. BEGIN p := NIL; p.a := 45;
  2057. END Test.
  2058. positive: explicit dereference on pointer to array
  2059. MODULE Test;
  2060. VAR p: POINTER TO ARRAY 10 OF INTEGER;
  2061. BEGIN NEW (p); p^[4] := 45; ASSERT (p[4] = 45);
  2062. END Test.
  2063. positive: implicit dereference on pointer to array
  2064. MODULE Test;
  2065. VAR p: POINTER TO ARRAY 10 OF INTEGER;
  2066. BEGIN NEW (p); p[4] := 45; ASSERT (p^[4] = 45);
  2067. END Test.
  2068. negative: explicit dereference of nil pointer to array
  2069. MODULE Test;
  2070. VAR p: POINTER TO ARRAY 10 OF INTEGER;
  2071. BEGIN p := NIL; p^[4] := 45;
  2072. END Test.
  2073. negative: implicit dereference of nil pointer to array
  2074. MODULE Test;
  2075. VAR p: POINTER TO ARRAY 10 OF INTEGER;
  2076. BEGIN p := NIL; p[4] := 45;
  2077. END Test.
  2078. # array length
  2079. positive: length of one-dimensional open array
  2080. MODULE Test;
  2081. VAR a: ARRAY 10 OF INTEGER;
  2082. PROCEDURE Procedure (p: ARRAY OF INTEGER; len: INTEGER);
  2083. BEGIN ASSERT (LEN (p) = len);
  2084. END Procedure;
  2085. BEGIN Procedure (a, 10); Procedure (a, LEN (a));
  2086. END Test.
  2087. positive: first dimension of one-dimensional open array
  2088. MODULE Test;
  2089. VAR a: ARRAY 10 OF INTEGER;
  2090. PROCEDURE Procedure (p: ARRAY OF INTEGER; len: INTEGER);
  2091. BEGIN ASSERT (LEN (p, 0) = len);
  2092. END Procedure;
  2093. BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
  2094. END Test.
  2095. positive: dynamic dimension of one-dimensional open array
  2096. MODULE Test;
  2097. VAR a: ARRAY 10 OF INTEGER;
  2098. PROCEDURE Procedure (p: ARRAY OF INTEGER; dim, len: INTEGER);
  2099. BEGIN ASSERT (LEN (p, dim) = len);
  2100. END Procedure;
  2101. BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0));
  2102. END Test.
  2103. negative: negative dynamic dimension of one-dimensional open array
  2104. MODULE Test;
  2105. VAR a: ARRAY 10 OF INTEGER;
  2106. PROCEDURE Procedure (p: ARRAY OF INTEGER; dim: INTEGER);
  2107. VAR len: LONGINT;
  2108. BEGIN len := LEN (p, dim);
  2109. END Procedure;
  2110. BEGIN Procedure (a, -1);
  2111. END Test.
  2112. negative: invalid dynamic dimension of one-dimensional open array
  2113. MODULE Test;
  2114. VAR a: ARRAY 10 OF INTEGER;
  2115. PROCEDURE Procedure (p: ARRAY OF INTEGER; dim: INTEGER);
  2116. VAR len: LONGINT;
  2117. BEGIN len := LEN (p, dim);
  2118. END Procedure;
  2119. BEGIN Procedure (a, 1);
  2120. END Test.
  2121. positive: length of two-dimensional open array
  2122. MODULE Test;
  2123. VAR a: ARRAY 10, 20 OF INTEGER;
  2124. PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
  2125. BEGIN ASSERT (LEN (p) = len);
  2126. END Procedure;
  2127. BEGIN Procedure (a, 10); Procedure (a, LEN (a));
  2128. END Test.
  2129. positive: first dimension of two-dimensional open array
  2130. MODULE Test;
  2131. VAR a: ARRAY 10, 20 OF INTEGER;
  2132. PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
  2133. BEGIN ASSERT (LEN (p, 0) = len);
  2134. END Procedure;
  2135. BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
  2136. END Test.
  2137. positive: second dimension of two-dimensional open array
  2138. MODULE Test;
  2139. VAR a: ARRAY 10, 20 OF INTEGER;
  2140. PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
  2141. BEGIN ASSERT (LEN (p, 1) = len);
  2142. END Procedure;
  2143. BEGIN Procedure (a, 20); Procedure (a, LEN (a, 1));
  2144. END Test.
  2145. positive: dynamic dimension of two-dimensional open array
  2146. MODULE Test;
  2147. VAR a: ARRAY 10, 20 OF INTEGER;
  2148. PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; dim, len: INTEGER);
  2149. BEGIN ASSERT (LEN (p, dim) = len);
  2150. END Procedure;
  2151. BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0)); Procedure (a, 1, 20); Procedure (a, 1, LEN (a, 1));
  2152. END Test.
  2153. negative: negative dynamic dimension of two-dimensional open array
  2154. MODULE Test;
  2155. VAR a: ARRAY 10, 20 OF INTEGER;
  2156. PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
  2157. VAR len: LONGINT;
  2158. BEGIN len := LEN (p, dim);
  2159. END Procedure;
  2160. BEGIN Procedure (a, -1);
  2161. END Test.
  2162. negative: invalid dynamic dimension of two-dimensional open array
  2163. MODULE Test;
  2164. VAR a: ARRAY 10, 20 OF INTEGER;
  2165. PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
  2166. VAR len: LONGINT;
  2167. BEGIN len := LEN (p, dim);
  2168. END Procedure;
  2169. BEGIN Procedure (a, 2);
  2170. END Test.
  2171. positive: length of one-dimensional variable open array
  2172. MODULE Test;
  2173. VAR a: ARRAY 10 OF INTEGER;
  2174. PROCEDURE Procedure (VAR p: ARRAY OF INTEGER; len: INTEGER);
  2175. BEGIN ASSERT (LEN (p) = len);
  2176. END Procedure;
  2177. BEGIN Procedure (a, 10); Procedure (a, LEN (a));
  2178. END Test.
  2179. positive: first dimension of one-dimensional variable open array
  2180. MODULE Test;
  2181. VAR a: ARRAY 10 OF INTEGER;
  2182. PROCEDURE Procedure (VAR p: ARRAY OF INTEGER; len: INTEGER);
  2183. BEGIN ASSERT (LEN (p, 0) = len);
  2184. END Procedure;
  2185. BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
  2186. END Test.
  2187. positive: dynamic dimension of one-dimensional variable open array
  2188. MODULE Test;
  2189. VAR a: ARRAY 10 OF INTEGER;
  2190. PROCEDURE Procedure (VAR p: ARRAY OF INTEGER; dim, len: INTEGER);
  2191. BEGIN ASSERT (LEN (p, dim) = len);
  2192. END Procedure;
  2193. BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0));
  2194. END Test.
  2195. negative: negative dynamic dimension of one-dimensional variable open array
  2196. MODULE Test;
  2197. VAR a: ARRAY 10 OF INTEGER;
  2198. PROCEDURE Procedure (VAR p: ARRAY OF INTEGER; dim: INTEGER);
  2199. VAR len: LONGINT;
  2200. BEGIN len := LEN (p, dim);
  2201. END Procedure;
  2202. BEGIN Procedure (a, -1);
  2203. END Test.
  2204. negative: invalid dynamic dimension of one-dimensional variable open array
  2205. MODULE Test;
  2206. VAR a: ARRAY 10 OF INTEGER;
  2207. PROCEDURE Procedure (VAR p: ARRAY OF INTEGER; dim: INTEGER);
  2208. VAR len: LONGINT;
  2209. BEGIN len := LEN (p, dim);
  2210. END Procedure;
  2211. BEGIN Procedure (a, 1);
  2212. END Test.
  2213. positive: length of two-dimensional variable open array
  2214. MODULE Test;
  2215. VAR a: ARRAY 10, 20 OF INTEGER;
  2216. PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
  2217. BEGIN ASSERT (LEN (p) = len);
  2218. END Procedure;
  2219. BEGIN Procedure (a, 10); Procedure (a, LEN (a));
  2220. END Test.
  2221. positive: first dimension of two-dimensional variable open array
  2222. MODULE Test;
  2223. VAR a: ARRAY 10, 20 OF INTEGER;
  2224. PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
  2225. BEGIN ASSERT (LEN (p, 0) = len);
  2226. END Procedure;
  2227. BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
  2228. END Test.
  2229. positive: second dimension of two-dimensional variable open array
  2230. MODULE Test;
  2231. VAR a: ARRAY 10, 20 OF INTEGER;
  2232. PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
  2233. BEGIN ASSERT (LEN (p, 1) = len);
  2234. END Procedure;
  2235. BEGIN Procedure (a, 20); Procedure (a, LEN (a, 1));
  2236. END Test.
  2237. positive: dynamic dimension of two-dimensional variable open array
  2238. MODULE Test;
  2239. VAR a: ARRAY 10, 20 OF INTEGER;
  2240. PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; dim, len: INTEGER);
  2241. BEGIN ASSERT (LEN (p, dim) = len);
  2242. END Procedure;
  2243. BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0)); Procedure (a, 1, 20); Procedure (a, 1, LEN (a, 1));
  2244. END Test.
  2245. negative: negative dynamic dimension of two-dimensional variable open array
  2246. MODULE Test;
  2247. VAR a: ARRAY 10, 20 OF INTEGER;
  2248. PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
  2249. VAR len: LONGINT;
  2250. BEGIN len := LEN (p, dim);
  2251. END Procedure;
  2252. BEGIN Procedure (a, -1);
  2253. END Test.
  2254. negative: invalid dynamic dimension of two-dimensional variable open array
  2255. MODULE Test;
  2256. VAR a: ARRAY 10, 20 OF INTEGER;
  2257. PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
  2258. VAR len: LONGINT;
  2259. BEGIN len := LEN (p, dim);
  2260. END Procedure;
  2261. BEGIN Procedure (a, 2);
  2262. END Test.
  2263. positive: length of one-dimensional constant open array
  2264. MODULE Test;
  2265. VAR a: ARRAY 10 OF INTEGER;
  2266. PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; len: INTEGER);
  2267. BEGIN ASSERT (LEN (p) = len);
  2268. END Procedure;
  2269. BEGIN Procedure (a, 10); Procedure (a, LEN (a));
  2270. END Test.
  2271. positive: first dimension of one-dimensional constant open array
  2272. MODULE Test;
  2273. VAR a: ARRAY 10 OF INTEGER;
  2274. PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; len: INTEGER);
  2275. BEGIN ASSERT (LEN (p, 0) = len);
  2276. END Procedure;
  2277. BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
  2278. END Test.
  2279. positive: dynamic dimension of one-dimensional constant open array
  2280. MODULE Test;
  2281. VAR a: ARRAY 10 OF INTEGER;
  2282. PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim, len: INTEGER);
  2283. BEGIN ASSERT (LEN (p, dim) = len);
  2284. END Procedure;
  2285. BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0));
  2286. END Test.
  2287. negative: negative dynamic dimension of one-dimensional constant open array
  2288. MODULE Test;
  2289. VAR a: ARRAY 10 OF INTEGER;
  2290. PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim: INTEGER);
  2291. VAR len: LONGINT;
  2292. BEGIN len := LEN (p, dim);
  2293. END Procedure;
  2294. BEGIN Procedure (a, -1);
  2295. END Test.
  2296. negative: invalid dynamic dimension of one-dimensional constant open array
  2297. MODULE Test;
  2298. VAR a: ARRAY 10 OF INTEGER;
  2299. PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim: INTEGER);
  2300. VAR len: LONGINT;
  2301. BEGIN len := LEN (p, dim);
  2302. END Procedure;
  2303. BEGIN Procedure (a, 1);
  2304. END Test.
  2305. positive: length of two-dimensional constant open array
  2306. MODULE Test;
  2307. VAR a: ARRAY 10, 20 OF INTEGER;
  2308. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
  2309. BEGIN ASSERT (LEN (p) = len);
  2310. END Procedure;
  2311. BEGIN Procedure (a, 10); Procedure (a, LEN (a));
  2312. END Test.
  2313. positive: first dimension of two-dimensional constant open array
  2314. MODULE Test;
  2315. VAR a: ARRAY 10, 20 OF INTEGER;
  2316. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
  2317. BEGIN ASSERT (LEN (p, 0) = len);
  2318. END Procedure;
  2319. BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
  2320. END Test.
  2321. positive: second dimension of two-dimensional constant open array
  2322. MODULE Test;
  2323. VAR a: ARRAY 10, 20 OF INTEGER;
  2324. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
  2325. BEGIN ASSERT (LEN (p, 1) = len);
  2326. END Procedure;
  2327. BEGIN Procedure (a, 20); Procedure (a, LEN (a, 1));
  2328. END Test.
  2329. positive: dynamic dimension of two-dimensional constant open array
  2330. MODULE Test;
  2331. VAR a: ARRAY 10, 20 OF INTEGER;
  2332. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim, len: INTEGER);
  2333. BEGIN ASSERT (LEN (p, dim) = len);
  2334. END Procedure;
  2335. BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0)); Procedure (a, 1, 20); Procedure (a, 1, LEN (a, 1));
  2336. END Test.
  2337. negative: negative dynamic dimension of two-dimensional constant open array
  2338. MODULE Test;
  2339. VAR a: ARRAY 10, 20 OF INTEGER;
  2340. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
  2341. VAR len: LONGINT;
  2342. BEGIN len := LEN (p, dim);
  2343. END Procedure;
  2344. BEGIN Procedure (a, -1);
  2345. END Test.
  2346. negative: invalid dynamic dimension of two-dimensional constant open array
  2347. MODULE Test;
  2348. VAR a: ARRAY 10, 20 OF INTEGER;
  2349. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
  2350. VAR len: LONGINT;
  2351. BEGIN len := LEN (p, dim);
  2352. END Procedure;
  2353. BEGIN Procedure (a, 2);
  2354. END Test.
  2355. positive: length of pointer to one-dimensional open array
  2356. MODULE Test;
  2357. VAR a: POINTER TO ARRAY OF INTEGER;
  2358. PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; len: LONGINT);
  2359. BEGIN ASSERT (LEN (p) = len);
  2360. END Procedure;
  2361. BEGIN NEW (a, 10); ASSERT (LEN (a) = 10); Procedure (a^, 10); Procedure (a^, LEN (a));
  2362. END Test.
  2363. positive: first dimension of pointer to one-dimensional open array
  2364. MODULE Test;
  2365. VAR a: POINTER TO ARRAY OF INTEGER;
  2366. PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; len: LONGINT);
  2367. BEGIN ASSERT (LEN (p, 0) = len);
  2368. END Procedure;
  2369. BEGIN NEW (a, 10); ASSERT (LEN (a, 0) = 10); Procedure (a^, 10); Procedure (a^, LEN (a, 0));
  2370. END Test.
  2371. positive: dynamic dimension of pointer to one-dimensional open array
  2372. MODULE Test;
  2373. VAR a: POINTER TO ARRAY OF INTEGER;
  2374. PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim, len: LONGINT);
  2375. BEGIN ASSERT (LEN (p, dim) = len);
  2376. END Procedure;
  2377. BEGIN NEW (a, 10); Procedure (a^, 0, 10); Procedure (a^, 0, LEN (a, 0));
  2378. END Test.
  2379. negative: negative dynamic dimension of pointer to one-dimensional open array
  2380. MODULE Test;
  2381. VAR a: POINTER TO ARRAY OF INTEGER;
  2382. PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim: INTEGER);
  2383. VAR len: LONGINT;
  2384. BEGIN len := LEN (p, dim);
  2385. END Procedure;
  2386. BEGIN NEW (a, 10); Procedure (a^, -1);
  2387. END Test.
  2388. negative: invalid dynamic dimension of pointer to one-dimensional open array
  2389. MODULE Test;
  2390. VAR a: POINTER TO ARRAY OF INTEGER;
  2391. PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim: INTEGER);
  2392. VAR len: LONGINT;
  2393. BEGIN len := LEN (p, dim);
  2394. END Procedure;
  2395. BEGIN NEW (a, 10); Procedure (a^, 1);
  2396. END Test.
  2397. positive: length of pointer to two-dimensional open array
  2398. MODULE Test;
  2399. VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
  2400. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: LONGINT);
  2401. BEGIN ASSERT (LEN (p) = len);
  2402. END Procedure;
  2403. BEGIN NEW (a, 10, 20); Procedure (a^, 10); Procedure (a^, LEN (a));
  2404. END Test.
  2405. positive: first dimension of pointer to two-dimensional open array
  2406. MODULE Test;
  2407. VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
  2408. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: LONGINT);
  2409. BEGIN ASSERT (LEN (p, 0) = len);
  2410. END Procedure;
  2411. BEGIN NEW (a, 10, 20); Procedure (a^, 10); Procedure (a^, LEN (a, 0));
  2412. END Test.
  2413. positive: second dimension of pointer to two-dimensional open array
  2414. MODULE Test;
  2415. VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
  2416. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: LONGINT);
  2417. BEGIN ASSERT (LEN (p, 1) = len);
  2418. END Procedure;
  2419. BEGIN NEW (a, 10, 20); Procedure (a^, 20); Procedure (a^, LEN (a, 1));
  2420. END Test.
  2421. positive: dynamic dimension of pointer to two-dimensional open array
  2422. MODULE Test;
  2423. VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
  2424. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim, len: LONGINT);
  2425. BEGIN ASSERT (LEN (p, dim) = len);
  2426. END Procedure;
  2427. BEGIN NEW (a, 10, 20); Procedure (a^, 0, 10); Procedure (a^, 0, LEN (a, 0)); Procedure (a^, 1, 20); Procedure (a^, 1, LEN (a, 1));
  2428. END Test.
  2429. negative: negative dynamic dimension of pointer to two-dimensional open array
  2430. MODULE Test;
  2431. VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
  2432. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
  2433. VAR len: LONGINT;
  2434. BEGIN len := LEN (p, dim);
  2435. END Procedure;
  2436. BEGIN NEW (a, 10, 20); Procedure (a^, -1);
  2437. END Test.
  2438. negative: invalid dynamic dimension of pointer to two-dimensional open array
  2439. MODULE Test;
  2440. VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
  2441. PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
  2442. VAR len: LONGINT;
  2443. BEGIN len := LEN (p, dim);
  2444. END Procedure;
  2445. BEGIN NEW (a, 10, 20); Procedure (a^, 2);
  2446. END Test.
  2447. # indexing
  2448. positive: indexing global array
  2449. MODULE Test;
  2450. VAR g: ARRAY 10 OF INTEGER;
  2451. BEGIN g[0] := 1; g[1] := 2; g[2] := LEN (g); ASSERT (g[0] = 1); ASSERT (g[1] = 2); ASSERT (g[g[0]] = 2); ASSERT (g[g[g[0]]] = 10);
  2452. END Test.
  2453. negative: negative index into global array
  2454. MODULE Test;
  2455. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2456. BEGIN index := -1; g[index] := 0;
  2457. END Test.
  2458. negative: too large index into global array
  2459. MODULE Test;
  2460. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2461. BEGIN index := LEN (g); g[index] := 0;
  2462. END Test.
  2463. positive: reading global array
  2464. MODULE Test;
  2465. VAR g: ARRAY 10 OF INTEGER;
  2466. PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
  2467. BEGIN p[index] := value;
  2468. END Set;
  2469. BEGIN Set (g, 5, 15); ASSERT (g[5] = 15);
  2470. END Test.
  2471. positive: writing global array
  2472. MODULE Test;
  2473. VAR g: ARRAY 10 OF INTEGER;
  2474. PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
  2475. BEGIN RETURN p[index];
  2476. END Get;
  2477. BEGIN g[5] := 15; ASSERT (Get (g, 5) = 15);
  2478. END Test.
  2479. positive: reading two-dimensional global array
  2480. MODULE Test;
  2481. VAR g: ARRAY 10, 20 OF INTEGER;
  2482. PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
  2483. BEGIN p[index1, index2] := value;
  2484. END Set;
  2485. BEGIN Set (g, 5, 6, 15); ASSERT (g[5, 6] = 15);
  2486. END Test.
  2487. positive: writing two-dimensional global array
  2488. MODULE Test;
  2489. VAR g: ARRAY 10, 20 OF INTEGER;
  2490. PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
  2491. BEGIN RETURN p[index1, index2];
  2492. END Get;
  2493. BEGIN g[5, 6] := 15; ASSERT (Get (g, 5, 6) = 15);
  2494. END Test.
  2495. positive: indexing local array
  2496. MODULE Test;
  2497. PROCEDURE Procedure;
  2498. VAR l: ARRAY 10 OF INTEGER;
  2499. BEGIN l[0] := 1; l[1] := 2; l[2] := LEN (l); ASSERT (l[0] = 1); ASSERT (l[1] = 2); ASSERT (l[l[0]] = 2); ASSERT (l[l[l[0]]] = 10);
  2500. END Procedure;
  2501. BEGIN Procedure;
  2502. END Test.
  2503. negative: negative index into local array
  2504. MODULE Test;
  2505. PROCEDURE Procedure;
  2506. VAR l: ARRAY 10 OF INTEGER; index: LONGINT;
  2507. BEGIN index := -1; l[index] := 0;
  2508. END Procedure;
  2509. BEGIN Procedure;
  2510. END Test.
  2511. negative: too large index into local array
  2512. MODULE Test;
  2513. PROCEDURE Procedure;
  2514. VAR l: ARRAY 10 OF INTEGER; index: LONGINT;
  2515. BEGIN index := LEN (l); l[index] := 0;
  2516. END Procedure;
  2517. BEGIN Procedure;
  2518. END Test.
  2519. positive: reading local array
  2520. MODULE Test;
  2521. PROCEDURE Procedure;
  2522. VAR l: ARRAY 10 OF INTEGER;
  2523. BEGIN Set (l, 5, 15); ASSERT (l[5] = 15);
  2524. END Procedure;
  2525. PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
  2526. BEGIN p[index] := value;
  2527. END Set;
  2528. BEGIN Procedure;
  2529. END Test.
  2530. positive: writing local array
  2531. MODULE Test;
  2532. PROCEDURE Procedure;
  2533. VAR l: ARRAY 10 OF INTEGER;
  2534. BEGIN l[5] := 15; ASSERT (Get (l, 5) = 15);
  2535. END Procedure;
  2536. PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
  2537. BEGIN RETURN p[index];
  2538. END Get;
  2539. BEGIN Procedure;
  2540. END Test.
  2541. positive: reading two-dimensional local array
  2542. MODULE Test;
  2543. PROCEDURE Procedure;
  2544. VAR l: ARRAY 10, 20 OF INTEGER;
  2545. BEGIN Set (l, 5, 6, 15); ASSERT (l[5, 6] = 15);
  2546. END Procedure;
  2547. PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
  2548. BEGIN p[index1, index2] := value;
  2549. END Set;
  2550. BEGIN Procedure;
  2551. END Test.
  2552. positive: writing two-dimensional local array
  2553. MODULE Test;
  2554. PROCEDURE Procedure;
  2555. VAR l: ARRAY 10, 20 OF INTEGER;
  2556. BEGIN l[5, 6] := 15; ASSERT (Get (l, 5, 6) = 15);
  2557. END Procedure;
  2558. PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
  2559. BEGIN RETURN p[index1, index2];
  2560. END Get;
  2561. BEGIN Procedure;
  2562. END Test.
  2563. positive: indexing parameter array
  2564. MODULE Test;
  2565. VAR g: ARRAY 10 OF INTEGER;
  2566. PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
  2567. BEGIN p[1] := 2; p[2] := LEN (p); ASSERT (p[0] = 1); ASSERT (p[1] = 2); ASSERT (p[p[0]] = 2); ASSERT (p[p[p[0]]] = 10);
  2568. END Procedure;
  2569. BEGIN g[0] := 1; Procedure (g);
  2570. END Test.
  2571. negative: negative index into parameter array
  2572. MODULE Test;
  2573. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2574. PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
  2575. BEGIN index := -1; p[index] := 0;
  2576. END Procedure;
  2577. BEGIN Procedure (g);
  2578. END Test.
  2579. negative: too large index into parameter array
  2580. MODULE Test;
  2581. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2582. PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
  2583. BEGIN index := LEN (p); p[index] := 0;
  2584. END Procedure;
  2585. BEGIN Procedure (g);
  2586. END Test.
  2587. positive: reading parameter array
  2588. MODULE Test;
  2589. VAR g: ARRAY 10 OF INTEGER;
  2590. PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
  2591. BEGIN Set (p, 5, 15); ASSERT (p[5] = 15);
  2592. END Procedure;
  2593. PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
  2594. BEGIN p[index] := value;
  2595. END Set;
  2596. BEGIN Procedure (g);
  2597. END Test.
  2598. positive: writing parameter array
  2599. MODULE Test;
  2600. VAR g: ARRAY 10 OF INTEGER;
  2601. PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
  2602. BEGIN p[5] := 15; ASSERT (Get (p, 5) = 15);
  2603. END Procedure;
  2604. PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
  2605. BEGIN RETURN p[index];
  2606. END Get;
  2607. BEGIN Procedure (g);
  2608. END Test.
  2609. positive: reading two-dimensional parameter array
  2610. MODULE Test;
  2611. VAR g: ARRAY 10, 20 OF INTEGER;
  2612. PROCEDURE Procedure (p: ARRAY 10, 20 OF INTEGER);
  2613. BEGIN Set (p, 5, 6, 15); ASSERT (p[5, 6] = 15);
  2614. END Procedure;
  2615. PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
  2616. BEGIN p[index1, index2] := value;
  2617. END Set;
  2618. BEGIN Procedure (g);
  2619. END Test.
  2620. positive: writing two-dimensional parameter array
  2621. MODULE Test;
  2622. VAR g: ARRAY 10, 20 OF INTEGER;
  2623. PROCEDURE Procedure (p: ARRAY 10, 20 OF INTEGER);
  2624. BEGIN p[5, 6] := 15; ASSERT (Get (p, 5, 6) = 15);
  2625. END Procedure;
  2626. PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
  2627. BEGIN RETURN p[index1, index2];
  2628. END Get;
  2629. BEGIN Procedure (g);
  2630. END Test.
  2631. positive: indexing variable parameter array
  2632. MODULE Test;
  2633. VAR g: ARRAY 10 OF INTEGER;
  2634. PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
  2635. BEGIN p[1] := 2; p[2] := LEN (p); ASSERT (p[0] = 1); ASSERT (p[1] = 2); ASSERT (p[p[0]] = 2); ASSERT (p[p[p[0]]] = 10);
  2636. END Procedure;
  2637. BEGIN g[0] := 1; Procedure (g); ASSERT (g[0] = 1); ASSERT (g[1] = 2); ASSERT (g[g[0]] = 2); ASSERT (g[g[g[0]]] = 10);
  2638. END Test.
  2639. negative: negative index into variable parameter array
  2640. MODULE Test;
  2641. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2642. PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
  2643. BEGIN index := -1; p[index] := 0;
  2644. END Procedure;
  2645. BEGIN Procedure (g);
  2646. END Test.
  2647. negative: too large index into variable parameter array
  2648. MODULE Test;
  2649. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2650. PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
  2651. BEGIN index := LEN (p); p[index] := 0;
  2652. END Procedure;
  2653. BEGIN Procedure (g);
  2654. END Test.
  2655. positive: reading variable parameter array
  2656. MODULE Test;
  2657. VAR g: ARRAY 10 OF INTEGER;
  2658. PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
  2659. BEGIN Set (p, 5, 15); ASSERT (p[5] = 15);
  2660. END Procedure;
  2661. PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
  2662. BEGIN p[index] := value;
  2663. END Set;
  2664. BEGIN Procedure (g); ASSERT (g[5] = 15);
  2665. END Test.
  2666. positive: writing variable parameter array
  2667. MODULE Test;
  2668. VAR g: ARRAY 10 OF INTEGER;
  2669. PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
  2670. BEGIN p[5] := 15; ASSERT (Get (p, 5) = 15);
  2671. END Procedure;
  2672. PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
  2673. BEGIN RETURN p[index];
  2674. END Get;
  2675. BEGIN Procedure (g); ASSERT (Get (g, 5) = 15); ASSERT (g[5] = 15);
  2676. END Test.
  2677. positive: reading two-dimensional variable parameter array
  2678. MODULE Test;
  2679. VAR g: ARRAY 10, 20 OF INTEGER;
  2680. PROCEDURE Procedure (VAR p: ARRAY 10, 20 OF INTEGER);
  2681. BEGIN Set (p, 5, 6, 15); ASSERT (p[5, 6] = 15);
  2682. END Procedure;
  2683. PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
  2684. BEGIN p[index1, index2] := value;
  2685. END Set;
  2686. BEGIN Procedure (g); ASSERT (g[5, 6] = 15);
  2687. END Test.
  2688. positive: writing two-dimensional variable parameter array
  2689. MODULE Test;
  2690. VAR g: ARRAY 10, 20 OF INTEGER;
  2691. PROCEDURE Procedure (VAR p: ARRAY 10, 20 OF INTEGER);
  2692. BEGIN p[5, 6] := 15; ASSERT (Get (p, 5, 6) = 15);
  2693. END Procedure;
  2694. PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
  2695. BEGIN RETURN p[index1, index2];
  2696. END Get;
  2697. BEGIN Procedure (g); ASSERT (Get (g, 5, 6) = 15); ASSERT (g[5, 6] = 15);
  2698. END Test.
  2699. positive: indexing constant parameter array
  2700. MODULE Test;
  2701. VAR g: ARRAY 10 OF INTEGER;
  2702. PROCEDURE Procedure (CONST p: ARRAY 10 OF INTEGER);
  2703. BEGIN ASSERT (p[0] = 1); ASSERT (p[1] = 2); ASSERT (p[p[0]] = 2); ASSERT (p[p[p[0]]] = 10);
  2704. END Procedure;
  2705. BEGIN g[0] := 1; g[1] := 2; g[2] := LEN (g); Procedure (g);
  2706. END Test.
  2707. negative: negative index into constant parameter array
  2708. MODULE Test;
  2709. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2710. PROCEDURE Procedure (CONST p: ARRAY 10 OF INTEGER);
  2711. BEGIN index := -1; index := p[index];
  2712. END Procedure;
  2713. BEGIN Procedure (g);
  2714. END Test.
  2715. negative: too large index into constant parameter array
  2716. MODULE Test;
  2717. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2718. PROCEDURE Procedure (CONST p: ARRAY 10 OF INTEGER);
  2719. BEGIN index := LEN (p); index := p[index];
  2720. END Procedure;
  2721. BEGIN Procedure (g);
  2722. END Test.
  2723. positive: indexing open array
  2724. MODULE Test;
  2725. VAR g: ARRAY 10 OF INTEGER;
  2726. PROCEDURE Procedure (p: ARRAY OF INTEGER);
  2727. BEGIN p[1] := 2; p[2] := SHORT (LEN (p)); ASSERT (p[0] = 1); ASSERT (p[1] = 2); ASSERT (p[p[0]] = 2); ASSERT (p[p[p[0]]] = 10);
  2728. END Procedure;
  2729. BEGIN g[0] := 1; Procedure (g);
  2730. END Test.
  2731. negative: negative index into open array
  2732. MODULE Test;
  2733. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2734. PROCEDURE Procedure (p: ARRAY OF INTEGER);
  2735. BEGIN index := -1; p[index] := 0;
  2736. END Procedure;
  2737. BEGIN Procedure (g);
  2738. END Test.
  2739. negative: too large index into open array
  2740. MODULE Test;
  2741. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2742. PROCEDURE Procedure (p: ARRAY OF INTEGER);
  2743. BEGIN index := LEN (p); p[index] := 0;
  2744. END Procedure;
  2745. BEGIN Procedure (g);
  2746. END Test.
  2747. positive: reading open array
  2748. MODULE Test;
  2749. VAR g: ARRAY 10 OF INTEGER;
  2750. PROCEDURE Procedure (p: ARRAY OF INTEGER);
  2751. BEGIN Set (p, 5, 15); ASSERT (p[5] = 15);
  2752. END Procedure;
  2753. PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
  2754. BEGIN p[index] := value;
  2755. END Set;
  2756. BEGIN Procedure (g);
  2757. END Test.
  2758. positive: writing open array
  2759. MODULE Test;
  2760. VAR g: ARRAY 10 OF INTEGER;
  2761. PROCEDURE Procedure (p: ARRAY OF INTEGER);
  2762. BEGIN p[5] := 15; ASSERT (Get (p, 5) = 15);
  2763. END Procedure;
  2764. PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
  2765. BEGIN RETURN p[index];
  2766. END Get;
  2767. BEGIN Procedure (g);
  2768. END Test.
  2769. positive: reading two-dimensional open array
  2770. MODULE Test;
  2771. VAR g: ARRAY 10, 20 OF INTEGER;
  2772. PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER);
  2773. BEGIN Set (p, 5, 6, 15); ASSERT (p[5, 6] = 15);
  2774. END Procedure;
  2775. PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
  2776. BEGIN p[index1, index2] := value;
  2777. END Set;
  2778. BEGIN Procedure (g);
  2779. END Test.
  2780. positive: writing two-dimensional open array
  2781. MODULE Test;
  2782. VAR g: ARRAY 10, 20 OF INTEGER;
  2783. PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER);
  2784. BEGIN p[5, 6] := 15; ASSERT (Get (p, 5, 6) = 15);
  2785. END Procedure;
  2786. PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
  2787. BEGIN RETURN p[index1, index2];
  2788. END Get;
  2789. BEGIN Procedure (g);
  2790. END Test.
  2791. positive: indexing variable open array
  2792. MODULE Test;
  2793. VAR g: ARRAY 10 OF INTEGER;
  2794. PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
  2795. BEGIN p[1] := 2; p[2] := SHORT (LEN (p)); ASSERT (p[0] = 1); ASSERT (p[1] = 2); ASSERT (p[p[0]] = 2); ASSERT (p[p[p[0]]] = 10);
  2796. END Procedure;
  2797. BEGIN g[0] := 1; Procedure (g); ASSERT (g[0] = 1); ASSERT (g[1] = 2); ASSERT (g[g[0]] = 2); ASSERT (g[g[g[0]]] = 10);
  2798. END Test.
  2799. negative: negative index into variable open array
  2800. MODULE Test;
  2801. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2802. PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
  2803. BEGIN index := -1; p[index] := 0;
  2804. END Procedure;
  2805. BEGIN Procedure (g);
  2806. END Test.
  2807. negative: too large index into variable open array
  2808. MODULE Test;
  2809. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2810. PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
  2811. BEGIN index := LEN (p); p[index] := 0;
  2812. END Procedure;
  2813. BEGIN Procedure (g);
  2814. END Test.
  2815. positive: reading variable open array
  2816. MODULE Test;
  2817. VAR g: ARRAY 10 OF INTEGER;
  2818. PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
  2819. BEGIN Set (p, 5, 15); ASSERT (p[5] = 15);
  2820. END Procedure;
  2821. PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
  2822. BEGIN p[index] := value;
  2823. END Set;
  2824. BEGIN Procedure (g); ASSERT (g[5] = 15);
  2825. END Test.
  2826. positive: writing variable open array
  2827. MODULE Test;
  2828. VAR g: ARRAY 10 OF INTEGER;
  2829. PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
  2830. BEGIN p[5] := 15; ASSERT (Get (p, 5) = 15);
  2831. END Procedure;
  2832. PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
  2833. BEGIN RETURN p[index];
  2834. END Get;
  2835. BEGIN Procedure (g); ASSERT (Get (g, 5) = 15); ASSERT (g[5] = 15);
  2836. END Test.
  2837. positive: reading two-dimensional variable open array
  2838. MODULE Test;
  2839. VAR g: ARRAY 10, 20 OF INTEGER;
  2840. PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER);
  2841. BEGIN Set (p, 5, 6, 15); ASSERT (p[5, 6] = 15);
  2842. END Procedure;
  2843. PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
  2844. BEGIN p[index1, index2] := value;
  2845. END Set;
  2846. BEGIN Procedure (g); ASSERT (g[5, 6] = 15);
  2847. END Test.
  2848. positive: writing two-dimensional variable open array
  2849. MODULE Test;
  2850. VAR g: ARRAY 10, 20 OF INTEGER;
  2851. PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER);
  2852. BEGIN p[5, 6] := 15; ASSERT (Get (p, 5, 6) = 15);
  2853. END Procedure;
  2854. PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
  2855. BEGIN RETURN p[index1, index2];
  2856. END Get;
  2857. BEGIN Procedure (g); ASSERT (Get (g, 5, 6) = 15); ASSERT (g[5, 6] = 15);
  2858. END Test.
  2859. positive: indexing constant open array
  2860. MODULE Test;
  2861. VAR g: ARRAY 10 OF INTEGER;
  2862. PROCEDURE Procedure (CONST p: ARRAY OF INTEGER);
  2863. BEGIN ASSERT (p[0] = 1); ASSERT (p[1] = 2); ASSERT (p[p[0]] = 2); ASSERT (p[p[p[0]]] = 10);
  2864. END Procedure;
  2865. BEGIN g[0] := 1; g[1] := 2; g[2] := LEN (g); Procedure (g);
  2866. END Test.
  2867. negative: negative index into constant open array
  2868. MODULE Test;
  2869. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2870. PROCEDURE Procedure (p: ARRAY OF INTEGER);
  2871. BEGIN index := -1; p[index] := 0;
  2872. END Procedure;
  2873. BEGIN Procedure (g);
  2874. END Test.
  2875. negative: too large index into constant open array
  2876. MODULE Test;
  2877. VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
  2878. PROCEDURE Procedure (p: ARRAY OF INTEGER);
  2879. BEGIN index := LEN (p); p[index] := 0;
  2880. END Procedure;
  2881. BEGIN Procedure (g);
  2882. END Test.
  2883. positive: indexing pointer to array
  2884. MODULE Test;
  2885. VAR g: POINTER TO ARRAY 10 OF INTEGER;
  2886. BEGIN NEW (g); g[0] := 1; g[1] := 2; g[2] := LEN (g^); ASSERT (g[0] = 1); ASSERT (g[1] = 2); ASSERT (g[g[0]] = 2); ASSERT (g[g[g[0]]] = 10);
  2887. END Test.
  2888. negative: negative index into pointer to array
  2889. MODULE Test;
  2890. VAR g: POINTER TO ARRAY 10 OF INTEGER; index: LONGINT;
  2891. BEGIN NEW (g); index := -1; g[index] := 0;
  2892. END Test.
  2893. negative: too large index into pointer to array
  2894. MODULE Test;
  2895. VAR g: POINTER TO ARRAY 10 OF INTEGER; index: LONGINT;
  2896. BEGIN NEW (g); index := LEN (g^); g[index] := 0;
  2897. END Test.
  2898. positive: reading pointer to array
  2899. MODULE Test;
  2900. VAR g: POINTER TO ARRAY 10 OF INTEGER;
  2901. PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
  2902. BEGIN p[index] := value;
  2903. END Set;
  2904. BEGIN NEW (g); Set (g^, 5, 15); ASSERT (g[5] = 15);
  2905. END Test.
  2906. positive: writing pointer to array
  2907. MODULE Test;
  2908. VAR g: POINTER TO ARRAY 10 OF INTEGER;
  2909. PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
  2910. BEGIN RETURN p[index];
  2911. END Get;
  2912. BEGIN NEW (g); g[5] := 15; ASSERT (Get (g^, 5) = 15);
  2913. END Test.
  2914. positive: reading two-dimensional pointer to array
  2915. MODULE Test;
  2916. VAR g: POINTER TO ARRAY 10, 20 OF INTEGER;
  2917. PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
  2918. BEGIN p[index1, index2] := value;
  2919. END Set;
  2920. BEGIN NEW (g); Set (g^, 5, 6, 15); ASSERT (g[5, 6] = 15);
  2921. END Test.
  2922. positive: writing two-dimensional pointer to array
  2923. MODULE Test;
  2924. VAR g: POINTER TO ARRAY 10, 20 OF INTEGER;
  2925. PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
  2926. BEGIN RETURN p[index1, index2];
  2927. END Get;
  2928. BEGIN NEW (g); g[5, 6] := 15; ASSERT (Get (g^, 5, 6) = 15);
  2929. END Test.
  2930. positive: indexing pointer to open array
  2931. MODULE Test;
  2932. VAR g: POINTER TO ARRAY OF INTEGER;
  2933. BEGIN NEW (g, 10); g[0] := 1; g[1] := 2; g[2] := SHORT (LEN (g^)); ASSERT (g[0] = 1); ASSERT (g[1] = 2); ASSERT (g[g[0]] = 2); ASSERT (g[g[g[0]]] = 10);
  2934. END Test.
  2935. negative: negative index into pointer to open array
  2936. MODULE Test;
  2937. VAR g: POINTER TO ARRAY OF INTEGER; index: LONGINT;
  2938. BEGIN NEW (g, 10); index := -1; g[index] := 0;
  2939. END Test.
  2940. negative: too large index into pointer to open array
  2941. MODULE Test;
  2942. VAR g: POINTER TO ARRAY OF INTEGER; index: LONGINT;
  2943. BEGIN NEW (g, 10); index := LEN (g^); g[index] := 0;
  2944. END Test.
  2945. positive: reading pointer to open array
  2946. MODULE Test;
  2947. VAR g: POINTER TO ARRAY OF INTEGER;
  2948. PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
  2949. BEGIN p[index] := value;
  2950. END Set;
  2951. BEGIN NEW (g, 10); Set (g^, 5, 15); ASSERT (g[5] = 15);
  2952. END Test.
  2953. positive: writing pointer to open array
  2954. MODULE Test;
  2955. VAR g: POINTER TO ARRAY OF INTEGER;
  2956. PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
  2957. BEGIN RETURN p[index];
  2958. END Get;
  2959. BEGIN NEW (g, 10); g[5] := 15; ASSERT (Get (g^, 5) = 15);
  2960. END Test.
  2961. positive: reading two-dimensional pointer to open array
  2962. MODULE Test;
  2963. VAR g: POINTER TO ARRAY OF ARRAY OF INTEGER;
  2964. PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
  2965. BEGIN p[index1, index2] := value;
  2966. END Set;
  2967. BEGIN NEW (g, 10, 20); Set (g^, 5, 6, 15); ASSERT (g[5, 6] = 15);
  2968. END Test.
  2969. positive: writing two-dimensional pointer to open array
  2970. MODULE Test;
  2971. VAR g: POINTER TO ARRAY OF ARRAY OF INTEGER;
  2972. PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
  2973. BEGIN RETURN p[index1, index2];
  2974. END Get;
  2975. BEGIN NEW (g, 10, 20); g[5, 6] := 15; ASSERT (Get (g^, 5, 6) = 15);
  2976. END Test.
  2977. # modifying parameters
  2978. positive: modifying boolean parameter
  2979. MODULE Test;
  2980. VAR g: BOOLEAN;
  2981. PROCEDURE Procedure (p: BOOLEAN);
  2982. BEGIN ASSERT (p); p := FALSE; ASSERT (~p); ASSERT (g);
  2983. END Procedure;
  2984. BEGIN g := TRUE; Procedure (g); ASSERT (g);
  2985. END Test.
  2986. positive: modifying character parameter
  2987. MODULE Test;
  2988. VAR g: CHAR;
  2989. PROCEDURE Procedure (p: CHAR);
  2990. BEGIN ASSERT (p = 'c'); p := 'Z'; ASSERT (p = 'Z'); ASSERT (g = 'c');
  2991. END Procedure;
  2992. BEGIN g := 'c'; Procedure (g); ASSERT (g = 'c');
  2993. END Test.
  2994. positive: modifying integer parameter
  2995. MODULE Test;
  2996. VAR g: INTEGER;
  2997. PROCEDURE Procedure (p: INTEGER);
  2998. BEGIN ASSERT (p = 2); INC (p); ASSERT (p = 3); ASSERT (g = 2);
  2999. END Procedure;
  3000. BEGIN g := 2; Procedure (g); ASSERT (g = 2);
  3001. END Test.
  3002. positive: modifying real parameter
  3003. MODULE Test;
  3004. VAR g: REAL;
  3005. PROCEDURE Procedure (p: REAL);
  3006. BEGIN ASSERT (p = 2.5); p := p * 2; ASSERT (p = 5); ASSERT (g = 2.5);
  3007. END Procedure;
  3008. BEGIN g := 2.5; Procedure (g); ASSERT (g = 2.5);
  3009. END Test.
  3010. positive: modifying set parameter
  3011. MODULE Test;
  3012. VAR g: SET;
  3013. PROCEDURE Procedure (p: SET);
  3014. BEGIN ASSERT (p = {3}); INCL (p, 2); INCL (p, 4); ASSERT (p = {2 .. 4}); ASSERT (g = {3});
  3015. END Procedure;
  3016. BEGIN g := {3}; Procedure (g); ASSERT (g = {3});
  3017. END Test.
  3018. positive: modifying array parameter
  3019. MODULE Test;
  3020. VAR g: ARRAY 10 OF INTEGER;
  3021. PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
  3022. BEGIN ASSERT (p[1] = 23); ASSERT (p[8] = 91); p[8] := 19; p[1] := 32; ASSERT (p[1] = 32); ASSERT (p[8] = 19); ASSERT (g[1] = 23); ASSERT (g[8] = 91);
  3023. END Procedure;
  3024. BEGIN g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 23); ASSERT (g[8] = 91);
  3025. END Test.
  3026. positive: modifying open array parameter
  3027. MODULE Test;
  3028. VAR g: ARRAY 10 OF INTEGER;
  3029. PROCEDURE Procedure (p: ARRAY OF INTEGER);
  3030. BEGIN ASSERT (p[1] = 23); ASSERT (p[8] = 91); p[8] := 19; p[1] := 32; ASSERT (p[1] = 32); ASSERT (p[8] = 19); ASSERT (g[1] = 23); ASSERT (g[8] = 91);
  3031. END Procedure;
  3032. BEGIN g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 23); ASSERT (g[8] = 91);
  3033. END Test.
  3034. positive: modifying character array parameter
  3035. MODULE Test;
  3036. VAR g: ARRAY 10 OF CHAR;
  3037. PROCEDURE Procedure (p: ARRAY 10 OF CHAR);
  3038. BEGIN ASSERT (p = "value"); p := "modified"; ASSERT (p = "modified"); ASSERT (g = "value");
  3039. END Procedure;
  3040. BEGIN g := "value"; Procedure (g); ASSERT (g = "value");
  3041. END Test.
  3042. positive: modifying open character array parameter
  3043. MODULE Test;
  3044. VAR g: ARRAY 10 OF CHAR;
  3045. PROCEDURE Procedure (p: ARRAY OF CHAR);
  3046. BEGIN ASSERT (p = "value"); p := "modified"; ASSERT (p = "modified"); ASSERT (g = "value");
  3047. END Procedure;
  3048. BEGIN g := "value"; Procedure (g); ASSERT (g = "value");
  3049. END Test.
  3050. positive: modifying record parameter
  3051. MODULE Test;
  3052. TYPE Record = RECORD x: INTEGER END;
  3053. VAR g: Record;
  3054. PROCEDURE Procedure (p: Record);
  3055. BEGIN ASSERT (p.x = 15); p.x := p.x * 3; ASSERT (p.x = 45); ASSERT (g.x = 15);
  3056. END Procedure;
  3057. BEGIN g.x := 15; Procedure (g); ASSERT (g.x = 15);
  3058. END Test.
  3059. positive: modifying object parameter
  3060. MODULE Test;
  3061. TYPE Object = OBJECT VAR x: INTEGER END Object;
  3062. VAR g: Object;
  3063. PROCEDURE Procedure (p: Object);
  3064. BEGIN ASSERT (p.x = 20); p.x := 10; ASSERT (p.x = 10); ASSERT (g.x = 10);
  3065. END Procedure;
  3066. BEGIN NEW (g); g.x := 20; Procedure (g); ASSERT (g.x = 10);
  3067. END Test.
  3068. positive: modifying object reference parameter
  3069. MODULE Test;
  3070. TYPE Object = OBJECT END Object;
  3071. VAR g: Object;
  3072. PROCEDURE Procedure (p: Object);
  3073. BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g # NIL);
  3074. END Procedure;
  3075. BEGIN NEW (g); Procedure (g); ASSERT (g # NIL);
  3076. END Test.
  3077. positive: modifying pointer to array parameter
  3078. MODULE Test;
  3079. VAR g: POINTER TO ARRAY 10 OF INTEGER;
  3080. PROCEDURE Procedure (p: POINTER TO ARRAY 10 OF INTEGER);
  3081. BEGIN ASSERT (p[1] = 23); ASSERT (p[8] = 91); p[8] := 19; p[1] := 32; ASSERT (p[1] = 32); ASSERT (p[8] = 19); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3082. END Procedure;
  3083. BEGIN NEW (g); g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3084. END Test.
  3085. positive: modifying pointer to open array parameter
  3086. MODULE Test;
  3087. VAR g: POINTER TO ARRAY OF INTEGER;
  3088. PROCEDURE Procedure (p: POINTER TO ARRAY OF INTEGER);
  3089. BEGIN ASSERT (p[1] = 23); ASSERT (p[8] = 91); p[8] := 19; p[1] := 32; ASSERT (p[1] = 32); ASSERT (p[8] = 19); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3090. END Procedure;
  3091. BEGIN NEW (g, 10); g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3092. END Test.
  3093. positive: modifying pointer to character array parameter
  3094. MODULE Test;
  3095. VAR g: POINTER TO ARRAY 10 OF CHAR;
  3096. PROCEDURE Procedure (p: POINTER TO ARRAY 10 OF CHAR);
  3097. BEGIN ASSERT (p^ = "value"); p^ := "modified"; ASSERT (p^ = "modified"); ASSERT (g^ = "modified");
  3098. END Procedure;
  3099. BEGIN NEW (g); g^ := "value"; Procedure (g); ASSERT (g^ = "modified");
  3100. END Test.
  3101. positive: modifying pointer to open character array parameter
  3102. MODULE Test;
  3103. VAR g: POINTER TO ARRAY OF CHAR;
  3104. PROCEDURE Procedure (p: POINTER TO ARRAY OF CHAR);
  3105. BEGIN ASSERT (p^ = "value"); p^ := "modified"; ASSERT (p^ = "modified"); ASSERT (g^ = "modified");
  3106. END Procedure;
  3107. BEGIN NEW (g, 10); g^ := "value"; Procedure (g); ASSERT (g^ = "modified");
  3108. END Test.
  3109. positive: modifying pointer to array reference parameter
  3110. MODULE Test;
  3111. VAR g: POINTER TO ARRAY 10 OF INTEGER;
  3112. PROCEDURE Procedure (p: POINTER TO ARRAY 10 OF INTEGER);
  3113. BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g # NIL);
  3114. END Procedure;
  3115. BEGIN NEW (g); Procedure (g); ASSERT (g # NIL);
  3116. END Test.
  3117. positive: modifying pointer to record parameter
  3118. MODULE Test;
  3119. TYPE Record = RECORD x: INTEGER END;
  3120. VAR g: POINTER TO Record;
  3121. PROCEDURE Procedure (p: POINTER TO Record);
  3122. BEGIN ASSERT (p.x = 15); p.x := p.x * 3; ASSERT (p.x = 45); ASSERT (g.x = 45);
  3123. END Procedure;
  3124. BEGIN NEW (g); g.x := 15; Procedure (g); ASSERT (g.x = 45);
  3125. END Test.
  3126. positive: modifying pointer to record reference parameter
  3127. MODULE Test;
  3128. TYPE Record = RECORD END;
  3129. VAR g: POINTER TO Record;
  3130. PROCEDURE Procedure (p: POINTER TO Record);
  3131. BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g # NIL);
  3132. END Procedure;
  3133. BEGIN NEW (g); Procedure (g); ASSERT (g # NIL);
  3134. END Test.
  3135. positive: modifying procedure parameter
  3136. MODULE Test;
  3137. TYPE P = PROCEDURE (p: P);
  3138. VAR g: P;
  3139. PROCEDURE Procedure (p: P);
  3140. BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g # NIL);
  3141. END Procedure;
  3142. BEGIN g := Procedure; Procedure (g); ASSERT (g # NIL);
  3143. END Test.
  3144. positive: modifying variable boolean parameter
  3145. MODULE Test;
  3146. VAR g: BOOLEAN;
  3147. PROCEDURE Procedure (VAR p: BOOLEAN);
  3148. BEGIN ASSERT (p); p := FALSE; ASSERT (~p); ASSERT (~g);
  3149. END Procedure;
  3150. BEGIN g := TRUE; Procedure (g); ASSERT (~g);
  3151. END Test.
  3152. positive: modifying variable character parameter
  3153. MODULE Test;
  3154. VAR g: CHAR;
  3155. PROCEDURE Procedure (VAR p: CHAR);
  3156. BEGIN ASSERT (p = 'c'); p := 'Z'; ASSERT (p = 'Z'); ASSERT (g = 'Z');
  3157. END Procedure;
  3158. BEGIN g := 'c'; Procedure (g); ASSERT (g = 'Z');
  3159. END Test.
  3160. positive: modifying variable integer parameter
  3161. MODULE Test;
  3162. VAR g: INTEGER;
  3163. PROCEDURE Procedure (VAR p: INTEGER);
  3164. BEGIN ASSERT (p = 2); INC (p); ASSERT (p = 3); ASSERT (g = 3);
  3165. END Procedure;
  3166. BEGIN g := 2; Procedure (g); ASSERT (g = 3);
  3167. END Test.
  3168. positive: modifying variable real parameter
  3169. MODULE Test;
  3170. VAR g: REAL;
  3171. PROCEDURE Procedure (VAR p: REAL);
  3172. BEGIN ASSERT (p = 2.5); p := p * 2; ASSERT (p = 5); ASSERT (g = 5);
  3173. END Procedure;
  3174. BEGIN g := 2.5; Procedure (g); ASSERT (g = 5);
  3175. END Test.
  3176. positive: modifying variable set parameter
  3177. MODULE Test;
  3178. VAR g: SET;
  3179. PROCEDURE Procedure (VAR p: SET);
  3180. BEGIN ASSERT (p = {3}); INCL (p, 2); INCL (p, 4); ASSERT (p = {2 .. 4}); ASSERT (g = {2 .. 4});
  3181. END Procedure;
  3182. BEGIN g := {3}; Procedure (g); ASSERT (g = {2 .. 4});
  3183. END Test.
  3184. positive: modifying variable array parameter
  3185. MODULE Test;
  3186. VAR g: ARRAY 10 OF INTEGER;
  3187. PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
  3188. BEGIN ASSERT (p[1] = 23); ASSERT (p[8] = 91); p[8] := 19; p[1] := 32; ASSERT (p[1] = 32); ASSERT (p[8] = 19); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3189. END Procedure;
  3190. BEGIN g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3191. END Test.
  3192. positive: modifying variable open array parameter
  3193. MODULE Test;
  3194. VAR g: ARRAY 10 OF INTEGER;
  3195. PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
  3196. BEGIN ASSERT (p[1] = 23); ASSERT (p[8] = 91); p[8] := 19; p[1] := 32; ASSERT (p[1] = 32); ASSERT (p[8] = 19); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3197. END Procedure;
  3198. BEGIN g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3199. END Test.
  3200. positive: modifying variable character array parameter
  3201. MODULE Test;
  3202. VAR g: ARRAY 10 OF CHAR;
  3203. PROCEDURE Procedure (VAR p: ARRAY 10 OF CHAR);
  3204. BEGIN ASSERT (p = "value"); p := "modified"; ASSERT (p = "modified"); ASSERT (g = "modified");
  3205. END Procedure;
  3206. BEGIN g := "value"; Procedure (g); ASSERT (g = "modified");
  3207. END Test.
  3208. positive: modifying variable open character array parameter
  3209. MODULE Test;
  3210. VAR g: ARRAY 10 OF CHAR;
  3211. PROCEDURE Procedure (VAR p: ARRAY OF CHAR);
  3212. BEGIN ASSERT (p = "value"); p := "modified"; ASSERT (p = "modified"); ASSERT (g = "modified");
  3213. END Procedure;
  3214. BEGIN g := "value"; Procedure (g); ASSERT (g = "modified");
  3215. END Test.
  3216. positive: modifying variable record parameter
  3217. MODULE Test;
  3218. TYPE Record = RECORD x: INTEGER END;
  3219. VAR g: Record;
  3220. PROCEDURE Procedure (VAR p: Record);
  3221. BEGIN ASSERT (p.x = 15); p.x := p.x * 3; ASSERT (p.x = 45); ASSERT (g.x = 45);
  3222. END Procedure;
  3223. BEGIN g.x := 15; Procedure (g); ASSERT (g.x = 45);
  3224. END Test.
  3225. positive: modifying variable object parameter
  3226. MODULE Test;
  3227. TYPE Object = OBJECT VAR x: INTEGER END Object;
  3228. VAR g: Object;
  3229. PROCEDURE Procedure (VAR p: Object);
  3230. BEGIN ASSERT (p.x = 20); p.x := 10; ASSERT (p.x = 10); ASSERT (g.x = 10);
  3231. END Procedure;
  3232. BEGIN NEW (g); g.x := 20; Procedure (g); ASSERT (g.x = 10);
  3233. END Test.
  3234. positive: modifying variable object reference parameter
  3235. MODULE Test;
  3236. TYPE Object = OBJECT END Object;
  3237. VAR g: Object;
  3238. PROCEDURE Procedure (VAR p: Object);
  3239. BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g = NIL);
  3240. END Procedure;
  3241. BEGIN NEW (g); Procedure (g); ASSERT (g = NIL);
  3242. END Test.
  3243. positive: modifying variable pointer to array parameter
  3244. MODULE Test;
  3245. VAR g: POINTER TO ARRAY 10 OF INTEGER;
  3246. PROCEDURE Procedure (VAR p: POINTER TO ARRAY 10 OF INTEGER);
  3247. BEGIN ASSERT (p[1] = 23); ASSERT (p[8] = 91); p[8] := 19; p[1] := 32; ASSERT (p[1] = 32); ASSERT (p[8] = 19); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3248. END Procedure;
  3249. BEGIN NEW (g); g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3250. END Test.
  3251. positive: modifying variable pointer to open array parameter
  3252. MODULE Test;
  3253. VAR g: POINTER TO ARRAY OF INTEGER;
  3254. PROCEDURE Procedure (VAR p: POINTER TO ARRAY OF INTEGER);
  3255. BEGIN ASSERT (p[1] = 23); ASSERT (p[8] = 91); p[8] := 19; p[1] := 32; ASSERT (p[1] = 32); ASSERT (p[8] = 19); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3256. END Procedure;
  3257. BEGIN NEW (g, 10); g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
  3258. END Test.
  3259. positive: modifying variable pointer to character array parameter
  3260. MODULE Test;
  3261. VAR g: POINTER TO ARRAY 10 OF CHAR;
  3262. PROCEDURE Procedure (VAR p: POINTER TO ARRAY 10 OF CHAR);
  3263. BEGIN ASSERT (p^ = "value"); p^ := "modified"; ASSERT (p^ = "modified"); ASSERT (g^ = "modified");
  3264. END Procedure;
  3265. BEGIN NEW (g); g^ := "value"; Procedure (g); ASSERT (g^ = "modified");
  3266. END Test.
  3267. positive: modifying variable pointer to open character array parameter
  3268. MODULE Test;
  3269. VAR g: POINTER TO ARRAY OF CHAR;
  3270. PROCEDURE Procedure (VAR p: POINTER TO ARRAY OF CHAR);
  3271. BEGIN ASSERT (p^ = "value"); p^ := "modified"; ASSERT (p^ = "modified"); ASSERT (g^ = "modified");
  3272. END Procedure;
  3273. BEGIN NEW (g, 10); g^ := "value"; Procedure (g); ASSERT (g^ = "modified");
  3274. END Test.
  3275. positive: modifying variable pointer to array reference parameter
  3276. MODULE Test;
  3277. VAR g: POINTER TO ARRAY 10 OF INTEGER;
  3278. PROCEDURE Procedure (VAR p: POINTER TO ARRAY 10 OF INTEGER);
  3279. BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g = NIL);
  3280. END Procedure;
  3281. BEGIN NEW (g); Procedure (g); ASSERT (g = NIL);
  3282. END Test.
  3283. positive: modifying variable pointer to record parameter
  3284. MODULE Test;
  3285. TYPE Record = RECORD x: INTEGER END;
  3286. VAR g: POINTER TO Record;
  3287. PROCEDURE Procedure (VAR p: POINTER TO Record);
  3288. BEGIN ASSERT (p.x = 15); p.x := p.x * 3; ASSERT (p.x = 45); ASSERT (g.x = 45);
  3289. END Procedure;
  3290. BEGIN NEW (g); g.x := 15; Procedure (g); ASSERT (g.x = 45);
  3291. END Test.
  3292. positive: modifying variable pointer to record reference parameter
  3293. MODULE Test;
  3294. TYPE Record = RECORD END;
  3295. VAR g: POINTER TO Record;
  3296. PROCEDURE Procedure (VAR p: POINTER TO Record);
  3297. BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g = NIL);
  3298. END Procedure;
  3299. BEGIN NEW (g); Procedure (g); ASSERT (g = NIL);
  3300. END Test.
  3301. positive: modifying variable procedure parameter
  3302. MODULE Test;
  3303. TYPE P = PROCEDURE (VAR p: P);
  3304. VAR g: P;
  3305. PROCEDURE Procedure (VAR p: P);
  3306. BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g = NIL);
  3307. END Procedure;
  3308. BEGIN g := Procedure; Procedure (g); ASSERT (g = NIL);
  3309. END Test.
  3310. # if statement
  3311. positive: if statement with satisfied condition
  3312. MODULE Test;
  3313. VAR i: INTEGER;
  3314. BEGIN i := 0; IF i = 0 THEN ELSIF i = 1 THEN HALT (1234) ELSIF i = 2 THEN HALT (1234) ELSE HALT (1234) END;
  3315. IF i = 0 THEN RETURN ELSIF i = 1 THEN ELSIF i = 2 THEN ELSE END; HALT (1234);
  3316. END Test.
  3317. positive: if statement with unsatisfied condition
  3318. MODULE Test;
  3319. VAR i: INTEGER;
  3320. BEGIN i := 2; IF i = 0 THEN HALT (1234) ELSIF i = 1 THEN HALT (1234) ELSIF i = 2 THEN ELSE HALT (1234) END;
  3321. IF i = 0 THEN ELSIF i = 1 THEN ELSIF i = 2 THEN RETURN ELSE END; HALT (1234);
  3322. END Test.
  3323. positive: else if statement with unsatisfied condition
  3324. MODULE Test;
  3325. VAR i: INTEGER;
  3326. BEGIN i := 4; IF i = 0 THEN HALT (1234) ELSIF i = 1 THEN HALT (1234) ELSIF i = 2 THEN HALT (1234) ELSE END;
  3327. IF i = 0 THEN ELSIF i = 1 THEN ELSIF i = 2 THEN ELSE RETURN END; HALT (1234);
  3328. END Test.
  3329. # exit statement
  3330. positive: unconditional exit statement
  3331. MODULE Test;
  3332. BEGIN LOOP EXIT; HALT (1234) END;
  3333. END Test.
  3334. positive: nested unconditional exit statement
  3335. MODULE Test;
  3336. BEGIN LOOP LOOP EXIT; HALT (1234) END; EXIT; HALT (1234) END;
  3337. END Test.
  3338. positive: conditional exit statement
  3339. MODULE Test;
  3340. VAR i: INTEGER;
  3341. BEGIN i := 0; LOOP IF i = 0 THEN EXIT END; HALT (1234) END;
  3342. END Test.
  3343. positive: nested conditional exit statement
  3344. MODULE Test;
  3345. VAR i: INTEGER;
  3346. BEGIN i := 0; LOOP LOOP IF i = 0 THEN EXIT END; HALT (1234) END; EXIT; HALT (1234) END;
  3347. END Test.
  3348. # case statement
  3349. positive: case statement with character value
  3350. MODULE Test;
  3351. PROCEDURE Case (c: CHAR): INTEGER;
  3352. BEGIN CASE c OF | 'a', 't', 'j': RETURN 0 | 'l'..'o': RETURN 1 | 'r', 'b', 10X: RETURN 2 ELSE RETURN 3; END; HALT (1234);
  3353. END Case;
  3354. BEGIN ASSERT (Case ('a') = 0); ASSERT (Case ('b') = 2); ASSERT (Case ('c') = 3); ASSERT (Case ('j') = 0); ASSERT (Case ('n') = 1);
  3355. ASSERT (Case ('o') = 1); ASSERT (Case ('r') = 2); ASSERT (Case ('t') = 0); ASSERT (Case ('z') = 3); ASSERT (Case (10X) = 2);
  3356. END Test.
  3357. negative: case statement with too low character value
  3358. MODULE Test;
  3359. VAR c: CHAR;
  3360. BEGIN c := 'a'; CASE c OF | 'b'..'g': | 's', 'r': | 'u', 'v': END;
  3361. END Test.
  3362. negative: case statement with too high character value
  3363. MODULE Test;
  3364. VAR c: CHAR;
  3365. BEGIN c := 'w'; CASE c OF | 'b'..'g': | 's', 'r': | 'u', 'v': END;
  3366. END Test.
  3367. negative: case statement with unmatched character value
  3368. MODULE Test;
  3369. VAR c: CHAR;
  3370. BEGIN c := 't'; CASE c OF | 'b'..'g': | 's', 'r': | 'u', 'v': END;
  3371. END Test.
  3372. positive: case statement with integer value
  3373. MODULE Test;
  3374. PROCEDURE Case (i: INTEGER): INTEGER;
  3375. BEGIN CASE i OF | 1, 3, 9: RETURN 0 | 4..6: RETURN 1 | 8, 2: RETURN 2 ELSE RETURN 3; END; HALT (1234);
  3376. END Case;
  3377. BEGIN ASSERT (Case (0) = 3); ASSERT (Case (1) = 0); ASSERT (Case (2) = 2); ASSERT (Case (3) = 0); ASSERT (Case (4) = 1);
  3378. ASSERT (Case (5) = 1); ASSERT (Case (6) = 1); ASSERT (Case (7) = 3); ASSERT (Case (8) = 2); ASSERT (Case (9) = 0);
  3379. END Test.
  3380. negative: case statement with too low integer value
  3381. MODULE Test;
  3382. VAR i: INTEGER;
  3383. BEGIN i := 0; CASE i OF | 1, 3, 9: | 4..6: | 8, 2: END;
  3384. END Test.
  3385. negative: case statement with too high integer value
  3386. MODULE Test;
  3387. VAR i: INTEGER;
  3388. BEGIN i := 10; CASE i OF | 1, 3, 9: | 4..6: | 8, 2: END;
  3389. END Test.
  3390. negative: case statement with unmatched integer value
  3391. MODULE Test;
  3392. VAR i: INTEGER;
  3393. BEGIN i := 7; CASE i OF | 1, 3, 9: | 4..6: | 8, 2: END;
  3394. END Test.
  3395. # for statement
  3396. positive: for statement with positive step sizes
  3397. MODULE Test;
  3398. VAR i, steps: INTEGER;
  3399. BEGIN
  3400. steps := 0; FOR i := 0 TO 10 DO INC (steps) END; ASSERT (steps = 11);
  3401. steps := 0; FOR i := 0 TO 10 BY 1 DO INC (steps) END; ASSERT (steps = 11);
  3402. steps := 0; FOR i := 0 TO 10 BY 2 DO INC (steps) END; ASSERT (steps = 6);
  3403. steps := 0; FOR i := 0 TO 10 BY 3 DO INC (steps) END; ASSERT (steps = 4);
  3404. steps := 0; FOR i := 0 TO 10 BY 4 DO INC (steps) END; ASSERT (steps = 3);
  3405. END Test.
  3406. positive: for statement with negative step sizes
  3407. MODULE Test;
  3408. VAR i, steps: INTEGER;
  3409. BEGIN
  3410. steps := 0; FOR i := 10 TO 0 DO INC (steps) END; ASSERT (steps = 0);
  3411. steps := 0; FOR i := 10 TO 0 BY -1 DO INC (steps) END; ASSERT (steps = 11);
  3412. steps := 0; FOR i := 10 TO 0 BY -2 DO INC (steps) END; ASSERT (steps = 6);
  3413. steps := 0; FOR i := 10 TO 0 BY -3 DO INC (steps) END; ASSERT (steps = 4);
  3414. steps := 0; FOR i := 10 TO 0 BY -4 DO INC (steps) END; ASSERT (steps = 3);
  3415. END Test.
  3416. positive: modifying start counter in for statement
  3417. MODULE Test;
  3418. VAR i, steps, start: INTEGER;
  3419. BEGIN steps := 0; start := 0; FOR i := start TO 10 DO start := i; INC (steps) END; ASSERT (steps = 11);
  3420. END Test.
  3421. positive: modifying end counter in for statement
  3422. MODULE Test;
  3423. VAR i, steps, end: INTEGER;
  3424. BEGIN steps := 0; end := 10; FOR i := 0 TO end DO end := i; INC (steps) END; ASSERT (steps = 11);
  3425. END Test.
  3426. positive: using counter as end counter for statement
  3427. MODULE Test;
  3428. VAR i, steps: INTEGER;
  3429. BEGIN steps := 0; i := 10; FOR i := 0 TO i DO INC (steps) END; ASSERT (steps = 1);
  3430. END Test.
  3431. # new statement
  3432. positive: new statement on pointer to record
  3433. MODULE Test;
  3434. VAR p: POINTER TO RECORD a, b: INTEGER END;
  3435. BEGIN NEW (p); p.a := 3; p.b := p.a; ASSERT (p.b = 3);
  3436. END Test.
  3437. positive: new statement on pointer to too large record
  3438. MODULE Test;
  3439. VAR p: POINTER TO RECORD data*: ARRAY MAX (LONGINT) DIV 16 - 1000 OF INTEGER END;
  3440. BEGIN (*! NEW (p); ASSERT (p = NIL); *)
  3441. END Test.
  3442. positive: new statement on pointer to array
  3443. MODULE Test;
  3444. VAR p: POINTER TO ARRAY 10 OF INTEGER;
  3445. BEGIN NEW (p); p[2] := 3; p[1] := p[2]; ASSERT (p[2] = 3);
  3446. END Test.
  3447. positive: new statement on pointer to too large array
  3448. MODULE Test;
  3449. VAR r: POINTER TO ARRAY MAX (LONGINT) DIV 16 - 1000 OF INTEGER;
  3450. BEGIN (*! NEW (r); ASSERT (r = NIL); *)
  3451. END Test.
  3452. positive: new statement on pointer to open array
  3453. MODULE Test;
  3454. VAR p: POINTER TO ARRAY OF INTEGER;
  3455. BEGIN NEW (p, 10); p[2] := 3; p[1] := p[2]; ASSERT (p[2] = 3);
  3456. END Test.
  3457. negative: new statement on pointer to open array with negative size
  3458. MODULE Test;
  3459. VAR p: POINTER TO ARRAY OF INTEGER; size: INTEGER;
  3460. BEGIN size := -10; NEW (p, size);
  3461. END Test.
  3462. positive: new statement on pointer to too large open array
  3463. MODULE Test;
  3464. VAR r: POINTER TO ARRAY OF INTEGER;
  3465. BEGIN (*! NEW (r, MAX (LONGINT) DIV 2 - 1000); ASSERT (r = NIL); *)
  3466. END Test.
  3467. positive: new statement on object
  3468. MODULE Test;
  3469. VAR o: OBJECT VAR a, b: INTEGER END;
  3470. BEGIN NEW (o); o.a := 3; o.b := o.a; ASSERT (o.b = 3);
  3471. END Test.
  3472. positive: new statement on too large object
  3473. MODULE Test;
  3474. VAR o: OBJECT VAR data*: ARRAY MAX (LONGINT) DIV 16 - 1000 OF INTEGER END;
  3475. BEGIN (*! NEW (o); ASSERT (o = NIL); *)
  3476. END Test.
  3477. positive: new statement modifying designator after object body
  3478. MODULE Test;
  3479. VAR o: OBJECT PROCEDURE &Init; BEGIN ASSERT (o = NIL); END Init; BEGIN ASSERT (o # NIL); END;
  3480. BEGIN o := NIL; NEW (o); ASSERT (o # NIL);
  3481. END Test.
  3482. # with statement
  3483. positive: with statement with same global record
  3484. MODULE Test;
  3485. TYPE R = RECORD b: BOOLEAN END;
  3486. VAR r: R;
  3487. BEGIN r.b := TRUE; WITH r : R DO ASSERT (r.b) END;
  3488. END Test.
  3489. positive: with statement with same local record
  3490. MODULE Test;
  3491. PROCEDURE Procedure;
  3492. TYPE R = RECORD b: BOOLEAN END;
  3493. VAR r: R;
  3494. BEGIN r.b := TRUE; WITH r : R DO ASSERT (r.b) END;
  3495. END Procedure;
  3496. BEGIN Procedure;
  3497. END Test.
  3498. positive: with statement with same parameter record
  3499. MODULE Test;
  3500. TYPE R = RECORD b: BOOLEAN END;
  3501. VAR r: R;
  3502. PROCEDURE Procedure (r: R); BEGIN WITH r : R DO ASSERT (r.b); END; END Procedure;
  3503. BEGIN r.b := TRUE; Procedure (r);
  3504. END Test.
  3505. positive: with statement with same variable parameter record
  3506. MODULE Test;
  3507. TYPE R = RECORD b: BOOLEAN END;
  3508. VAR r: R;
  3509. PROCEDURE Procedure (VAR r: R); BEGIN WITH r : R DO ASSERT (r.b); END; END Procedure;
  3510. BEGIN r.b := TRUE; Procedure (r);
  3511. END Test.
  3512. positive: with statement with same constant parameter record
  3513. MODULE Test;
  3514. TYPE R = RECORD b: BOOLEAN END;
  3515. VAR r: R;
  3516. PROCEDURE Procedure (CONST r: R); BEGIN WITH r : R DO ASSERT (r.b); END; END Procedure;
  3517. BEGIN r.b := TRUE; Procedure (r);
  3518. END Test.
  3519. positive: with statement with variable parameter record
  3520. MODULE Test;
  3521. TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
  3522. VAR r: R1;
  3523. PROCEDURE Procedure (VAR r: R0); BEGIN WITH r : R1 DO ASSERT (r.b); END; END Procedure;
  3524. BEGIN r.b := TRUE; Procedure (r);
  3525. END Test.
  3526. negative: unsatisfied with statement with variable parameter record
  3527. MODULE Test;
  3528. TYPE R0 = RECORD END; R1 = RECORD (R0) END;
  3529. VAR r: R0;
  3530. PROCEDURE Procedure (VAR r: R0); BEGIN WITH r : R1 DO END; END Procedure;
  3531. BEGIN Procedure (r);
  3532. END Test.
  3533. positive: with statement with constant parameter record
  3534. MODULE Test;
  3535. TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
  3536. VAR r: R1;
  3537. PROCEDURE Procedure (CONST r: R0); BEGIN WITH r : R1 DO ASSERT (r.b); END; END Procedure;
  3538. BEGIN r.b := TRUE; Procedure (r);
  3539. END Test.
  3540. negative: unsatisfied with statement with constant parameter record
  3541. MODULE Test;
  3542. TYPE R0 = RECORD END; R1 = RECORD (R0) END;
  3543. VAR r: R0;
  3544. PROCEDURE Procedure (CONST r: R0); BEGIN WITH r : R1 DO END; END Procedure;
  3545. BEGIN Procedure (r);
  3546. END Test.
  3547. positive: with statement with same pointer to record
  3548. MODULE Test;
  3549. TYPE R = RECORD b: BOOLEAN END; P = POINTER TO R;
  3550. VAR p: P;
  3551. BEGIN NEW (p); p.b := TRUE; WITH p : P DO ASSERT (p.b); END;
  3552. END Test.
  3553. positive: with statement with pointer to record
  3554. MODULE Test;
  3555. TYPE R0 = RECORD END; P0 = POINTER TO R0
  3556. TYPE R1 = RECORD (R0) b: BOOLEAN END; P1 = POINTER TO R1;
  3557. VAR p0: P0; p1: P1;
  3558. BEGIN NEW (p1); p1.b := TRUE; p0 := p1; WITH p0 : P1 DO ASSERT (p0.b); END;
  3559. END Test.
  3560. negative: with statement with reassigned pointer to record
  3561. MODULE Test;
  3562. TYPE R0 = RECORD END; P0 = POINTER TO R0
  3563. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  3564. VAR p0: P0; p1: P1;
  3565. PROCEDURE Reassign; BEGIN NEW (p0); END Reassign;
  3566. BEGIN NEW (p1); p0 := p1; WITH p0 : P1 DO Reassign; p1 := p0; END;
  3567. END Test.
  3568. negative: unsatisfied with statement with pointer to record
  3569. MODULE Test;
  3570. TYPE R0 = RECORD END; P0 = POINTER TO R0;
  3571. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  3572. VAR p0: P0;
  3573. BEGIN NEW (p0); WITH p0 : P1 DO END;
  3574. END Test.
  3575. negative: with statement with nil pointer to same record
  3576. MODULE Test;
  3577. TYPE R = RECORD END; P = POINTER TO R;
  3578. VAR p: P;
  3579. BEGIN p := NIL; WITH p : P DO END;
  3580. END Test.
  3581. negative: with statement with nil pointer to record
  3582. MODULE Test;
  3583. TYPE R0 = RECORD END; P0 = POINTER TO R0;
  3584. TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
  3585. VAR p0: P0;
  3586. BEGIN p0 := NIL; WITH p0 : P1 DO END;
  3587. END Test.
  3588. positive: with statement with same object
  3589. MODULE Test;
  3590. TYPE O = OBJECT VAR b: BOOLEAN END O;
  3591. VAR o: O;
  3592. BEGIN NEW (o); o.b := TRUE; WITH o : O DO ASSERT (o.b); END;
  3593. END Test.
  3594. positive: with statement with object
  3595. MODULE Test;
  3596. TYPE O0 = OBJECT END O0;
  3597. TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
  3598. VAR o0: O0; o1: O1;
  3599. BEGIN NEW (o1); o1.b := TRUE; o0 := o1; WITH o0 : O1 DO ASSERT (o0.b); END;
  3600. END Test.
  3601. negative: with statement with reassigned object
  3602. MODULE Test;
  3603. TYPE O0 = OBJECT END O0;
  3604. TYPE O1 = OBJECT (O0) END O1;
  3605. VAR o0: O0; o1: O1;
  3606. PROCEDURE Reassign; BEGIN NEW (o0); END Reassign;
  3607. BEGIN NEW (o1); o0 := o1; WITH o0 : O1 DO Reassign; o1 := o0; END;
  3608. END Test.
  3609. negative: unsatisfied with statement with object
  3610. MODULE Test;
  3611. TYPE O0 = OBJECT END O0;
  3612. TYPE O1 = OBJECT (O0) END O1;
  3613. VAR o0: O0;
  3614. BEGIN NEW (o0); WITH o0 : O1 DO END;
  3615. END Test.
  3616. negative: with statement with same nil object
  3617. MODULE Test;
  3618. TYPE O = OBJECT END O;
  3619. VAR o: O;
  3620. BEGIN o := NIL; WITH o : O DO END;
  3621. END Test.
  3622. negative: with statement with nil object
  3623. MODULE Test;
  3624. TYPE O0 = OBJECT END O0;
  3625. TYPE O1 = OBJECT (O0) END O1;
  3626. VAR o0: O0;
  3627. BEGIN o0 := NIL; WITH o0 : O1 DO END;
  3628. END Test.
  3629. positive: with statement with base object
  3630. MODULE Test;
  3631. TYPE O0 = OBJECT;
  3632. TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
  3633. VAR o0: O0; o1: O1;
  3634. BEGIN NEW (o1); o1.b := TRUE; o0 := o1; WITH o0 : O1 DO ASSERT (o0.b); END;
  3635. END Test.
  3636. negative: with statement with nil base object
  3637. MODULE Test;
  3638. TYPE O0 = OBJECT;
  3639. TYPE O1 = OBJECT (O0) END O1;
  3640. VAR o0: O0;
  3641. BEGIN o0 := NIL; WITH o0 : O1 DO END;
  3642. END Test.
  3643. # nested procedures
  3644. positive: access to global variable within nested procedure
  3645. MODULE Test;
  3646. VAR g: INTEGER;
  3647. PROCEDURE Procedure;
  3648. PROCEDURE Nested; BEGIN g := 45; END Nested;
  3649. BEGIN Nested;
  3650. END Procedure;
  3651. BEGIN g := 0; Procedure; ASSERT (g = 45);
  3652. END Test.
  3653. positive: access to global variable within nested procedure called from nested procedure
  3654. MODULE Test;
  3655. VAR g: INTEGER;
  3656. PROCEDURE Procedure;
  3657. PROCEDURE Nested0; BEGIN Nested1; END Nested0;
  3658. PROCEDURE Nested1; BEGIN g := 45; END Nested1;
  3659. BEGIN Nested0;
  3660. END Procedure;
  3661. BEGIN g := 0; Procedure; ASSERT (g = 45);
  3662. END Test.
  3663. positive: access to object variable within nested procedure
  3664. MODULE Test;
  3665. VAR o: OBJECT
  3666. VAR f: INTEGER;
  3667. PROCEDURE Procedure;
  3668. PROCEDURE Nested; BEGIN f := 45; END Nested;
  3669. BEGIN Nested;
  3670. END Procedure;
  3671. BEGIN f := 0; Procedure; ASSERT (f = 45); END;
  3672. BEGIN NEW (o);
  3673. END Test.
  3674. positive: access to object variable within nested procedure called from nested procedure
  3675. MODULE Test;
  3676. VAR o: OBJECT
  3677. VAR f: INTEGER;
  3678. PROCEDURE Procedure;
  3679. PROCEDURE Nested0; BEGIN Nested1; END Nested0;
  3680. PROCEDURE Nested1; BEGIN f := 45; END Nested1;
  3681. BEGIN Nested0;
  3682. END Procedure;
  3683. BEGIN f := 0; Procedure; ASSERT (f = 45); END;
  3684. BEGIN NEW (o);
  3685. END Test.
  3686. positive: access to local variable within nested procedure
  3687. MODULE Test;
  3688. PROCEDURE Procedure;
  3689. VAR l: INTEGER;
  3690. PROCEDURE Nested; BEGIN l := 45; END Nested;
  3691. BEGIN l := 0; Nested; ASSERT (l = 45);
  3692. END Procedure;
  3693. BEGIN Procedure;
  3694. END Test.
  3695. positive: access to local variable within nested procedure called from nested procedure
  3696. MODULE Test;
  3697. PROCEDURE Procedure;
  3698. VAR l: INTEGER;
  3699. PROCEDURE Nested0; BEGIN Nested1; END Nested0;
  3700. PROCEDURE Nested1; BEGIN l := 45; END Nested1;
  3701. BEGIN l := 0; Nested0; ASSERT (l = 45);
  3702. END Procedure;
  3703. BEGIN Procedure;
  3704. END Test.
  3705. positive: access to parameter within nested procedure
  3706. MODULE Test;
  3707. PROCEDURE Procedure (p: INTEGER);
  3708. PROCEDURE Nested; BEGIN p := 45; END Nested;
  3709. BEGIN Nested; ASSERT (p = 45);
  3710. END Procedure;
  3711. BEGIN Procedure (0);
  3712. END Test.
  3713. positive: access to parameter within nested procedure called from nested procedure
  3714. MODULE Test;
  3715. PROCEDURE Procedure (p: INTEGER);
  3716. PROCEDURE Nested0; BEGIN Nested1; END Nested0;
  3717. PROCEDURE Nested1; BEGIN p := 45; END Nested1;
  3718. BEGIN Nested0; ASSERT (p = 45);
  3719. END Procedure;
  3720. BEGIN Procedure (0);
  3721. END Test.
  3722. # methods
  3723. positive: single method call
  3724. MODULE Test;
  3725. VAR object: OBJECT
  3726. PROCEDURE Method; BEGIN ASSERT (i = 0); i := 1; END Method;
  3727. END; i: INTEGER;
  3728. BEGIN i := 0; NEW (object); object.Method; ASSERT (i = 1);
  3729. END Test.
  3730. positive: single super call
  3731. MODULE Test;
  3732. TYPE Object0 = OBJECT
  3733. PROCEDURE Method; BEGIN ASSERT (i = 1); i := 2; END Method;
  3734. END Object0;
  3735. TYPE Object1 = OBJECT (Object0)
  3736. PROCEDURE Method; BEGIN ASSERT (i = 0); i := 1; Method^; END Method;
  3737. END Object1;
  3738. VAR object: Object1; i: INTEGER;
  3739. BEGIN i := 0; NEW (object); object.Method; ASSERT (i = 2);
  3740. END Test.
  3741. positive: double method call
  3742. MODULE Test;
  3743. VAR object: OBJECT
  3744. PROCEDURE Method0; BEGIN ASSERT (i = 0); i := 1; Method1; END Method0;
  3745. PROCEDURE Method1; BEGIN ASSERT (i = 1); i := 2; END Method1;
  3746. END; i: INTEGER;
  3747. BEGIN i := 0; NEW (object); object.Method0; ASSERT (i = 2);
  3748. END Test.
  3749. positive: double super call
  3750. MODULE Test;
  3751. TYPE Object0 = OBJECT
  3752. PROCEDURE Method0; BEGIN ASSERT (i = 1); i := 2; Method1; END Method0;
  3753. PROCEDURE Method1; BEGIN ASSERT (i = 3); i := 4; END Method1;
  3754. END Object0;
  3755. TYPE Object1 = OBJECT (Object0)
  3756. PROCEDURE Method0; BEGIN ASSERT (i = 0); i := 1; Method0^; END Method0;
  3757. PROCEDURE Method1; BEGIN ASSERT (i = 2); i := 3; Method1^; END Method1;
  3758. END Object1;
  3759. VAR object: Object1; i: INTEGER;
  3760. BEGIN i := 0; NEW (object); object.Method0; ASSERT (i = 4);
  3761. END Test.
  3762. positive: single method call with initializer
  3763. MODULE Test;
  3764. VAR object: OBJECT VAR i: INTEGER;
  3765. PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
  3766. PROCEDURE Method; BEGIN ASSERT (i = 0); i := 1; END Method;
  3767. END;
  3768. BEGIN NEW (object, 0); object.Method; ASSERT (object.i = 1);
  3769. END Test.
  3770. positive: single super call with initializer
  3771. MODULE Test;
  3772. TYPE Object0 = OBJECT VAR i: INTEGER;
  3773. PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
  3774. PROCEDURE Method; BEGIN ASSERT (i = 1); i := 2; END Method;
  3775. END Object0;
  3776. TYPE Object1 = OBJECT (Object0)
  3777. PROCEDURE &Init (i: INTEGER); BEGIN Init^ (i); END Init;
  3778. PROCEDURE Method; BEGIN ASSERT (i = 0); i := 1; Method^; END Method;
  3779. END Object1;
  3780. VAR object: Object1;
  3781. BEGIN NEW (object, 0); object.Method; ASSERT (object.i = 2);
  3782. END Test.
  3783. positive: double method call with initializer
  3784. MODULE Test;
  3785. VAR object: OBJECT VAR i: INTEGER;
  3786. PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
  3787. PROCEDURE Method0; BEGIN ASSERT (i = 0); i := 1; Method1; END Method0;
  3788. PROCEDURE Method1; BEGIN ASSERT (i = 1); i := 2; END Method1;
  3789. END;
  3790. BEGIN NEW (object, 0); object.Method0; ASSERT (object.i = 2);
  3791. END Test.
  3792. positive: double super call with initializer
  3793. MODULE Test;
  3794. TYPE Object0 = OBJECT VAR i: INTEGER;
  3795. PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
  3796. PROCEDURE Method0; BEGIN ASSERT (i = 1); i := 2; Method1; END Method0;
  3797. PROCEDURE Method1; BEGIN ASSERT (i = 3); i := 4; END Method1;
  3798. END Object0;
  3799. TYPE Object1 = OBJECT (Object0)
  3800. PROCEDURE &Init (i: INTEGER); BEGIN Init^ (i); END Init;
  3801. PROCEDURE Method0; BEGIN ASSERT (i = 0); i := 1; Method0^; END Method0;
  3802. PROCEDURE Method1; BEGIN ASSERT (i = 2); i := 3; Method1^; END Method1;
  3803. END Object1;
  3804. VAR object: Object1;
  3805. BEGIN NEW (object, 0); object.Method0; ASSERT (object.i = 4);
  3806. END Test.
  3807. positive: single method call with initializer and body
  3808. MODULE Test;
  3809. VAR object: OBJECT VAR i: INTEGER;
  3810. PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
  3811. PROCEDURE Method; BEGIN ASSERT (i = 1); i := 2; END Method;
  3812. BEGIN ASSERT (i = 0); i := 1;
  3813. END;
  3814. BEGIN NEW (object, 0); object.Method; ASSERT (object.i = 2);
  3815. END Test.
  3816. positive: single super call with initializer and body
  3817. MODULE Test;
  3818. TYPE Object0 = OBJECT VAR i: INTEGER;
  3819. PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
  3820. PROCEDURE Method; BEGIN ASSERT (i = 3); i := 4; END Method;
  3821. BEGIN ASSERT (i = 0); i := 1;
  3822. END Object0;
  3823. TYPE Object1 = OBJECT (Object0)
  3824. PROCEDURE &Init (i: INTEGER); BEGIN Init^ (i); END Init;
  3825. PROCEDURE Method; BEGIN ASSERT (i = 2); i := 3; Method^; END Method;
  3826. BEGIN ASSERT (i = 1); i := 2;
  3827. END Object1;
  3828. VAR object: Object1;
  3829. BEGIN NEW (object, 0); object.Method; ASSERT (object.i = 4);
  3830. END Test.
  3831. positive: double method call with initializer and body
  3832. MODULE Test;
  3833. VAR object: OBJECT VAR i: INTEGER;
  3834. PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
  3835. PROCEDURE Method0; BEGIN ASSERT (i = 1); i := 2; Method1; END Method0;
  3836. PROCEDURE Method1; BEGIN ASSERT (i = 2); i := 3; END Method1;
  3837. BEGIN ASSERT (i = 0); i := 1;
  3838. END;
  3839. BEGIN NEW (object, 0); object.Method0; ASSERT (object.i = 3);
  3840. END Test.
  3841. positive: double super call with initializer and body
  3842. MODULE Test;
  3843. TYPE Object0 = OBJECT VAR i: INTEGER;
  3844. PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
  3845. PROCEDURE Method0; BEGIN ASSERT (i = 3); i := 4; Method1; END Method0;
  3846. PROCEDURE Method1; BEGIN ASSERT (i = 5); i := 6; END Method1;
  3847. BEGIN ASSERT (i = 0); i := 1;
  3848. END Object0;
  3849. TYPE Object1 = OBJECT (Object0)
  3850. PROCEDURE &Init (i: INTEGER); BEGIN Init^ (i); END Init;
  3851. PROCEDURE Method0; BEGIN ASSERT (i = 2); i := 3; Method0^; END Method0;
  3852. PROCEDURE Method1; BEGIN ASSERT (i = 4); i := 5; Method1^; END Method1;
  3853. BEGIN ASSERT (i = 1); i := 2;
  3854. END Object1;
  3855. VAR object: Object1;
  3856. BEGIN NEW (object, 0); object.Method0; ASSERT (object.i = 6);
  3857. END Test.
  3858. positive: call of object body
  3859. MODULE Test;
  3860. VAR o: OBJECT BEGIN b := TRUE END;
  3861. VAR b: BOOLEAN;
  3862. BEGIN b := FALSE; NEW(o); ASSERT(b);
  3863. END Test.
  3864. positive: call of object body chains
  3865. MODULE Test;
  3866. TYPE
  3867. O = OBJECT BEGIN b1 := TRUE END O;
  3868. O2=OBJECT(O) BEGIN b2 := b1 END O2;
  3869. O3=OBJECT(O2) BEGIN b3 := b2 END O3;
  3870. VAR b1,b2,b3: BOOLEAN; o: O3;
  3871. BEGIN
  3872. b1 := FALSE; b2 := FALSE; b3 := FALSE;
  3873. NEW(o);
  3874. ASSERT(b1); ASSERT(b2); ASSERT(b3);
  3875. END Test.
  3876. positive: call of object body chains with initializer
  3877. MODULE Test;
  3878. TYPE
  3879. O = OBJECT BEGIN b1 := b0 END O;
  3880. O2=OBJECT(O) BEGIN b2 := b1 END O2;
  3881. O3=OBJECT(O2) PROCEDURE &Init; BEGIN b0 := TRUE END Init; BEGIN b3 := b2 END O3;
  3882. VAR b0,b1,b2,b3: BOOLEAN; o: O3;
  3883. BEGIN
  3884. b0 := FALSE; b1 := FALSE; b2 := FALSE; b3 := FALSE;
  3885. NEW(o);
  3886. ASSERT(b0); ASSERT(b1); ASSERT(b2); ASSERT(b3);
  3887. END Test.
  3888. # copy statement
  3889. positive: copy statement on array of character
  3890. MODULE Test;
  3891. VAR source, dest: ARRAY 20 OF CHAR;
  3892. BEGIN source := "source"; COPY (source, dest); ASSERT (dest = "source");
  3893. END Test.
  3894. positive: copy statement on array of character and longer array of character
  3895. MODULE Test;
  3896. VAR source: ARRAY 20 OF CHAR; dest: ARRAY 30 OF CHAR;
  3897. BEGIN source := "source"; COPY (source, dest); ASSERT (dest = "source");
  3898. END Test.
  3899. positive: copy statement on array of character and shorter array of character
  3900. MODULE Test;
  3901. VAR source: ARRAY 30 OF CHAR; dest: ARRAY 20 OF CHAR;
  3902. BEGIN source := "source"; COPY (source, dest); ASSERT (dest = "source");
  3903. END Test.
  3904. positive: copy statement on string and longer array of character
  3905. MODULE Test;
  3906. CONST Source = "source";
  3907. VAR dest: ARRAY 20 OF CHAR;
  3908. BEGIN COPY (Source, dest); ASSERT (dest = Source);
  3909. END Test.
  3910. positive: copy statement on empty string and array of character
  3911. MODULE Test;
  3912. CONST Source = "";
  3913. VAR dest: ARRAY 20 OF CHAR;
  3914. BEGIN COPY (Source, dest); ASSERT (dest = Source); ASSERT (dest[0] = 0X);
  3915. END Test.
  3916. positive: copy statement with array of character parameter as source
  3917. MODULE Test;
  3918. PROCEDURE Procedure (source: ARRAY 20 OF CHAR);
  3919. VAR dest: ARRAY 20 OF CHAR;
  3920. BEGIN COPY (source, dest); ASSERT (dest = "source");
  3921. END Procedure;
  3922. BEGIN Procedure ("source");
  3923. END Test.
  3924. positive: copy statement with variable array of character parameter as source
  3925. MODULE Test;
  3926. VAR source: ARRAY 20 OF CHAR;
  3927. PROCEDURE Procedure (VAR source: ARRAY 20 OF CHAR);
  3928. VAR dest: ARRAY 20 OF CHAR;
  3929. BEGIN COPY (source, dest); ASSERT (dest = "source");
  3930. END Procedure;
  3931. BEGIN source := "source"; Procedure (source);
  3932. END Test.
  3933. positive: copy statement with constant array of character parameter as source
  3934. MODULE Test;
  3935. PROCEDURE Procedure (CONST source: ARRAY 20 OF CHAR);
  3936. VAR dest: ARRAY 20 OF CHAR;
  3937. BEGIN COPY (source, dest); ASSERT (dest = "source");
  3938. END Procedure;
  3939. BEGIN Procedure ("source");
  3940. END Test.
  3941. positive: copy statement with open array of character parameter as source
  3942. MODULE Test;
  3943. PROCEDURE Procedure (source: ARRAY OF CHAR);
  3944. VAR dest: ARRAY 20 OF CHAR;
  3945. BEGIN COPY (source, dest); ASSERT (dest = "source");
  3946. END Procedure;
  3947. BEGIN Procedure ("source");
  3948. END Test.
  3949. positive: copy statement with too long open array of character parameter as source (truncate)
  3950. MODULE Test;
  3951. PROCEDURE Procedure (source: ARRAY OF CHAR);
  3952. VAR dest: ARRAY 2 OF CHAR;
  3953. BEGIN COPY (source, dest); ASSERT(dest="s");
  3954. END Procedure;
  3955. BEGIN Procedure ("source");
  3956. END Test.
  3957. positive: copy statement with open variable array of character parameter as source
  3958. MODULE Test;
  3959. VAR source: ARRAY 20 OF CHAR;
  3960. PROCEDURE Procedure (VAR source: ARRAY OF CHAR);
  3961. VAR dest: ARRAY 20 OF CHAR;
  3962. BEGIN COPY (source, dest); ASSERT (dest = "source");
  3963. END Procedure;
  3964. BEGIN source := "source"; Procedure (source);
  3965. END Test.
  3966. positive: copy statement with too long open variable array of character parameter as source (truncate)
  3967. MODULE Test;
  3968. VAR source: ARRAY 20 OF CHAR;
  3969. PROCEDURE Procedure (VAR source: ARRAY OF CHAR);
  3970. VAR dest: ARRAY 2 OF CHAR;
  3971. BEGIN COPY (source, dest);ASSERT(dest="s");
  3972. END Procedure;
  3973. BEGIN source := "source"; Procedure (source);
  3974. END Test.
  3975. positive: copy statement with open constant array of character parameter as source
  3976. MODULE Test;
  3977. PROCEDURE Procedure (CONST source: ARRAY OF CHAR);
  3978. VAR dest: ARRAY 20 OF CHAR;
  3979. BEGIN COPY (source, dest); ASSERT (dest = "source");
  3980. END Procedure;
  3981. BEGIN Procedure ("source");
  3982. END Test.
  3983. positive: copy statement with too long open constant array of character parameter as source (truncate)
  3984. MODULE Test;
  3985. PROCEDURE Procedure (CONST source: ARRAY OF CHAR);
  3986. VAR dest: ARRAY 2 OF CHAR;
  3987. BEGIN COPY (source, dest); ASSERT(dest="s");
  3988. END Procedure;
  3989. BEGIN Procedure ("source");
  3990. END Test.
  3991. positive: copy statement with array of character parameter as destination
  3992. MODULE Test;
  3993. PROCEDURE Procedure (dest: ARRAY 20 OF CHAR);
  3994. VAR source: ARRAY 20 OF CHAR;
  3995. BEGIN source := "source"; COPY (source, dest); ASSERT (dest = "source");
  3996. END Procedure;
  3997. BEGIN Procedure ("destination");
  3998. END Test.
  3999. positive: copy statement with variable array of character parameter as destination
  4000. MODULE Test;
  4001. VAR dest: ARRAY 20 OF CHAR;
  4002. PROCEDURE Procedure (VAR dest: ARRAY 20 OF CHAR);
  4003. VAR source: ARRAY 20 OF CHAR;
  4004. BEGIN source := "source"; COPY (source, dest);
  4005. END Procedure;
  4006. BEGIN Procedure (dest); ASSERT (dest = "source");
  4007. END Test.
  4008. positive: copy statement with open array of character parameter as destination
  4009. MODULE Test;
  4010. PROCEDURE Procedure (dest: ARRAY OF CHAR);
  4011. VAR source: ARRAY 20 OF CHAR;
  4012. BEGIN source := "source"; COPY (source, dest); ASSERT (dest = "source");
  4013. END Procedure;
  4014. BEGIN Procedure ("destination");
  4015. END Test.
  4016. positive: copy statement with too short open array of character parameter as destination (truncate)
  4017. MODULE Test;
  4018. PROCEDURE Procedure (dest: ARRAY OF CHAR);
  4019. VAR source: ARRAY 20 OF CHAR;
  4020. BEGIN source := "source"; COPY (source, dest); ASSERT(dest="");
  4021. END Procedure;
  4022. BEGIN Procedure ("");
  4023. END Test.
  4024. positive: copy statement with open variable array of character parameter as destination
  4025. MODULE Test;
  4026. VAR dest: ARRAY 20 OF CHAR;
  4027. PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
  4028. VAR source: ARRAY 20 OF CHAR;
  4029. BEGIN source := "source"; COPY (source, dest);
  4030. END Procedure;
  4031. BEGIN Procedure (dest); ASSERT (dest = "source");
  4032. END Test.
  4033. positive: copy statement with too short open variable array of character parameter as destination (truncate)
  4034. MODULE Test;
  4035. VAR dest: ARRAY 2 OF CHAR;
  4036. PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
  4037. VAR source: ARRAY 20 OF CHAR;
  4038. BEGIN source := "source"; COPY (source, dest); ASSERT(dest="s");
  4039. END Procedure;
  4040. BEGIN Procedure (dest);
  4041. END Test.
  4042. positive: copy statement with string as source and array of character parameter as destination
  4043. MODULE Test;
  4044. CONST Source = "source";
  4045. PROCEDURE Procedure (dest: ARRAY 20 OF CHAR);
  4046. BEGIN COPY (Source, dest); ASSERT (dest = Source);
  4047. END Procedure;
  4048. BEGIN Procedure ("destination");
  4049. END Test.
  4050. positive: copy statement with empty string as source and array of character parameter as destination
  4051. MODULE Test;
  4052. CONST Source = "";
  4053. PROCEDURE Procedure (dest: ARRAY 20 OF CHAR);
  4054. BEGIN COPY (Source, dest); ASSERT (dest = Source); ASSERT (dest[0] = 0X);
  4055. END Procedure;
  4056. BEGIN Procedure ("destination");
  4057. END Test.
  4058. positive: copy statement with string as source and variable array of character parameter as destination
  4059. MODULE Test;
  4060. CONST Source = "source";
  4061. VAR dest: ARRAY 20 OF CHAR;
  4062. PROCEDURE Procedure (VAR dest: ARRAY 20 OF CHAR);
  4063. BEGIN COPY (Source, dest);
  4064. END Procedure;
  4065. BEGIN Procedure (dest); ASSERT (dest = Source);
  4066. END Test.
  4067. positive: copy statement with empty string as source and variable array of character parameter as destination
  4068. MODULE Test;
  4069. CONST Source = "";
  4070. VAR dest: ARRAY 20 OF CHAR;
  4071. PROCEDURE Procedure (VAR dest: ARRAY 20 OF CHAR);
  4072. BEGIN COPY (Source, dest);
  4073. END Procedure;
  4074. BEGIN Procedure (dest); ASSERT (dest = Source); ASSERT (dest[0] = 0X);
  4075. END Test.
  4076. positive: copy statement with string as source and open array of character parameter as destination
  4077. MODULE Test;
  4078. CONST Source = "source";
  4079. PROCEDURE Procedure (dest: ARRAY OF CHAR);
  4080. BEGIN COPY (Source, dest); ASSERT (dest = Source);
  4081. END Procedure;
  4082. BEGIN Procedure ("destination");
  4083. END Test.
  4084. positive: copy statement with empty string as source and open array of character parameter as destination
  4085. MODULE Test;
  4086. CONST Source = "";
  4087. PROCEDURE Procedure (dest: ARRAY OF CHAR);
  4088. BEGIN COPY (Source, dest); ASSERT (dest = Source); ASSERT (dest[0] = 0X);
  4089. END Procedure;
  4090. BEGIN Procedure ("destination");
  4091. END Test.
  4092. positive: copy statement with string as source and too short open array of character parameter as destination (truncate)
  4093. MODULE Test;
  4094. CONST Source = "source";
  4095. PROCEDURE Procedure (dest: ARRAY OF CHAR);
  4096. BEGIN COPY (Source, dest); ASSERT (dest = "");
  4097. END Procedure;
  4098. BEGIN Procedure ("");
  4099. END Test.
  4100. positive: copy statement with string as source and open variable array of character parameter as destination
  4101. MODULE Test;
  4102. CONST Source = "source";
  4103. VAR dest: ARRAY 20 OF CHAR;
  4104. PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
  4105. BEGIN COPY (Source, dest);
  4106. END Procedure;
  4107. BEGIN Procedure (dest); ASSERT (dest = Source);
  4108. END Test.
  4109. positive: copy statement with empty string as source and open variable array of character parameter as destination
  4110. MODULE Test;
  4111. CONST Source = "";
  4112. VAR dest: ARRAY 20 OF CHAR;
  4113. PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
  4114. BEGIN COPY (Source, dest);
  4115. END Procedure;
  4116. BEGIN Procedure (dest); ASSERT (dest = Source); ASSERT (dest[0] = 0X);
  4117. END Test.
  4118. positive: copy statement with string as source and too short open variable array of character parameter as destination (truncate)
  4119. MODULE Test;
  4120. CONST Source = "source";
  4121. VAR dest: ARRAY 2 OF CHAR;
  4122. PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
  4123. BEGIN COPY (Source, dest);
  4124. END Procedure;
  4125. BEGIN Procedure (dest); ASSERT(dest="s");
  4126. END Test.
  4127. # string assignment
  4128. positive: string assignment on array of character
  4129. MODULE Test;
  4130. CONST Source = "source";
  4131. VAR dest: ARRAY 20 OF CHAR;
  4132. BEGIN dest := Source; ASSERT (dest = Source);
  4133. END Test.
  4134. positive: string assignment on array of character parameter
  4135. MODULE Test;
  4136. CONST Source = "source";
  4137. PROCEDURE Procedure (dest: ARRAY 20 OF CHAR);
  4138. BEGIN dest := Source; ASSERT (dest = Source);
  4139. END Procedure;
  4140. BEGIN Procedure ("destination");
  4141. END Test.
  4142. positive: string assignment on variable array of character parameter
  4143. MODULE Test;
  4144. CONST Source = "source";
  4145. VAR dest: ARRAY 20 OF CHAR;
  4146. PROCEDURE Procedure (VAR dest: ARRAY 20 OF CHAR);
  4147. BEGIN dest := Source;
  4148. END Procedure;
  4149. BEGIN Procedure (dest); ASSERT (dest = Source);
  4150. END Test.
  4151. positive: string assignment on open array of character parameter
  4152. MODULE Test;
  4153. CONST Source = "source";
  4154. PROCEDURE Procedure (dest: ARRAY OF CHAR);
  4155. BEGIN dest := Source; ASSERT (dest = Source);
  4156. END Procedure;
  4157. BEGIN Procedure ("destination");
  4158. END Test.
  4159. negative: string assignment on too short open array of character parameter
  4160. MODULE Test;
  4161. CONST Source = "source";
  4162. PROCEDURE Procedure (dest: ARRAY OF CHAR);
  4163. BEGIN dest := Source; ASSERT (dest = Source);
  4164. END Procedure;
  4165. BEGIN Procedure ("");
  4166. END Test.
  4167. positive: string assignment on open variable array of character parameter
  4168. MODULE Test;
  4169. CONST Source = "source";
  4170. VAR dest: ARRAY 20 OF CHAR;
  4171. PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
  4172. BEGIN dest := Source;
  4173. END Procedure;
  4174. BEGIN Procedure (dest); ASSERT (dest = Source);
  4175. END Test.
  4176. positive: string assignment on too short open variable array of character parameter (truncate)
  4177. MODULE Test;
  4178. CONST Source = "source";
  4179. VAR dest: ARRAY 2 OF CHAR;
  4180. PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
  4181. BEGIN dest := Source;
  4182. END Procedure;
  4183. BEGIN Procedure (dest); ASSERT(dest="s");
  4184. END Test.
  4185. # increment statement
  4186. positive: increment statement with short integers
  4187. MODULE Test;
  4188. VAR a, b, c: SHORTINT;
  4189. BEGIN a := 0; b := 3; c := -4;
  4190. INC (a); ASSERT (a = 1); DEC (a); ASSERT (a = 0);
  4191. INC (a, 2); ASSERT (a = 2); INC (a, -2); ASSERT (a = 0);
  4192. INC (a, b); ASSERT (a = b); INC (a, -b); ASSERT (a = 0);
  4193. INC (a, c); ASSERT (a = c); INC (a, -c); ASSERT (a = 0);
  4194. END Test.
  4195. positive: increment statement with integers
  4196. MODULE Test;
  4197. VAR a, b: INTEGER; c: SHORTINT;
  4198. BEGIN a := 0; b := 3; c := -4;
  4199. INC (a); ASSERT (a = 1); DEC (a); ASSERT (a = 0);
  4200. INC (a, 2); ASSERT (a = 2); INC (a, -2); ASSERT (a = 0);
  4201. INC (a, b); ASSERT (a = b); INC (a, -b); ASSERT (a = 0);
  4202. INC (a, c); ASSERT (a = c); INC (a, -c); ASSERT (a = 0);
  4203. END Test.
  4204. positive: increment statement with long integers
  4205. MODULE Test;
  4206. VAR a, b: LONGINT; c: INTEGER; d: SHORTINT;
  4207. BEGIN a := 0; b := 3; c := -4; d := 5;
  4208. INC (a); ASSERT (a = 1); DEC (a); ASSERT (a = 0);
  4209. INC (a, 2); ASSERT (a = 2); INC (a, -2); ASSERT (a = 0);
  4210. INC (a, b); ASSERT (a = b); INC (a, -b); ASSERT (a = 0);
  4211. INC (a, c); ASSERT (a = c); INC (a, -c); ASSERT (a = 0);
  4212. INC (a, d); ASSERT (a = d); INC (a, -d); ASSERT (a = 0);
  4213. END Test.
  4214. positive: increment statement with huge integers
  4215. MODULE Test;
  4216. VAR a, b: HUGEINT; c: LONGINT; d: INTEGER; e: SHORTINT;
  4217. BEGIN a := 0; b := 3; c := -4; d := 5; e := -6;
  4218. INC (a); ASSERT (a = 1); DEC (a); ASSERT (a = 0);
  4219. INC (a, 2); ASSERT (a = 2); INC (a, -2); ASSERT (a = 0);
  4220. INC (a, b); ASSERT (a = b); INC (a, -b); ASSERT (a = 0);
  4221. INC (a, c); ASSERT (a = c); INC (a, -c); ASSERT (a = 0);
  4222. INC (a, d); ASSERT (a = d); INC (a, -d); ASSERT (a = 0);
  4223. INC (a, e); ASSERT (a = e); INC (a, -e); ASSERT (a = 0);
  4224. END Test.
  4225. # decrement statement
  4226. positive: decrement statement with short integers
  4227. MODULE Test;
  4228. VAR a, b, c: SHORTINT;
  4229. BEGIN a := 0; b := 3; c := -4;
  4230. DEC (a); ASSERT (a = -1); INC (a); ASSERT (a = 0);
  4231. DEC (a, 2); ASSERT (a = -2); DEC (a, -2); ASSERT (a = 0);
  4232. DEC (a, b); ASSERT (a = -b); DEC (a, -b); ASSERT (a = 0);
  4233. DEC (a, c); ASSERT (a = -c); DEC (a, -c); ASSERT (a = 0);
  4234. END Test.
  4235. positive: decrement statement with integers
  4236. MODULE Test;
  4237. VAR a, b: INTEGER; c: SHORTINT;
  4238. BEGIN a := 0; b := 3; c := -4;
  4239. DEC (a); ASSERT (a = -1); INC (a); ASSERT (a = 0);
  4240. DEC (a, 2); ASSERT (a = -2); DEC (a, -2); ASSERT (a = 0);
  4241. DEC (a, b); ASSERT (a = -b); DEC (a, -b); ASSERT (a = 0);
  4242. DEC (a, c); ASSERT (a = -c); DEC (a, -c); ASSERT (a = 0);
  4243. END Test.
  4244. positive: decrement statement with long integers
  4245. MODULE Test;
  4246. VAR a, b: LONGINT; c: INTEGER; d: SHORTINT;
  4247. BEGIN a := 0; b := 3; c := -4; d := 5;
  4248. DEC (a); ASSERT (a = -1); INC (a); ASSERT (a = 0);
  4249. DEC (a, 2); ASSERT (a = -2); DEC (a, -2); ASSERT (a = 0);
  4250. DEC (a, b); ASSERT (a = -b); DEC (a, -b); ASSERT (a = 0);
  4251. DEC (a, c); ASSERT (a = -c); DEC (a, -c); ASSERT (a = 0);
  4252. DEC (a, d); ASSERT (a = -d); DEC (a, -d); ASSERT (a = 0);
  4253. END Test.
  4254. positive: decrement statement with huge integers
  4255. MODULE Test;
  4256. VAR a, b: HUGEINT; c: LONGINT; d: INTEGER; e: SHORTINT;
  4257. BEGIN a := 0; b := 3; c := -4; d := 5; e := -6;
  4258. DEC (a); ASSERT (a = -1); INC (a); ASSERT (a = 0);
  4259. DEC (a, 2); ASSERT (a = -2); DEC (a, -2); ASSERT (a = 0);
  4260. DEC (a, b); ASSERT (a = -b); DEC (a, -b); ASSERT (a = 0);
  4261. DEC (a, c); ASSERT (a = -c); DEC (a, -c); ASSERT (a = 0);
  4262. DEC (a, d); ASSERT (a = -d); DEC (a, -d); ASSERT (a = 0);
  4263. DEC (a, e); ASSERT (a = -e); DEC (a, -e); ASSERT (a = 0);
  4264. END Test.
  4265. # include statement
  4266. positive: include statement with short integer as set element
  4267. MODULE Test;
  4268. VAR set: SET; element: SHORTINT;
  4269. BEGIN
  4270. set := {}; element := MIN (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
  4271. set := {}; element := MAX (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
  4272. element := MIN (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
  4273. element := MAX (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
  4274. END Test.
  4275. negative: include statement with too small short integer as set element
  4276. MODULE Test;
  4277. VAR set: SET; element: SHORTINT;
  4278. BEGIN set := {}; element := MIN (SET) - 1; INCL (set, element);
  4279. END Test.
  4280. negative: include statement with too large short integer as set element
  4281. MODULE Test;
  4282. VAR set: SET; element: SHORTINT;
  4283. BEGIN set := {}; element := MAX (SET) + 1; INCL (set, element);
  4284. END Test.
  4285. positive: include statement with integer as set element
  4286. MODULE Test;
  4287. VAR set: SET; element: INTEGER;
  4288. BEGIN
  4289. set := {}; element := MIN (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
  4290. set := {}; element := MAX (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
  4291. element := MIN (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
  4292. element := MAX (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
  4293. END Test.
  4294. negative: include statement with too small integer as set element
  4295. MODULE Test;
  4296. VAR set: SET; element: INTEGER;
  4297. BEGIN set := {}; element := MIN (SET) - 1; INCL (set, element);
  4298. END Test.
  4299. negative: include statement with too large integer as set element
  4300. MODULE Test;
  4301. VAR set: SET; element: INTEGER;
  4302. BEGIN set := {}; element := MAX (SET) + 1; INCL (set, element);
  4303. END Test.
  4304. positive: include statement with long integer as set element
  4305. MODULE Test;
  4306. VAR set: SET; element: LONGINT;
  4307. BEGIN
  4308. set := {}; element := MIN (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
  4309. set := {}; element := MAX (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
  4310. element := MIN (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
  4311. element := MAX (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
  4312. END Test.
  4313. negative: include statement with too small long integer as set element
  4314. MODULE Test;
  4315. VAR set: SET; element: LONGINT;
  4316. BEGIN set := {}; element := MIN (SET) - 1; INCL (set, element);
  4317. END Test.
  4318. negative: include statement with too large long integer as set element
  4319. MODULE Test;
  4320. VAR set: SET; element: LONGINT;
  4321. BEGIN set := {}; element := MAX (SET) + 1; INCL (set, element);
  4322. END Test.
  4323. positive: include statement with huge integer as set element
  4324. MODULE Test;
  4325. VAR set: SET; element: HUGEINT;
  4326. BEGIN
  4327. set := {}; element := MIN (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
  4328. set := {}; element := MAX (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
  4329. element := MIN (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
  4330. element := MAX (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
  4331. END Test.
  4332. negative: include statement with too small huge integer as set element
  4333. MODULE Test;
  4334. VAR set: SET; element: HUGEINT;
  4335. BEGIN set := {}; element := MIN (SET) - 1; INCL (set, element);
  4336. END Test.
  4337. negative: include statement with too large huge integer as set element
  4338. MODULE Test;
  4339. VAR set: SET; element: HUGEINT;
  4340. BEGIN set := {}; element := MAX (SET) + 1; INCL (set, element);
  4341. END Test.
  4342. # exclude statement
  4343. positive: exclude statement with short integer as set element
  4344. MODULE Test;
  4345. VAR set: SET; element: SHORTINT;
  4346. BEGIN
  4347. set := {}; element := MIN (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4348. set := {}; element := MAX (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4349. element := MIN (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4350. element := MAX (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4351. END Test.
  4352. negative: exclude statement with too small short integer as set element
  4353. MODULE Test;
  4354. VAR set: SET; element: SHORTINT;
  4355. BEGIN set := {}; element := MIN (SET) - 1; EXCL (set, element);
  4356. END Test.
  4357. negative: exclude statement with too large short integer as set element
  4358. MODULE Test;
  4359. VAR set: SET; element: SHORTINT;
  4360. BEGIN set := {}; element := MAX (SET) + 1; EXCL (set, element);
  4361. END Test.
  4362. positive: exclude statement with integer as set element
  4363. MODULE Test;
  4364. VAR set: SET; element: INTEGER;
  4365. BEGIN
  4366. set := {}; element := MIN (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4367. set := {}; element := MAX (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4368. element := MIN (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4369. element := MAX (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4370. END Test.
  4371. negative: exclude statement with too small integer as set element
  4372. MODULE Test;
  4373. VAR set: SET; element: INTEGER;
  4374. BEGIN set := {}; element := MIN (SET) - 1; EXCL (set, element);
  4375. END Test.
  4376. negative: exclude statement with too large integer as set element
  4377. MODULE Test;
  4378. VAR set: SET; element: INTEGER;
  4379. BEGIN set := {}; element := MAX (SET) + 1; EXCL (set, element);
  4380. END Test.
  4381. positive: exclude statement with long integer as set element
  4382. MODULE Test;
  4383. VAR set: SET; element: LONGINT;
  4384. BEGIN
  4385. set := {}; element := MIN (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4386. set := {}; element := MAX (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4387. element := MIN (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4388. element := MAX (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4389. END Test.
  4390. negative: exclude statement with too small long integer as set element
  4391. MODULE Test;
  4392. VAR set: SET; element: LONGINT;
  4393. BEGIN set := {}; element := MIN (SET) - 1; EXCL (set, element);
  4394. END Test.
  4395. negative: exclude statement with too large long integer as set element
  4396. MODULE Test;
  4397. VAR set: SET; element: LONGINT;
  4398. BEGIN set := {}; element := MAX (SET) + 1; EXCL (set, element);
  4399. END Test.
  4400. positive: exclude statement with huge integer as set element
  4401. MODULE Test;
  4402. VAR set: SET; element: HUGEINT;
  4403. BEGIN
  4404. set := {}; element := MIN (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4405. set := {}; element := MAX (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4406. element := MIN (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4407. element := MAX (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
  4408. END Test.
  4409. negative: exclude statement with too small huge integer as set element
  4410. MODULE Test;
  4411. VAR set: SET; element: HUGEINT;
  4412. BEGIN set := {}; element := MIN (SET) - 1; EXCL (set, element);
  4413. END Test.
  4414. negative: exclude statement with too large huge integer as set element
  4415. MODULE Test;
  4416. VAR set: SET; element: HUGEINT;
  4417. BEGIN set := {}; element := MAX (SET) + 1; EXCL (set, element);
  4418. END Test.
  4419. # await statement
  4420. positive: await statement in exclusive block
  4421. MODULE Test;
  4422. VAR condition: BOOLEAN;
  4423. PROCEDURE Await; BEGIN AWAIT (condition) END Await;
  4424. BEGIN {EXCLUSIVE} condition := TRUE; Await;
  4425. END Test.
  4426. negative: await statement in non-exclusive block
  4427. MODULE Test;
  4428. VAR condition: BOOLEAN;
  4429. PROCEDURE Await; BEGIN AWAIT (condition) END Await;
  4430. BEGIN condition := FALSE; Await;
  4431. END Test.
  4432. positive: await statement satisfied by active object
  4433. MODULE Test;
  4434. VAR done: BOOLEAN;
  4435. VAR o: OBJECT BEGIN{ACTIVE} Done; END;
  4436. PROCEDURE Done; BEGIN{EXCLUSIVE} done := TRUE; END Done;
  4437. PROCEDURE P; BEGIN{EXCLUSIVE} AWAIT(done) END P;
  4438. BEGIN done := FALSE; NEW(o); P;
  4439. END Test.
  4440. negative: await statement after exit statement in exclusive block
  4441. MODULE Test;
  4442. VAR condition: BOOLEAN;
  4443. BEGIN condition := FALSE; LOOP BEGIN {EXCLUSIVE} EXIT; END; END; AWAIT (condition);
  4444. END Test.
  4445. # procedure variables
  4446. positive: calling global procedure variable
  4447. MODULE Test;
  4448. VAR p: PROCEDURE (VAR x: INTEGER); i: INTEGER;
  4449. PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
  4450. BEGIN i := 2; p := P; p (i); ASSERT (i = 4);
  4451. END Test.
  4452. negative: calling global nil procedure variable
  4453. MODULE Test;
  4454. VAR p: PROCEDURE;
  4455. BEGIN p := NIL; p;
  4456. END Test.
  4457. positive: calling global procedure variable in array
  4458. MODULE Test;
  4459. VAR p: ARRAY 10 OF PROCEDURE (VAR x: INTEGER); i: INTEGER;
  4460. PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
  4461. BEGIN i := 2; p[i] := P; p[i](i); ASSERT (i = 4);
  4462. END Test.
  4463. negative: calling global nil procedure variable in array
  4464. MODULE Test;
  4465. VAR p: ARRAY 10 OF PROCEDURE; i: INTEGER;
  4466. BEGIN i := 2; p[i] := NIL; p[i];
  4467. END Test.
  4468. positive: calling local procedure variable
  4469. MODULE Test;
  4470. PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
  4471. PROCEDURE Procedure;
  4472. VAR p: PROCEDURE (VAR x: INTEGER); i: INTEGER;
  4473. BEGIN i := 2; p := P; p (i); ASSERT (i = 4);
  4474. END Procedure;
  4475. BEGIN Procedure;
  4476. END Test.
  4477. negative: calling local nil procedure variable
  4478. MODULE Test;
  4479. PROCEDURE Procedure;
  4480. VAR p: PROCEDURE;
  4481. BEGIN p := NIL; p;
  4482. END Procedure;
  4483. BEGIN Procedure;
  4484. END Test.
  4485. positive: calling local procedure variable in array
  4486. MODULE Test;
  4487. PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
  4488. PROCEDURE Procedure;
  4489. VAR p: ARRAY 10 OF PROCEDURE (VAR x: INTEGER); i: INTEGER;
  4490. BEGIN i := 2; p[i] := P; p[i](i); ASSERT (i = 4);
  4491. END Procedure;
  4492. BEGIN Procedure;
  4493. END Test.
  4494. negative: calling local nil procedure variable in array
  4495. MODULE Test;
  4496. PROCEDURE Procedure;
  4497. VAR p: ARRAY 10 OF PROCEDURE; i: INTEGER;
  4498. BEGIN i := 2; p[i] := NIL; p[i];
  4499. END Procedure;
  4500. BEGIN Procedure;
  4501. END Test.
  4502. positive: calling parameter procedure variable
  4503. MODULE Test;
  4504. PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
  4505. PROCEDURE Procedure (p: PROCEDURE (VAR x: INTEGER));
  4506. VAR i: INTEGER;
  4507. BEGIN i := 2; p := P; p (i); ASSERT (i = 4);
  4508. END Procedure;
  4509. BEGIN Procedure (P);
  4510. END Test.
  4511. negative: calling parameter nil procedure variable
  4512. MODULE Test;
  4513. PROCEDURE Procedure (p: PROCEDURE);
  4514. BEGIN p;
  4515. END Procedure;
  4516. BEGIN Procedure (NIL);
  4517. END Test.
  4518. positive: calling variable parameter procedure variable
  4519. MODULE Test;
  4520. VAR p: PROCEDURE (VAR x: INTEGER);
  4521. PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
  4522. PROCEDURE Procedure (VAR p: PROCEDURE (VAR x: INTEGER));
  4523. VAR i: INTEGER;
  4524. BEGIN i := 2; p := P; p (i); ASSERT (i = 4);
  4525. END Procedure;
  4526. BEGIN p := P; Procedure (p);
  4527. END Test.
  4528. negative: calling variable parameter nil procedure variable
  4529. MODULE Test;
  4530. VAR p: PROCEDURE;
  4531. PROCEDURE Procedure (VAR p: PROCEDURE);
  4532. BEGIN p;
  4533. END Procedure;
  4534. BEGIN p := NIL; Procedure (p);
  4535. END Test.
  4536. positive: calling parameter procedure variable of object
  4537. MODULE Test;
  4538. VAR i: INTEGER; o: OBJECT
  4539. VAR p: PROCEDURE (VAR x: INTEGER);
  4540. END;
  4541. PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
  4542. BEGIN i := 2; NEW (o); o.p := P; o.p (i); ASSERT (i = 4);
  4543. END Test.
  4544. negative: calling parameter nil procedure variable of object
  4545. MODULE Test;
  4546. VAR o: OBJECT
  4547. VAR p: PROCEDURE;
  4548. END;
  4549. BEGIN NEW (o); o.p := NIL; o.p;
  4550. END Test.
  4551. positive: calling parameter procedure variable within object
  4552. MODULE Test;
  4553. VAR o: OBJECT
  4554. VAR p: PROCEDURE (VAR x: INTEGER);
  4555. PROCEDURE &Procedure;
  4556. VAR i: INTEGER;
  4557. BEGIN i := 2; p := P; p (i); ASSERT (i = 4);
  4558. END Procedure;
  4559. END;
  4560. PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
  4561. BEGIN NEW (o);
  4562. END Test.
  4563. negative: calling parameter nil procedure variable within object
  4564. MODULE Test;
  4565. VAR o: OBJECT
  4566. VAR p: PROCEDURE;
  4567. PROCEDURE &Procedure;
  4568. BEGIN p := NIL; p;
  4569. END Procedure;
  4570. END;
  4571. BEGIN NEW (o);
  4572. END Test.
  4573. # concurrency
  4574. positive: exclusive section in procedure in module scope
  4575. MODULE Test;
  4576. PROCEDURE P;
  4577. BEGIN{EXCLUSIVE}
  4578. END P;
  4579. BEGIN P END Test.
  4580. positive: exclusive section in procedure in object scope
  4581. MODULE Test;
  4582. VAR a: OBJECT
  4583. PROCEDURE P;
  4584. BEGIN{EXCLUSIVE}
  4585. END P;
  4586. END;
  4587. BEGIN NEW(a); a.P END Test.
  4588. positive: positive await statement in procedure in module scope
  4589. MODULE Test;
  4590. VAR done: BOOLEAN;
  4591. PROCEDURE P;
  4592. BEGIN{EXCLUSIVE}
  4593. AWAIT(done)
  4594. END P;
  4595. BEGIN done := TRUE; P END Test.
  4596. negative: active body
  4597. MODULE Test;
  4598. VAR start,called: BOOLEAN;
  4599. VAR o:OBJECT VAR i: LONGINT; BEGIN{ACTIVE} WHILE ~start DO END; called := TRUE END;
  4600. BEGIN
  4601. start := FALSE; called := FALSE;
  4602. NEW(o);
  4603. start := TRUE;
  4604. WHILE ~called DO END;
  4605. HALT(100);
  4606. END Test.
  4607. positive: negative await statement in procedure in module scope
  4608. MODULE Test;
  4609. VAR done: BOOLEAN;
  4610. VAR o:OBJECT VAR i: LONGINT; BEGIN{ACTIVE} FOR i := 0 TO 10000 DO END; Done END;
  4611. PROCEDURE Done;
  4612. BEGIN{EXCLUSIVE}
  4613. done := TRUE
  4614. END Done;
  4615. PROCEDURE P;
  4616. BEGIN{EXCLUSIVE}
  4617. AWAIT(done)
  4618. END P;
  4619. BEGIN done := FALSE; NEW(o); P END Test.
  4620. positive: positive await statement in procedure in object scope
  4621. MODULE Test;
  4622. VAR o:OBJECT
  4623. VAR done: BOOLEAN;
  4624. PROCEDURE P;
  4625. BEGIN{EXCLUSIVE}
  4626. AWAIT(done)
  4627. END P;
  4628. BEGIN done := TRUE;
  4629. END;
  4630. BEGIN NEW(o); o.P; END Test.
  4631. positive: negative await statement in procedure in object scope
  4632. MODULE Test;
  4633. VAR o:OBJECT
  4634. VAR done: BOOLEAN; i: LONGINT;
  4635. PROCEDURE & Init; BEGIN done := FALSE END Init;
  4636. PROCEDURE P;
  4637. BEGIN{EXCLUSIVE}
  4638. AWAIT(done)
  4639. END P;
  4640. PROCEDURE Done;
  4641. BEGIN{EXCLUSIVE}
  4642. done := TRUE
  4643. END Done;
  4644. BEGIN{ACTIVE} FOR i := 0 TO 10000 DO END; Done
  4645. END;
  4646. BEGIN NEW(o); o.P; END Test.
  4647. # programs
  4648. positive: Gaussian natural sum using arrays
  4649. MODULE Test;
  4650. CONST Count = 100;
  4651. VAR i, sum: LONGINT; a: ARRAY Count OF LONGINT;
  4652. BEGIN
  4653. FOR i := 0 TO Count - 1 DO
  4654. a[i] := i;
  4655. END;
  4656. i := 0; sum := 0;
  4657. WHILE i < Count DO
  4658. INC (sum, a[i]); INC (i);
  4659. END;
  4660. ASSERT (sum = Count * (Count-1) DIV 2);
  4661. END Test.
  4662. positive: natural sum with several synchronous concurrent accumulators
  4663. MODULE Test;
  4664. TYPE Accumulator = OBJECT
  4665. VAR i: INTEGER; done: BOOLEAN;
  4666. PROCEDURE &Init; BEGIN done := FALSE; END Init;
  4667. PROCEDURE Await; BEGIN {EXCLUSIVE} AWAIT (done); END Await;
  4668. BEGIN {ACTIVE, EXCLUSIVE} FOR i := 1 TO 100 DO Add END; done := TRUE;
  4669. END Accumulator;
  4670. VAR acc0, acc1, acc2: Accumulator; sum: INTEGER;
  4671. PROCEDURE Busy; VAR i: INTEGER; BEGIN FOR i := 1 TO 100 DO END; END Busy;
  4672. PROCEDURE Add; VAR temp: INTEGER; BEGIN {EXCLUSIVE} temp := sum; Busy; sum := temp + 1 END Add;
  4673. BEGIN sum := 0; NEW (acc0); NEW (acc1); NEW (acc2); acc0.Await; acc1.Await; acc2.Await; ASSERT (sum = 300);
  4674. END Test.
  4675. negative: natural sum with several asynchronous concurrent accumulators
  4676. MODULE Test;
  4677. TYPE Accumulator = OBJECT
  4678. VAR i: INTEGER; done: BOOLEAN;
  4679. PROCEDURE &Init; BEGIN done := FALSE; END Init;
  4680. PROCEDURE Await; BEGIN {EXCLUSIVE} AWAIT (done); END Await;
  4681. BEGIN {ACTIVE, EXCLUSIVE} FOR i := 1 TO 100 DO Add END; done := TRUE;
  4682. END Accumulator;
  4683. VAR acc0, acc1, acc2: Accumulator; sum: INTEGER;
  4684. PROCEDURE Busy; VAR i: INTEGER; BEGIN FOR i := 1 TO 100 DO END; END Busy;
  4685. PROCEDURE Add; VAR temp: INTEGER; BEGIN temp := sum; Busy; sum := temp + 1 END Add;
  4686. BEGIN sum := 0; NEW (acc0); NEW (acc1); NEW (acc2); acc0.Await; acc1.Await; acc2.Await; ASSERT (sum = 300);
  4687. END Test.
  4688. positive: dining philosophers
  4689. MODULE Test;
  4690. CONST Forks = 5;
  4691. TYPE Fork = OBJECT
  4692. VAR taken: BOOLEAN;
  4693. PROCEDURE &Init; BEGIN taken := FALSE; END Init;
  4694. PROCEDURE PickUp; BEGIN {EXCLUSIVE} AWAIT (~taken); taken := TRUE; END PickUp;
  4695. PROCEDURE PutDown; BEGIN {EXCLUSIVE} taken := FALSE; END PutDown;
  4696. END Fork;
  4697. TYPE Philosopher = OBJECT
  4698. VAR first, second, i: INTEGER; done: BOOLEAN
  4699. PROCEDURE &Init (id: INTEGER); BEGIN IF id # Forks - 1 THEN first := id; second := id + 1; ELSE first := 0; second := Forks - 1 END; done := FALSE; END Init;
  4700. PROCEDURE Await; BEGIN {EXCLUSIVE} AWAIT (done); END Await;
  4701. BEGIN {EXCLUSIVE, ACTIVE} FOR i := 1 TO 10 DO Think;
  4702. fork[first].PickUp; fork[second].PickUp; Eat; fork[second].PutDown; fork[first].PutDown;
  4703. END; done := TRUE;
  4704. END Philosopher;
  4705. VAR fork: ARRAY Forks OF Fork; philosopher: ARRAY Forks OF Philosopher; id: INTEGER;
  4706. PROCEDURE Think; VAR i: INTEGER; BEGIN FOR i := 1 TO 100 DO END; END Think;
  4707. PROCEDURE Eat; VAR i: INTEGER; BEGIN FOR i := 1 TO 1000 DO END; END Eat;
  4708. BEGIN
  4709. FOR id := 0 TO Forks - 1 DO NEW (fork[id]) END;
  4710. FOR id := 0 TO Forks - 1 DO NEW (philosopher[id], id) END;
  4711. FOR id := 0 TO Forks - 1 DO philosopher[id].Await END;
  4712. END Test.
  4713. positive: bounded buffer
  4714. MODULE Test;
  4715. TYPE Buffer = OBJECT
  4716. VAR in, out, size: LONGINT;
  4717. VAR data: POINTER TO ARRAY OF INTEGER;
  4718. PROCEDURE &Init (len: LONGINT); BEGIN in := 0; out := 0; size := 0; NEW (data, len); END Init;
  4719. PROCEDURE Put (item: INTEGER); BEGIN {EXCLUSIVE} AWAIT (size # LEN (data)); data[in] := item; in := (in + 1) MOD LEN (data); INC (size) END Put;
  4720. PROCEDURE Get (VAR item: INTEGER); BEGIN {EXCLUSIVE} AWAIT (size # 0); item := data[out]; out := (out + 1) MOD LEN (data); DEC (size) END Get;
  4721. END Buffer;
  4722. TYPE Process = OBJECT
  4723. VAR count: INTEGER; buffer: Buffer; done: BOOLEAN;
  4724. PROCEDURE &Init (count: INTEGER; buffer: Buffer); BEGIN SELF.count := count; SELF.buffer := buffer; done := FALSE; END Init;
  4725. PROCEDURE Await; BEGIN {EXCLUSIVE} AWAIT (done); END Await;
  4726. PROCEDURE Handle; END Handle;
  4727. BEGIN {EXCLUSIVE, ACTIVE} Handle; done := TRUE;
  4728. END Process;
  4729. TYPE Producer = OBJECT (Process)
  4730. PROCEDURE Handle; VAR i: INTEGER; BEGIN FOR i := 1 TO count DO buffer.Put (i); END; END Handle;
  4731. END Producer;
  4732. TYPE Consumer = OBJECT (Process)
  4733. PROCEDURE Handle; VAR i, item: INTEGER; BEGIN FOR i := 1 TO count DO buffer.Get (item); ASSERT (item = i); END; END Handle;
  4734. END Consumer;
  4735. PROCEDURE Test (len, count: INTEGER);
  4736. VAR buffer: Buffer; consumer: Consumer; producer: Producer;
  4737. BEGIN NEW (buffer, len); NEW (consumer, count, buffer); NEW (producer, count, buffer); consumer.Await; producer.Await;
  4738. END Test;
  4739. BEGIN Test (1, 1000); Test (10, 1000); Test (1000, 1000); Test (1000, 100);
  4740. END Test.
  4741. positive: sudoku solver
  4742. MODULE Test;
  4743. CONST Empty = '0'; Blocks = 3; Columns = Blocks * Blocks; Cells = Columns * Columns;
  4744. TYPE Cell = INTEGER; Value = CHAR; Game = ARRAY Cells + 1 OF Value;
  4745. PROCEDURE IsValidCell (CONST game: Game; cell: Cell): BOOLEAN;
  4746. VAR value: Value; VAR row, column: Cell;
  4747. PROCEDURE Check (start, stride: Cell): BOOLEAN;
  4748. VAR cells, count: Cell;
  4749. BEGIN count := stride; FOR cells := 0 TO Columns - 1 DO IF (start # cell) & (game[start] = value) THEN RETURN FALSE END;
  4750. DEC (count); IF count = 0 THEN count := stride; INC (start, Columns + 1 - stride) ELSE INC (start) END; END; RETURN TRUE;
  4751. END Check;
  4752. BEGIN value := game[cell]; IF value = Empty THEN RETURN TRUE END; row := cell DIV Columns; column := cell MOD Columns;
  4753. RETURN Check (cell - column, Columns) & Check (column, 1) & Check (cell - row MOD Blocks * Columns - column MOD Blocks, Blocks);
  4754. END IsValidCell;
  4755. PROCEDURE IsValid (CONST game: Game): BOOLEAN;
  4756. VAR cell: Cell; BEGIN FOR cell := 0 TO Cells - 1 DO IF ~IsValidCell (game, cell) THEN RETURN FALSE END END; RETURN TRUE;
  4757. END IsValid;
  4758. PROCEDURE Solve (VAR game: Game): BOOLEAN;
  4759. VAR cell: Cell; value: SHORTINT;
  4760. BEGIN FOR cell := 0 TO Cells - 1 DO IF game[cell] = Empty THEN FOR value := ORD (Empty) + 1 TO ORD (Empty) + Columns DO game[cell] := CHR (value);
  4761. IF IsValidCell (game, cell) & Solve (game) THEN RETURN TRUE END; END; game[cell] := Empty; RETURN FALSE; END END; RETURN IsValid (game);
  4762. END Solve;
  4763. PROCEDURE Check (CONST problem, solution: Game);
  4764. VAR game: Game; BEGIN ASSERT (IsValid (problem)); ASSERT (IsValid (solution)); game := problem; ASSERT (Solve (game)); ASSERT (game = solution);
  4765. END Check;
  4766. BEGIN Check ("003020080090500000018609074600047390080205040059160007930402760000006010040070900", "563724189794581236218639574621847395387295641459163827935412768872956413146378952");
  4767. END Test.
  4768. # miscellaneous
  4769. positive: SYSTEM.VAL on designator and non-designator expression
  4770. MODULE Test;
  4771. IMPORT SYSTEM;
  4772. PROCEDURE P;
  4773. VAR c1,c2,c3,c4: CHAR;
  4774. BEGIN
  4775. c1 := 0FFX;
  4776. c2 := 0FFX;
  4777. c3 := 0FFX;
  4778. c4 := 0FFX;
  4779. ASSERT(SYSTEM.VAL(LONGINT,c4) = -1);
  4780. ASSERT(SYSTEM.VAL(LONGINT,ORD(c4)) = 255);
  4781. END P;
  4782. BEGIN P;
  4783. END Test.
  4784. positive: reimporting an object type with initializer
  4785. MODULE A;
  4786. TYPE D1*= OBJECT END D1;
  4787. END A.
  4788. MODULE B;
  4789. IMPORT A;
  4790. TYPE
  4791. D1*= OBJECT (A.D1)
  4792. PROCEDURE &Init*;
  4793. BEGIN
  4794. END Init;
  4795. END D1;
  4796. END B.
  4797. MODULE Test;
  4798. IMPORT B;
  4799. PROCEDURE P*;
  4800. VAR o: B.D1;
  4801. BEGIN NEW(o);
  4802. END P;
  4803. BEGIN P;
  4804. END Test.
  4805. positive: reimporting objects and execute bodies
  4806. MODULE A;
  4807. TYPE O*= OBJECT
  4808. VAR initZ-: LONGINT;
  4809. BEGIN initZ := 999;
  4810. END O;
  4811. END A.
  4812. MODULE B;
  4813. IMPORT A;
  4814. TYPE O*= OBJECT (A.O)
  4815. VAR initY-: LONGINT;
  4816. BEGIN initY := 998;
  4817. END O;
  4818. END B.
  4819. MODULE Test;
  4820. IMPORT B;
  4821. TYPE O*=OBJECT (B.O)
  4822. VAR initO: LONGINT;
  4823. BEGIN initO := 997
  4824. END O;
  4825. VAR o: O;
  4826. BEGIN
  4827. NEW(o); ASSERT(o.initO=997); ASSERT(o.initY =998); ASSERT(o.initZ=999);
  4828. END Test.
  4829. positive: importing protected object
  4830. MODULE A;
  4831. TYPE O*= OBJECT
  4832. PROCEDURE P*;
  4833. BEGIN{EXCLUSIVE}
  4834. END P;
  4835. END O;
  4836. END A.
  4837. MODULE Test;
  4838. IMPORT A;
  4839. VAR o: A.O;
  4840. BEGIN
  4841. NEW(o); o.P;
  4842. END Test.
  4843. positive: importing and extending protected object
  4844. MODULE Test;
  4845. IMPORT A;
  4846. TYPE O*= OBJECT (A.O)
  4847. VAR
  4848. PROCEDURE Q*;
  4849. BEGIN
  4850. P;
  4851. END Q;
  4852. END O;
  4853. VAR o: O;
  4854. BEGIN
  4855. NEW(o); o.Q;
  4856. END Test.
  4857. positive: passing string parameter to procedure returning pointer
  4858. MODULE Test;
  4859. TYPE String= POINTER TO ARRAY OF CHAR;
  4860. PROCEDURE TestString*(CONST str: ARRAY OF CHAR): String;
  4861. VAR ch: CHAR;
  4862. BEGIN
  4863. ch := str[0];
  4864. RETURN NIL
  4865. END TestString;
  4866. PROCEDURE Test*;
  4867. VAR str: String;
  4868. BEGIN
  4869. str := TestString("TestStr");
  4870. END Test;
  4871. BEGIN Test
  4872. END Test.
  4873. positive: passing array parameter to nested procedure
  4874. MODULE Test;
  4875. PROCEDURE Enum();
  4876. VAR name: ARRAY 256 OF CHAR;
  4877. PROCEDURE GetNextSymbol(VAR s: ARRAY OF CHAR );
  4878. BEGIN
  4879. s[0] := 0X;
  4880. END GetNextSymbol;
  4881. BEGIN
  4882. GetNextSymbol(name);
  4883. END Enum;
  4884. BEGIN Enum();
  4885. END Test.
  4886. positive: nested procedure calls itself with parameter
  4887. MODULE Test;
  4888. PROCEDURE Test;
  4889. VAR k: LONGINT;
  4890. PROCEDURE Test0(l: LONGINT);
  4891. BEGIN
  4892. ASSERT(l = 999);
  4893. INC(k);
  4894. IF k < 10 THEN Test0(l) END;
  4895. END Test0;
  4896. BEGIN
  4897. k := 0;
  4898. Test0(999);
  4899. END Test;
  4900. BEGIN Test;
  4901. END Test.
  4902. positive: object type declared in procedure scope
  4903. MODULE Test;
  4904. PROCEDURE Test;
  4905. TYPE
  4906. O=OBJECT
  4907. VAR i:LONGINT;
  4908. PROCEDURE &Init;
  4909. BEGIN
  4910. i := 999;
  4911. END Init;
  4912. PROCEDURE P;
  4913. BEGIN
  4914. ASSERT(i=999);
  4915. END P;
  4916. END O;
  4917. VAR o:O;
  4918. BEGIN
  4919. NEW(o); o.P;
  4920. END Test;
  4921. BEGIN Test;
  4922. END Test.
  4923. positive: expression involving multiple register savings on stack
  4924. MODULE Test;
  4925. PROCEDURE Test;
  4926. VAR a: POINTER TO ARRAY OF LONGINT; i : LONGINT;
  4927. PROCEDURE Add(i: LONGINT): LONGINT;
  4928. BEGIN
  4929. RETURN i+10
  4930. END Add;
  4931. BEGIN
  4932. NEW(a,10);
  4933. i := 5;
  4934. a[i] := 10;
  4935. a[i] := a[i]+Add(a[i]+Add(a[i] + Add(a[i])));
  4936. ASSERT(a[i] = 70);
  4937. END Test;
  4938. BEGIN Test;
  4939. END Test.
  4940. positive: GETPROCEDURE with procedure returning an object
  4941. MODULE A;
  4942. TYPE Object*=OBJECT VAR a-: LONGINT; END Object;
  4943. PROCEDURE TheProcedure*(): Object;
  4944. VAR o: Object;
  4945. BEGIN
  4946. NEW(o); o.a := 100; RETURN o;
  4947. END TheProcedure;
  4948. END A.
  4949. MODULE Test;
  4950. IMPORT A;
  4951. PROCEDURE Test;
  4952. VAR p: PROCEDURE(): A.Object; o: A.Object;
  4953. BEGIN
  4954. GETPROCEDURE("A","TheProcedure",p);
  4955. o := p();
  4956. ASSERT(o.a = 100);
  4957. END Test;
  4958. BEGIN Test;
  4959. END Test.
  4960. positive: import object and use initializer on alias
  4961. MODULE A;
  4962. TYPE
  4963. O*= OBJECT
  4964. VAR a*: LONGINT;
  4965. PROCEDURE &Init*;
  4966. BEGIN
  4967. END Init;
  4968. END O;
  4969. O2*=O;
  4970. END A.
  4971. MODULE Test;
  4972. IMPORT X :=A;
  4973. VAR o: X.O2;
  4974. BEGIN
  4975. NEW(o); o.a :=10;
  4976. END Test.
  4977. positive: procedure returning record
  4978. MODULE Test;
  4979. TYPE R= RECORD a,b: LONGINT END;
  4980. VAR r: R;
  4981. PROCEDURE P(b,a: LONGINT): R;
  4982. VAR r: R;
  4983. BEGIN
  4984. r.a := a; r.b := b;
  4985. RETURN r
  4986. END P;
  4987. BEGIN
  4988. r := P(10,20);
  4989. ASSERT(r.a =20); ASSERT(r.b = 10);
  4990. END Test.
  4991. positive: procedure returning static array
  4992. MODULE Test;
  4993. TYPE S= ARRAY 128 OF CHAR;
  4994. VAR s:S;
  4995. PROCEDURE Q(CONST name: ARRAY OF CHAR): S;
  4996. VAR s:S;
  4997. BEGIN
  4998. COPY(name,s);
  4999. RETURN s;
  5000. END Q;
  5001. BEGIN
  5002. s := Q("TestText");
  5003. ASSERT(s= "TestText");
  5004. END Test.
  5005. positive: assign static array of char to static VAR parameter arrray of char
  5006. MODULE Test;
  5007. TYPE String = ARRAY 1024 OF CHAR;
  5008. VAR o:OBJECT
  5009. VAR
  5010. x,y,z: LONGINT;
  5011. string:String;
  5012. END;
  5013. name: String;
  5014. PROCEDURE P(VAR name: String);
  5015. BEGIN
  5016. name := o.string;
  5017. END P;
  5018. BEGIN
  5019. NEW(o); o.string := "test"; P(name); ASSERT(name = "test");
  5020. END Test.
  5021. positive: procedure returning record containing pointer
  5022. MODULE Test;
  5023. TYPE R= RECORD any: POINTER TO R; a,b: LONGINT END;
  5024. VAR r: R;
  5025. PROCEDURE P(b,a: LONGINT): R;
  5026. VAR r: R;
  5027. BEGIN
  5028. r.a := a; r.b := b;
  5029. RETURN r
  5030. END P;
  5031. BEGIN
  5032. r := P(10,20);
  5033. ASSERT(r.a =20); ASSERT(r.b = 10);
  5034. END Test.
  5035. positive: pass record by value, variable and as a constant
  5036. MODULE Test;
  5037. TYPE Record= RECORD min,max: LONGINT END;
  5038. PROCEDURE P(x: Record);
  5039. BEGIN
  5040. ASSERT(x.min = -123); ASSERT(x.max = 123);
  5041. END P;
  5042. PROCEDURE Q(VAR x: Record);
  5043. BEGIN
  5044. ASSERT(x.min = -123); ASSERT(x.max = 123);
  5045. END Q;
  5046. PROCEDURE R(CONST x: Record);
  5047. BEGIN
  5048. ASSERT(x.min = -123); ASSERT(x.max = 123);
  5049. END R;
  5050. PROCEDURE T;
  5051. VAR r: Record;
  5052. BEGIN
  5053. r.min := -123; r.max := 123;
  5054. P(r); Q(r); R(r);
  5055. END T;
  5056. BEGIN
  5057. T
  5058. END Test.
  5059. positive: procedure returning record called as parameter
  5060. MODULE Test;
  5061. TYPE
  5062. Rectangle=RECORD l,t,r,b: LONGINT END;
  5063. Object = OBJECT VAR w: LONGINT END Object;
  5064. PROCEDURE Check(y: Object; r1: Rectangle; x: Object; CONST r2: Rectangle);
  5065. BEGIN
  5066. ASSERT(r1.l = r2.l); ASSERT(r1.t = r2.t);
  5067. ASSERT(r1.r = 10); ASSERT(r1.b = 20);
  5068. ASSERT(r2.r = 101); ASSERT(r2.b = 102);
  5069. ASSERT(x.w = 10);
  5070. END Check;
  5071. PROCEDURE Q(l,t,r,b: LONGINT): Rectangle;
  5072. VAR R: Rectangle;
  5073. BEGIN
  5074. R.l := l; R.t := t; R.r := r; R.b := b;
  5075. RETURN R
  5076. END Q;
  5077. PROCEDURE P;
  5078. VAR r1,r2: Rectangle; o: Object;
  5079. BEGIN
  5080. NEW(o); o.w := 10;
  5081. r1.l := 0; r2.l := 0; r1.t := -100; r2.t := -100;
  5082. r1.r := 10; r1.b := 20;
  5083. r2.r := 101; r2.b := 102;
  5084. Check(o,r1,o,r2);
  5085. Check(o,Q(0,-100,10,20),o,Q(0,-100,101,102));
  5086. END P;
  5087. BEGIN P
  5088. END Test.
  5089. positive: pass delegate as parameter
  5090. MODULE Test;
  5091. TYPE
  5092. Procedure = PROCEDURE {DELEGATE}(): LONGINT;
  5093. TYPE
  5094. O= OBJECT
  5095. VAR g: LONGINT;
  5096. PROCEDURE Test;
  5097. BEGIN
  5098. CallProc(OProc);
  5099. CallProc(GProc);
  5100. END Test;
  5101. PROCEDURE OProc(): LONGINT;
  5102. BEGIN
  5103. RETURN g
  5104. END OProc;
  5105. BEGIN g := 10;
  5106. END O;
  5107. PROCEDURE CallProc(p: Procedure);
  5108. BEGIN
  5109. ASSERT(p() = 10);
  5110. END CallProc;
  5111. PROCEDURE GProc(): LONGINT;
  5112. BEGIN
  5113. RETURN 10
  5114. END GProc;
  5115. PROCEDURE P;
  5116. VAR o: O;
  5117. BEGIN
  5118. NEW(o); o.Test;
  5119. END P;
  5120. BEGIN P
  5121. END Test.
  5122. positive: reimport indirectly published procedure
  5123. MODULE A;
  5124. TYPE AO*= OBJECT
  5125. VAR called*: BOOLEAN;
  5126. PROCEDURE P*;
  5127. BEGIN called := TRUE;
  5128. END P;
  5129. BEGIN
  5130. called := FALSE;
  5131. END AO;
  5132. AO2*= OBJECT(AO);
  5133. PROCEDURE P;
  5134. BEGIN P^
  5135. END P;
  5136. END AO2;
  5137. END A.
  5138. MODULE B;
  5139. IMPORT A;
  5140. TYPE BO*= OBJECT(A.AO2);
  5141. PROCEDURE P;
  5142. BEGIN P^
  5143. END P;
  5144. END BO;
  5145. END B.
  5146. MODULE Test;
  5147. IMPORT B;
  5148. TYPE O*= OBJECT(B.BO);
  5149. PROCEDURE P;
  5150. BEGIN
  5151. P^;
  5152. END P;
  5153. END O;
  5154. PROCEDURE P;
  5155. VAR o:O;
  5156. BEGIN
  5157. NEW(o);
  5158. o.P; ASSERT(o.called);
  5159. END P;
  5160. BEGIN P;
  5161. END Test.
  5162. positive: pass static array by value, reference and as constant
  5163. MODULE Test;
  5164. TYPE Array= ARRAY 10 OF LONGINT;
  5165. PROCEDURE P(x: Array);
  5166. BEGIN
  5167. ASSERT(x[5] = -123); ASSERT(x[8] = 123);
  5168. END P;
  5169. PROCEDURE Q(VAR x: Array);
  5170. BEGIN
  5171. ASSERT(x[5] = -123); ASSERT(x[8] = 123);
  5172. END Q;
  5173. PROCEDURE R(CONST x: Array);
  5174. BEGIN
  5175. ASSERT(x[5] = -123); ASSERT(x[8] = 123);
  5176. END R;
  5177. PROCEDURE T;
  5178. VAR r: Array;
  5179. BEGIN
  5180. r[5] := -123; r[8] := 123;
  5181. P(r); Q(r); R(r);
  5182. END T;
  5183. BEGIN
  5184. T
  5185. END Test.
  5186. positive: procedure returning static array called as parameter
  5187. MODULE Test;
  5188. TYPE
  5189. Rectangle=ARRAY 10 OF LONGINT;
  5190. Object = OBJECT VAR w: LONGINT END Object;
  5191. PROCEDURE Check(y: Object; r1: Rectangle; x: Object; CONST r2: Rectangle);
  5192. BEGIN
  5193. ASSERT(r1[3] = r2[3]); ASSERT(r1[5] = r2[5]);
  5194. ASSERT(r1[6] = 10); ASSERT(r1[7] = 20);
  5195. ASSERT(r2[6] = 101); ASSERT(r2[7] = 102);
  5196. ASSERT(x.w = 10);
  5197. END Check;
  5198. PROCEDURE Q(l,t,r,b: LONGINT): Rectangle;
  5199. VAR R: Rectangle;
  5200. BEGIN
  5201. R[3] := l; R[5] := t; R[6] := r; R[7] := b;
  5202. RETURN R
  5203. END Q;
  5204. PROCEDURE P;
  5205. VAR r1,r2: Rectangle; o: Object;
  5206. BEGIN
  5207. NEW(o); o.w := 10;
  5208. r1[3] := 0; r2[3] := 0; r1[5] := -100; r2[5] := -100;
  5209. r1[6] := 10; r1[7] := 20;
  5210. r2[6] := 101; r2[7] := 102;
  5211. Check(o,r1,o,r2);
  5212. Check(o,Q(0,-100,10,20),o,Q(0,-100,101,102));
  5213. END P;
  5214. BEGIN P
  5215. END Test.
  5216. positive: new on var parameter object
  5217. MODULE Test;
  5218. TYPE O = OBJECT
  5219. VAR x: LONGINT;
  5220. PROCEDURE &init;
  5221. BEGIN x := 10;
  5222. END init;
  5223. END O;
  5224. PROCEDURE Q(VAR o: O);
  5225. BEGIN
  5226. NEW(o); ASSERT(o # NIL,101); ASSERT(o.x = 10,102);
  5227. END Q;
  5228. PROCEDURE P;
  5229. VAR o: O;
  5230. BEGIN
  5231. Q(o); ASSERT(o.x = 10,103);
  5232. END P;
  5233. BEGIN P
  5234. END Test.
  5235. positive: new on var parameter array
  5236. MODULE Test;
  5237. TYPE O=POINTER TO ARRAY OF INTEGER;
  5238. PROCEDURE Q(VAR o: O);
  5239. BEGIN
  5240. NEW(o,10); o[5] := 10;
  5241. END Q;
  5242. PROCEDURE P;
  5243. VAR o: O;
  5244. BEGIN
  5245. Q(o); ASSERT(o[5] = 10); ASSERT(LEN(o)=10);
  5246. END P;
  5247. BEGIN P
  5248. END Test.
  5249. positive: call procedure returning a basic type within an exclusive section
  5250. MODULE Test;
  5251. TYPE
  5252. O= OBJECT
  5253. PROCEDURE P(): LONGINT;
  5254. VAR a: LONGINT;
  5255. BEGIN{EXCLUSIVE}
  5256. a := 4;
  5257. RETURN a*a
  5258. END P;
  5259. END O;
  5260. PROCEDURE P;
  5261. VAR o: O;
  5262. BEGIN
  5263. NEW(o);
  5264. ASSERT(o.P() = 16);
  5265. END P;
  5266. BEGIN P
  5267. END Test.
  5268. positive: pass Delegate nil value
  5269. MODULE Test;
  5270. TYPE
  5271. Delegate= PROCEDURE{DELEGATE};
  5272. PROCEDURE P(p: Delegate);
  5273. BEGIN
  5274. ASSERT(p=NIL);
  5275. END P;
  5276. BEGIN
  5277. P(NIL); (* if incorrect then stack will be invalid => hard brakedown *)
  5278. END Test.
  5279. positive: type tests and guards on records and pointers on direct and indirect parameters
  5280. MODULE Test;
  5281. TYPE
  5282. R0=RECORD END;
  5283. R1=RECORD(R0) v: LONGINT END;
  5284. R2=RECORD(R0) END;
  5285. P0=POINTER TO RECORD END;
  5286. P1=POINTER TO RECORD(P0) v: LONGINT; END;
  5287. P2=POINTER TO RECORD(P1) END;
  5288. PROCEDURE R(VAR r: R0);
  5289. BEGIN
  5290. ASSERT(r IS R1);
  5291. ASSERT(~(r IS R2));
  5292. WITH r: R1 DO
  5293. r.v := 10;
  5294. END;
  5295. r(R1).v := 10;
  5296. END R;
  5297. PROCEDURE S(VAR r: R0);
  5298. BEGIN
  5299. R(r);
  5300. END S;
  5301. PROCEDURE RC(CONST r: R0);
  5302. VAR i: LONGINT;
  5303. BEGIN
  5304. ASSERT(r IS R1);
  5305. ASSERT(~(r IS R2));
  5306. WITH r: R1 DO
  5307. i := r.v
  5308. END;
  5309. i := r(R1).v;
  5310. END RC;
  5311. PROCEDURE SC(CONST r: R0);
  5312. BEGIN
  5313. RC(r);
  5314. END SC;
  5315. PROCEDURE P(p: P0);
  5316. BEGIN
  5317. ASSERT(p IS P1);
  5318. ASSERT(~(p IS P2));
  5319. WITH p: P1 DO
  5320. p.v := 10;
  5321. END;
  5322. p(P1).v := 10;
  5323. END P;
  5324. PROCEDURE PV(VAR p: P0);
  5325. BEGIN
  5326. ASSERT(p IS P1);
  5327. ASSERT(~(p IS P2));
  5328. WITH p: P1 DO
  5329. p.v := 10;
  5330. END;
  5331. p(P1).v := 10;
  5332. END PV;
  5333. PROCEDURE PC(CONST p: P0);
  5334. BEGIN
  5335. ASSERT(p IS P1);
  5336. ASSERT(~(p IS P2));
  5337. WITH p: P1 DO
  5338. p.v := 10;
  5339. END;
  5340. p(P1).v := 10;
  5341. END PC;
  5342. PROCEDURE Test;
  5343. VAR r: R1; p: P1; p0: P0;
  5344. BEGIN
  5345. R(r); S(r); RC(r); SC(r);
  5346. NEW(p);
  5347. p0 := p;
  5348. P(p); PC(p); PV(p0);
  5349. END Test;
  5350. BEGIN
  5351. Test;
  5352. END Test.
  5353. positive: inline procedure with fixups
  5354. MODULE Test;
  5355. IMPORT SYSTEM;
  5356. CONST const = 123;
  5357. VAR a, b: LONGINT;
  5358. PROCEDURE -P(): LONGINT;
  5359. CODE{SYSTEM.i386}
  5360. MOV EAX,b
  5361. MOV a,const
  5362. JMP end
  5363. MOV EAX,10
  5364. end:
  5365. END P;
  5366. PROCEDURE Q;
  5367. VAR b: LONGINT;
  5368. BEGIN
  5369. b := P();
  5370. ASSERT(a=123);
  5371. ASSERT(b=1234);
  5372. END Q;
  5373. BEGIN
  5374. b := 1234;
  5375. Q;
  5376. a := P();
  5377. ASSERT(a=1234);
  5378. END Test.
  5379. positive: import inline assembler procedure
  5380. MODULE A;
  5381. IMPORT SYSTEM;
  5382. PROCEDURE -P*(a: LONGINT): LONGINT;
  5383. CODE{SYSTEM.i386}
  5384. POP EAX
  5385. ADD EAX,10
  5386. END P;
  5387. BEGIN
  5388. ASSERT(P(10) = 20);
  5389. END A.
  5390. MODULE Test;
  5391. IMPORT A;
  5392. BEGIN
  5393. ASSERT(A.P(10)=20)
  5394. END Test.
  5395. positive: call a winapi procedure with an array of system byte
  5396. MODULE Test;
  5397. IMPORT SYSTEM;
  5398. PROCEDURE{WINAPI} ReadFile (VAR lpBuffer: ARRAY OF SYSTEM.BYTE);
  5399. BEGIN
  5400. ASSERT(SYSTEM.VAL(CHAR,lpBuffer[0]) = 'A');
  5401. END ReadFile;
  5402. PROCEDURE P;
  5403. VAR a: ARRAY 2 OF CHAR;
  5404. BEGIN
  5405. a[0] := 'A';
  5406. ReadFile(a);
  5407. END P;
  5408. BEGIN P
  5409. END Test.
  5410. positive: unlock with or without return statements
  5411. MODULE Test;
  5412. VAR q: LONGINT;
  5413. PROCEDURE P;
  5414. BEGIN{EXCLUSIVE}
  5415. END P;
  5416. PROCEDURE P2;
  5417. BEGIN{EXCLUSIVE}
  5418. RETURN
  5419. END P2;
  5420. PROCEDURE Q(): LONGINT;
  5421. BEGIN{EXCLUSIVE}
  5422. RETURN 0
  5423. END Q;
  5424. BEGIN P; P2; P; q := Q(); P;
  5425. END Test.
  5426. positive: conversion to 32 bit in ash
  5427. MODULE Test;
  5428. PROCEDURE P;
  5429. VAR l: LONGINT; ch: CHAR;
  5430. BEGIN
  5431. ch := CHR(237); l := 8;
  5432. l := ASH(ORD(ch),l); ASSERT(l=60672);
  5433. END P;
  5434. BEGIN
  5435. P
  5436. END Test.
  5437. positive: pass delegate as variable or value parameter
  5438. MODULE Test;
  5439. TYPE
  5440. Array = POINTER TO ARRAY OF CHAR;
  5441. Delegate = PROCEDURE{DELEGATE}(): LONGINT;
  5442. O= OBJECT
  5443. VAR a: Array;
  5444. PROCEDURE P(): LONGINT;
  5445. BEGIN
  5446. ASSERT(a # NIL);
  5447. RETURN LEN(a);
  5448. END P;
  5449. PROCEDURE &Init(a: Array);
  5450. BEGIN
  5451. SELF.a := a;
  5452. END Init;
  5453. END O;
  5454. VAR dd: Delegate; o: O; a: Array;
  5455. PROCEDURE SetDelegate(d: Delegate);
  5456. BEGIN
  5457. dd := d;
  5458. END SetDelegate;
  5459. PROCEDURE GetDelegate(VAR d: Delegate);
  5460. BEGIN
  5461. d := o.P;
  5462. END GetDelegate;
  5463. PROCEDURE P;
  5464. VAR d: Delegate;
  5465. BEGIN
  5466. GetDelegate(d);
  5467. SetDelegate(d);
  5468. ASSERT(dd() = 123);
  5469. END P;
  5470. BEGIN NEW(a,123); NEW(o,a); P;
  5471. END Test.
  5472. positive: import same module with different aliases
  5473. MODULE A;
  5474. PROCEDURE P*; BEGIN END P;
  5475. END A.
  5476. MODULE Test;
  5477. IMPORT A,B := A;
  5478. PROCEDURE P;
  5479. BEGIN
  5480. A.P;
  5481. B.P;
  5482. END P;
  5483. BEGIN P
  5484. END Test.
  5485. positive: procedures returning a record (checks correct return parameter size)
  5486. MODULE Test;
  5487. TYPE
  5488. Rectangle=RECORD t,l,r,b: LONGINT END;
  5489. Container= POINTER TO RECORD r: Rectangle END;
  5490. PROCEDURE GetWMCoordinates(VAR r : Rectangle) : Rectangle;
  5491. VAR rect : Rectangle;
  5492. BEGIN
  5493. rect.l := r.l+1;
  5494. rect.r := r.r+2;
  5495. rect.t := r.t+3;
  5496. rect.b := r.b+4;
  5497. RETURN rect;
  5498. END GetWMCoordinates;
  5499. PROCEDURE GetWMCoordinates2() : Rectangle;
  5500. VAR rect : Rectangle;
  5501. BEGIN
  5502. rect.l := 1;
  5503. rect.r := 2;
  5504. rect.t := 3;
  5505. rect.b := 4;
  5506. RETURN rect;
  5507. END GetWMCoordinates2;
  5508. PROCEDURE P1;
  5509. VAR r2: Rectangle;
  5510. BEGIN
  5511. r2 := GetWMCoordinates2();
  5512. ASSERT(r2.l = 1,101);
  5513. ASSERT(r2.r = 2,102);
  5514. ASSERT(r2.t = 3,103);
  5515. ASSERT(r2.b = 4,104);
  5516. END P1;
  5517. PROCEDURE P2;
  5518. VAR r1,r2: Rectangle;
  5519. BEGIN
  5520. r1.l := 1; r1.r := 2; r1.t := 3; r1.b := 4;
  5521. r2 := GetWMCoordinates(r1);
  5522. ASSERT(r2.l = 2,201);
  5523. ASSERT(r2.r = 4,202);
  5524. ASSERT(r2.t = 6,203);
  5525. ASSERT(r2.b = 8,204);
  5526. END P2;
  5527. PROCEDURE P3;
  5528. VAR c1,c2: Container;
  5529. BEGIN
  5530. NEW(c1); NEW(c2);
  5531. c1.r.l := 1; c1.r.r := 2; c1.r.t := 3; c1.r.b := 4;
  5532. c2.r := GetWMCoordinates(c1.r);
  5533. ASSERT(c2.r.l = 2);
  5534. ASSERT(c2.r.r = 4);
  5535. ASSERT(c2.r.t = 6);
  5536. ASSERT(c2.r.b = 8);
  5537. END P3;
  5538. BEGIN P1;P2;P3;
  5539. END Test.
  5540. positive: conversion on return types
  5541. MODULE Test;
  5542. PROCEDURE GetInt () : LONGINT;
  5543. VAR integer: INTEGER;
  5544. BEGIN
  5545. integer := -56;
  5546. RETURN integer
  5547. END GetInt;
  5548. PROCEDURE GetShortint () : LONGINT;
  5549. VAR integer: INTEGER;
  5550. BEGIN
  5551. integer := -56;
  5552. RETURN integer
  5553. END GetShortint;
  5554. PROCEDURE P;
  5555. VAR i: LONGINT;
  5556. BEGIN
  5557. i := GetInt();
  5558. ASSERT(i=-56);
  5559. i := GetShortint();
  5560. ASSERT(i=-56);
  5561. END P;
  5562. BEGIN P;
  5563. END Test.
  5564. positive: allocate imported variable
  5565. MODULE A;
  5566. TYPE Record*= RECORD a*: LONGINT; p*: POINTER TO ARRAY OF CHAR; c*: LONGINT; END;
  5567. VAR a*: Record;
  5568. END A.
  5569. MODULE Test;
  5570. IMPORT A;
  5571. PROCEDURE P;
  5572. BEGIN
  5573. NEW(A.a.p,10);
  5574. ASSERT(A.a.p # NIL,101);
  5575. END P;
  5576. BEGIN P;
  5577. END Test.
  5578. positive: bitwise rotate
  5579. MODULE Test;
  5580. IMPORT SYSTEM;
  5581. PROCEDURE P;
  5582. VAR val,rot: SET; by: LONGINT;
  5583. BEGIN
  5584. val := {1,2,3,30,31};
  5585. rot := SYSTEM.VAL(SET,ROT(SYSTEM.VAL(LONGINT,val),7));
  5586. ASSERT(rot ={5..6,8..10});
  5587. rot := SYSTEM.VAL(SET,ROT(SYSTEM.VAL(LONGINT,val),-7));
  5588. ASSERT(rot={23..24,26..28});
  5589. val := {1,2,3,30,31};
  5590. by := 7;
  5591. rot := SYSTEM.VAL(SET,ROT(SYSTEM.VAL(LONGINT,val),by));
  5592. ASSERT(rot ={5..6,8..10});
  5593. by := -7;
  5594. rot := SYSTEM.VAL(SET,ROT(SYSTEM.VAL(LONGINT,val),by));
  5595. ASSERT(rot={23..24,26..28});
  5596. END P;
  5597. BEGIN P;
  5598. END Test.
  5599. positive: huge stack frames to check for ensured stack allocation
  5600. MODULE Test;
  5601. PROCEDURE P(count: LONGINT);
  5602. VAR x: ARRAY 16000 OF CHAR;
  5603. BEGIN
  5604. IF count > 5 THEN RETURN END;
  5605. P(count+1);
  5606. END P;
  5607. BEGIN P(0);
  5608. END Test.
  5609. positive: finally statement, direct and indirect
  5610. MODULE Test;
  5611. VAR b: BOOLEAN;
  5612. PROCEDURE P;
  5613. BEGIN
  5614. HALT(100);
  5615. RETURN
  5616. FINALLY
  5617. b := TRUE
  5618. END P;
  5619. PROCEDURE R;
  5620. BEGIN
  5621. HALT(100);
  5622. END R;
  5623. PROCEDURE Q;
  5624. BEGIN
  5625. R; RETURN
  5626. FINALLY
  5627. b := TRUE
  5628. END Q;
  5629. PROCEDURE S;
  5630. PROCEDURE R;
  5631. BEGIN
  5632. HALT(100);
  5633. END R;
  5634. BEGIN
  5635. R; RETURN
  5636. FINALLY
  5637. b := TRUE
  5638. END S;
  5639. BEGIN
  5640. b := FALSE; P(); ASSERT(b=TRUE);
  5641. b := FALSE; Q(); ASSERT(b=TRUE);
  5642. b := FALSE; S(); ASSERT(b=TRUE);
  5643. END Test.
  5644. positive: negate hugeint zero
  5645. MODULE Test;
  5646. PROCEDURE Test;
  5647. VAR x: INTEGER; h,j: HUGEINT;
  5648. BEGIN
  5649. h := 0;
  5650. j := -h;
  5651. ASSERT(j=0);
  5652. END Test;
  5653. BEGIN Test
  5654. END Test.
  5655. positive: allocation of a partially exported record type
  5656. MODULE A;
  5657. TYPE
  5658. P*=POINTER TO Desc;
  5659. Desc=RECORD a*,b: LONGINT END;
  5660. END A.
  5661. MODULE Test;
  5662. IMPORT A;
  5663. PROCEDURE Test;
  5664. VAR a: A.P;
  5665. BEGIN
  5666. NEW(a); a.a := 10; ASSERT(a.a = 10);
  5667. END Test;
  5668. BEGIN Test
  5669. END Test.
  5670. positive: allocation of a partially exported record type in a multiply imported module
  5671. MODULE A;
  5672. TYPE
  5673. P*=POINTER TO Desc;
  5674. Desc=RECORD a*,b: LONGINT END;
  5675. END A.
  5676. MODULE B;
  5677. END B.
  5678. MODULE Test;
  5679. IMPORT BB := B, BBB := B, AA := A, BBBB := B, AAA := A, B, A;
  5680. PROCEDURE Test;
  5681. VAR a: AAA.P;
  5682. BEGIN
  5683. NEW(a); a.a := 10; ASSERT(a.a = 10);
  5684. END Test;
  5685. BEGIN Test
  5686. END Test.
  5687. positive: pass sub-array (computation of address needs multiplication with base size)
  5688. MODULE Test;
  5689. VAR a: ARRAY 10 OF ARRAY 10 OF INTEGER;
  5690. PROCEDURE Q(VAR a: ARRAY OF INTEGER; i: INTEGER);
  5691. VAR j: INTEGER;
  5692. BEGIN
  5693. FOR j := 0 TO SHORT(LEN(a)-1 ) DO
  5694. ASSERT(a[j] = i*10+j);
  5695. END;
  5696. END Q;
  5697. PROCEDURE P(VAR a: ARRAY OF ARRAY OF INTEGER);
  5698. VAR i,j: INTEGER;
  5699. BEGIN
  5700. FOR i := 0 TO SHORT(LEN(a,0)-1) DO
  5701. FOR j := 0 TO SHORT(LEN(a,1)-1) DO
  5702. a[i,j] := i*10+j;
  5703. END;
  5704. END;
  5705. FOR i := 0 TO SHORT(LEN(a,0)-1) DO
  5706. Q(a[i],i);
  5707. END;
  5708. END P;
  5709. BEGIN P(a);
  5710. END Test.
  5711. positive: array length operator for static and dynamic arrays with static and dynamic dimension parameter
  5712. MODULE Test;
  5713. PROCEDURE Test;
  5714. VAR a: ARRAY 1,2,3,4 OF LONGINT;
  5715. b: POINTER TO ARRAY OF ARRAY OF ARRAY 3,4 OF LONGINT;
  5716. c: POINTER TO ARRAY OF ARRAY OF ARRAY OF ARRAY OF LONGINT;
  5717. l0,l1,l2,l3,lv,v: LONGINT;
  5718. BEGIN
  5719. v := 2;
  5720. NEW(b,1,2);
  5721. NEW(c,1,2,3,4);
  5722. l0 := LEN(a,0);
  5723. ASSERT(l0=1,1000);
  5724. l1 := LEN(a,1);
  5725. ASSERT(l1=2,1001);
  5726. l2 := LEN(a,2);
  5727. ASSERT(l2=3,1002);
  5728. l3 := LEN(a,3);
  5729. ASSERT(l3=4,1003);
  5730. FOR v := 0 TO 3 DO
  5731. lv := LEN(a,v);
  5732. ASSERT(lv=v+1,1004);
  5733. END;
  5734. l0 := LEN(b,0);
  5735. ASSERT(l0=1,2000);
  5736. l1 := LEN(b,1);
  5737. ASSERT(l1=2,2001);
  5738. l2 := LEN(b,2);
  5739. ASSERT(l2=3,2002);
  5740. l3 := LEN(b,3);
  5741. ASSERT(l3=4,2003);
  5742. FOR v := 0 TO 3 DO
  5743. lv := LEN(b,v);
  5744. ASSERT(lv=v+1,2004);
  5745. END;
  5746. l0 := LEN(c,0);
  5747. ASSERT(l0=1,3000);
  5748. l1 := LEN(c,1);
  5749. ASSERT(l1=2,3001);
  5750. l2 := LEN(c,2);
  5751. ASSERT(l2=3,3002);
  5752. l3 := LEN(c,3);
  5753. ASSERT(l3=4,3003);
  5754. FOR v := 0 TO 3 DO
  5755. lv := LEN(c,v);
  5756. ASSERT(lv=v+1,3004);
  5757. END;
  5758. END Test;
  5759. BEGIN Test
  5760. END Test.
  5761. positive: assignment of extended record type to base type (check destination size)
  5762. MODULE Test;
  5763. TYPE
  5764. R= RECORD a,b,c: LONGINT END;
  5765. S= RECORD (R) d,e: LONGINT END;
  5766. PROCEDURE Test;
  5767. VAR a0,a1,a2: LONGINT; b: R; c: LONGINT; d: S;
  5768. BEGIN
  5769. a0 := 0;
  5770. a1 := 0;
  5771. a2 := 0;
  5772. c := 0;
  5773. d.a := MAX(LONGINT);
  5774. d.b := MAX(LONGINT);
  5775. d.c := MAX(LONGINT);
  5776. d.d := MAX(LONGINT);
  5777. d.e := MAX(LONGINT);
  5778. b := d;
  5779. ASSERT(c=0);
  5780. ASSERT(a0=0);
  5781. ASSERT(a1=0);
  5782. ASSERT(a2=0);
  5783. ASSERT(b.a = MAX(LONGINT));
  5784. ASSERT(b.b = MAX(LONGINT));
  5785. ASSERT(b.c = MAX(LONGINT));
  5786. END Test;
  5787. BEGIN Test
  5788. END Test.
  5789. positive: return of real number (was: problem in AMD float stack)
  5790. MODULE Test; (** AUTHOR ""; PURPOSE ""; *)
  5791. VAR r: LONGREAL;
  5792. PROCEDURE P(): LONGREAL;
  5793. VAR x,y : LONGREAL;
  5794. BEGIN
  5795. x := 10;
  5796. y := 20;
  5797. x := x*x;
  5798. RETURN y
  5799. END P;
  5800. BEGIN
  5801. ASSERT(P()=20);
  5802. END Test.
  5803. positive: multiplication with 8-bit number (was: problem in AMD backend register reuse)
  5804. MODULE Test;
  5805. VAR longint: LONGINT;
  5806. PROCEDURE Mul16(ch1,ch2: CHAR; VAR long:LONGINT);
  5807. VAR
  5808. int1,int0: INTEGER;
  5809. BEGIN
  5810. int1 := ORD(ch1);
  5811. int0 := ORD(ch2);
  5812. long := 256 * LONG(int1) + int0;
  5813. END Mul16;
  5814. BEGIN
  5815. Mul16(10X,20X,longint);
  5816. ASSERT(longint = 256*10H+20H);
  5817. END Test.
  5818. positive: test for correct use of SYSTEM.VAL (without conversion)
  5819. MODULE Test;
  5820. IMPORT SYSTEM;
  5821. VAR r: REAL; x: LONGREAL; l: LONGINT; h: HUGEINT;
  5822. PROCEDURE Real(): LONGINT;
  5823. VAR r: REAL; l: LONGINT;
  5824. BEGIN
  5825. r := 10;
  5826. (* trick to store real value in original format in longint variable wihout using SYSTEM.VAL, for testing SYSTEM.VAL ! *)
  5827. SYSTEM.MOVE(SYSTEM.ADR(r),SYSTEM.ADR(l),SIZEOF(REAL));
  5828. RETURN l;
  5829. END Real;
  5830. PROCEDURE Longreal(): HUGEINT;
  5831. VAR r: LONGREAL; l: HUGEINT;
  5832. BEGIN
  5833. r := 10;
  5834. (* trick to store real value in original format in longint variable wihout using SYSTEM.VAL, for testing SYSTEM.VAL ! *)
  5835. SYSTEM.MOVE(SYSTEM.ADR(r),SYSTEM.ADR(l),SIZEOF(HUGEINT));
  5836. RETURN l;
  5837. END Longreal;
  5838. PROCEDURE Longint(): REAL;
  5839. VAR r: REAL; l: LONGINT;
  5840. BEGIN
  5841. l := 10;
  5842. (* trick to store real value in original format in longint variable wihout using SYSTEM.VAL, for testing SYSTEM.VAL ! *)
  5843. SYSTEM.MOVE(SYSTEM.ADR(l),SYSTEM.ADR(r),SIZEOF(REAL));
  5844. RETURN r;
  5845. END Longint;
  5846. PROCEDURE Hugeint(): LONGREAL;
  5847. VAR r: LONGREAL; l: HUGEINT;
  5848. BEGIN
  5849. l := 10;
  5850. (* trick to store real value in original format in longint variable wihout using SYSTEM.VAL, for testing SYSTEM.VAL ! *)
  5851. SYSTEM.MOVE(SYSTEM.ADR(l),SYSTEM.ADR(r),SIZEOF(LONGREAL));
  5852. RETURN r;
  5853. END Hugeint;
  5854. BEGIN
  5855. r := SYSTEM.VAL(REAL,Real());
  5856. ASSERT(r = 10);
  5857. x := SYSTEM.VAL(LONGREAL,Longreal());
  5858. ASSERT(x = 10);
  5859. l := SYSTEM.VAL(LONGINT, Longint());
  5860. ASSERT(l=10);
  5861. h := SYSTEM.VAL(HUGEINT, Hugeint());
  5862. ASSERT(h=10);
  5863. END Test.
  5864. positive: correct use of indexers for (static) array of array
  5865. MODULE Test;
  5866. TYPE Elem = ARRAY 4 OF LONGINT;
  5867. PROCEDURE P;
  5868. VAR a: ARRAY 8 OF Elem;
  5869. x: Elem; i: LONGINT;
  5870. BEGIN
  5871. FOR i := 0 TO LEN(a)-1 DO
  5872. a[i,0] := i*1;
  5873. a[i,1] := i*2;
  5874. a[i,2] := i*3;
  5875. a[i,3] := i*4;
  5876. END;
  5877. x := a[2];
  5878. ASSERT(x[0] = 2);
  5879. ASSERT(x[1] = 2*2);
  5880. ASSERT(x[2] = 3*2);
  5881. ASSERT(x[3] = 4*2);
  5882. END P;
  5883. BEGIN P
  5884. END Test.
  5885. positive: testing calling convention, in particular return of complex types
  5886. MODULE Test;
  5887. TYPE
  5888. Object = OBJECT VAR a,b,c: INTEGER END Object;
  5889. Record = RECORD a,b,c: INTEGER END;
  5890. StaticArray=ARRAY 6 OF INTEGER;
  5891. DynamicArray = POINTER TO ARRAY OF INTEGER;
  5892. StaticMathArray= ARRAY [7] OF INTEGER;
  5893. DynamicMathArray= ARRAY [*] OF INTEGER;
  5894. TensorMathArray = ARRAY [?] OF INTEGER;
  5895. PROCEDURE O(a,b,c: INTEGER): Object;
  5896. VAR o: Object;
  5897. BEGIN
  5898. NEW(o); o.a := a; o.b := b; o.c := c;
  5899. RETURN o;
  5900. END O;
  5901. PROCEDURE RO(a,b,c: INTEGER): Object;
  5902. BEGIN
  5903. IF RESULT = NIL THEN NEW(RESULT) END;
  5904. RESULT.a := a; RESULT.b := b; RESULT.c := c;
  5905. RETURN RESULT;
  5906. END RO;
  5907. PROCEDURE R(a,b,c: INTEGER): Record;
  5908. VAR r: Record
  5909. BEGIN
  5910. r.a := a; r.b := b; r.c := c;
  5911. RETURN r
  5912. END R;
  5913. PROCEDURE A(x,y,z: INTEGER): StaticArray;
  5914. VAR a: StaticArray;
  5915. BEGIN
  5916. a[0] := x; a[1] := y; a[2] := z;
  5917. RETURN a;
  5918. END A;
  5919. PROCEDURE RA(x,y,z: INTEGER): StaticArray;
  5920. BEGIN
  5921. RESULT[0] := x; RESULT[1] := y; RESULT[2] := z;
  5922. RETURN RESULT;
  5923. END RA;
  5924. PROCEDURE DA(x,y,z: INTEGER): DynamicArray;
  5925. VAR a: DynamicArray;
  5926. BEGIN
  5927. NEW(a,3);
  5928. a[0] := x; a[1] := y; a[2] := z;
  5929. RETURN a
  5930. END DA;
  5931. PROCEDURE RDA(x,y,z: INTEGER): DynamicArray;
  5932. BEGIN
  5933. IF RESULT = NIL THEN NEW(RESULT,3) END;
  5934. RESULT[0] := x; RESULT[1] := y; RESULT[2] := z;
  5935. RETURN RESULT
  5936. END RDA;
  5937. PROCEDURE MA(x,y,z: INTEGER): StaticMathArray;
  5938. VAR a: StaticMathArray;
  5939. BEGIN
  5940. a[0] := x; a[1] := y; a[2] := z;
  5941. RETURN a;
  5942. END MA;
  5943. PROCEDURE RMA(x,y,z: INTEGER): StaticMathArray;
  5944. BEGIN
  5945. RESULT[0] := x; RESULT[1] := y; RESULT[2] := z;
  5946. RETURN RESULT;
  5947. END RMA;
  5948. PROCEDURE DMA(x,y,z: INTEGER): DynamicMathArray;
  5949. VAR a: DynamicMathArray;
  5950. BEGIN
  5951. NEW(a,3);
  5952. a[0] := x; a[1] := y; a[2] := z;
  5953. RETURN a;
  5954. END DMA;
  5955. PROCEDURE RDMA(x,y,z: INTEGER): DynamicMathArray;
  5956. BEGIN
  5957. IF LEN(RESULT) < 3 THEN NEW(RESULT,3) END;
  5958. RESULT[0] := x; RESULT[1] := y; RESULT[2] := z;
  5959. RETURN RESULT;
  5960. END RDMA;
  5961. PROCEDURE TA(x,y,z: INTEGER): TensorMathArray;
  5962. VAR a: TensorMathArray;
  5963. BEGIN
  5964. NEW(a,3);
  5965. a[0] := x; a[1] := y; a[2] := z;
  5966. RETURN a;
  5967. END TA;
  5968. PROCEDURE RTA(x,y,z: INTEGER): TensorMathArray;
  5969. BEGIN
  5970. IF (DIM(RESULT)# 1) OR (LEN(RESULT,0) < 3) THEN NEW(RESULT,3) END;
  5971. RESULT[0] := x; RESULT[1] := y; RESULT[2] := z;
  5972. RETURN RESULT;
  5973. END RTA;
  5974. PROCEDURE S(r: Record; a,b,c: INTEGER);
  5975. BEGIN
  5976. ASSERT(r.a=a); ASSERT(r.b = b); ASSERT(r.c = c);
  5977. END S;
  5978. PROCEDURE T(CONST r: Record; a,b,c: INTEGER);
  5979. BEGIN
  5980. ASSERT(r.a=a); ASSERT(r.b = b); ASSERT(r.c = c);
  5981. END T;
  5982. PROCEDURE U(o: Object; a,b,c: INTEGER);
  5983. BEGIN
  5984. ASSERT(o.a=a); ASSERT(o.b = b); ASSERT(o.c = c);
  5985. END U;
  5986. PROCEDURE V(a: StaticArray; x,y,z: INTEGER);
  5987. BEGIN
  5988. ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
  5989. END V;
  5990. PROCEDURE W(CONST a: StaticArray; x,y,z: INTEGER);
  5991. BEGIN
  5992. ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
  5993. END W;
  5994. PROCEDURE WM(CONST a: StaticMathArray; x,y,z: INTEGER);
  5995. BEGIN
  5996. ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
  5997. END WM;
  5998. PROCEDURE WVM(a: StaticMathArray; x,y,z: INTEGER);
  5999. BEGIN
  6000. ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
  6001. END WVM;
  6002. PROCEDURE WDM(CONST a: DynamicMathArray; x,y,z: INTEGER);
  6003. BEGIN
  6004. ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
  6005. END WDM;
  6006. PROCEDURE WDVM(a: DynamicMathArray; x,y,z: INTEGER);
  6007. BEGIN
  6008. ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
  6009. END WDVM;
  6010. PROCEDURE WTM(CONST a: TensorMathArray; x,y,z: INTEGER);
  6011. BEGIN
  6012. ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
  6013. END WTM;
  6014. PROCEDURE WTVM(a: TensorMathArray; x,y,z: INTEGER);
  6015. BEGIN
  6016. ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
  6017. END WTVM;
  6018. PROCEDURE P;
  6019. VAR o: Object; r: Record; a: StaticArray; d: DynamicArray; ma: StaticMathArray; dma: DynamicMathArray; tma: TensorMathArray;
  6020. BEGIN
  6021. o := O(1,2,3); U(o,1,2,3);
  6022. o := RO(10,20,30); U(o,10,20,30);
  6023. o := NIL;
  6024. o := RO(11,22,33); U(o,11,22,33);
  6025. r := R(10,20,30);
  6026. ASSERT(r.a = 10); ASSERT(r.b = 20); ASSERT(r.c = 30);
  6027. S(R(10,20,30),10,20,30);
  6028. T(R(10,20,30),10,20,30);
  6029. U(O(10,20,30),10,20,30);
  6030. a := A(10,20,30);
  6031. V(a,10,20,30);
  6032. V(A(10,20,30),10,20,30);
  6033. W(A(10,20,30),10,20,30);
  6034. ma := MA(10,20,30);
  6035. WM(ma,10,20,30);
  6036. WM(MA(1,2,3),1,2,3);
  6037. WVM(MA(2,3,4),2,3,4);
  6038. dma := DMA(10,20,30); WDM(dma,10,20,30);
  6039. WDM(DMA(1,2,3),1,2,3);
  6040. WDVM(DMA(1,2,3),1,2,3);
  6041. dma := RDMA(10,20,30); WDM(dma,10,20,30);
  6042. WDM(RDMA(1,2,3),1,2,3);
  6043. WDVM(RDMA(1,2,3),1,2,3);
  6044. tma := TA(4,5,6); WTM(tma,4,5,6);
  6045. WTM(TA(2,3,4),2,3,4);
  6046. WTVM(TA(3,4,5),3,4,5);
  6047. tma := RTA(4,5,6); WTM(tma,4,5,6);
  6048. WTM(RTA(2,3,4),2,3,4);
  6049. WTVM(RTA(3,4,5),3,4,5);
  6050. END P;
  6051. BEGIN P;
  6052. END Test.
  6053. positive: simple calling convention test (c and winapi returning pointer)
  6054. MODULE Test;
  6055. TYPE
  6056. Pointer = POINTER TO RECORD x,y: LONGINT END;
  6057. PROCEDURE {C} P(x,y: LONGINT): Pointer;
  6058. VAR p: Pointer;
  6059. BEGIN
  6060. NEW(p);
  6061. p.x := x;
  6062. p.y := y;
  6063. RETURN p
  6064. END P;
  6065. PROCEDURE {WINAPI} Q(x,y: LONGINT): Pointer;
  6066. VAR p: Pointer;
  6067. BEGIN
  6068. NEW(p);
  6069. p.x := x;
  6070. p.y := y;
  6071. RETURN p
  6072. END Q;
  6073. PROCEDURE R(x,y: LONGINT): Pointer;
  6074. VAR p: Pointer;
  6075. BEGIN
  6076. NEW(p);
  6077. p.x := x;
  6078. p.y := y;
  6079. RETURN p
  6080. END R;
  6081. PROCEDURE Test*;
  6082. VAR p,q,r: Pointer;
  6083. BEGIN
  6084. p := P(1,2);
  6085. ASSERT(p.x = 1); ASSERT(p.y = 2);
  6086. q := Q(1,2);
  6087. ASSERT(q.x = 1); ASSERT(q.y = 2);
  6088. r := R(1,2);
  6089. ASSERT(r.x = 1); ASSERT(r.y = 2);
  6090. END Test;
  6091. BEGIN
  6092. Test
  6093. END Test.
  6094. positive: use local variable as value and as reference (optimizer test)
  6095. MODULE Test;
  6096. PROCEDURE P(VAR x: LONGINT);
  6097. BEGIN
  6098. x := 20;
  6099. END P;
  6100. PROCEDURE T;
  6101. VAR x: LONGINT;
  6102. BEGIN
  6103. x := 10;
  6104. P(x);
  6105. ASSERT(x=20);
  6106. END T;
  6107. BEGIN
  6108. T;
  6109. END Test.
  6110. positive: pass record size to array of system.byte with dynamic dize for varpars and dereferences
  6111. MODULE Test;
  6112. IMPORT SYSTEM;
  6113. TYPE Base = RECORD END;
  6114. TYPE Record = RECORD(Base) a,b,c: LONGINT END
  6115. PROCEDURE TestS(VAR a: ARRAY OF SYSTEM.BYTE);
  6116. BEGIN
  6117. ASSERT(LEN(a) = SIZEOF(Record));
  6118. END TestS;
  6119. PROCEDURE TestI(VAR a: Base);
  6120. BEGIN
  6121. TestS(a);
  6122. END TestI;
  6123. VAR a: POINTER TO Base; b: POINTER TO Record; c: Record;
  6124. BEGIN
  6125. NEW(b); a := b;
  6126. TestS(a^);
  6127. TestI(a^);
  6128. TestI(c);
  6129. END Test.
  6130. positive: pass variables and values to array of byte
  6131. MODULE Test;
  6132. IMPORT SYSTEM;
  6133. PROCEDURE Pass(CONST a: ARRAY OF SYSTEM.BYTE; len: LONGINT);
  6134. VAR i: LONGINT;
  6135. BEGIN
  6136. ASSERT(LEN(a) = len);
  6137. END Pass;
  6138. PROCEDURE Test*;
  6139. VAR i: LONGINT;
  6140. BEGIN
  6141. Pass(3,1);
  6142. Pass(i,4);
  6143. Pass(3+i,4);
  6144. Pass(65000, 2);
  6145. END Test;
  6146. END Test.