1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858 |
- # Oberon language test and validation suite
- # options --mayTrap --prolog="Compiler.Compile TesterInput.txt" --command="SystemTools.Free Test Dummy B A;SystemTools.Load Test" --logFile="FoxExecutionTest.Log" --result="Oberon.Execution.Test.Diff"
- # test halt and assert statements and simple procedure call (basics for the test suite)
- positive: empty module
- MODULE Test;
- END Test.
- negative: simple halt
- MODULE Test;
- BEGIN HALT (1234);
- END Test.
- positive: satisified assertion
- MODULE Test;
- VAR b: BOOLEAN;
- BEGIN b := TRUE; ASSERT (b);
- END Test.
- negative: unsatisified assertion
- MODULE Test;
- VAR b: BOOLEAN;
- BEGIN b := FALSE; ASSERT (b);
- END Test.
- negative: simple halt in global procedure
- MODULE Test;
- PROCEDURE Procedure;
- BEGIN HALT (1234);
- END Procedure;
- BEGIN Procedure;
- END Test.
- positive: satisified assertion in global procedure
- MODULE Test;
- PROCEDURE Procedure;
- VAR b: BOOLEAN;
- BEGIN b := TRUE; ASSERT (b);
- END Procedure;
- BEGIN Procedure;
- END Test.
- negative: unsatisified assertion in global procedure
- MODULE Test;
- PROCEDURE Procedure;
- VAR b: BOOLEAN;
- BEGIN b := FALSE; ASSERT (b);
- END Procedure;
- BEGIN Procedure;
- END Test.
- positive: parameterless procedure call
- MODULE Test;
- VAR called: BOOLEAN;
- PROCEDURE P;
- BEGIN
- called := TRUE;
- END P;
- BEGIN
- called := FALSE;
- P;
- ASSERT(called);
- END Test.
- # basic types storage test
- positive: Char stored in PAF
- MODULE Test;
- PROCEDURE Char;
- VAR a,b: CHAR;
- BEGIN
- a := 'a';
- b := a;
- ASSERT(b = 'a');
- END Char;
- BEGIN
- Char;
- END Test.
- positive: Shortint stored in PAF
- MODULE Test;
- PROCEDURE Shortint;
- VAR a,b: SHORTINT;
- BEGIN
- a := 13;
- b := a;
- ASSERT(b = 13);
- END Shortint;
- BEGIN
- Shortint;
- END Test.
- positive: Integer stored in PAF
- MODULE Test;
- PROCEDURE Integer;
- VAR a,b: INTEGER;
- BEGIN
- a := 2233;
- b := a;
- ASSERT(b = 2233);
- END Integer;
- BEGIN
- Integer;
- END Test.
- positive: Longint stored in PAF
- MODULE Test;
- PROCEDURE Longint;
- VAR a,b: LONGINT;
- BEGIN
- a := 70800;
- b := a;
- ASSERT(b = 70800);
- END Longint;
- BEGIN
- Longint;
- END Test.
- positive: Hugeint stored in PAF
- MODULE Test;
- PROCEDURE Hugeint;
- VAR a,b: HUGEINT;
- BEGIN
- a := 70800;
- b := a;
- ASSERT(b = 70800);
- END Hugeint;
- BEGIN
- Hugeint;
- END Test.
- positive: Real stored in PAF
- MODULE Test;
- PROCEDURE Real;
- VAR a,b: REAL;
- BEGIN
- a := 888;
- b := a;
- ASSERT(b = 888);
- END Real;
- BEGIN
- Real;
- END Test.
- positive: Longreal stored in PAF
- MODULE Test;
- PROCEDURE Longreal;
- VAR a,b: LONGREAL;
- BEGIN
- a := 888;
- b := a;
- ASSERT(b = 888);
- END Longreal;
- BEGIN
- Longreal;
- END Test.
- positive: Set stored in PAF
- MODULE Test;
- PROCEDURE Set;
- VAR a,b: SET;
- BEGIN
- a := {1,2,8,9,31};
- b := a;
- ASSERT(b = {1,2,8,9,31});
- END Set;
- BEGIN
- Set;
- END Test.
- positive: Boolean stored in PAF
- MODULE Test;
- PROCEDURE Boolean;
- VAR a,b,c: BOOLEAN;
- BEGIN
- a := FALSE;
- b := TRUE;
- c := FALSE;
- ASSERT(b = TRUE);
- END Boolean;
- BEGIN
- Boolean;
- END Test.
- # constant declarations
- positive: expression containing a constant
- MODULE Test;
- CONST N = 10000;
- VAR i: INTEGER;
- BEGIN i := N - 1; ASSERT (i = 9999);
- END Test.
- positive: lengths of string constants
- MODULE Test;
- CONST String = "This string is not empty";
- CONST Copy = String;
- PROCEDURE Assert (CONST str: ARRAY OF CHAR);
- BEGIN ASSERT (LEN (str) # 0);
- END Assert;
- BEGIN Assert (String); Assert (Copy);
- END Test.
- # basic type declarations
- positive: constant boolean assignment
- MODULE Test;
- VAR b: BOOLEAN;
- BEGIN b := TRUE; ASSERT (b = TRUE);
- END Test.
- positive: variable boolean assignment
- MODULE Test;
- VAR b1, b2: BOOLEAN;
- BEGIN b1 := TRUE; b2 := FALSE; b2 := b1; ASSERT (b2 = TRUE);
- END Test.
- positive: boolean equality
- MODULE Test;
- VAR b1, b2: BOOLEAN;
- BEGIN b1 := TRUE; b2 := b1; ASSERT (b1 = b2); b1 := FALSE; b2 := b1; ASSERT (b1 = b2);
- END Test.
- positive: array of boolean values
- MODULE Test;
- VAR b: ARRAY 2 OF BOOLEAN;
- BEGIN b[1] := TRUE; ASSERT (b[1]);
- END Test.
- positive: constant character assignment
- MODULE Test;
- VAR c: CHAR;
- BEGIN c := 'c'; ASSERT (c = 'c');
- END Test.
- positive: variable character assignment
- MODULE Test;
- VAR c1, c2: CHAR;
- BEGIN c1 := 'A'; c2 := 'B'; c2 := c1; ASSERT (c2 = 'A');
- END Test.
- positive: char array variable assignment
- MODULE Test;
- VAR v: ARRAY 2 OF CHAR;
- BEGIN v[0] := CHR(92); ASSERT (ORD(v[0]) = 92);
- END Test.
- positive: heximal character value assignment
- MODULE Test;
- VAR c: CHAR;
- BEGIN c := 020X; ASSERT (c = ' ');
- END Test.
- positive: constant integer assignment
- MODULE Test;
- VAR i: INTEGER;
- BEGIN i := 2; ASSERT (i = 2);
- END Test.
- positive: variable integer assignment
- MODULE Test;
- VAR i1, i2: INTEGER;
- BEGIN i1 := 45; i2 := 64; i2 := i1; ASSERT (i1 = 45);
- END Test.
- positive: constant real assignment
- MODULE Test;
- VAR r: REAL;
- BEGIN r := 2; ASSERT (r = 2);
- END Test.
- positive: variable real assignment
- MODULE Test;
- VAR r1, r2: REAL;
- BEGIN r1 := 2.25; r2 := 3.75; r2 := r1; ASSERT (r1 = 2.25);
- END Test.
- positive: real value assignment to real variable
- MODULE Test;
- VAR r: REAL;
- BEGIN r := 1.25; ASSERT (r = 1.25);
- END Test.
- positive: constant set assignment
- MODULE Test;
- VAR s: SET;
- BEGIN s := {1}; ASSERT (1 IN s);
- END Test.
- positive: variable set assignment
- MODULE Test;
- VAR s1, s2: SET; i: INTEGER;
- BEGIN i := 5; s1 := {i}; s2 := {}; s2 := s1; ASSERT (i IN s2);
- END Test.
- positive: set inclusions
- MODULE Test;
- VAR s: SET; i, j, k: INTEGER;
- BEGIN i := 1; j := 3; k := 7; s := {1, 3, 5..8}; ASSERT ((i IN s) & (j IN s) & (k IN s));
- END Test.
- negative: set value out of bounds at maximum
- MODULE Test;
- VAR n: INTEGER; s: SET;
- BEGIN n := MAX(SET) + 1; s := {n};
- END Test.
- negative: set value out of bounds at minimum
- MODULE Test;
- VAR n: INTEGER; s: SET;
- BEGIN n := MIN(SET) - 1; s := {n};
- END Test.
- # array type declarations
- negative: array out of bounds while reading
- MODULE Test;
- VAR a: ARRAY 1 OF INTEGER; r, i: INTEGER;
- BEGIN a[0] := 0; i := 1; r := a[i];
- END Test.
- negative: array out of bounds while writing
- MODULE Test;
- VAR a: ARRAY 1 OF INTEGER; i: INTEGER;
- BEGIN i := 1; a[i] := 0;
- END Test.
- positive: index of array element is record variable
- MODULE Test;
- TYPE R = RECORD i: INTEGER END;
- VAR ai: ARRAY 2 OF INTEGER; ar: ARRAY 2 OF R;
- BEGIN ai[0] := 0; ai[1] := 5; ar[0].i := 1; ASSERT (ai[ar[ai[0]].i] = 5);
- END Test.
- positive: one-dimensional array element assignment
- MODULE Test;
- VAR a: ARRAY 2 OF CHAR;
- BEGIN a[1] := 'c'; ASSERT (a[1] = 'c');
- END Test.
- positive: two-dimensional array element assignment
- MODULE Test;
- VAR a: ARRAY 2, 2 OF BOOLEAN;
- BEGIN a[1, 1] := TRUE; ASSERT (a[1, 1] = TRUE);
- END Test.
- # record type declarations
- positive: record initialization
- MODULE Test;
- VAR r: RECORD i: INTEGER END;
- BEGIN r.i := 5; ASSERT (r.i = 5);
- END Test.
- positive: record copies
- MODULE Test;
- VAR a, b: RECORD i, j: INTEGER END;
- BEGIN a.i := 1; a.j := 2; b := a; ASSERT (b.i = 1); ASSERT (b.j = 2);
- END Test.
- # pointer type declarations
- positive: dynamic record allocation with new
- MODULE Test;
- VAR p: POINTER TO RECORD x: INTEGER END;
- BEGIN NEW (p); ASSERT (p # NIL); p.x := 3; ASSERT (p.x = 3);
- END Test.
- positive: valid type guard test
- MODULE Test;
- TYPE R1 = RECORD END; R2 = RECORD (R1) END; P1 = POINTER TO R1; P2 = POINTER TO R2;
- VAR p1: P1; p2: P2;
- BEGIN NEW (p2); p1 := p2; p2 := p1(P2);
- END Test.
- # procedure type declarations
- positive: procedure type with value parameter INTEGER
- MODULE Test;
- VAR a: ARRAY 5 OF INTEGER; i: INTEGER; r: INTEGER;
- PROCEDURE Iterate (VAR a: ARRAY OF INTEGER; p : PROCEDURE (r: INTEGER));
- VAR i: LONGINT;
- BEGIN FOR i := 0 TO LEN (a) - 1 DO p (a[i]) END;
- END Iterate;
- PROCEDURE Accummulate (v: INTEGER);
- BEGIN r := r + v;
- END Accummulate;
- BEGIN FOR i := 0 TO 4 DO a[i] := i END; r := 0; Iterate (a, Accummulate); ASSERT (r = 10);
- END Test.
- positive: procedure type with value parameter REAL
- MODULE Test;
- VAR a: ARRAY 5 OF REAL; i: INTEGER; r: REAL;
- PROCEDURE Iterate (VAR a: ARRAY OF REAL; p : PROCEDURE (r: REAL));
- VAR i: LONGINT;
- BEGIN FOR i := 0 TO LEN (a) - 1 DO p (a[i]) END;
- END Iterate;
- PROCEDURE Accummulate (v: REAL);
- BEGIN r := r + v;
- END Accummulate;
- BEGIN FOR i := 0 TO 4 DO a[i] := i END; r := 0; Iterate (a, Accummulate); ASSERT (r = 10);
- END Test.
- positive: procedure type with var parameter INTEGER
- MODULE Test;
- VAR i: INTEGER; k: INTEGER; p: PROCEDURE (VAR r: INTEGER; b: INTEGER);
- PROCEDURE Accummulate (VAR r: INTEGER; v: INTEGER);
- BEGIN r := r + v;
- END Accummulate;
- BEGIN k := 0; p := Accummulate; FOR i := 0 TO 4 DO p (k, i) END; ASSERT (k = 10);
- END Test.
- positive: procedure type with var parameter REAL
- MODULE Test;
- VAR i: INTEGER; k: REAL; p: PROCEDURE (VAR r: REAL; b: REAL);
- PROCEDURE Accummulate (VAR r: REAL; v: REAL);
- BEGIN r := r + v;
- END Accummulate;
- BEGIN k := 0; p := Accummulate; FOR i := 0 TO 4 DO p (k, i) END; ASSERT (k = 10);
- END Test.
- positive: procedure type with result type INTEGER
- MODULE Test;
- VAR r: INTEGER; p: PROCEDURE (a, b: INTEGER): INTEGER;
- PROCEDURE Add (a, b: INTEGER): INTEGER;
- BEGIN RETURN a + b;
- END Add;
- BEGIN p := Add; r := p (3, 4); ASSERT (r = 7);
- END Test.
- positive: procedure type with result type REAL
- MODULE Test;
- VAR r: REAL; p: PROCEDURE (a, b: REAL): REAL;
- PROCEDURE Add (a, b: REAL): REAL;
- BEGIN RETURN a + b;
- END Add;
- BEGIN p := Add; r := p (3, 4); ASSERT (r = 7);
- END Test.
- positive: procedure type with result type in record INTEGER
- MODULE Test;
- VAR r: INTEGER; p: RECORD p: PROCEDURE (a, b: INTEGER): INTEGER END;
- PROCEDURE Add (a, b: INTEGER): INTEGER;
- BEGIN RETURN a + b;
- END Add;
- BEGIN p.p := Add; r := p.p (3, 4); ASSERT (r = 7);
- END Test.
- positive: procedure type with result type in record REAL
- MODULE Test;
- VAR r: REAL; p: RECORD p: PROCEDURE (a, b: REAL): REAL END;
- PROCEDURE Add (a, b: REAL): REAL;
- BEGIN RETURN a + b;
- END Add;
- BEGIN p.p := Add; r := p.p (3, 4); ASSERT (r = 7);
- END Test.
- positive: procedure array
- MODULE Test;
- VAR i: INTEGER; a: ARRAY 10 OF PROCEDURE (VAR a: INTEGER);
- PROCEDURE Add3 (VAR v: INTEGER);
- BEGIN INC (v, 3);
- END Add3;
- BEGIN i := 3; a[6] := Add3; a[6] (i); ASSERT (i = 6); a[i](i); ASSERT (i = 9);
- END Test.
- positive: procedure array with return type
- MODULE Test;
- VAR i: INTEGER; a: ARRAY 10 OF PROCEDURE (i: INTEGER): INTEGER;
- PROCEDURE Add2 (v: INTEGER): INTEGER;
- BEGIN RETURN v + 2;
- END Add2;
- BEGIN a[3] := Add2; i := a[3](1); ASSERT (i = 3); INC (i, a[i](i)); ASSERT (i = 8);
- END Test.
- # conversions
- positive: constant positive real to integer conversion
- MODULE Test;
- VAR i: LONGINT;
- BEGIN i := ENTIER (3.5); ASSERT (i = 3);
- END Test.
- positive: constant negative real to integer conversion
- MODULE Test;
- VAR i: LONGINT;
- BEGIN i := ENTIER (-3.5); ASSERT (i = -4);
- END Test.
- positive: positive real to integer conversion
- MODULE Test;
- VAR r: REAL; i: LONGINT;
- BEGIN r := 3.5; i := ENTIER (r); ASSERT (i = 3);
- END Test.
- positive: negative real to integer conversion
- MODULE Test;
- VAR r: REAL; i: LONGINT;
- BEGIN r := -3.5; i := ENTIER (r); ASSERT (i = -4);
- END Test.
- # variable declarations
- positive: two-dimensional array assignment
- MODULE Test;
- VAR a: ARRAY 8, 12 OF INTEGER;
- BEGIN a[1, 2] := 3; ASSERT (a[1][2] = 3);
- END Test.
- positive: two-dimensional open array assignment
- MODULE Test;
- VAR a: ARRAY 8, 12 OF INTEGER;
- PROCEDURE P (VAR b: ARRAY OF ARRAY OF INTEGER);
- BEGIN b[1][2] := 3;
- END P;
- BEGIN P (a); ASSERT (a[1][2] = 3);
- END Test.
- # operations
- positive: logical operations
- MODULE Test;
- VAR a, b: BOOLEAN;
- BEGIN
- a := FALSE; ASSERT (~a);
- b := FALSE; ASSERT (~a & ~b); ASSERT (~a OR ~b);
- b := TRUE; ASSERT (~a & b); ASSERT (~a OR b);
- a := TRUE; ASSERT (a);
- b := FALSE; ASSERT (a & ~b); ASSERT (a OR ~b);
- b := TRUE; ASSERT (a & b); ASSERT (a OR b);
- END Test.
- positive: arithmetic operations
- MODULE Test;
- VAR a, b: INTEGER;
- BEGIN
- a := 9; b := 7;
- ASSERT (+a = 9); ASSERT (+b = 7);
- ASSERT (-a = -9); ASSERT (-b = -7);
- ASSERT (a + b = 16); ASSERT (b + a = 16);
- ASSERT (a - b = 2); ASSERT (b - a = -2);
- ASSERT (a * b = 63); ASSERT (b * a = 63);
- ASSERT (a DIV b = 1); ASSERT (b DIV a = 0);
- ASSERT (a MOD b = 2); ASSERT (b MOD a = 7);
- END Test.
- positive: set operations
- MODULE Test;
- VAR a, b, c: SET;
- BEGIN
- a := {0, 1, 2}; ASSERT (a = {0..2}); ASSERT ((0 IN a) & (1 IN a) & (2 IN a) & ~(3 IN a) & ~(4 IN a));
- b := {2, 3, 4}; ASSERT (b = {2..4}); ASSERT (~(0 IN b) & ~(1 IN b) & (2 IN b) & (3 IN b) & (4 IN b));
- c := a + b; ASSERT (c = {0..4}); ASSERT ((0 IN c) & (1 IN c) & (2 IN c) & (3 IN c) & (4 IN c));
- c := a - b; ASSERT (c = {0..1}); ASSERT ((0 IN c) & (1 IN c) & ~(2 IN c) & ~(3 IN c) & ~(4 IN c));
- c := a * b; ASSERT (c = {2..2}); ASSERT (~(0 IN c) & ~(1 IN c) & (2 IN c) & ~(3 IN c) & ~(4 IN c));
- 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));
- END Test.
- positive: relations
- MODULE Test;
- VAR ai, bi: INTEGER; as, bs: SET; ar, br: REAL;
- BEGIN
- ai := 0; bi := 1; ASSERT (~(ai = bi)); ASSERT (ai # bi); ASSERT (ai < bi); ASSERT (ai <= bi); ASSERT (~(ai > bi)); ASSERT (~(ai >= bi));
- as := {1}; bs := {1, 2}; ASSERT (~(as = bs)); ASSERT (as # bs); ASSERT (as < bs); ASSERT (as <= bs); ASSERT (~(as > bs)); ASSERT (~(as >= bs));
- ar := 0; br := 1; ASSERT (~(ar = br)); ASSERT (ar # br); ASSERT (ar < br); ASSERT (ar <= br); ASSERT (~(ar > br)); ASSERT (~(ar >= br));
- END Test.
- # complement
- positive: complement on booleans
- MODULE Test;
- VAR value: BOOLEAN;
- BEGIN
- value := TRUE; ASSERT (value); ASSERT (~~value);
- value := FALSE; ASSERT (~value); ASSERT (~~~value);
- END Test.
- # relational operations
- positive: relational operations on booleans
- MODULE Test;
- VAR value: BOOLEAN;
- BEGIN
- value := TRUE;
- ASSERT (value = TRUE); ASSERT (~(value = FALSE)); ASSERT (value = value);
- ASSERT (value # FALSE); ASSERT (~(value # TRUE)); ASSERT (~(value # value));
- value := FALSE;
- ASSERT (value = FALSE); ASSERT (~(value = TRUE)); ASSERT (value = value);
- ASSERT (value # TRUE); ASSERT (~(value # FALSE)); ASSERT (~(value # value));
- END Test.
- positive: relational operations on characters
- MODULE Test;
- VAR value: CHAR;
- BEGIN
- value := 'a';
- ASSERT (value = 'a'); ASSERT (~(value = 'b')); ASSERT (value = value);
- ASSERT (value # 'b'); ASSERT (~(value # 'a')); ASSERT (~(value # value));
- ASSERT (value < 'z'); ASSERT (~(value < 0X)); ASSERT (~(value < value));
- ASSERT (value <= 'z'); ASSERT (~(value <= 0X)); ASSERT (value <= value);
- ASSERT (value > 0X); ASSERT (~(value > 'z')); ASSERT (~(value > value));
- ASSERT (value >= 0X); ASSERT (~(value >= 'z')); ASSERT (value >= value);
- END Test.
- positive: relational operations on short integers
- MODULE Test;
- VAR value: SHORTINT;
- BEGIN
- value := 5;
- ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
- ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
- ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
- ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
- ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
- ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
- END Test.
- positive: relational operations on integers
- MODULE Test;
- VAR value: INTEGER;
- BEGIN
- value := 5;
- ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
- ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
- ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
- ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
- ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
- ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
- END Test.
- positive: relational operations on long integers
- MODULE Test;
- VAR value: LONGINT;
- BEGIN
- value := 5;
- ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
- ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
- ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
- ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
- ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
- ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
- END Test.
- positive: relational operations on huge integers
- MODULE Test;
- VAR value: HUGEINT;
- BEGIN
- value := 5;
- ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
- ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
- ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
- ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
- ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
- ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
- END Test.
- positive: relational operations on reals
- MODULE Test;
- VAR value: REAL;
- BEGIN
- value := 5;
- ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
- ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
- ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
- ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
- ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
- ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
- END Test.
- positive: relational operations on long reals
- MODULE Test;
- VAR value: LONGREAL;
- BEGIN
- value := 5;
- ASSERT (value = 5); ASSERT (~(value = 6)); ASSERT (value = value);
- ASSERT (value # 6); ASSERT (~(value # 5)); ASSERT (~(value # value));
- ASSERT (value < 6); ASSERT (~(value < 4)); ASSERT (~(value < value));
- ASSERT (value <= 6); ASSERT (~(value <= 4)); ASSERT (value <= value);
- ASSERT (value > 4); ASSERT (~(value > 6)); ASSERT (~(value > value));
- ASSERT (value >= 4); ASSERT (~(value >= 6)); ASSERT (value >= value);
- END Test.
- positive: relational operations on sets
- MODULE Test;
- VAR value: SET;
- BEGIN
- value := {1, 2};
- ASSERT (value = {1, 2}); ASSERT (~(value = {2})); ASSERT (value = value);
- ASSERT (value # {2}); ASSERT (~(value # {1, 2})); ASSERT (~(value # value));
- ASSERT (value < {1, 2, 3}); ASSERT (~(value < {2})); ASSERT (~(value < value));
- ASSERT (value <= {1, 2, 3}); ASSERT (~(value <= {2})); ASSERT (value <= value);
- ASSERT (value > {2}); ASSERT (~(value > {1, 2, 3})); ASSERT (~(value > value));
- ASSERT (value >= {2}); ASSERT (~(value >= {1, 2, 3})); ASSERT (value >= value);
- END Test.
- positive: relational operations on character arrays
- MODULE Test;
- VAR value: ARRAY 10 OF CHAR;
- BEGIN
- value := "text";
- ASSERT (value = "text"); ASSERT (~(value = "abc")); ASSERT (value = value);
- ASSERT (value # "abc"); ASSERT (~(value # "text")); ASSERT (~(value # value));
- ASSERT (value < "xyz"); ASSERT (~(value < "abc")); ASSERT (~(value < value));
- ASSERT (value <= "xyz"); ASSERT (~(value <= "abc")); ASSERT (value <= value);
- ASSERT (value > "abc"); ASSERT (~(value > "xyz")); ASSERT (~(value > value));
- ASSERT (value >= "abc"); ASSERT (~(value >= "xyz")); ASSERT (value >= value);
- ASSERT (value[0] = 't'); ASSERT (value[1] = 'e'); ASSERT (value[2] = 'x'); ASSERT (value[3] = 't'); ASSERT (value[4] = 0X);
- END Test.
- # negation
- positive: negation on short integers
- MODULE Test;
- VAR value: SHORTINT;
- BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
- END Test.
- positive: negation on integers
- MODULE Test;
- VAR value: INTEGER;
- BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
- END Test.
- positive: negation on long integers
- MODULE Test;
- VAR value: LONGINT;
- BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
- END Test.
- positive: negation on huge integers
- MODULE Test;
- VAR value: HUGEINT;
- BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
- END Test.
- positive: negation on reals
- MODULE Test;
- VAR value: REAL;
- BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
- END Test.
- positive: negation on long reals
- MODULE Test;
- VAR value: LONGREAL;
- BEGIN value := 5; ASSERT (-value = -5); ASSERT (-(-value) = 5); ASSERT (-(-value) = value)
- END Test.
- positive: negation on sets
- MODULE Test;
- VAR value: SET;
- BEGIN value := {1, 2}; ASSERT (-value = {0, 3 .. MAX (SET)}); ASSERT (-(-value) = {1, 2}); ASSERT (-(-value) = value)
- END Test.
- # absolute value
- positive: absolute value of short integer
- MODULE Test;
- VAR value: SHORTINT;
- BEGIN
- value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
- value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
- END Test.
- positive: absolute value of integer
- MODULE Test;
- VAR value: INTEGER;
- BEGIN
- value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
- value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
- END Test.
- positive: absolute value of long integer
- MODULE Test;
- VAR value: LONGINT;
- BEGIN
- value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
- value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
- END Test.
- positive: absolute value of huge integer
- MODULE Test;
- VAR value: HUGEINT;
- BEGIN
- value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
- value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
- END Test.
- positive: absolute value of real
- MODULE Test;
- VAR value: REAL;
- BEGIN
- value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
- value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
- END Test.
- positive: absolute value of long real
- MODULE Test;
- VAR value: LONGREAL;
- BEGIN
- value := 5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = value); ASSERT (ABS (-value) = value);
- value := -5; ASSERT (ABS (value) = 5); ASSERT (ABS (-value) = 5); ASSERT (ABS (value) = -value); ASSERT (ABS (-value) = -value);
- END Test.
- # logical operations
- positive: logical and on booleans
- MODULE Test;
- VAR a, b: BOOLEAN;
- BEGIN
- a := FALSE; b := FALSE; ASSERT (a & b = FALSE);
- a := FALSE; b := TRUE; ASSERT (a & b = FALSE);
- a := TRUE; b := FALSE; ASSERT (a & b = FALSE);
- a := TRUE; b := TRUE; ASSERT (a & b = TRUE);
- END Test.
- positive: logical and on boolean return values
- MODULE Test;
- PROCEDURE True (): BOOLEAN; BEGIN RETURN TRUE; END True;
- PROCEDURE False (): BOOLEAN; BEGIN RETURN FALSE; END False;
- BEGIN
- ASSERT (False () & False () = FALSE);
- ASSERT (False () & True () = FALSE);
- ASSERT (True () & False () = FALSE);
- ASSERT (True () & True () = TRUE);
- END Test.
- positive: logical or on booleans
- MODULE Test;
- VAR a, b: BOOLEAN;
- BEGIN
- a := FALSE; b := FALSE; ASSERT (a OR b = FALSE);
- a := FALSE; b := TRUE; ASSERT (a OR b = TRUE);
- a := TRUE; b := FALSE; ASSERT (a OR b = TRUE);
- a := TRUE; b := TRUE; ASSERT (a OR b = TRUE);
- END Test.
- positive: logical or on boolean return values
- MODULE Test;
- PROCEDURE True (): BOOLEAN; BEGIN RETURN TRUE; END True;
- PROCEDURE False (): BOOLEAN; BEGIN RETURN FALSE; END False;
- BEGIN
- ASSERT (False () OR False () = FALSE);
- ASSERT (False () OR True () = TRUE);
- ASSERT (True () OR False () = TRUE);
- ASSERT (True () OR True () = TRUE);
- END Test.
- positive: short-circuit evaluation
- MODULE Test;
- PROCEDURE True (): BOOLEAN; BEGIN RETURN TRUE; END True;
- PROCEDURE False (): BOOLEAN; BEGIN RETURN FALSE; END False;
- PROCEDURE Halt (): BOOLEAN; BEGIN HALT (1234); END Halt;
- BEGIN
- ASSERT (False () & Halt () = FALSE);
- ASSERT (True () OR Halt () = TRUE);
- END Test.
- # capital letter operation
- positive: capital letter of character
- MODULE Test;
- VAR value: CHAR;
- BEGIN
- value := '0'; ASSERT (CAP (value) = '0'); ASSERT (CAP (value) = CAP ('0'));
- value := '9'; ASSERT (CAP (value) = '9'); ASSERT (CAP (value) = CAP ('9'));
- value := 'a'; ASSERT (CAP (value) = 'A'); ASSERT (CAP (value) = CAP ('a'));
- value := 'z'; ASSERT (CAP (value) = 'Z'); ASSERT (CAP (value) = CAP ('z'));
- value := 'A'; ASSERT (CAP (value) = 'A'); ASSERT (CAP (value) = CAP ('A'));
- value := 'Z'; ASSERT (CAP (value) = 'Z'); ASSERT (CAP (value) = CAP ('Z'));
- END Test.
- # character annd ordinal value operations
- positive: ordinal value of character
- MODULE Test;
- VAR value: CHAR; i: INTEGER;
- BEGIN
- value := '0'; ASSERT (ORD (value) = ORD ('0'));
- value := '9'; ASSERT (ORD (value) = ORD ('9'));
- value := 'a'; ASSERT (ORD (value) = ORD ('a'));
- value := 'z'; ASSERT (ORD (value) = ORD ('z'));
- value := 'A'; ASSERT (ORD (value) = ORD ('A'));
- value := 'Z'; ASSERT (ORD (value) = ORD ('Z'));
- FOR i := ORD (0X) TO ORD (0FFX) DO value := CHR (i); ASSERT (ORD (value) = i); END;
- END Test.
- positive: character value of short integer
- MODULE Test;
- VAR value: SHORTINT;
- BEGIN
- value := ORD ('0'); ASSERT (CHR (value) = '0');
- value := ORD ('9'); ASSERT (CHR (value) = '9');
- value := ORD ('a'); ASSERT (CHR (value) = 'a');
- value := ORD ('z'); ASSERT (CHR (value) = 'z');
- value := ORD ('A'); ASSERT (CHR (value) = 'A');
- value := ORD ('Z'); ASSERT (CHR (value) = 'Z');
- END Test.
- positive: character value of integer
- MODULE Test;
- VAR value: INTEGER;
- BEGIN
- value := ORD ('0'); ASSERT (CHR (value) = '0');
- value := ORD ('9'); ASSERT (CHR (value) = '9');
- value := ORD ('a'); ASSERT (CHR (value) = 'a');
- value := ORD ('z'); ASSERT (CHR (value) = 'z');
- value := ORD ('A'); ASSERT (CHR (value) = 'A');
- value := ORD ('Z'); ASSERT (CHR (value) = 'Z');
- END Test.
- positive: character value of long integer
- MODULE Test;
- VAR value: LONGINT;
- BEGIN
- value := ORD ('0'); ASSERT (CHR (value) = '0');
- value := ORD ('9'); ASSERT (CHR (value) = '9');
- value := ORD ('a'); ASSERT (CHR (value) = 'a');
- value := ORD ('z'); ASSERT (CHR (value) = 'z');
- value := ORD ('A'); ASSERT (CHR (value) = 'A');
- value := ORD ('Z'); ASSERT (CHR (value) = 'Z');
- END Test.
- positive: character value of huge integer
- MODULE Test;
- VAR value: HUGEINT;
- BEGIN
- value := ORD ('0'); ASSERT (CHR (value) = '0');
- value := ORD ('9'); ASSERT (CHR (value) = '9');
- value := ORD ('a'); ASSERT (CHR (value) = 'a');
- value := ORD ('z'); ASSERT (CHR (value) = 'z');
- value := ORD ('A'); ASSERT (CHR (value) = 'A');
- value := ORD ('Z'); ASSERT (CHR (value) = 'Z');
- END Test.
- # set element operations
- positive: short integer as set element
- MODULE Test;
- VAR element: SHORTINT; set: SET;
- BEGIN
- element := MIN (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
- element := MIN (SET) + 2; set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
- element := MAX (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
- element := MAX (SET) - 2; set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
- END Test.
- negative: short integer as too small set element
- MODULE Test;
- VAR element: SHORTINT; set: SET;
- BEGIN element := MIN (SET) - 1; set := {element};
- END Test.
- negative: short integer as too large set element
- MODULE Test;
- VAR element: SHORTINT; set: SET;
- BEGIN element := MAX (SET) + 1; set := {element};
- END Test.
- positive: short integer as first set element
- MODULE Test;
- VAR element: SHORTINT; set: SET;
- BEGIN
- element := MIN (SET); set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
- element := MIN (SET); set := {element .. MIN (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MIN (SET)}); ASSERT (set = {element}); ASSERT (set = {MIN (SET)});
- 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});
- element := MIN (SET) + 2; set := {element .. MIN (SET)}; ASSERT (~(element IN set)); ASSERT (set = {element .. MIN (SET)}); ASSERT (set = {});
- END Test.
- negative: short integer as too small first set element
- MODULE Test;
- VAR element: SHORTINT; set: SET;
- BEGIN element := MIN (SET) - 1;set := {element .. MAX (SET)};
- END Test.
- negative: short integer as too large first set element
- MODULE Test;
- VAR element: SHORTINT; set: SET;
- BEGIN element := MAX (SET) + 1;set := {element .. MAX (SET)};
- END Test.
- positive: short integer as last set element
- MODULE Test;
- VAR element: SHORTINT; set: SET;
- BEGIN
- element := MAX (SET); set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
- element := MAX (SET); set := {MAX (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MAX (SET) .. MAX (SET)}); ASSERT (set = {MAX (SET)});
- 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)});
- element := MAX (SET) - 2; set := {MAX (SET).. element}; ASSERT (~(element IN set)); ASSERT (set = {MAX (SET) .. element}); ASSERT (set = {});
- END Test.
- negative: short integer as too small last set element
- MODULE Test;
- VAR element: SHORTINT; set: SET;
- BEGIN element := MIN (SET) - 1;set := {MIN (SET) .. element};
- END Test.
- negative: short integer as too large last set element
- MODULE Test;
- VAR element: SHORTINT; set: SET;
- BEGIN element := MAX (SET) + 1;set := {MIN (SET) .. element};
- END Test.
- positive: short integers as set elements
- MODULE Test;
- VAR first, last: SHORTINT; set: SET;
- BEGIN
- first := MIN (SET); last := MAX (SET); set := {first .. last}; ASSERT (set = {MIN (SET) .. MAX (SET)});
- ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {});
- first := MIN (SET) + 2; last := MAX (SET) - 2; set := {first .. last}; ASSERT (set = {MIN (SET) + 2 .. MAX (SET) - 2});
- ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {MIN (SET), MIN (SET) + 1, MAX (SET) - 1, MAX (SET)});
- first := MIN (SET) + 2; last := first; set := {first .. last}; ASSERT (set = {first});
- first := MIN (SET) + 2; last := first + 1; set := {first .. last}; ASSERT (set = {first, last});
- first := MIN (SET) + 2; last := first - 1; set := {first .. last}; ASSERT (set = {});
- END Test.
- positive: integer as set element
- MODULE Test;
- VAR element: INTEGER; set: SET;
- BEGIN
- element := MIN (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
- element := MAX (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
- END Test.
- negative: integer as too small set element
- MODULE Test;
- VAR element: INTEGER; set: SET;
- BEGIN element := MIN (SET) - 1; set := {element};
- END Test.
- negative: integer as too large set element
- MODULE Test;
- VAR element: INTEGER; set: SET;
- BEGIN element := MAX (SET) + 1; set := {element};
- END Test.
- positive: integer as first set element
- MODULE Test;
- VAR element: INTEGER; set: SET;
- BEGIN
- element := MIN (SET); set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
- element := MIN (SET); set := {element .. MIN (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MIN (SET)}); ASSERT (set = {element}); ASSERT (set = {MIN (SET)});
- 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});
- element := MIN (SET) + 2; set := {element .. MIN (SET)}; ASSERT (~(element IN set)); ASSERT (set = {element .. MIN (SET)}); ASSERT (set = {});
- END Test.
- negative: integer as too small first set element
- MODULE Test;
- VAR element: INTEGER; set: SET;
- BEGIN element := MIN (SET) - 1;set := {element .. MAX (SET)};
- END Test.
- negative: integer as too large first set element
- MODULE Test;
- VAR element: INTEGER; set: SET;
- BEGIN element := MAX (SET) + 1;set := {element .. MAX (SET)};
- END Test.
- positive: integer as last set element
- MODULE Test;
- VAR element: INTEGER; set: SET;
- BEGIN
- element := MAX (SET); set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
- element := MAX (SET); set := {MAX (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MAX (SET) .. MAX (SET)}); ASSERT (set = {MAX (SET)});
- 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)});
- element := MAX (SET) - 2; set := {MAX (SET).. element}; ASSERT (~(element IN set)); ASSERT (set = {MAX (SET) .. element}); ASSERT (set = {});
- END Test.
- negative: integer as too small last set element
- MODULE Test;
- VAR element: INTEGER; set: SET;
- BEGIN element := MIN (SET) - 1;set := {MIN (SET) .. element};
- END Test.
- negative: integer as too large last set element
- MODULE Test;
- VAR element: INTEGER; set: SET;
- BEGIN element := MAX (SET) + 1;set := {MIN (SET) .. element};
- END Test.
- positive: integers as set elements
- MODULE Test;
- VAR first, last: INTEGER; set: SET;
- BEGIN
- first := MIN (SET); last := MAX (SET); set := {first .. last}; ASSERT (set = {MIN (SET) .. MAX (SET)});
- ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {});
- first := MIN (SET) + 2; last := MAX (SET) - 2; set := {first .. last}; ASSERT (set = {MIN (SET) + 2 .. MAX (SET) - 2});
- ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {MIN (SET), MIN (SET) + 1, MAX (SET) - 1, MAX (SET)});
- first := MIN (SET) + 2; last := first; set := {first .. last}; ASSERT (set = {first});
- first := MIN (SET) + 2; last := first + 1; set := {first .. last}; ASSERT (set = {first, last});
- first := MIN (SET) + 2; last := first - 1; set := {first .. last}; ASSERT (set = {});
- END Test.
- positive: long integer as set element
- MODULE Test;
- VAR element: LONGINT; set: SET;
- BEGIN
- element := MIN (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
- element := MAX (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
- END Test.
- negative: long integer as too small set element
- MODULE Test;
- VAR element: LONGINT; set: SET;
- BEGIN element := MIN (SET) - 1; set := {element};
- END Test.
- negative: long integer as too large set element
- MODULE Test;
- VAR element: LONGINT; set: SET;
- BEGIN element := MAX (SET) + 1; set := {element};
- END Test.
- positive: long integer as first set element
- MODULE Test;
- VAR element: LONGINT; set: SET;
- BEGIN
- element := MIN (SET); set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
- element := MIN (SET); set := {element .. MIN (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MIN (SET)}); ASSERT (set = {element}); ASSERT (set = {MIN (SET)});
- 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});
- element := MIN (SET) + 2; set := {element .. MIN (SET)}; ASSERT (~(element IN set)); ASSERT (set = {element .. MIN (SET)}); ASSERT (set = {});
- END Test.
- negative: long integer as too small first set element
- MODULE Test;
- VAR element: LONGINT; set: SET;
- BEGIN element := MIN (SET) - 1;set := {element .. MAX (SET)};
- END Test.
- negative: long integer as too large first set element
- MODULE Test;
- VAR element: LONGINT; set: SET;
- BEGIN element := MAX (SET) + 1;set := {element .. MAX (SET)};
- END Test.
- positive: long integer as last set element
- MODULE Test;
- VAR element: LONGINT; set: SET;
- BEGIN
- element := MAX (SET); set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
- element := MAX (SET); set := {MAX (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MAX (SET) .. MAX (SET)}); ASSERT (set = {MAX (SET)});
- 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)});
- element := MAX (SET) - 2; set := {MAX (SET).. element}; ASSERT (~(element IN set)); ASSERT (set = {MAX (SET) .. element}); ASSERT (set = {});
- END Test.
- negative: long integer as too small last set element
- MODULE Test;
- VAR element: LONGINT; set: SET;
- BEGIN element := MIN (SET) - 1;set := {MIN (SET) .. element};
- END Test.
- negative: long integer as too large last set element
- MODULE Test;
- VAR element: LONGINT; set: SET;
- BEGIN element := MAX (SET) + 1;set := {MIN (SET) .. element};
- END Test.
- positive: long integers as set elements
- MODULE Test;
- VAR first, last: LONGINT; set: SET;
- BEGIN
- first := MIN (SET); last := MAX (SET); set := {first .. last}; ASSERT (set = {MIN (SET) .. MAX (SET)});
- ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {});
- first := MIN (SET) + 2; last := MAX (SET) - 2; set := {first .. last}; ASSERT (set = {MIN (SET) + 2 .. MAX (SET) - 2});
- ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {MIN (SET), MIN (SET) + 1, MAX (SET) - 1, MAX (SET)});
- first := MIN (SET) + 2; last := first; set := {first .. last}; ASSERT (set = {first});
- first := MIN (SET) + 2; last := first + 1; set := {first .. last}; ASSERT (set = {first, last});
- first := MIN (SET) + 2; last := first - 1; set := {first .. last}; ASSERT (set = {});
- END Test.
- positive: huge integer as set element
- MODULE Test;
- VAR element: HUGEINT; set: SET;
- BEGIN
- element := MIN (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
- element := MAX (SET); set := {element}; ASSERT (element IN set); ASSERT (set - {element} = {});
- END Test.
- negative: huge integer as too small set element
- MODULE Test;
- VAR element: HUGEINT; set: SET;
- BEGIN element := MIN (SET) - 1; set := {element};
- END Test.
- negative: huge integer as too large set element
- MODULE Test;
- VAR element: HUGEINT; set: SET;
- BEGIN element := MAX (SET) + 1; set := {element};
- END Test.
- positive: huge integer as first set element
- MODULE Test;
- VAR element: HUGEINT; set: SET;
- BEGIN
- element := MIN (SET); set := {element .. MAX (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
- element := MIN (SET); set := {element .. MIN (SET)}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MIN (SET)}); ASSERT (set = {element}); ASSERT (set = {MIN (SET)});
- 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});
- element := MIN (SET) + 2; set := {element .. MIN (SET)}; ASSERT (~(element IN set)); ASSERT (set = {element .. MIN (SET)}); ASSERT (set = {});
- END Test.
- negative: huge integer as too small first set element
- MODULE Test;
- VAR element: HUGEINT; set: SET;
- BEGIN element := MIN (SET) - 1;set := {element .. MAX (SET)};
- END Test.
- negative: huge integer as too large first set element
- MODULE Test;
- VAR element: HUGEINT; set: SET;
- BEGIN element := MAX (SET) + 1;set := {element .. MAX (SET)};
- END Test.
- positive: huge integer as last set element
- MODULE Test;
- VAR element: HUGEINT; set: SET;
- BEGIN
- element := MAX (SET); set := {MIN (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MIN (SET) .. MAX (SET)}); ASSERT (-set = {});
- element := MAX (SET); set := {MAX (SET) .. element}; ASSERT (element IN set); ASSERT (set = {MAX (SET) .. MAX (SET)}); ASSERT (set = {MAX (SET)});
- 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)});
- element := MAX (SET) - 2; set := {MAX (SET).. element}; ASSERT (~(element IN set)); ASSERT (set = {MAX (SET) .. element}); ASSERT (set = {});
- END Test.
- negative: huge integer as too small last set element
- MODULE Test;
- VAR element: HUGEINT; set: SET;
- BEGIN element := MIN (SET) - 1;set := {MIN (SET) .. element};
- END Test.
- negative: huge integer as too large last set element
- MODULE Test;
- VAR element: HUGEINT; set: SET;
- BEGIN element := MAX (SET) + 1;set := {MIN (SET) .. element};
- END Test.
- positive: huge integers as set elements
- MODULE Test;
- VAR first, last: HUGEINT; set: SET;
- BEGIN
- first := MIN (SET); last := MAX (SET); set := {first .. last}; ASSERT (set = {MIN (SET) .. MAX (SET)});
- ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {});
- first := MIN (SET) + 2; last := MAX (SET) - 2; set := {first .. last}; ASSERT (set = {MIN (SET) + 2 .. MAX (SET) - 2});
- ASSERT (first IN set); ASSERT (last IN set); ASSERT (-set = {MIN (SET), MIN (SET) + 1, MAX (SET) - 1, MAX (SET)});
- first := MIN (SET) + 2; last := first; set := {first .. last}; ASSERT (set = {first});
- first := MIN (SET) + 2; last := first + 1; set := {first .. last}; ASSERT (set = {first, last});
- first := MIN (SET) + 2; last := first - 1; set := {first .. last}; ASSERT (set = {});
- END Test.
- # odd test
- positive: odd test on short integer
- MODULE Test;
- VAR value: SHORTINT;
- BEGIN
- value := 0; ASSERT (~ODD (value)); ASSERT (ODD (value + 1));
- value := 5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
- value := -5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
- END Test.
- positive: odd test on integer
- MODULE Test;
- VAR value: INTEGER;
- BEGIN
- value := 0; ASSERT (~ODD (value)); ASSERT (ODD (value + 1));
- value := 5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
- value := -5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
- END Test.
- positive: odd test on long integer
- MODULE Test;
- VAR value: LONGINT;
- BEGIN
- value := 0; ASSERT (~ODD (value)); ASSERT (ODD (value + 1));
- value := 5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
- value := -5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
- END Test.
- positive: odd test on huge integer
- MODULE Test;
- VAR value: HUGEINT;
- BEGIN
- value := 0; ASSERT (~ODD (value)); ASSERT (ODD (value + 1));
- value := 5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
- value := -5; ASSERT (ODD (value)); ASSERT (~ODD (value + 1));
- END Test.
- # explicit basic type conversions
- positive: long on short integer
- MODULE Test;
- VAR value: SHORTINT;
- BEGIN value := 11H; ASSERT (LONG (value) = 11H); ASSERT (LONG (value) = LONG (11H));
- END Test.
- positive: long on integer
- MODULE Test;
- VAR value: INTEGER;
- BEGIN value := 1122H; ASSERT (LONG (value) = 1122H); ASSERT (LONG (value) = LONG (1122H));
- END Test.
- positive: long on long integer
- MODULE Test;
- VAR value: LONGINT;
- BEGIN value := 11223344H; ASSERT (LONG (value) = 11223344H); ASSERT (LONG (value) = LONG (11223344H));
- END Test.
- positive: short on integer
- MODULE Test;
- VAR value: INTEGER;
- BEGIN value := 1122H; ASSERT (SHORT (value) = SHORT (INTEGER(1122H)));
- END Test.
- positive: short on long integer
- MODULE Test;
- VAR value: LONGINT;
- BEGIN value := 11223344H;ASSERT (SHORT (value) = SHORT (LONGINT(11223344H)));
- END Test.
- positive: short on huge integer
- MODULE Test;
- VAR value: HUGEINT;
- BEGIN value := 1122334455667788H; ASSERT (SHORT (value) = SHORT (HUGEINT(1122334455667788H)));
- END Test.
- positive: entier on reals
- MODULE Test;
- VAR value: REAL;
- BEGIN
- value := 0; ASSERT (ENTIER (value) = 0);
- value := 1; ASSERT (ENTIER (value) = 1);
- value := 1.75; ASSERT (ENTIER (value) = 1);
- value := -1; ASSERT (ENTIER (value) = -1);
- value := -1.75; ASSERT (ENTIER (value) = -2);
- END Test.
- positive: entier on long reals
- MODULE Test;
- VAR value: LONGREAL;
- BEGIN
- value := 0; ASSERT (ENTIER (value) = 0);
- value := 1; ASSERT (ENTIER (value) = 1);
- value := 1.75; ASSERT (ENTIER (value) = 1);
- value := -1; ASSERT (ENTIER (value) = -1);
- value := -1.75; ASSERT (ENTIER (value) = -2);
- END Test.
- # arithmetic operations
- positive: addition on short integers
- MODULE Test;
- VAR a, b: SHORTINT;
- BEGIN
- a := 3; b := 2; ASSERT (a + b = +5); ASSERT (a + b = 3 + 2);
- a := -3; b := 2; ASSERT (a + b = -1); ASSERT (a + b = (-3) + 2);
- a := 3; b := -2; ASSERT (a + b = +1); ASSERT (a + b = 3 + (-2));
- a := -3; b := -2; ASSERT (a + b = -5); ASSERT (a + b = (-3) + (-2));
- a := MAX (SHORTINT); b := MIN (SHORTINT) + 1; ASSERT (a + b = 0); ASSERT (a + b = MAX (SHORTINT) + MIN (SHORTINT) + 1);
- END Test.
- positive: addition on integers
- MODULE Test;
- VAR a, b: INTEGER;
- BEGIN
- a := 3; b := 2; ASSERT (a + b = +5); ASSERT (a + b = 3 + 2);
- a := -3; b := 2; ASSERT (a + b = -1); ASSERT (a + b = (-3) + 2);
- a := 3; b := -2; ASSERT (a + b = +1); ASSERT (a + b = 3 + (-2));
- a := -3; b := -2; ASSERT (a + b = -5); ASSERT (a + b = (-3) + (-2));
- a := MAX (INTEGER); b := MIN (INTEGER) + 1; ASSERT (a + b = 0); ASSERT (a + b = MAX (INTEGER) + MIN (INTEGER) + 1);
- END Test.
- positive: addition on long integers
- MODULE Test;
- VAR a, b: LONGINT;
- BEGIN
- a := 3; b := 2; ASSERT (a + b = +5); ASSERT (a + b = 3 + 2);
- a := -3; b := 2; ASSERT (a + b = -1); ASSERT (a + b = (-3) + 2);
- a := 3; b := -2; ASSERT (a + b = +1); ASSERT (a + b = 3 + (-2));
- a := -3; b := -2; ASSERT (a + b = -5); ASSERT (a + b = (-3) + (-2));
- a := MAX (LONGINT); b := MIN (LONGINT) + 1; ASSERT (a + b = 0); ASSERT (a + b = MAX (LONGINT) + MIN (LONGINT) + 1);
- END Test.
- positive: addition on huge integers
- MODULE Test;
- VAR a, b: HUGEINT;
- BEGIN
- a := 3; b := 2; ASSERT (a + b = +5); ASSERT (a + b = 3 + 2);
- a := -3; b := 2; ASSERT (a + b = -1); ASSERT (a + b = (-3) + 2);
- a := 3; b := -2; ASSERT (a + b = +1); ASSERT (a + b = 3 + (-2));
- a := -3; b := -2; ASSERT (a + b = -5); ASSERT (a + b = (-3) + (-2));
- a := MAX (HUGEINT); b := MIN (HUGEINT) + 1; ASSERT (a + b = 0); ASSERT (a + b = MAX (HUGEINT) + MIN (HUGEINT) + 1);
- END Test.
- positive: addition on reals
- MODULE Test;
- VAR a, b: REAL;
- BEGIN
- a := 3.5; b := 2.5; ASSERT (a + b = +6); ASSERT (a + b = 3.5 + 2.5);
- a := -3.5; b := 2.5; ASSERT (a + b = -1); ASSERT (a + b = (-3.5) + 2.5);
- a := 3.5; b := -2.5; ASSERT (a + b = +1); ASSERT (a + b = 3.5 + (-2.5));
- a := -3.5; b := -2.5; ASSERT (a + b = -6); ASSERT (a + b = (-3.5) + (-2.5));
- END Test.
- positive: addition on long reals
- MODULE Test;
- VAR a, b: LONGREAL;
- BEGIN
- a := 3; b := 2; ASSERT (a + b = +5); ASSERT (a + b = 3 + 2);
- a := -3; b := 2; ASSERT (a + b = -1); ASSERT (a + b = (-3) + 2);
- a := 3; b := -2; ASSERT (a + b = +1); ASSERT (a + b = 3 + (-2));
- a := -3; b := -2; ASSERT (a + b = -5); ASSERT (a + b = (-3) + (-2));
- END Test.
- positive: subtraction on short integers
- MODULE Test;
- VAR a, b: SHORTINT;
- BEGIN
- a := 3; b := 2; ASSERT (a - b = +1); ASSERT (a - b = 3 - 2);
- a := -3; b := 2; ASSERT (a - b = -5); ASSERT (a - b = (-3) - 2);
- a := 3; b := -2; ASSERT (a - b = +5); ASSERT (a - b = 3 - (-2));
- a := -3; b := -2; ASSERT (a - b = -1); ASSERT (a - b = (-3) - (-2));
- a := MIN (SHORTINT) + 1; b := MAX (SHORTINT); ASSERT (a - b = 2); ASSERT (a - b = SHORT (INTEGER(MIN (SHORTINT) + 1 - MAX (SHORTINT))));
- END Test.
- positive: subtraction on integers
- MODULE Test;
- VAR a, b: INTEGER;
- BEGIN
- a := 3; b := 2; ASSERT (a - b = +1); ASSERT (a - b = 3 - 2);
- a := -3; b := 2; ASSERT (a - b = -5); ASSERT (a - b = (-3) - 2);
- a := 3; b := -2; ASSERT (a - b = +5); ASSERT (a - b = 3 - (-2));
- a := -3; b := -2; ASSERT (a - b = -1); ASSERT (a - b = (-3) - (-2));
- a := MIN (INTEGER) + 1; b := MAX (INTEGER); ASSERT (a - b = 2); ASSERT (a - b = SHORT (LONGINT(MIN (INTEGER) + 1 - MAX (INTEGER))));
- END Test.
- positive: subtraction on long integers
- MODULE Test;
- VAR a, b: LONGINT;
- BEGIN
- a := 3; b := 2; ASSERT (a - b = +1); ASSERT (a - b = 3 - 2);
- a := -3; b := 2; ASSERT (a - b = -5); ASSERT (a - b = (-3) - 2);
- a := 3; b := -2; ASSERT (a - b = +5); ASSERT (a - b = 3 - (-2));
- a := -3; b := -2; ASSERT (a - b = -1); ASSERT (a - b = (-3) - (-2));
- a := MIN (LONGINT) + 1; b := MAX (LONGINT); ASSERT (a - b = 2);
- (* ASSERT (a - b = SHORT (MIN (LONGINT) + 1 - MAX (LONGINT))); *)
- END Test.
- positive: subtraction on huge integers
- MODULE Test;
- VAR a, b: HUGEINT;
- BEGIN
- a := 3; b := 2; ASSERT (a - b = +1); ASSERT (a - b = 3 - 2);
- a := -3; b := 2; ASSERT (a - b = -5); ASSERT (a - b = (-3) - 2);
- a := 3; b := -2; ASSERT (a - b = +5); ASSERT (a - b = 3 - (-2));
- a := -3; b := -2; ASSERT (a - b = -1); ASSERT (a - b = (-3) - (-2));
- a := MIN (HUGEINT) + 1; b := MAX (HUGEINT); ASSERT (a - b = 2); ASSERT (a - b = MIN (HUGEINT) + 1 - MAX (HUGEINT));
- END Test.
- positive: subtraction on reals
- MODULE Test;
- VAR a, b: REAL;
- BEGIN
- a := 3.5; b := 2.5; ASSERT (a - b = +1); ASSERT (a - b = 3.5 - 2.5);
- a := -3.5; b := 2.5; ASSERT (a - b = -6); ASSERT (a - b = (-3.5) - 2.5);
- a := 3.5; b := -2.5; ASSERT (a - b = +6); ASSERT (a - b = 3.5 - (-2.5));
- a := -3.5; b := -2.5; ASSERT (a - b = -1); ASSERT (a - b = (-3.5) - (-2.5));
- END Test.
- positive: subtraction on long reals
- MODULE Test;
- VAR a, b: LONGREAL;
- BEGIN
- a := 3.5; b := 2.5; ASSERT (a - b = +1); ASSERT (a - b = 3.5 - 2.5);
- a := -3.5; b := 2.5; ASSERT (a - b = -6); ASSERT (a - b = (-3.5) - 2.5);
- a := 3.5; b := -2.5; ASSERT (a - b = +6); ASSERT (a - b = 3.5 - (-2.5));
- a := -3.5; b := -2.5; ASSERT (a - b = -1); ASSERT (a - b = (-3.5) - (-2.5));
- END Test.
- positive: multiplication on short integers
- MODULE Test;
- VAR a, b: SHORTINT;
- BEGIN
- a := 3; b := 2; ASSERT (a * b = +6); ASSERT (a * b = 3 * 2);
- a := -3; b := 2; ASSERT (a * b = -6); ASSERT (a * b = (-3) * 2);
- a := 3; b := -2; ASSERT (a * b = -6); ASSERT (a * b = 3 * (-2));
- a := -3; b := -2; ASSERT (a * b = +6); ASSERT (a * b = (-3) * (-2));
- a := MAX (SHORTINT); b := MAX (SHORTINT); ASSERT (a * b = 1); ASSERT (a * b = SHORT (INTEGER(MAX (SHORTINT) * MAX (SHORTINT))));
- END Test.
- positive: multiplication on integers
- MODULE Test;
- VAR a, b: INTEGER;
- BEGIN
- a := 3; b := 2; ASSERT (a * b = +6); ASSERT (a * b = 3 * 2);
- a := -3; b := 2; ASSERT (a * b = -6); ASSERT (a * b = (-3) * 2);
- a := 3; b := -2; ASSERT (a * b = -6); ASSERT (a * b = 3 * (-2));
- a := -3; b := -2; ASSERT (a * b = +6); ASSERT (a * b = (-3) * (-2));
- a := MAX (INTEGER); b := MAX (INTEGER); ASSERT (a * b = 1); ASSERT (a * b = SHORT (LONGINT(MAX (INTEGER) * MAX (INTEGER))));
- END Test.
- positive: multiplication on long integers
- MODULE Test;
- VAR a, b: LONGINT;
- BEGIN
- a := 3; b := 2; ASSERT (a * b = +6); ASSERT (a * b = 3 * 2);
- a := -3; b := 2; ASSERT (a * b = -6); ASSERT (a * b = (-3) * 2);
- a := 3; b := -2; ASSERT (a * b = -6); ASSERT (a * b = 3 * (-2));
- a := -3; b := -2; ASSERT (a * b = +6); ASSERT (a * b = (-3) * (-2));
- a := MAX (LONGINT); b := MAX (LONGINT); ASSERT (a * b = 1);
- (*ASSERT (a * b = SHORT (HUGEINT(MAX (LONGINT) * MAX (LONGINT))));*)
- END Test.
- positive: multiplication on huge integers
- MODULE Test;
- VAR a, b: HUGEINT;
- BEGIN
- a := 3; b := 2; ASSERT (a * b = +6); ASSERT (a * b = 3 * 2);
- a := -3; b := 2; ASSERT (a * b = -6); ASSERT (a * b = (-3) * 2);
- a := 3; b := -2; ASSERT (a * b = -6); ASSERT (a * b = 3 * (-2));
- a := -3; b := -2; ASSERT (a * b = +6); ASSERT (a * b = (-3) * (-2));
- a := MAX (HUGEINT); b := MAX (HUGEINT); ASSERT (a * b = 1); ASSERT (a * b = MAX (HUGEINT) * MAX (HUGEINT));
- END Test.
- positive: multiplication on reals
- MODULE Test;
- VAR a, b: REAL;
- BEGIN
- a := 3.5; b := 2.5; ASSERT (a * b = +8.75); ASSERT (a * b = 3.5 * 2.5);
- a := -3.5; b := 2.5; ASSERT (a * b = -8.75); ASSERT (a * b = (-3.5) * 2.5);
- a := 3.5; b := -2.5; ASSERT (a * b = -8.75); ASSERT (a * b = 3.5 * (-2.5));
- a := -3.5; b := -2.5; ASSERT (a * b = +8.75); ASSERT (a * b = (-3.5) * (-2.5));
- END Test.
- positive: multiplication on long reals
- MODULE Test;
- VAR a, b: LONGREAL;
- BEGIN
- a := 3.5; b := 2.5; ASSERT (a * b = +8.75); ASSERT (a * b = 3.5 * 2.5);
- a := -3.5; b := 2.5; ASSERT (a * b = -8.75); ASSERT (a * b = (-3.5) * 2.5);
- a := 3.5; b := -2.5; ASSERT (a * b = -8.75); ASSERT (a * b = 3.5 * (-2.5));
- a := -3.5; b := -2.5; ASSERT (a * b = +8.75); ASSERT (a * b = (-3.5) * (-2.5));
- END Test.
- positive: integer division on short integers with positive divisor
- MODULE Test;
- VAR a, b: SHORTINT;
- BEGIN
- a := 3; b := 2; ASSERT (a DIV b = +1); ASSERT (a DIV b = 3 DIV 2);
- a := -3; b := 2; ASSERT (a DIV b = -2); ASSERT (a DIV b = (-3) DIV 2);
- a := 2; b := 3; ASSERT (a DIV b = +0); ASSERT (a DIV b = 2 DIV 3);
- a := -2; b := 3; ASSERT (a DIV b = -1); ASSERT (a DIV b = (-2) DIV 3);
- a := MAX (SHORTINT); b := MAX (SHORTINT); ASSERT (a DIV b = 1); ASSERT (a DIV b = MAX (SHORTINT) DIV MAX (SHORTINT));
- END Test.
- negative: integer division on short integers with negative divisor
- MODULE Test;
- VAR a, b, c: SHORTINT;
- BEGIN
- a := 3; b := -2; c := a DIV b;
- END Test.
- negative: integer division by zero on short integer
- MODULE Test;
- VAR a, b, r: SHORTINT;
- BEGIN a := 3; b := 0; r := a DIV b;
- END Test.
- positive: integer division on integers with positive divisor
- MODULE Test;
- VAR a, b: INTEGER;
- BEGIN
- a := 3; b := 2; ASSERT (a DIV b = +1); ASSERT (a DIV b = 3 DIV 2);
- a := -3; b := 2; ASSERT (a DIV b = -2); ASSERT (a DIV b = (-3) DIV 2);
- a := 2; b := 3; ASSERT (a DIV b = +0); ASSERT (a DIV b = 2 DIV 3);
- a := -2; b := 3; ASSERT (a DIV b = -1); ASSERT (a DIV b = (-2) DIV 3);
- a := MAX (INTEGER); b := MAX (INTEGER); ASSERT (a DIV b = 1); ASSERT (a DIV b = MAX (INTEGER) DIV MAX (INTEGER));
- END Test.
- negative: integer division on integers with negative divisor
- MODULE Test;
- VAR a, b, c: INTEGER;
- BEGIN
- a := 3; b := -2; c := a DIV b;
- END Test.
- negative: integer division by zero on integer
- MODULE Test;
- VAR a, b, r: INTEGER;
- BEGIN a := 3; b := 0; r := a DIV b;
- END Test.
- positive: integer division on long integers with positive divisor
- MODULE Test;
- VAR a, b: LONGINT;
- BEGIN
- a := 3; b := 2; ASSERT (a DIV b = +1); ASSERT (a DIV b = 3 DIV 2);
- a := -3; b := 2; ASSERT (a DIV b = -2); ASSERT (a DIV b = (-3) DIV 2);
- a := 2; b := 3; ASSERT (a DIV b = +0); ASSERT (a DIV b = 2 DIV 3);
- a := -2; b := 3; ASSERT (a DIV b = -1); ASSERT (a DIV b = (-2) DIV 3);
- a := MAX (LONGINT); b := MAX (LONGINT); ASSERT (a DIV b = 1); ASSERT (a DIV b = MAX (LONGINT) DIV MAX (LONGINT));
- END Test.
- negative: integer division on long integers with negative divisor
- MODULE Test;
- VAR a, b, c: LONGINT;
- BEGIN
- a := 3; b := -2; c := a DIV b;
- END Test.
- negative: integer division by zero on long integer
- MODULE Test;
- VAR a, b, r: LONGINT;
- BEGIN a := 3; b := 0; r := a DIV b;
- END Test.
- positive: integer division on huge integers with positive divisor
- MODULE Test;
- VAR a, b: HUGEINT;
- BEGIN
- a := 3; b := 2; ASSERT (a DIV b = +1); ASSERT (a DIV b = 3 DIV 2);
- a := -3; b := 2; ASSERT (a DIV b = -2); ASSERT (a DIV b = (-3) DIV 2);
- a := 2; b := 3; ASSERT (a DIV b = +0); ASSERT (a DIV b = 2 DIV 3);
- a := -2; b := 3; ASSERT (a DIV b = -1); ASSERT (a DIV b = (-2) DIV 3);
- a := MAX (HUGEINT); b := MAX (HUGEINT); ASSERT (a DIV b = 1); ASSERT (a DIV b = MAX (HUGEINT) DIV MAX (HUGEINT));
- END Test.
- negative: integer division on huge integers with negative divisor
- MODULE Test;
- VAR a, b, c: HUGEINT;
- BEGIN
- a := 3; b := -2; c := a DIV b;
- END Test.
- negative: integer division by zero on huge integer
- MODULE Test;
- VAR a, b, r: HUGEINT;
- BEGIN a := 3; b := 0; r := a DIV b;
- END Test.
- positive: real division on short integers
- MODULE Test;
- VAR a, b: SHORTINT;
- BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
- END Test.
- positive: real division on integers
- MODULE Test;
- VAR a, b: INTEGER;
- BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
- END Test.
- positive: real division on long integers
- MODULE Test;
- VAR a, b: LONGINT;
- BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
- END Test.
- positive: real division on huge integers
- MODULE Test;
- VAR a, b: HUGEINT;
- BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
- END Test.
- positive: real division on reals
- MODULE Test;
- VAR a, b: REAL;
- BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
- END Test.
- positive: real division on long reals
- MODULE Test;
- VAR a, b: LONGREAL;
- BEGIN a := 3; b := 2; ASSERT (a / b = 1.5); ASSERT (a / b = 3 / 2);
- END Test.
- positive: modulo on short integers
- MODULE Test;
- VAR a, b: SHORTINT;
- BEGIN
- 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);
- 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);
- 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);
- 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);
- a := MAX (SHORTINT); b := MAX (SHORTINT); ASSERT (a MOD b = 0); ASSERT (a MOD b = MAX (SHORTINT) MOD MAX (SHORTINT));
- END Test.
- negative: modulo by zero on short integer
- MODULE Test;
- VAR a, b, r: SHORTINT;
- BEGIN a := 3; b := 0; r := a MOD b;
- END Test.
- positive: modulo on integers
- MODULE Test;
- VAR a, b: INTEGER;
- BEGIN
- 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);
- 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);
- 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);
- 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);
- a := MAX (INTEGER); b := MAX (INTEGER); ASSERT (a MOD b = 0); ASSERT (a MOD b = MAX (INTEGER) MOD MAX (INTEGER));
- END Test.
- negative: modulo by zero on integer
- MODULE Test;
- VAR a, b, r: INTEGER;
- BEGIN a := 3; b := 0; r := a MOD b;
- END Test.
- positive: modulo on long integers
- MODULE Test;
- VAR a, b: LONGINT;
- BEGIN
- 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);
- 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);
- 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);
- 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);
- a := MAX (LONGINT); b := MAX (LONGINT); ASSERT (a MOD b = 0); ASSERT (a MOD b = MAX (LONGINT) MOD MAX (LONGINT));
- END Test.
- negative: modulo by zero on long integer
- MODULE Test;
- VAR a, b, r: LONGINT;
- BEGIN a := 3; b := 0; r := a MOD b;
- END Test.
- positive: modulo on huge integers
- MODULE Test;
- VAR a, b: HUGEINT;
- BEGIN
- 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);
- 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);
- 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);
- 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);
- a := MAX (HUGEINT); b := MAX (HUGEINT); ASSERT (a MOD b = 0); ASSERT (a MOD b = MAX (HUGEINT) MOD MAX (HUGEINT));
- END Test.
- negative: modulo by zero on huge integer
- MODULE Test;
- VAR a, b, r: HUGEINT;
- BEGIN a := 3; b := 0; r := a MOD b;
- END Test.
- positive: arithmetic shift on short integer
- MODULE Test;
- VAR a, b: SHORTINT;
- BEGIN
- a := 6; b := 2; ASSERT (ASH (a, b) = 24); ASSERT (ASH (a, b) = ASH (a, 2)); ASSERT (ASH (a, b) = ASH (6, 2));
- a := 6; b := 0; ASSERT (ASH (a, b) = 6); ASSERT (ASH (a, b) = ASH (a, 0)); ASSERT (ASH (a, b) = ASH (6, 0));
- a := 6; b := -2; ASSERT (ASH (a, b) = 1); ASSERT (ASH (a, b) = ASH (a, -2)); ASSERT (ASH (a, b) = ASH (6, -2));
- END Test.
- positive: arithmetic shift on integer
- MODULE Test;
- VAR a, b: INTEGER;
- BEGIN
- a := 6; b := 2; ASSERT (ASH (a, b) = 24); ASSERT (ASH (a, b) = ASH (a, 2)); ASSERT (ASH (a, b) = ASH (6, 2));
- a := 6; b := 0; ASSERT (ASH (a, b) = 6); ASSERT (ASH (a, b) = ASH (a, 0)); ASSERT (ASH (a, b) = ASH (6, 0));
- a := 6; b := -2; ASSERT (ASH (a, b) = 1); ASSERT (ASH (a, b) = ASH (a, -2)); ASSERT (ASH (a, b) = ASH (6, -2));
- END Test.
- positive: arithmetic shift on long integer
- MODULE Test;
- VAR a, b: LONGINT;
- BEGIN
- a := 6; b := 2; ASSERT (ASH (a, b) = 24); ASSERT (ASH (a, b) = ASH (a, 2)); ASSERT (ASH (a, b) = ASH (6, 2));
- a := 6; b := 0; ASSERT (ASH (a, b) = 6); ASSERT (ASH (a, b) = ASH (a, 0)); ASSERT (ASH (a, b) = ASH (6, 0));
- a := 6; b := -2; ASSERT (ASH (a, b) = 1); ASSERT (ASH (a, b) = ASH (a, -2)); ASSERT (ASH (a, b) = ASH (6, -2));
- END Test.
- positive: arithmetic shift on huge integer
- MODULE Test;
- VAR a, b: HUGEINT;
- BEGIN
- a := 6; b := 2; ASSERT (ASH (a, b) = 24); ASSERT (ASH (a, b) = ASH (a, 2)); ASSERT (ASH (a, b) = ASH (6, 2));
- a := 6; b := 0; ASSERT (ASH (a, b) = 6); ASSERT (ASH (a, b) = ASH (a, 0)); ASSERT (ASH (a, b) = ASH (6, 0));
- a := 6; b := -2; ASSERT (ASH (a, b) = 1); ASSERT (ASH (a, b) = ASH (a, -2)); ASSERT (ASH (a, b) = ASH (6, -2));
- END Test.
- # set operators
- positive: set union
- MODULE Test;
- VAR a, b: SET;
- BEGIN
- a := {}; b := {}; ASSERT (a + b = {}); ASSERT (a + b = {} + {});
- a := {1, 2}; b := {}; ASSERT (a + b = {1, 2}); ASSERT (a + b = {1, 2} + {});
- a := {}; b := {2, 3}; ASSERT (a + b = {2, 3}); ASSERT (a + b = {} + {2, 3});
- a := {1, 2}; b := {2, 3}; ASSERT (a + b = {1..3}); ASSERT (a + b = {1, 2} + {2, 3});
- a := {}; b := {}; ASSERT (a + {} = {}); ASSERT ({} + b = {} + {});
- a := {1, 2}; b := {}; ASSERT (a + {} = {1, 2}); ASSERT ({1,2} + b = {1, 2} + {});
- a := {}; b := {2, 3}; ASSERT (a + {2,3} = {2, 3}); ASSERT ({} + b = {} + {2, 3});
- a := {1, 2}; b := {2, 3}; ASSERT (a + {2,3} = {1..3}); ASSERT ({1,2} + b = {1, 2} + {2, 3});
- END Test.
- positive: set difference
- MODULE Test;
- VAR a, b: SET;
- BEGIN
- a := {}; b := {}; ASSERT (a - b = {}); ASSERT (a - b = {} - {});
- a := {1, 2}; b := {}; ASSERT (a - b = {1, 2}); ASSERT (a - b = {1, 2} - {});
- a := {}; b := {2, 3}; ASSERT (a - b = {}); ASSERT (a - b = {} - {2, 3});
- a := {1, 2}; b := {2, 3}; ASSERT (a - b = {1}); ASSERT (a - b = {1, 2} - {2, 3});
- a := {}; b := {}; ASSERT (a - {} = {}); ASSERT ({} - b = {} - {});
- a := {1, 2}; b := {}; ASSERT (a - {} = {1, 2}); ASSERT ({1,2} - b = {1, 2} - {});
- a := {}; b := {2, 3}; ASSERT (a - {2,3} = {}); ASSERT ({} - b = {} - {2, 3});
- a := {1, 2}; b := {2, 3}; ASSERT (a - {2,3} = {1}); ASSERT ({1,2} - b = {1, 2} - {2, 3});
- END Test.
- positive: set intersection
- MODULE Test;
- VAR a, b: SET;
- BEGIN
- a := {}; b := {}; ASSERT (a * b = {}); ASSERT (a * b = {} * {});
- a := {1, 2}; b := {}; ASSERT (a * b = {}); ASSERT (a * b = {1, 2} * {});
- a := {}; b := {2, 3}; ASSERT (a * b = {}); ASSERT (a * b = {} * {2, 3});
- a := {1, 2}; b := {2, 3}; ASSERT (a * b = {2}); ASSERT (a * b = {1, 2} * {2, 3});
- a := {}; b := {}; ASSERT ({} * b = {}); ASSERT (a * {} = {} * {});
- a := {1, 2}; b := {}; ASSERT ({1,2} * b = {}); ASSERT (a * {} = {1, 2} * {});
- a := {}; b := {2, 3}; ASSERT (a * {2,3} = {}); ASSERT ({} * b = {} * {2, 3});
- a := {1, 2}; b := {2, 3}; ASSERT ({1,2} * b = {2}); ASSERT (a * {2,3} = {1, 2} * {2, 3});
- END Test.
- positive: symmetric set difference
- MODULE Test;
- VAR a, b: SET;
- BEGIN
- a := {}; b := {}; ASSERT (a / b = {}); ASSERT (a / b = {} / {});
- a := {1, 2}; b := {}; ASSERT (a / b = {1, 2}); ASSERT (a / b = {1, 2} / {});
- a := {}; b := {2, 3}; ASSERT (a / b = {2, 3}); ASSERT (a / b = {} / {2, 3});
- a := {1, 2}; b := {2, 3}; ASSERT (a / b = {1, 3}); ASSERT (a / b = {1, 2} / {2, 3});
- a := {}; b := {}; ASSERT (a / {} = {}); ASSERT (a / {} = {} / {});
- a := {1, 2}; b := {}; ASSERT ({1,2} / b = {1, 2}); ASSERT (a / {} = {1, 2} / {});
- a := {}; b := {2, 3}; ASSERT ({} / b = {2, 3}); ASSERT (a / {2,3} = {} / {2, 3});
- a := {1, 2}; b := {2, 3}; ASSERT ({1,2} / b = {1, 3}); ASSERT (a / {2,3} = {1, 2} / {2, 3});
- END Test.
- # type guards
- positive: type guard on same global record
- MODULE Test;
- TYPE R = RECORD b: BOOLEAN END;
- VAR r: R;
- BEGIN r.b := TRUE; ASSERT (r(R).b);
- END Test.
- positive: type guard on same local record
- MODULE Test;
- PROCEDURE Procedure;
- TYPE R = RECORD b: BOOLEAN END;
- VAR r: R;
- BEGIN r.b := TRUE; ASSERT (r(R).b);
- END Procedure;
- BEGIN Procedure;
- END Test.
- positive: type guard on same parameter record
- MODULE Test;
- TYPE R = RECORD b: BOOLEAN END;
- VAR r: R;
- PROCEDURE Procedure (r: R); BEGIN ASSERT (r(R).b); END Procedure;
- BEGIN r.b := TRUE; Procedure (r);
- END Test.
- positive: type guard on same variable parameter record
- MODULE Test;
- TYPE R = RECORD b: BOOLEAN END;
- VAR r: R;
- PROCEDURE Procedure (VAR r: R); BEGIN ASSERT (r(R).b); END Procedure;
- BEGIN r.b := TRUE; Procedure (r);
- END Test.
- positive: type guard on same constant parameter record
- MODULE Test;
- TYPE R = RECORD b: BOOLEAN END;
- VAR r: R;
- PROCEDURE Procedure (CONST r: R); BEGIN ASSERT (r(R).b); END Procedure;
- BEGIN r.b := TRUE; Procedure (r);
- END Test.
- positive: type guard on variable parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
- VAR r: R1;
- PROCEDURE Procedure (VAR r: R0); BEGIN ASSERT (r(R1).b); END Procedure;
- BEGIN r.b := TRUE; Procedure (r);
- END Test.
- negative: unsatisfied type guard on variable parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
- VAR r: R0;
- PROCEDURE Procedure (VAR r: R0); BEGIN ASSERT (r(R1).b); END Procedure;
- BEGIN Procedure (r);
- END Test.
- positive: type guard on constant parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
- VAR r: R1;
- PROCEDURE Procedure (CONST r: R0); BEGIN ASSERT (r(R1).b); END Procedure;
- BEGIN r.b := TRUE; Procedure (r);
- END Test.
- negative: unsatisfied type guard on constant parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
- VAR r: R0;
- PROCEDURE Procedure (CONST r: R0); BEGIN ASSERT (r(R1).b); END Procedure;
- BEGIN Procedure (r);
- END Test.
- positive: type guard on same pointer to record
- MODULE Test;
- TYPE R = RECORD b: BOOLEAN END; P = POINTER TO R;
- VAR p: P;
- BEGIN NEW (p); p.b := TRUE; ASSERT (p(P).b); ASSERT (p^(R).b);
- END Test.
- positive: type guard on pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0
- TYPE R1 = RECORD (R0) b: BOOLEAN END; P1 = POINTER TO R1;
- VAR p0: P0; p1: P1;
- BEGIN NEW (p1); p1.b := TRUE; p0 := p1; ASSERT (p0(P1).b); ASSERT (p0^(R1).b);
- END Test.
- positive: type guard on returned pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0
- TYPE R1 = RECORD (R0) b: BOOLEAN END; P1 = POINTER TO R1;
- VAR p1: P1;
- PROCEDURE Function (): P0;
- BEGIN NEW (p1); p1.b := TRUE; RETURN p1;
- END Function;
- BEGIN ASSERT (Function ()(P1).b); ASSERT (Function ()^(R1).b);
- END Test.
- negative: unsatisfied type guard on pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0;
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR p0: P0; p1: P1;
- BEGIN NEW (p0); p1 := p0(P1);
- END Test.
- positive: type guard on nil pointer to same record
- MODULE Test;
- TYPE R = RECORD END; P = POINTER TO R;
- VAR p: P;
- BEGIN p := NIL; p := p(P);
- END Test.
- negative: type guard on nil pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0;
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR p0: P0; p1: P1;
- BEGIN p0 := NIL; p1 := p0(P1);
- END Test.
- negative: type guard on returned nil pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR p1: P1;
- PROCEDURE Function (): P0;
- BEGIN RETURN NIL;
- END Function;
- BEGIN p1 := Function ()(P1);
- END Test.
- positive: type guard on same object
- MODULE Test;
- TYPE O = OBJECT VAR b: BOOLEAN END O;
- VAR o: O;
- BEGIN NEW (o); o.b := TRUE; ASSERT (o(O).b);
- END Test.
- positive: type guard on object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
- VAR o0: O0; o1: O1;
- BEGIN NEW (o1); o1.b := TRUE; o0 := o1; ASSERT (o0(O1).b);
- END Test.
- positive: type guard on returned object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
- VAR o1: O1;
- PROCEDURE Function (): O0;
- BEGIN NEW (o1); o1.b := TRUE; RETURN o1;
- END Function;
- BEGIN ASSERT (Function ()(O1).b);
- END Test.
- negative: unsatisfied type guard on object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0; o1: O1;
- BEGIN NEW (o0); o1 := o0(O1);
- END Test.
- positive: type guard on same nil object
- MODULE Test;
- TYPE O = OBJECT END O;
- VAR o: O;
- BEGIN o := NIL; o := o(O);
- END Test.
- negative: type guard on nil object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0; o1: O1;
- BEGIN o0 := NIL; o1 := o0(O1);
- END Test.
- negative: type guard on returned nil object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o1: O1;
- PROCEDURE Function (): O0;
- BEGIN RETURN NIL;
- END Function;
- BEGIN o1 := Function ()(O1);
- END Test.
- positive: type guard on base object
- MODULE Test;
- TYPE O0 = OBJECT;
- TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
- VAR o0: O0; o1: O1;
- BEGIN NEW (o1); o1.b := TRUE; o0 := o1; ASSERT (o0(O1).b);
- END Test.
- positive: type guard on returned base object
- MODULE Test;
- TYPE O0 = OBJECT;
- TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
- VAR o1: O1;
- PROCEDURE Function (): O0;
- BEGIN NEW (o1); o1.b := TRUE; RETURN o1;
- END Function;
- BEGIN ASSERT (Function ()(O1).b);
- END Test.
- negative: type guard on nil base object
- MODULE Test;
- TYPE O0 = OBJECT;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0; o1: O1;
- BEGIN o0 := NIL; o1 := o0(O1);
- END Test.
- negative: type guard on returned nil base object
- MODULE Test;
- TYPE O0 = OBJECT;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o1: O1;
- PROCEDURE Function (): O0;
- BEGIN RETURN NIL;
- END Function;
- BEGIN o1 := Function ()(O1);
- END Test.
- # type tests
- positive: type test on same global record
- MODULE Test;
- TYPE R = RECORD END;
- VAR r: R;
- BEGIN ASSERT (r IS R);
- END Test.
- positive: type test on same local record
- MODULE Test;
- PROCEDURE Procedure;
- TYPE R = RECORD END;
- VAR r: R;
- BEGIN ASSERT (r IS R);
- END Procedure;
- BEGIN Procedure;
- END Test.
- positive: type test on same parameter record
- MODULE Test;
- TYPE R = RECORD END;
- VAR r: R;
- PROCEDURE Procedure (r: R); BEGIN ASSERT (r IS R); END Procedure;
- BEGIN Procedure (r);
- END Test.
- positive: type test on same variable parameter record
- MODULE Test;
- TYPE R = RECORD END;
- VAR r: R;
- PROCEDURE Procedure (VAR r: R); BEGIN ASSERT (r IS R); END Procedure;
- BEGIN Procedure (r);
- END Test.
- positive: type test on same constant parameter record
- MODULE Test;
- TYPE R = RECORD END;
- VAR r: R;
- PROCEDURE Procedure (CONST r: R); BEGIN ASSERT (r IS R); END Procedure;
- BEGIN Procedure (r);
- END Test.
- positive: type test on variable parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) END;
- VAR r: R1;
- PROCEDURE Procedure (VAR r: R0); BEGIN ASSERT (r IS R1); END Procedure;
- BEGIN Procedure (r);
- END Test.
- positive: unsatisfied type test on variable parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) END;
- VAR r: R0;
- PROCEDURE Procedure (VAR r: R0); BEGIN ASSERT (~(r IS R1)); END Procedure;
- BEGIN Procedure (r);
- END Test.
- positive: type test on constant parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) END;
- VAR r: R1;
- PROCEDURE Procedure (CONST r: R0); BEGIN ASSERT (r IS R1); END Procedure;
- BEGIN Procedure (r);
- END Test.
- positive: unsatisfied type test on constant parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) END;
- VAR r: R0;
- PROCEDURE Procedure (CONST r: R0); BEGIN ASSERT (~(r IS R1)); END Procedure;
- BEGIN Procedure (r);
- END Test.
- positive: type test on same pointer to record
- MODULE Test;
- TYPE R = RECORD END; P = POINTER TO R;
- VAR p: P;
- BEGIN NEW (p); ASSERT (p IS P); ASSERT (p^ IS R);
- END Test.
- positive: type test on pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR p0: P0; p1: P1;
- BEGIN NEW (p1); p0 := p1; ASSERT (p0 IS P1); ASSERT (p0^ IS R1);
- END Test.
- positive: type test on returned pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR p1: P1;
- PROCEDURE Function (): P0;
- BEGIN NEW (p1); RETURN p1;
- END Function;
- BEGIN ASSERT (Function () IS P1); ASSERT (Function ()^ IS R1);
- END Test.
- positive: unsatisfied type test on pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR p0: P0;
- BEGIN NEW (p0); ASSERT (~(p0 IS P1)); ASSERT (~(p0^ IS R1));
- END Test.
- positive: unsatisfied type test on returned pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR p0: P0;
- PROCEDURE Function (): P0;
- BEGIN NEW (p0); RETURN p0;
- END Function;
- BEGIN ASSERT (~(Function () IS P1)); ASSERT (~(Function ()^ IS R1));
- END Test.
- positive: type test on nil pointer to same record
- MODULE Test;
- TYPE R = RECORD END; P = POINTER TO R;
- VAR p: P; result: BOOLEAN
- BEGIN p := NIL; result := p IS P;
- END Test.
- negative: type test on nil pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0;
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR p0: P0; result: BOOLEAN
- BEGIN p0 := NIL; result := p0 IS P1;
- END Test.
- negative: type test on returned nil pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0;
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR result: BOOLEAN
- PROCEDURE Function (): P0;
- BEGIN RETURN NIL;
- END Function;
- BEGIN result := Function () IS P1;
- END Test.
- positive: type test on same object
- MODULE Test;
- TYPE O = OBJECT END O;
- VAR o: O;
- BEGIN NEW (o); ASSERT (o IS O);
- END Test.
- positive: type test on object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0; o1: O1;
- BEGIN NEW (o1); o0 := o1; ASSERT (o0 IS O1);
- END Test.
- positive: type test on returned object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o1: O1;
- PROCEDURE Function (): O0;
- BEGIN NEW (o1); RETURN o1;
- END Function;
- BEGIN ASSERT (Function () IS O1);
- END Test.
- positive: unsatisfied type test on object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0;
- BEGIN NEW (o0); ASSERT (~(o0 IS O1));
- END Test.
- positive: unsatisfied type test on returned object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0;
- PROCEDURE Function (): O0;
- BEGIN NEW (o0); RETURN o0;
- END Function;
- BEGIN ASSERT (~(Function () IS O1));
- END Test.
- positive: type test on same nil object
- MODULE Test;
- TYPE O = OBJECT END O;
- VAR o: O; result: BOOLEAN;
- BEGIN o := NIL; result := o IS O;
- END Test.
- negative: type test on nil object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0; result: BOOLEAN;
- BEGIN o0 := NIL; result := o0 IS O1;
- END Test.
- negative: type test on returned nil object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR result: BOOLEAN;
- PROCEDURE Function (): O0;
- BEGIN RETURN NIL;
- END Function;
- BEGIN result := Function () IS O1;
- END Test.
- positive: type test on base object
- MODULE Test;
- TYPE O0 = OBJECT;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0; o1: O1;
- BEGIN NEW (o1); o0 := o1; ASSERT (o0 IS O1);
- END Test.
- positive: type test on returned base object
- MODULE Test;
- TYPE O0 = OBJECT;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o1: O1;
- PROCEDURE Function (): O0;
- BEGIN NEW (o1); RETURN o1;
- END Function;
- BEGIN ASSERT (Function () IS O1);
- END Test.
- negative: type test on nil base object
- MODULE Test;
- TYPE O0 = OBJECT;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0; result: BOOLEAN;
- BEGIN o0 := NIL; result := o0 IS O1;
- END Test.
- negative: type test on returned nil base object
- MODULE Test;
- TYPE O0 = OBJECT;
- TYPE O1 = OBJECT (O0) END O1;
- VAR result: BOOLEAN;
- PROCEDURE Function (): O0;
- BEGIN RETURN NIL;
- END Function;
- BEGIN result := Function () IS O1;
- END Test.
- # dereferencing
- positive: explicit dereference on pointer to record
- MODULE Test;
- VAR p: POINTER TO RECORD a: INTEGER END;
- BEGIN NEW (p); p^.a := 45; ASSERT (p.a = 45);
- END Test.
- negative: explicit dereference of nil pointer to record
- MODULE Test;
- VAR p: POINTER TO RECORD a: INTEGER END;
- BEGIN p := NIL; p^.a := 45;
- END Test.
- positive: implicit dereference on pointer to record
- MODULE Test;
- VAR p: POINTER TO RECORD a: INTEGER END;
- BEGIN NEW (p); p.a := 45; ASSERT (p^.a = 45);
- END Test.
- negative: implicit dereference of nil pointer to record
- MODULE Test;
- VAR p: POINTER TO RECORD a: INTEGER END;
- BEGIN p := NIL; p.a := 45;
- END Test.
- positive: explicit dereference on pointer to array
- MODULE Test;
- VAR p: POINTER TO ARRAY 10 OF INTEGER;
- BEGIN NEW (p); p^[4] := 45; ASSERT (p[4] = 45);
- END Test.
- positive: implicit dereference on pointer to array
- MODULE Test;
- VAR p: POINTER TO ARRAY 10 OF INTEGER;
- BEGIN NEW (p); p[4] := 45; ASSERT (p^[4] = 45);
- END Test.
- negative: explicit dereference of nil pointer to array
- MODULE Test;
- VAR p: POINTER TO ARRAY 10 OF INTEGER;
- BEGIN p := NIL; p^[4] := 45;
- END Test.
- negative: implicit dereference of nil pointer to array
- MODULE Test;
- VAR p: POINTER TO ARRAY 10 OF INTEGER;
- BEGIN p := NIL; p[4] := 45;
- END Test.
- # array length
- positive: length of one-dimensional open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a));
- END Test.
- positive: first dimension of one-dimensional open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p, 0) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
- END Test.
- positive: dynamic dimension of one-dimensional open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF INTEGER; dim, len: INTEGER);
- BEGIN ASSERT (LEN (p, dim) = len);
- END Procedure;
- BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0));
- END Test.
- negative: negative dynamic dimension of one-dimensional open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, -1);
- END Test.
- negative: invalid dynamic dimension of one-dimensional open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, 1);
- END Test.
- positive: length of two-dimensional open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a));
- END Test.
- positive: first dimension of two-dimensional open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p, 0) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
- END Test.
- positive: second dimension of two-dimensional open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p, 1) = len);
- END Procedure;
- BEGIN Procedure (a, 20); Procedure (a, LEN (a, 1));
- END Test.
- positive: dynamic dimension of two-dimensional open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; dim, len: INTEGER);
- BEGIN ASSERT (LEN (p, dim) = len);
- END Procedure;
- BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0)); Procedure (a, 1, 20); Procedure (a, 1, LEN (a, 1));
- END Test.
- negative: negative dynamic dimension of two-dimensional open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, -1);
- END Test.
- negative: invalid dynamic dimension of two-dimensional open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, 2);
- END Test.
- positive: length of one-dimensional variable open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a));
- END Test.
- positive: first dimension of one-dimensional variable open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p, 0) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
- END Test.
- positive: dynamic dimension of one-dimensional variable open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF INTEGER; dim, len: INTEGER);
- BEGIN ASSERT (LEN (p, dim) = len);
- END Procedure;
- BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0));
- END Test.
- negative: negative dynamic dimension of one-dimensional variable open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, -1);
- END Test.
- negative: invalid dynamic dimension of one-dimensional variable open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, 1);
- END Test.
- positive: length of two-dimensional variable open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a));
- END Test.
- positive: first dimension of two-dimensional variable open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p, 0) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
- END Test.
- positive: second dimension of two-dimensional variable open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p, 1) = len);
- END Procedure;
- BEGIN Procedure (a, 20); Procedure (a, LEN (a, 1));
- END Test.
- positive: dynamic dimension of two-dimensional variable open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; dim, len: INTEGER);
- BEGIN ASSERT (LEN (p, dim) = len);
- END Procedure;
- BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0)); Procedure (a, 1, 20); Procedure (a, 1, LEN (a, 1));
- END Test.
- negative: negative dynamic dimension of two-dimensional variable open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, -1);
- END Test.
- negative: invalid dynamic dimension of two-dimensional variable open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, 2);
- END Test.
- positive: length of one-dimensional constant open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a));
- END Test.
- positive: first dimension of one-dimensional constant open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p, 0) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
- END Test.
- positive: dynamic dimension of one-dimensional constant open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim, len: INTEGER);
- BEGIN ASSERT (LEN (p, dim) = len);
- END Procedure;
- BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0));
- END Test.
- negative: negative dynamic dimension of one-dimensional constant open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, -1);
- END Test.
- negative: invalid dynamic dimension of one-dimensional constant open array
- MODULE Test;
- VAR a: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, 1);
- END Test.
- positive: length of two-dimensional constant open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a));
- END Test.
- positive: first dimension of two-dimensional constant open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p, 0) = len);
- END Procedure;
- BEGIN Procedure (a, 10); Procedure (a, LEN (a, 0));
- END Test.
- positive: second dimension of two-dimensional constant open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: INTEGER);
- BEGIN ASSERT (LEN (p, 1) = len);
- END Procedure;
- BEGIN Procedure (a, 20); Procedure (a, LEN (a, 1));
- END Test.
- positive: dynamic dimension of two-dimensional constant open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim, len: INTEGER);
- BEGIN ASSERT (LEN (p, dim) = len);
- END Procedure;
- BEGIN Procedure (a, 0, 10); Procedure (a, 0, LEN (a, 0)); Procedure (a, 1, 20); Procedure (a, 1, LEN (a, 1));
- END Test.
- negative: negative dynamic dimension of two-dimensional constant open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, -1);
- END Test.
- negative: invalid dynamic dimension of two-dimensional constant open array
- MODULE Test;
- VAR a: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN Procedure (a, 2);
- END Test.
- positive: length of pointer to one-dimensional open array
- MODULE Test;
- VAR a: POINTER TO ARRAY OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; len: LONGINT);
- BEGIN ASSERT (LEN (p) = len);
- END Procedure;
- BEGIN NEW (a, 10); ASSERT (LEN (a) = 10); Procedure (a^, 10); Procedure (a^, LEN (a));
- END Test.
- positive: first dimension of pointer to one-dimensional open array
- MODULE Test;
- VAR a: POINTER TO ARRAY OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; len: LONGINT);
- BEGIN ASSERT (LEN (p, 0) = len);
- END Procedure;
- BEGIN NEW (a, 10); ASSERT (LEN (a, 0) = 10); Procedure (a^, 10); Procedure (a^, LEN (a, 0));
- END Test.
- positive: dynamic dimension of pointer to one-dimensional open array
- MODULE Test;
- VAR a: POINTER TO ARRAY OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim, len: LONGINT);
- BEGIN ASSERT (LEN (p, dim) = len);
- END Procedure;
- BEGIN NEW (a, 10); Procedure (a^, 0, 10); Procedure (a^, 0, LEN (a, 0));
- END Test.
- negative: negative dynamic dimension of pointer to one-dimensional open array
- MODULE Test;
- VAR a: POINTER TO ARRAY OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN NEW (a, 10); Procedure (a^, -1);
- END Test.
- negative: invalid dynamic dimension of pointer to one-dimensional open array
- MODULE Test;
- VAR a: POINTER TO ARRAY OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN NEW (a, 10); Procedure (a^, 1);
- END Test.
- positive: length of pointer to two-dimensional open array
- MODULE Test;
- VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: LONGINT);
- BEGIN ASSERT (LEN (p) = len);
- END Procedure;
- BEGIN NEW (a, 10, 20); Procedure (a^, 10); Procedure (a^, LEN (a));
- END Test.
- positive: first dimension of pointer to two-dimensional open array
- MODULE Test;
- VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: LONGINT);
- BEGIN ASSERT (LEN (p, 0) = len);
- END Procedure;
- BEGIN NEW (a, 10, 20); Procedure (a^, 10); Procedure (a^, LEN (a, 0));
- END Test.
- positive: second dimension of pointer to two-dimensional open array
- MODULE Test;
- VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; len: LONGINT);
- BEGIN ASSERT (LEN (p, 1) = len);
- END Procedure;
- BEGIN NEW (a, 10, 20); Procedure (a^, 20); Procedure (a^, LEN (a, 1));
- END Test.
- positive: dynamic dimension of pointer to two-dimensional open array
- MODULE Test;
- VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim, len: LONGINT);
- BEGIN ASSERT (LEN (p, dim) = len);
- END Procedure;
- 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));
- END Test.
- negative: negative dynamic dimension of pointer to two-dimensional open array
- MODULE Test;
- VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN NEW (a, 10, 20); Procedure (a^, -1);
- END Test.
- negative: invalid dynamic dimension of pointer to two-dimensional open array
- MODULE Test;
- VAR a: POINTER TO ARRAY OF ARRAY OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF ARRAY OF INTEGER; dim: INTEGER);
- VAR len: LONGINT;
- BEGIN len := LEN (p, dim);
- END Procedure;
- BEGIN NEW (a, 10, 20); Procedure (a^, 2);
- END Test.
- # indexing
- positive: indexing global array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- 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);
- END Test.
- negative: negative index into global array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- BEGIN index := -1; g[index] := 0;
- END Test.
- negative: too large index into global array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- BEGIN index := LEN (g); g[index] := 0;
- END Test.
- positive: reading global array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
- BEGIN p[index] := value;
- END Set;
- BEGIN Set (g, 5, 15); ASSERT (g[5] = 15);
- END Test.
- positive: writing global array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
- BEGIN RETURN p[index];
- END Get;
- BEGIN g[5] := 15; ASSERT (Get (g, 5) = 15);
- END Test.
- positive: reading two-dimensional global array
- MODULE Test;
- VAR g: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
- BEGIN p[index1, index2] := value;
- END Set;
- BEGIN Set (g, 5, 6, 15); ASSERT (g[5, 6] = 15);
- END Test.
- positive: writing two-dimensional global array
- MODULE Test;
- VAR g: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
- BEGIN RETURN p[index1, index2];
- END Get;
- BEGIN g[5, 6] := 15; ASSERT (Get (g, 5, 6) = 15);
- END Test.
- positive: indexing local array
- MODULE Test;
- PROCEDURE Procedure;
- VAR l: ARRAY 10 OF INTEGER;
- 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);
- END Procedure;
- BEGIN Procedure;
- END Test.
- negative: negative index into local array
- MODULE Test;
- PROCEDURE Procedure;
- VAR l: ARRAY 10 OF INTEGER; index: LONGINT;
- BEGIN index := -1; l[index] := 0;
- END Procedure;
- BEGIN Procedure;
- END Test.
- negative: too large index into local array
- MODULE Test;
- PROCEDURE Procedure;
- VAR l: ARRAY 10 OF INTEGER; index: LONGINT;
- BEGIN index := LEN (l); l[index] := 0;
- END Procedure;
- BEGIN Procedure;
- END Test.
- positive: reading local array
- MODULE Test;
- PROCEDURE Procedure;
- VAR l: ARRAY 10 OF INTEGER;
- BEGIN Set (l, 5, 15); ASSERT (l[5] = 15);
- END Procedure;
- PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
- BEGIN p[index] := value;
- END Set;
- BEGIN Procedure;
- END Test.
- positive: writing local array
- MODULE Test;
- PROCEDURE Procedure;
- VAR l: ARRAY 10 OF INTEGER;
- BEGIN l[5] := 15; ASSERT (Get (l, 5) = 15);
- END Procedure;
- PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
- BEGIN RETURN p[index];
- END Get;
- BEGIN Procedure;
- END Test.
- positive: reading two-dimensional local array
- MODULE Test;
- PROCEDURE Procedure;
- VAR l: ARRAY 10, 20 OF INTEGER;
- BEGIN Set (l, 5, 6, 15); ASSERT (l[5, 6] = 15);
- END Procedure;
- PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
- BEGIN p[index1, index2] := value;
- END Set;
- BEGIN Procedure;
- END Test.
- positive: writing two-dimensional local array
- MODULE Test;
- PROCEDURE Procedure;
- VAR l: ARRAY 10, 20 OF INTEGER;
- BEGIN l[5, 6] := 15; ASSERT (Get (l, 5, 6) = 15);
- END Procedure;
- PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
- BEGIN RETURN p[index1, index2];
- END Get;
- BEGIN Procedure;
- END Test.
- positive: indexing parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
- 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);
- END Procedure;
- BEGIN g[0] := 1; Procedure (g);
- END Test.
- negative: negative index into parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
- BEGIN index := -1; p[index] := 0;
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- negative: too large index into parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
- BEGIN index := LEN (p); p[index] := 0;
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- positive: reading parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
- BEGIN Set (p, 5, 15); ASSERT (p[5] = 15);
- END Procedure;
- PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
- BEGIN p[index] := value;
- END Set;
- BEGIN Procedure (g);
- END Test.
- positive: writing parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
- BEGIN p[5] := 15; ASSERT (Get (p, 5) = 15);
- END Procedure;
- PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
- BEGIN RETURN p[index];
- END Get;
- BEGIN Procedure (g);
- END Test.
- positive: reading two-dimensional parameter array
- MODULE Test;
- VAR g: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY 10, 20 OF INTEGER);
- BEGIN Set (p, 5, 6, 15); ASSERT (p[5, 6] = 15);
- END Procedure;
- PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
- BEGIN p[index1, index2] := value;
- END Set;
- BEGIN Procedure (g);
- END Test.
- positive: writing two-dimensional parameter array
- MODULE Test;
- VAR g: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY 10, 20 OF INTEGER);
- BEGIN p[5, 6] := 15; ASSERT (Get (p, 5, 6) = 15);
- END Procedure;
- PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
- BEGIN RETURN p[index1, index2];
- END Get;
- BEGIN Procedure (g);
- END Test.
- positive: indexing variable parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
- 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);
- END Procedure;
- 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);
- END Test.
- negative: negative index into variable parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
- BEGIN index := -1; p[index] := 0;
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- negative: too large index into variable parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
- BEGIN index := LEN (p); p[index] := 0;
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- positive: reading variable parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
- BEGIN Set (p, 5, 15); ASSERT (p[5] = 15);
- END Procedure;
- PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
- BEGIN p[index] := value;
- END Set;
- BEGIN Procedure (g); ASSERT (g[5] = 15);
- END Test.
- positive: writing variable parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
- BEGIN p[5] := 15; ASSERT (Get (p, 5) = 15);
- END Procedure;
- PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
- BEGIN RETURN p[index];
- END Get;
- BEGIN Procedure (g); ASSERT (Get (g, 5) = 15); ASSERT (g[5] = 15);
- END Test.
- positive: reading two-dimensional variable parameter array
- MODULE Test;
- VAR g: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY 10, 20 OF INTEGER);
- BEGIN Set (p, 5, 6, 15); ASSERT (p[5, 6] = 15);
- END Procedure;
- PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
- BEGIN p[index1, index2] := value;
- END Set;
- BEGIN Procedure (g); ASSERT (g[5, 6] = 15);
- END Test.
- positive: writing two-dimensional variable parameter array
- MODULE Test;
- VAR g: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY 10, 20 OF INTEGER);
- BEGIN p[5, 6] := 15; ASSERT (Get (p, 5, 6) = 15);
- END Procedure;
- PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
- BEGIN RETURN p[index1, index2];
- END Get;
- BEGIN Procedure (g); ASSERT (Get (g, 5, 6) = 15); ASSERT (g[5, 6] = 15);
- END Test.
- positive: indexing constant parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY 10 OF INTEGER);
- BEGIN ASSERT (p[0] = 1); ASSERT (p[1] = 2); ASSERT (p[p[0]] = 2); ASSERT (p[p[p[0]]] = 10);
- END Procedure;
- BEGIN g[0] := 1; g[1] := 2; g[2] := LEN (g); Procedure (g);
- END Test.
- negative: negative index into constant parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (CONST p: ARRAY 10 OF INTEGER);
- BEGIN index := -1; index := p[index];
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- negative: too large index into constant parameter array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (CONST p: ARRAY 10 OF INTEGER);
- BEGIN index := LEN (p); index := p[index];
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- positive: indexing open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF INTEGER);
- 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);
- END Procedure;
- BEGIN g[0] := 1; Procedure (g);
- END Test.
- negative: negative index into open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (p: ARRAY OF INTEGER);
- BEGIN index := -1; p[index] := 0;
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- negative: too large index into open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (p: ARRAY OF INTEGER);
- BEGIN index := LEN (p); p[index] := 0;
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- positive: reading open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF INTEGER);
- BEGIN Set (p, 5, 15); ASSERT (p[5] = 15);
- END Procedure;
- PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
- BEGIN p[index] := value;
- END Set;
- BEGIN Procedure (g);
- END Test.
- positive: writing open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF INTEGER);
- BEGIN p[5] := 15; ASSERT (Get (p, 5) = 15);
- END Procedure;
- PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
- BEGIN RETURN p[index];
- END Get;
- BEGIN Procedure (g);
- END Test.
- positive: reading two-dimensional open array
- MODULE Test;
- VAR g: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER);
- BEGIN Set (p, 5, 6, 15); ASSERT (p[5, 6] = 15);
- END Procedure;
- PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
- BEGIN p[index1, index2] := value;
- END Set;
- BEGIN Procedure (g);
- END Test.
- positive: writing two-dimensional open array
- MODULE Test;
- VAR g: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF ARRAY OF INTEGER);
- BEGIN p[5, 6] := 15; ASSERT (Get (p, 5, 6) = 15);
- END Procedure;
- PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
- BEGIN RETURN p[index1, index2];
- END Get;
- BEGIN Procedure (g);
- END Test.
- positive: indexing variable open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
- 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);
- END Procedure;
- 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);
- END Test.
- negative: negative index into variable open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
- BEGIN index := -1; p[index] := 0;
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- negative: too large index into variable open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
- BEGIN index := LEN (p); p[index] := 0;
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- positive: reading variable open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
- BEGIN Set (p, 5, 15); ASSERT (p[5] = 15);
- END Procedure;
- PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
- BEGIN p[index] := value;
- END Set;
- BEGIN Procedure (g); ASSERT (g[5] = 15);
- END Test.
- positive: writing variable open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
- BEGIN p[5] := 15; ASSERT (Get (p, 5) = 15);
- END Procedure;
- PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
- BEGIN RETURN p[index];
- END Get;
- BEGIN Procedure (g); ASSERT (Get (g, 5) = 15); ASSERT (g[5] = 15);
- END Test.
- positive: reading two-dimensional variable open array
- MODULE Test;
- VAR g: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER);
- BEGIN Set (p, 5, 6, 15); ASSERT (p[5, 6] = 15);
- END Procedure;
- PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
- BEGIN p[index1, index2] := value;
- END Set;
- BEGIN Procedure (g); ASSERT (g[5, 6] = 15);
- END Test.
- positive: writing two-dimensional variable open array
- MODULE Test;
- VAR g: ARRAY 10, 20 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF ARRAY OF INTEGER);
- BEGIN p[5, 6] := 15; ASSERT (Get (p, 5, 6) = 15);
- END Procedure;
- PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
- BEGIN RETURN p[index1, index2];
- END Get;
- BEGIN Procedure (g); ASSERT (Get (g, 5, 6) = 15); ASSERT (g[5, 6] = 15);
- END Test.
- positive: indexing constant open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (CONST p: ARRAY OF INTEGER);
- BEGIN ASSERT (p[0] = 1); ASSERT (p[1] = 2); ASSERT (p[p[0]] = 2); ASSERT (p[p[p[0]]] = 10);
- END Procedure;
- BEGIN g[0] := 1; g[1] := 2; g[2] := LEN (g); Procedure (g);
- END Test.
- negative: negative index into constant open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (p: ARRAY OF INTEGER);
- BEGIN index := -1; p[index] := 0;
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- negative: too large index into constant open array
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER; index: LONGINT;
- PROCEDURE Procedure (p: ARRAY OF INTEGER);
- BEGIN index := LEN (p); p[index] := 0;
- END Procedure;
- BEGIN Procedure (g);
- END Test.
- positive: indexing pointer to array
- MODULE Test;
- VAR g: POINTER TO ARRAY 10 OF INTEGER;
- 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);
- END Test.
- negative: negative index into pointer to array
- MODULE Test;
- VAR g: POINTER TO ARRAY 10 OF INTEGER; index: LONGINT;
- BEGIN NEW (g); index := -1; g[index] := 0;
- END Test.
- negative: too large index into pointer to array
- MODULE Test;
- VAR g: POINTER TO ARRAY 10 OF INTEGER; index: LONGINT;
- BEGIN NEW (g); index := LEN (g^); g[index] := 0;
- END Test.
- positive: reading pointer to array
- MODULE Test;
- VAR g: POINTER TO ARRAY 10 OF INTEGER;
- PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
- BEGIN p[index] := value;
- END Set;
- BEGIN NEW (g); Set (g^, 5, 15); ASSERT (g[5] = 15);
- END Test.
- positive: writing pointer to array
- MODULE Test;
- VAR g: POINTER TO ARRAY 10 OF INTEGER;
- PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
- BEGIN RETURN p[index];
- END Get;
- BEGIN NEW (g); g[5] := 15; ASSERT (Get (g^, 5) = 15);
- END Test.
- positive: reading two-dimensional pointer to array
- MODULE Test;
- VAR g: POINTER TO ARRAY 10, 20 OF INTEGER;
- PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
- BEGIN p[index1, index2] := value;
- END Set;
- BEGIN NEW (g); Set (g^, 5, 6, 15); ASSERT (g[5, 6] = 15);
- END Test.
- positive: writing two-dimensional pointer to array
- MODULE Test;
- VAR g: POINTER TO ARRAY 10, 20 OF INTEGER;
- PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
- BEGIN RETURN p[index1, index2];
- END Get;
- BEGIN NEW (g); g[5, 6] := 15; ASSERT (Get (g^, 5, 6) = 15);
- END Test.
- positive: indexing pointer to open array
- MODULE Test;
- VAR g: POINTER TO ARRAY OF INTEGER;
- 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);
- END Test.
- negative: negative index into pointer to open array
- MODULE Test;
- VAR g: POINTER TO ARRAY OF INTEGER; index: LONGINT;
- BEGIN NEW (g, 10); index := -1; g[index] := 0;
- END Test.
- negative: too large index into pointer to open array
- MODULE Test;
- VAR g: POINTER TO ARRAY OF INTEGER; index: LONGINT;
- BEGIN NEW (g, 10); index := LEN (g^); g[index] := 0;
- END Test.
- positive: reading pointer to open array
- MODULE Test;
- VAR g: POINTER TO ARRAY OF INTEGER;
- PROCEDURE Set (VAR p: ARRAY OF INTEGER; index, value: INTEGER);
- BEGIN p[index] := value;
- END Set;
- BEGIN NEW (g, 10); Set (g^, 5, 15); ASSERT (g[5] = 15);
- END Test.
- positive: writing pointer to open array
- MODULE Test;
- VAR g: POINTER TO ARRAY OF INTEGER;
- PROCEDURE Get (CONST p: ARRAY OF INTEGER; index: INTEGER): INTEGER;
- BEGIN RETURN p[index];
- END Get;
- BEGIN NEW (g, 10); g[5] := 15; ASSERT (Get (g^, 5) = 15);
- END Test.
- positive: reading two-dimensional pointer to open array
- MODULE Test;
- VAR g: POINTER TO ARRAY OF ARRAY OF INTEGER;
- PROCEDURE Set (VAR p: ARRAY OF ARRAY OF INTEGER; index1, index2, value: INTEGER);
- BEGIN p[index1, index2] := value;
- END Set;
- BEGIN NEW (g, 10, 20); Set (g^, 5, 6, 15); ASSERT (g[5, 6] = 15);
- END Test.
- positive: writing two-dimensional pointer to open array
- MODULE Test;
- VAR g: POINTER TO ARRAY OF ARRAY OF INTEGER;
- PROCEDURE Get (CONST p: ARRAY OF ARRAY OF INTEGER; index1, index2: INTEGER): INTEGER;
- BEGIN RETURN p[index1, index2];
- END Get;
- BEGIN NEW (g, 10, 20); g[5, 6] := 15; ASSERT (Get (g^, 5, 6) = 15);
- END Test.
- # modifying parameters
- positive: modifying boolean parameter
- MODULE Test;
- VAR g: BOOLEAN;
- PROCEDURE Procedure (p: BOOLEAN);
- BEGIN ASSERT (p); p := FALSE; ASSERT (~p); ASSERT (g);
- END Procedure;
- BEGIN g := TRUE; Procedure (g); ASSERT (g);
- END Test.
- positive: modifying character parameter
- MODULE Test;
- VAR g: CHAR;
- PROCEDURE Procedure (p: CHAR);
- BEGIN ASSERT (p = 'c'); p := 'Z'; ASSERT (p = 'Z'); ASSERT (g = 'c');
- END Procedure;
- BEGIN g := 'c'; Procedure (g); ASSERT (g = 'c');
- END Test.
- positive: modifying integer parameter
- MODULE Test;
- VAR g: INTEGER;
- PROCEDURE Procedure (p: INTEGER);
- BEGIN ASSERT (p = 2); INC (p); ASSERT (p = 3); ASSERT (g = 2);
- END Procedure;
- BEGIN g := 2; Procedure (g); ASSERT (g = 2);
- END Test.
- positive: modifying real parameter
- MODULE Test;
- VAR g: REAL;
- PROCEDURE Procedure (p: REAL);
- BEGIN ASSERT (p = 2.5); p := p * 2; ASSERT (p = 5); ASSERT (g = 2.5);
- END Procedure;
- BEGIN g := 2.5; Procedure (g); ASSERT (g = 2.5);
- END Test.
- positive: modifying set parameter
- MODULE Test;
- VAR g: SET;
- PROCEDURE Procedure (p: SET);
- BEGIN ASSERT (p = {3}); INCL (p, 2); INCL (p, 4); ASSERT (p = {2 .. 4}); ASSERT (g = {3});
- END Procedure;
- BEGIN g := {3}; Procedure (g); ASSERT (g = {3});
- END Test.
- positive: modifying array parameter
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY 10 OF INTEGER);
- 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);
- END Procedure;
- BEGIN g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 23); ASSERT (g[8] = 91);
- END Test.
- positive: modifying open array parameter
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: ARRAY OF INTEGER);
- 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);
- END Procedure;
- BEGIN g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 23); ASSERT (g[8] = 91);
- END Test.
- positive: modifying character array parameter
- MODULE Test;
- VAR g: ARRAY 10 OF CHAR;
- PROCEDURE Procedure (p: ARRAY 10 OF CHAR);
- BEGIN ASSERT (p = "value"); p := "modified"; ASSERT (p = "modified"); ASSERT (g = "value");
- END Procedure;
- BEGIN g := "value"; Procedure (g); ASSERT (g = "value");
- END Test.
- positive: modifying open character array parameter
- MODULE Test;
- VAR g: ARRAY 10 OF CHAR;
- PROCEDURE Procedure (p: ARRAY OF CHAR);
- BEGIN ASSERT (p = "value"); p := "modified"; ASSERT (p = "modified"); ASSERT (g = "value");
- END Procedure;
- BEGIN g := "value"; Procedure (g); ASSERT (g = "value");
- END Test.
- positive: modifying record parameter
- MODULE Test;
- TYPE Record = RECORD x: INTEGER END;
- VAR g: Record;
- PROCEDURE Procedure (p: Record);
- BEGIN ASSERT (p.x = 15); p.x := p.x * 3; ASSERT (p.x = 45); ASSERT (g.x = 15);
- END Procedure;
- BEGIN g.x := 15; Procedure (g); ASSERT (g.x = 15);
- END Test.
- positive: modifying object parameter
- MODULE Test;
- TYPE Object = OBJECT VAR x: INTEGER END Object;
- VAR g: Object;
- PROCEDURE Procedure (p: Object);
- BEGIN ASSERT (p.x = 20); p.x := 10; ASSERT (p.x = 10); ASSERT (g.x = 10);
- END Procedure;
- BEGIN NEW (g); g.x := 20; Procedure (g); ASSERT (g.x = 10);
- END Test.
- positive: modifying object reference parameter
- MODULE Test;
- TYPE Object = OBJECT END Object;
- VAR g: Object;
- PROCEDURE Procedure (p: Object);
- BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g # NIL);
- END Procedure;
- BEGIN NEW (g); Procedure (g); ASSERT (g # NIL);
- END Test.
- positive: modifying pointer to array parameter
- MODULE Test;
- VAR g: POINTER TO ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: POINTER TO ARRAY 10 OF INTEGER);
- 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);
- END Procedure;
- BEGIN NEW (g); g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
- END Test.
- positive: modifying pointer to open array parameter
- MODULE Test;
- VAR g: POINTER TO ARRAY OF INTEGER;
- PROCEDURE Procedure (p: POINTER TO ARRAY OF INTEGER);
- 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);
- END Procedure;
- BEGIN NEW (g, 10); g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
- END Test.
- positive: modifying pointer to character array parameter
- MODULE Test;
- VAR g: POINTER TO ARRAY 10 OF CHAR;
- PROCEDURE Procedure (p: POINTER TO ARRAY 10 OF CHAR);
- BEGIN ASSERT (p^ = "value"); p^ := "modified"; ASSERT (p^ = "modified"); ASSERT (g^ = "modified");
- END Procedure;
- BEGIN NEW (g); g^ := "value"; Procedure (g); ASSERT (g^ = "modified");
- END Test.
- positive: modifying pointer to open character array parameter
- MODULE Test;
- VAR g: POINTER TO ARRAY OF CHAR;
- PROCEDURE Procedure (p: POINTER TO ARRAY OF CHAR);
- BEGIN ASSERT (p^ = "value"); p^ := "modified"; ASSERT (p^ = "modified"); ASSERT (g^ = "modified");
- END Procedure;
- BEGIN NEW (g, 10); g^ := "value"; Procedure (g); ASSERT (g^ = "modified");
- END Test.
- positive: modifying pointer to array reference parameter
- MODULE Test;
- VAR g: POINTER TO ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (p: POINTER TO ARRAY 10 OF INTEGER);
- BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g # NIL);
- END Procedure;
- BEGIN NEW (g); Procedure (g); ASSERT (g # NIL);
- END Test.
- positive: modifying pointer to record parameter
- MODULE Test;
- TYPE Record = RECORD x: INTEGER END;
- VAR g: POINTER TO Record;
- PROCEDURE Procedure (p: POINTER TO Record);
- BEGIN ASSERT (p.x = 15); p.x := p.x * 3; ASSERT (p.x = 45); ASSERT (g.x = 45);
- END Procedure;
- BEGIN NEW (g); g.x := 15; Procedure (g); ASSERT (g.x = 45);
- END Test.
- positive: modifying pointer to record reference parameter
- MODULE Test;
- TYPE Record = RECORD END;
- VAR g: POINTER TO Record;
- PROCEDURE Procedure (p: POINTER TO Record);
- BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g # NIL);
- END Procedure;
- BEGIN NEW (g); Procedure (g); ASSERT (g # NIL);
- END Test.
- positive: modifying procedure parameter
- MODULE Test;
- TYPE P = PROCEDURE (p: P);
- VAR g: P;
- PROCEDURE Procedure (p: P);
- BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g # NIL);
- END Procedure;
- BEGIN g := Procedure; Procedure (g); ASSERT (g # NIL);
- END Test.
- positive: modifying variable boolean parameter
- MODULE Test;
- VAR g: BOOLEAN;
- PROCEDURE Procedure (VAR p: BOOLEAN);
- BEGIN ASSERT (p); p := FALSE; ASSERT (~p); ASSERT (~g);
- END Procedure;
- BEGIN g := TRUE; Procedure (g); ASSERT (~g);
- END Test.
- positive: modifying variable character parameter
- MODULE Test;
- VAR g: CHAR;
- PROCEDURE Procedure (VAR p: CHAR);
- BEGIN ASSERT (p = 'c'); p := 'Z'; ASSERT (p = 'Z'); ASSERT (g = 'Z');
- END Procedure;
- BEGIN g := 'c'; Procedure (g); ASSERT (g = 'Z');
- END Test.
- positive: modifying variable integer parameter
- MODULE Test;
- VAR g: INTEGER;
- PROCEDURE Procedure (VAR p: INTEGER);
- BEGIN ASSERT (p = 2); INC (p); ASSERT (p = 3); ASSERT (g = 3);
- END Procedure;
- BEGIN g := 2; Procedure (g); ASSERT (g = 3);
- END Test.
- positive: modifying variable real parameter
- MODULE Test;
- VAR g: REAL;
- PROCEDURE Procedure (VAR p: REAL);
- BEGIN ASSERT (p = 2.5); p := p * 2; ASSERT (p = 5); ASSERT (g = 5);
- END Procedure;
- BEGIN g := 2.5; Procedure (g); ASSERT (g = 5);
- END Test.
- positive: modifying variable set parameter
- MODULE Test;
- VAR g: SET;
- PROCEDURE Procedure (VAR p: SET);
- BEGIN ASSERT (p = {3}); INCL (p, 2); INCL (p, 4); ASSERT (p = {2 .. 4}); ASSERT (g = {2 .. 4});
- END Procedure;
- BEGIN g := {3}; Procedure (g); ASSERT (g = {2 .. 4});
- END Test.
- positive: modifying variable array parameter
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY 10 OF INTEGER);
- 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);
- END Procedure;
- BEGIN g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
- END Test.
- positive: modifying variable open array parameter
- MODULE Test;
- VAR g: ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: ARRAY OF INTEGER);
- 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);
- END Procedure;
- BEGIN g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
- END Test.
- positive: modifying variable character array parameter
- MODULE Test;
- VAR g: ARRAY 10 OF CHAR;
- PROCEDURE Procedure (VAR p: ARRAY 10 OF CHAR);
- BEGIN ASSERT (p = "value"); p := "modified"; ASSERT (p = "modified"); ASSERT (g = "modified");
- END Procedure;
- BEGIN g := "value"; Procedure (g); ASSERT (g = "modified");
- END Test.
- positive: modifying variable open character array parameter
- MODULE Test;
- VAR g: ARRAY 10 OF CHAR;
- PROCEDURE Procedure (VAR p: ARRAY OF CHAR);
- BEGIN ASSERT (p = "value"); p := "modified"; ASSERT (p = "modified"); ASSERT (g = "modified");
- END Procedure;
- BEGIN g := "value"; Procedure (g); ASSERT (g = "modified");
- END Test.
- positive: modifying variable record parameter
- MODULE Test;
- TYPE Record = RECORD x: INTEGER END;
- VAR g: Record;
- PROCEDURE Procedure (VAR p: Record);
- BEGIN ASSERT (p.x = 15); p.x := p.x * 3; ASSERT (p.x = 45); ASSERT (g.x = 45);
- END Procedure;
- BEGIN g.x := 15; Procedure (g); ASSERT (g.x = 45);
- END Test.
- positive: modifying variable object parameter
- MODULE Test;
- TYPE Object = OBJECT VAR x: INTEGER END Object;
- VAR g: Object;
- PROCEDURE Procedure (VAR p: Object);
- BEGIN ASSERT (p.x = 20); p.x := 10; ASSERT (p.x = 10); ASSERT (g.x = 10);
- END Procedure;
- BEGIN NEW (g); g.x := 20; Procedure (g); ASSERT (g.x = 10);
- END Test.
- positive: modifying variable object reference parameter
- MODULE Test;
- TYPE Object = OBJECT END Object;
- VAR g: Object;
- PROCEDURE Procedure (VAR p: Object);
- BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g = NIL);
- END Procedure;
- BEGIN NEW (g); Procedure (g); ASSERT (g = NIL);
- END Test.
- positive: modifying variable pointer to array parameter
- MODULE Test;
- VAR g: POINTER TO ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: POINTER TO ARRAY 10 OF INTEGER);
- 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);
- END Procedure;
- BEGIN NEW (g); g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
- END Test.
- positive: modifying variable pointer to open array parameter
- MODULE Test;
- VAR g: POINTER TO ARRAY OF INTEGER;
- PROCEDURE Procedure (VAR p: POINTER TO ARRAY OF INTEGER);
- 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);
- END Procedure;
- BEGIN NEW (g, 10); g[1] := 23; g[8] := 91; Procedure (g); ASSERT (g[1] = 32); ASSERT (g[8] = 19);
- END Test.
- positive: modifying variable pointer to character array parameter
- MODULE Test;
- VAR g: POINTER TO ARRAY 10 OF CHAR;
- PROCEDURE Procedure (VAR p: POINTER TO ARRAY 10 OF CHAR);
- BEGIN ASSERT (p^ = "value"); p^ := "modified"; ASSERT (p^ = "modified"); ASSERT (g^ = "modified");
- END Procedure;
- BEGIN NEW (g); g^ := "value"; Procedure (g); ASSERT (g^ = "modified");
- END Test.
- positive: modifying variable pointer to open character array parameter
- MODULE Test;
- VAR g: POINTER TO ARRAY OF CHAR;
- PROCEDURE Procedure (VAR p: POINTER TO ARRAY OF CHAR);
- BEGIN ASSERT (p^ = "value"); p^ := "modified"; ASSERT (p^ = "modified"); ASSERT (g^ = "modified");
- END Procedure;
- BEGIN NEW (g, 10); g^ := "value"; Procedure (g); ASSERT (g^ = "modified");
- END Test.
- positive: modifying variable pointer to array reference parameter
- MODULE Test;
- VAR g: POINTER TO ARRAY 10 OF INTEGER;
- PROCEDURE Procedure (VAR p: POINTER TO ARRAY 10 OF INTEGER);
- BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g = NIL);
- END Procedure;
- BEGIN NEW (g); Procedure (g); ASSERT (g = NIL);
- END Test.
- positive: modifying variable pointer to record parameter
- MODULE Test;
- TYPE Record = RECORD x: INTEGER END;
- VAR g: POINTER TO Record;
- PROCEDURE Procedure (VAR p: POINTER TO Record);
- BEGIN ASSERT (p.x = 15); p.x := p.x * 3; ASSERT (p.x = 45); ASSERT (g.x = 45);
- END Procedure;
- BEGIN NEW (g); g.x := 15; Procedure (g); ASSERT (g.x = 45);
- END Test.
- positive: modifying variable pointer to record reference parameter
- MODULE Test;
- TYPE Record = RECORD END;
- VAR g: POINTER TO Record;
- PROCEDURE Procedure (VAR p: POINTER TO Record);
- BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g = NIL);
- END Procedure;
- BEGIN NEW (g); Procedure (g); ASSERT (g = NIL);
- END Test.
- positive: modifying variable procedure parameter
- MODULE Test;
- TYPE P = PROCEDURE (VAR p: P);
- VAR g: P;
- PROCEDURE Procedure (VAR p: P);
- BEGIN ASSERT (p # NIL); p := NIL; ASSERT (p = NIL); ASSERT (g = NIL);
- END Procedure;
- BEGIN g := Procedure; Procedure (g); ASSERT (g = NIL);
- END Test.
- # if statement
- positive: if statement with satisfied condition
- MODULE Test;
- VAR i: INTEGER;
- BEGIN i := 0; IF i = 0 THEN ELSIF i = 1 THEN HALT (1234) ELSIF i = 2 THEN HALT (1234) ELSE HALT (1234) END;
- IF i = 0 THEN RETURN ELSIF i = 1 THEN ELSIF i = 2 THEN ELSE END; HALT (1234);
- END Test.
- positive: if statement with unsatisfied condition
- MODULE Test;
- VAR i: INTEGER;
- BEGIN i := 2; IF i = 0 THEN HALT (1234) ELSIF i = 1 THEN HALT (1234) ELSIF i = 2 THEN ELSE HALT (1234) END;
- IF i = 0 THEN ELSIF i = 1 THEN ELSIF i = 2 THEN RETURN ELSE END; HALT (1234);
- END Test.
- positive: else if statement with unsatisfied condition
- MODULE Test;
- VAR i: INTEGER;
- BEGIN i := 4; IF i = 0 THEN HALT (1234) ELSIF i = 1 THEN HALT (1234) ELSIF i = 2 THEN HALT (1234) ELSE END;
- IF i = 0 THEN ELSIF i = 1 THEN ELSIF i = 2 THEN ELSE RETURN END; HALT (1234);
- END Test.
- # exit statement
- positive: unconditional exit statement
- MODULE Test;
- BEGIN LOOP EXIT; HALT (1234) END;
- END Test.
- positive: nested unconditional exit statement
- MODULE Test;
- BEGIN LOOP LOOP EXIT; HALT (1234) END; EXIT; HALT (1234) END;
- END Test.
- positive: conditional exit statement
- MODULE Test;
- VAR i: INTEGER;
- BEGIN i := 0; LOOP IF i = 0 THEN EXIT END; HALT (1234) END;
- END Test.
- positive: nested conditional exit statement
- MODULE Test;
- VAR i: INTEGER;
- BEGIN i := 0; LOOP LOOP IF i = 0 THEN EXIT END; HALT (1234) END; EXIT; HALT (1234) END;
- END Test.
- # case statement
- positive: case statement with character value
- MODULE Test;
- PROCEDURE Case (c: CHAR): INTEGER;
- BEGIN CASE c OF | 'a', 't', 'j': RETURN 0 | 'l'..'o': RETURN 1 | 'r', 'b', 10X: RETURN 2 ELSE RETURN 3; END; HALT (1234);
- END Case;
- BEGIN ASSERT (Case ('a') = 0); ASSERT (Case ('b') = 2); ASSERT (Case ('c') = 3); ASSERT (Case ('j') = 0); ASSERT (Case ('n') = 1);
- ASSERT (Case ('o') = 1); ASSERT (Case ('r') = 2); ASSERT (Case ('t') = 0); ASSERT (Case ('z') = 3); ASSERT (Case (10X) = 2);
- END Test.
- negative: case statement with too low character value
- MODULE Test;
- VAR c: CHAR;
- BEGIN c := 'a'; CASE c OF | 'b'..'g': | 's', 'r': | 'u', 'v': END;
- END Test.
- negative: case statement with too high character value
- MODULE Test;
- VAR c: CHAR;
- BEGIN c := 'w'; CASE c OF | 'b'..'g': | 's', 'r': | 'u', 'v': END;
- END Test.
- negative: case statement with unmatched character value
- MODULE Test;
- VAR c: CHAR;
- BEGIN c := 't'; CASE c OF | 'b'..'g': | 's', 'r': | 'u', 'v': END;
- END Test.
- positive: case statement with integer value
- MODULE Test;
- PROCEDURE Case (i: INTEGER): INTEGER;
- BEGIN CASE i OF | 1, 3, 9: RETURN 0 | 4..6: RETURN 1 | 8, 2: RETURN 2 ELSE RETURN 3; END; HALT (1234);
- END Case;
- BEGIN ASSERT (Case (0) = 3); ASSERT (Case (1) = 0); ASSERT (Case (2) = 2); ASSERT (Case (3) = 0); ASSERT (Case (4) = 1);
- ASSERT (Case (5) = 1); ASSERT (Case (6) = 1); ASSERT (Case (7) = 3); ASSERT (Case (8) = 2); ASSERT (Case (9) = 0);
- END Test.
- negative: case statement with too low integer value
- MODULE Test;
- VAR i: INTEGER;
- BEGIN i := 0; CASE i OF | 1, 3, 9: | 4..6: | 8, 2: END;
- END Test.
- negative: case statement with too high integer value
- MODULE Test;
- VAR i: INTEGER;
- BEGIN i := 10; CASE i OF | 1, 3, 9: | 4..6: | 8, 2: END;
- END Test.
- negative: case statement with unmatched integer value
- MODULE Test;
- VAR i: INTEGER;
- BEGIN i := 7; CASE i OF | 1, 3, 9: | 4..6: | 8, 2: END;
- END Test.
- # for statement
- positive: for statement with positive step sizes
- MODULE Test;
- VAR i, steps: INTEGER;
- BEGIN
- steps := 0; FOR i := 0 TO 10 DO INC (steps) END; ASSERT (steps = 11);
- steps := 0; FOR i := 0 TO 10 BY 1 DO INC (steps) END; ASSERT (steps = 11);
- steps := 0; FOR i := 0 TO 10 BY 2 DO INC (steps) END; ASSERT (steps = 6);
- steps := 0; FOR i := 0 TO 10 BY 3 DO INC (steps) END; ASSERT (steps = 4);
- steps := 0; FOR i := 0 TO 10 BY 4 DO INC (steps) END; ASSERT (steps = 3);
- END Test.
- positive: for statement with negative step sizes
- MODULE Test;
- VAR i, steps: INTEGER;
- BEGIN
- steps := 0; FOR i := 10 TO 0 DO INC (steps) END; ASSERT (steps = 0);
- steps := 0; FOR i := 10 TO 0 BY -1 DO INC (steps) END; ASSERT (steps = 11);
- steps := 0; FOR i := 10 TO 0 BY -2 DO INC (steps) END; ASSERT (steps = 6);
- steps := 0; FOR i := 10 TO 0 BY -3 DO INC (steps) END; ASSERT (steps = 4);
- steps := 0; FOR i := 10 TO 0 BY -4 DO INC (steps) END; ASSERT (steps = 3);
- END Test.
- positive: modifying start counter in for statement
- MODULE Test;
- VAR i, steps, start: INTEGER;
- BEGIN steps := 0; start := 0; FOR i := start TO 10 DO start := i; INC (steps) END; ASSERT (steps = 11);
- END Test.
- positive: modifying end counter in for statement
- MODULE Test;
- VAR i, steps, end: INTEGER;
- BEGIN steps := 0; end := 10; FOR i := 0 TO end DO end := i; INC (steps) END; ASSERT (steps = 11);
- END Test.
- positive: using counter as end counter for statement
- MODULE Test;
- VAR i, steps: INTEGER;
- BEGIN steps := 0; i := 10; FOR i := 0 TO i DO INC (steps) END; ASSERT (steps = 1);
- END Test.
- # new statement
- positive: new statement on pointer to record
- MODULE Test;
- VAR p: POINTER TO RECORD a, b: INTEGER END;
- BEGIN NEW (p); p.a := 3; p.b := p.a; ASSERT (p.b = 3);
- END Test.
- positive: new statement on pointer to too large record
- MODULE Test;
- VAR p: POINTER TO RECORD data*: ARRAY MAX (LONGINT) DIV 16 - 1000 OF INTEGER END;
- BEGIN (*! NEW (p); ASSERT (p = NIL); *)
- END Test.
- positive: new statement on pointer to array
- MODULE Test;
- VAR p: POINTER TO ARRAY 10 OF INTEGER;
- BEGIN NEW (p); p[2] := 3; p[1] := p[2]; ASSERT (p[2] = 3);
- END Test.
- positive: new statement on pointer to too large array
- MODULE Test;
- VAR r: POINTER TO ARRAY MAX (LONGINT) DIV 16 - 1000 OF INTEGER;
- BEGIN (*! NEW (r); ASSERT (r = NIL); *)
- END Test.
- positive: new statement on pointer to open array
- MODULE Test;
- VAR p: POINTER TO ARRAY OF INTEGER;
- BEGIN NEW (p, 10); p[2] := 3; p[1] := p[2]; ASSERT (p[2] = 3);
- END Test.
- negative: new statement on pointer to open array with negative size
- MODULE Test;
- VAR p: POINTER TO ARRAY OF INTEGER; size: INTEGER;
- BEGIN size := -10; NEW (p, size);
- END Test.
- positive: new statement on pointer to too large open array
- MODULE Test;
- VAR r: POINTER TO ARRAY OF INTEGER;
- BEGIN (*! NEW (r, MAX (LONGINT) DIV 2 - 1000); ASSERT (r = NIL); *)
- END Test.
- positive: new statement on object
- MODULE Test;
- VAR o: OBJECT VAR a, b: INTEGER END;
- BEGIN NEW (o); o.a := 3; o.b := o.a; ASSERT (o.b = 3);
- END Test.
- positive: new statement on too large object
- MODULE Test;
- VAR o: OBJECT VAR data*: ARRAY MAX (LONGINT) DIV 16 - 1000 OF INTEGER END;
- BEGIN (*! NEW (o); ASSERT (o = NIL); *)
- END Test.
- positive: new statement modifying designator after object body
- MODULE Test;
- VAR o: OBJECT PROCEDURE &Init; BEGIN ASSERT (o = NIL); END Init; BEGIN ASSERT (o # NIL); END;
- BEGIN o := NIL; NEW (o); ASSERT (o # NIL);
- END Test.
- # with statement
- positive: with statement with same global record
- MODULE Test;
- TYPE R = RECORD b: BOOLEAN END;
- VAR r: R;
- BEGIN r.b := TRUE; WITH r : R DO ASSERT (r.b) END;
- END Test.
- positive: with statement with same local record
- MODULE Test;
- PROCEDURE Procedure;
- TYPE R = RECORD b: BOOLEAN END;
- VAR r: R;
- BEGIN r.b := TRUE; WITH r : R DO ASSERT (r.b) END;
- END Procedure;
- BEGIN Procedure;
- END Test.
- positive: with statement with same parameter record
- MODULE Test;
- TYPE R = RECORD b: BOOLEAN END;
- VAR r: R;
- PROCEDURE Procedure (r: R); BEGIN WITH r : R DO ASSERT (r.b); END; END Procedure;
- BEGIN r.b := TRUE; Procedure (r);
- END Test.
- positive: with statement with same variable parameter record
- MODULE Test;
- TYPE R = RECORD b: BOOLEAN END;
- VAR r: R;
- PROCEDURE Procedure (VAR r: R); BEGIN WITH r : R DO ASSERT (r.b); END; END Procedure;
- BEGIN r.b := TRUE; Procedure (r);
- END Test.
- positive: with statement with same constant parameter record
- MODULE Test;
- TYPE R = RECORD b: BOOLEAN END;
- VAR r: R;
- PROCEDURE Procedure (CONST r: R); BEGIN WITH r : R DO ASSERT (r.b); END; END Procedure;
- BEGIN r.b := TRUE; Procedure (r);
- END Test.
- positive: with statement with variable parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
- VAR r: R1;
- PROCEDURE Procedure (VAR r: R0); BEGIN WITH r : R1 DO ASSERT (r.b); END; END Procedure;
- BEGIN r.b := TRUE; Procedure (r);
- END Test.
- negative: unsatisfied with statement with variable parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) END;
- VAR r: R0;
- PROCEDURE Procedure (VAR r: R0); BEGIN WITH r : R1 DO END; END Procedure;
- BEGIN Procedure (r);
- END Test.
- positive: with statement with constant parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) b: BOOLEAN END;
- VAR r: R1;
- PROCEDURE Procedure (CONST r: R0); BEGIN WITH r : R1 DO ASSERT (r.b); END; END Procedure;
- BEGIN r.b := TRUE; Procedure (r);
- END Test.
- negative: unsatisfied with statement with constant parameter record
- MODULE Test;
- TYPE R0 = RECORD END; R1 = RECORD (R0) END;
- VAR r: R0;
- PROCEDURE Procedure (CONST r: R0); BEGIN WITH r : R1 DO END; END Procedure;
- BEGIN Procedure (r);
- END Test.
- positive: with statement with same pointer to record
- MODULE Test;
- TYPE R = RECORD b: BOOLEAN END; P = POINTER TO R;
- VAR p: P;
- BEGIN NEW (p); p.b := TRUE; WITH p : P DO ASSERT (p.b); END;
- END Test.
- positive: with statement with pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0
- TYPE R1 = RECORD (R0) b: BOOLEAN END; P1 = POINTER TO R1;
- VAR p0: P0; p1: P1;
- BEGIN NEW (p1); p1.b := TRUE; p0 := p1; WITH p0 : P1 DO ASSERT (p0.b); END;
- END Test.
- negative: with statement with reassigned pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR p0: P0; p1: P1;
- PROCEDURE Reassign; BEGIN NEW (p0); END Reassign;
- BEGIN NEW (p1); p0 := p1; WITH p0 : P1 DO Reassign; p1 := p0; END;
- END Test.
- negative: unsatisfied with statement with pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0;
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR p0: P0;
- BEGIN NEW (p0); WITH p0 : P1 DO END;
- END Test.
- negative: with statement with nil pointer to same record
- MODULE Test;
- TYPE R = RECORD END; P = POINTER TO R;
- VAR p: P;
- BEGIN p := NIL; WITH p : P DO END;
- END Test.
- negative: with statement with nil pointer to record
- MODULE Test;
- TYPE R0 = RECORD END; P0 = POINTER TO R0;
- TYPE R1 = RECORD (R0) END; P1 = POINTER TO R1;
- VAR p0: P0;
- BEGIN p0 := NIL; WITH p0 : P1 DO END;
- END Test.
- positive: with statement with same object
- MODULE Test;
- TYPE O = OBJECT VAR b: BOOLEAN END O;
- VAR o: O;
- BEGIN NEW (o); o.b := TRUE; WITH o : O DO ASSERT (o.b); END;
- END Test.
- positive: with statement with object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
- VAR o0: O0; o1: O1;
- BEGIN NEW (o1); o1.b := TRUE; o0 := o1; WITH o0 : O1 DO ASSERT (o0.b); END;
- END Test.
- negative: with statement with reassigned object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0; o1: O1;
- PROCEDURE Reassign; BEGIN NEW (o0); END Reassign;
- BEGIN NEW (o1); o0 := o1; WITH o0 : O1 DO Reassign; o1 := o0; END;
- END Test.
- negative: unsatisfied with statement with object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0;
- BEGIN NEW (o0); WITH o0 : O1 DO END;
- END Test.
- negative: with statement with same nil object
- MODULE Test;
- TYPE O = OBJECT END O;
- VAR o: O;
- BEGIN o := NIL; WITH o : O DO END;
- END Test.
- negative: with statement with nil object
- MODULE Test;
- TYPE O0 = OBJECT END O0;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0;
- BEGIN o0 := NIL; WITH o0 : O1 DO END;
- END Test.
- positive: with statement with base object
- MODULE Test;
- TYPE O0 = OBJECT;
- TYPE O1 = OBJECT (O0) VAR b: BOOLEAN END O1;
- VAR o0: O0; o1: O1;
- BEGIN NEW (o1); o1.b := TRUE; o0 := o1; WITH o0 : O1 DO ASSERT (o0.b); END;
- END Test.
- negative: with statement with nil base object
- MODULE Test;
- TYPE O0 = OBJECT;
- TYPE O1 = OBJECT (O0) END O1;
- VAR o0: O0;
- BEGIN o0 := NIL; WITH o0 : O1 DO END;
- END Test.
- # nested procedures
- positive: access to global variable within nested procedure
- MODULE Test;
- VAR g: INTEGER;
- PROCEDURE Procedure;
- PROCEDURE Nested; BEGIN g := 45; END Nested;
- BEGIN Nested;
- END Procedure;
- BEGIN g := 0; Procedure; ASSERT (g = 45);
- END Test.
- positive: access to global variable within nested procedure called from nested procedure
- MODULE Test;
- VAR g: INTEGER;
- PROCEDURE Procedure;
- PROCEDURE Nested0; BEGIN Nested1; END Nested0;
- PROCEDURE Nested1; BEGIN g := 45; END Nested1;
- BEGIN Nested0;
- END Procedure;
- BEGIN g := 0; Procedure; ASSERT (g = 45);
- END Test.
- positive: access to object variable within nested procedure
- MODULE Test;
- VAR o: OBJECT
- VAR f: INTEGER;
- PROCEDURE Procedure;
- PROCEDURE Nested; BEGIN f := 45; END Nested;
- BEGIN Nested;
- END Procedure;
- BEGIN f := 0; Procedure; ASSERT (f = 45); END;
- BEGIN NEW (o);
- END Test.
- positive: access to object variable within nested procedure called from nested procedure
- MODULE Test;
- VAR o: OBJECT
- VAR f: INTEGER;
- PROCEDURE Procedure;
- PROCEDURE Nested0; BEGIN Nested1; END Nested0;
- PROCEDURE Nested1; BEGIN f := 45; END Nested1;
- BEGIN Nested0;
- END Procedure;
- BEGIN f := 0; Procedure; ASSERT (f = 45); END;
- BEGIN NEW (o);
- END Test.
- positive: access to local variable within nested procedure
- MODULE Test;
- PROCEDURE Procedure;
- VAR l: INTEGER;
- PROCEDURE Nested; BEGIN l := 45; END Nested;
- BEGIN l := 0; Nested; ASSERT (l = 45);
- END Procedure;
- BEGIN Procedure;
- END Test.
- positive: access to local variable within nested procedure called from nested procedure
- MODULE Test;
- PROCEDURE Procedure;
- VAR l: INTEGER;
- PROCEDURE Nested0; BEGIN Nested1; END Nested0;
- PROCEDURE Nested1; BEGIN l := 45; END Nested1;
- BEGIN l := 0; Nested0; ASSERT (l = 45);
- END Procedure;
- BEGIN Procedure;
- END Test.
- positive: access to parameter within nested procedure
- MODULE Test;
- PROCEDURE Procedure (p: INTEGER);
- PROCEDURE Nested; BEGIN p := 45; END Nested;
- BEGIN Nested; ASSERT (p = 45);
- END Procedure;
- BEGIN Procedure (0);
- END Test.
- positive: access to parameter within nested procedure called from nested procedure
- MODULE Test;
- PROCEDURE Procedure (p: INTEGER);
- PROCEDURE Nested0; BEGIN Nested1; END Nested0;
- PROCEDURE Nested1; BEGIN p := 45; END Nested1;
- BEGIN Nested0; ASSERT (p = 45);
- END Procedure;
- BEGIN Procedure (0);
- END Test.
- # methods
- positive: single method call
- MODULE Test;
- VAR object: OBJECT
- PROCEDURE Method; BEGIN ASSERT (i = 0); i := 1; END Method;
- END; i: INTEGER;
- BEGIN i := 0; NEW (object); object.Method; ASSERT (i = 1);
- END Test.
- positive: single super call
- MODULE Test;
- TYPE Object0 = OBJECT
- PROCEDURE Method; BEGIN ASSERT (i = 1); i := 2; END Method;
- END Object0;
- TYPE Object1 = OBJECT (Object0)
- PROCEDURE Method; BEGIN ASSERT (i = 0); i := 1; Method^; END Method;
- END Object1;
- VAR object: Object1; i: INTEGER;
- BEGIN i := 0; NEW (object); object.Method; ASSERT (i = 2);
- END Test.
- positive: double method call
- MODULE Test;
- VAR object: OBJECT
- PROCEDURE Method0; BEGIN ASSERT (i = 0); i := 1; Method1; END Method0;
- PROCEDURE Method1; BEGIN ASSERT (i = 1); i := 2; END Method1;
- END; i: INTEGER;
- BEGIN i := 0; NEW (object); object.Method0; ASSERT (i = 2);
- END Test.
- positive: double super call
- MODULE Test;
- TYPE Object0 = OBJECT
- PROCEDURE Method0; BEGIN ASSERT (i = 1); i := 2; Method1; END Method0;
- PROCEDURE Method1; BEGIN ASSERT (i = 3); i := 4; END Method1;
- END Object0;
- TYPE Object1 = OBJECT (Object0)
- PROCEDURE Method0; BEGIN ASSERT (i = 0); i := 1; Method0^; END Method0;
- PROCEDURE Method1; BEGIN ASSERT (i = 2); i := 3; Method1^; END Method1;
- END Object1;
- VAR object: Object1; i: INTEGER;
- BEGIN i := 0; NEW (object); object.Method0; ASSERT (i = 4);
- END Test.
- positive: single method call with initializer
- MODULE Test;
- VAR object: OBJECT VAR i: INTEGER;
- PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
- PROCEDURE Method; BEGIN ASSERT (i = 0); i := 1; END Method;
- END;
- BEGIN NEW (object, 0); object.Method; ASSERT (object.i = 1);
- END Test.
- positive: single super call with initializer
- MODULE Test;
- TYPE Object0 = OBJECT VAR i: INTEGER;
- PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
- PROCEDURE Method; BEGIN ASSERT (i = 1); i := 2; END Method;
- END Object0;
- TYPE Object1 = OBJECT (Object0)
- PROCEDURE &Init (i: INTEGER); BEGIN Init^ (i); END Init;
- PROCEDURE Method; BEGIN ASSERT (i = 0); i := 1; Method^; END Method;
- END Object1;
- VAR object: Object1;
- BEGIN NEW (object, 0); object.Method; ASSERT (object.i = 2);
- END Test.
- positive: double method call with initializer
- MODULE Test;
- VAR object: OBJECT VAR i: INTEGER;
- PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
- PROCEDURE Method0; BEGIN ASSERT (i = 0); i := 1; Method1; END Method0;
- PROCEDURE Method1; BEGIN ASSERT (i = 1); i := 2; END Method1;
- END;
- BEGIN NEW (object, 0); object.Method0; ASSERT (object.i = 2);
- END Test.
- positive: double super call with initializer
- MODULE Test;
- TYPE Object0 = OBJECT VAR i: INTEGER;
- PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
- PROCEDURE Method0; BEGIN ASSERT (i = 1); i := 2; Method1; END Method0;
- PROCEDURE Method1; BEGIN ASSERT (i = 3); i := 4; END Method1;
- END Object0;
- TYPE Object1 = OBJECT (Object0)
- PROCEDURE &Init (i: INTEGER); BEGIN Init^ (i); END Init;
- PROCEDURE Method0; BEGIN ASSERT (i = 0); i := 1; Method0^; END Method0;
- PROCEDURE Method1; BEGIN ASSERT (i = 2); i := 3; Method1^; END Method1;
- END Object1;
- VAR object: Object1;
- BEGIN NEW (object, 0); object.Method0; ASSERT (object.i = 4);
- END Test.
- positive: single method call with initializer and body
- MODULE Test;
- VAR object: OBJECT VAR i: INTEGER;
- PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
- PROCEDURE Method; BEGIN ASSERT (i = 1); i := 2; END Method;
- BEGIN ASSERT (i = 0); i := 1;
- END;
- BEGIN NEW (object, 0); object.Method; ASSERT (object.i = 2);
- END Test.
- positive: single super call with initializer and body
- MODULE Test;
- TYPE Object0 = OBJECT VAR i: INTEGER;
- PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
- PROCEDURE Method; BEGIN ASSERT (i = 3); i := 4; END Method;
- BEGIN ASSERT (i = 0); i := 1;
- END Object0;
- TYPE Object1 = OBJECT (Object0)
- PROCEDURE &Init (i: INTEGER); BEGIN Init^ (i); END Init;
- PROCEDURE Method; BEGIN ASSERT (i = 2); i := 3; Method^; END Method;
- BEGIN ASSERT (i = 1); i := 2;
- END Object1;
- VAR object: Object1;
- BEGIN NEW (object, 0); object.Method; ASSERT (object.i = 4);
- END Test.
- positive: double method call with initializer and body
- MODULE Test;
- VAR object: OBJECT VAR i: INTEGER;
- PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
- PROCEDURE Method0; BEGIN ASSERT (i = 1); i := 2; Method1; END Method0;
- PROCEDURE Method1; BEGIN ASSERT (i = 2); i := 3; END Method1;
- BEGIN ASSERT (i = 0); i := 1;
- END;
- BEGIN NEW (object, 0); object.Method0; ASSERT (object.i = 3);
- END Test.
- positive: double super call with initializer and body
- MODULE Test;
- TYPE Object0 = OBJECT VAR i: INTEGER;
- PROCEDURE &Init (i: INTEGER); BEGIN SELF.i := i; END Init;
- PROCEDURE Method0; BEGIN ASSERT (i = 3); i := 4; Method1; END Method0;
- PROCEDURE Method1; BEGIN ASSERT (i = 5); i := 6; END Method1;
- BEGIN ASSERT (i = 0); i := 1;
- END Object0;
- TYPE Object1 = OBJECT (Object0)
- PROCEDURE &Init (i: INTEGER); BEGIN Init^ (i); END Init;
- PROCEDURE Method0; BEGIN ASSERT (i = 2); i := 3; Method0^; END Method0;
- PROCEDURE Method1; BEGIN ASSERT (i = 4); i := 5; Method1^; END Method1;
- BEGIN ASSERT (i = 1); i := 2;
- END Object1;
- VAR object: Object1;
- BEGIN NEW (object, 0); object.Method0; ASSERT (object.i = 6);
- END Test.
- positive: call of object body
- MODULE Test;
- VAR o: OBJECT BEGIN b := TRUE END;
- VAR b: BOOLEAN;
- BEGIN b := FALSE; NEW(o); ASSERT(b);
- END Test.
- positive: call of object body chains
- MODULE Test;
- TYPE
- O = OBJECT BEGIN b1 := TRUE END O;
- O2=OBJECT(O) BEGIN b2 := b1 END O2;
- O3=OBJECT(O2) BEGIN b3 := b2 END O3;
- VAR b1,b2,b3: BOOLEAN; o: O3;
- BEGIN
- b1 := FALSE; b2 := FALSE; b3 := FALSE;
- NEW(o);
- ASSERT(b1); ASSERT(b2); ASSERT(b3);
- END Test.
- positive: call of object body chains with initializer
- MODULE Test;
- TYPE
- O = OBJECT BEGIN b1 := b0 END O;
- O2=OBJECT(O) BEGIN b2 := b1 END O2;
- O3=OBJECT(O2) PROCEDURE &Init; BEGIN b0 := TRUE END Init; BEGIN b3 := b2 END O3;
- VAR b0,b1,b2,b3: BOOLEAN; o: O3;
- BEGIN
- b0 := FALSE; b1 := FALSE; b2 := FALSE; b3 := FALSE;
- NEW(o);
- ASSERT(b0); ASSERT(b1); ASSERT(b2); ASSERT(b3);
- END Test.
- # copy statement
- positive: copy statement on array of character
- MODULE Test;
- VAR source, dest: ARRAY 20 OF CHAR;
- BEGIN source := "source"; COPY (source, dest); ASSERT (dest = "source");
- END Test.
- positive: copy statement on array of character and longer array of character
- MODULE Test;
- VAR source: ARRAY 20 OF CHAR; dest: ARRAY 30 OF CHAR;
- BEGIN source := "source"; COPY (source, dest); ASSERT (dest = "source");
- END Test.
- positive: copy statement on array of character and shorter array of character
- MODULE Test;
- VAR source: ARRAY 30 OF CHAR; dest: ARRAY 20 OF CHAR;
- BEGIN source := "source"; COPY (source, dest); ASSERT (dest = "source");
- END Test.
- positive: copy statement on string and longer array of character
- MODULE Test;
- CONST Source = "source";
- VAR dest: ARRAY 20 OF CHAR;
- BEGIN COPY (Source, dest); ASSERT (dest = Source);
- END Test.
- positive: copy statement on empty string and array of character
- MODULE Test;
- CONST Source = "";
- VAR dest: ARRAY 20 OF CHAR;
- BEGIN COPY (Source, dest); ASSERT (dest = Source); ASSERT (dest[0] = 0X);
- END Test.
- positive: copy statement with array of character parameter as source
- MODULE Test;
- PROCEDURE Procedure (source: ARRAY 20 OF CHAR);
- VAR dest: ARRAY 20 OF CHAR;
- BEGIN COPY (source, dest); ASSERT (dest = "source");
- END Procedure;
- BEGIN Procedure ("source");
- END Test.
- positive: copy statement with variable array of character parameter as source
- MODULE Test;
- VAR source: ARRAY 20 OF CHAR;
- PROCEDURE Procedure (VAR source: ARRAY 20 OF CHAR);
- VAR dest: ARRAY 20 OF CHAR;
- BEGIN COPY (source, dest); ASSERT (dest = "source");
- END Procedure;
- BEGIN source := "source"; Procedure (source);
- END Test.
- positive: copy statement with constant array of character parameter as source
- MODULE Test;
- PROCEDURE Procedure (CONST source: ARRAY 20 OF CHAR);
- VAR dest: ARRAY 20 OF CHAR;
- BEGIN COPY (source, dest); ASSERT (dest = "source");
- END Procedure;
- BEGIN Procedure ("source");
- END Test.
- positive: copy statement with open array of character parameter as source
- MODULE Test;
- PROCEDURE Procedure (source: ARRAY OF CHAR);
- VAR dest: ARRAY 20 OF CHAR;
- BEGIN COPY (source, dest); ASSERT (dest = "source");
- END Procedure;
- BEGIN Procedure ("source");
- END Test.
- positive: copy statement with too long open array of character parameter as source (truncate)
- MODULE Test;
- PROCEDURE Procedure (source: ARRAY OF CHAR);
- VAR dest: ARRAY 2 OF CHAR;
- BEGIN COPY (source, dest); ASSERT(dest="s");
- END Procedure;
- BEGIN Procedure ("source");
- END Test.
- positive: copy statement with open variable array of character parameter as source
- MODULE Test;
- VAR source: ARRAY 20 OF CHAR;
- PROCEDURE Procedure (VAR source: ARRAY OF CHAR);
- VAR dest: ARRAY 20 OF CHAR;
- BEGIN COPY (source, dest); ASSERT (dest = "source");
- END Procedure;
- BEGIN source := "source"; Procedure (source);
- END Test.
- positive: copy statement with too long open variable array of character parameter as source (truncate)
- MODULE Test;
- VAR source: ARRAY 20 OF CHAR;
- PROCEDURE Procedure (VAR source: ARRAY OF CHAR);
- VAR dest: ARRAY 2 OF CHAR;
- BEGIN COPY (source, dest);ASSERT(dest="s");
- END Procedure;
- BEGIN source := "source"; Procedure (source);
- END Test.
- positive: copy statement with open constant array of character parameter as source
- MODULE Test;
- PROCEDURE Procedure (CONST source: ARRAY OF CHAR);
- VAR dest: ARRAY 20 OF CHAR;
- BEGIN COPY (source, dest); ASSERT (dest = "source");
- END Procedure;
- BEGIN Procedure ("source");
- END Test.
- positive: copy statement with too long open constant array of character parameter as source (truncate)
- MODULE Test;
- PROCEDURE Procedure (CONST source: ARRAY OF CHAR);
- VAR dest: ARRAY 2 OF CHAR;
- BEGIN COPY (source, dest); ASSERT(dest="s");
- END Procedure;
- BEGIN Procedure ("source");
- END Test.
- positive: copy statement with array of character parameter as destination
- MODULE Test;
- PROCEDURE Procedure (dest: ARRAY 20 OF CHAR);
- VAR source: ARRAY 20 OF CHAR;
- BEGIN source := "source"; COPY (source, dest); ASSERT (dest = "source");
- END Procedure;
- BEGIN Procedure ("destination");
- END Test.
- positive: copy statement with variable array of character parameter as destination
- MODULE Test;
- VAR dest: ARRAY 20 OF CHAR;
- PROCEDURE Procedure (VAR dest: ARRAY 20 OF CHAR);
- VAR source: ARRAY 20 OF CHAR;
- BEGIN source := "source"; COPY (source, dest);
- END Procedure;
- BEGIN Procedure (dest); ASSERT (dest = "source");
- END Test.
- positive: copy statement with open array of character parameter as destination
- MODULE Test;
- PROCEDURE Procedure (dest: ARRAY OF CHAR);
- VAR source: ARRAY 20 OF CHAR;
- BEGIN source := "source"; COPY (source, dest); ASSERT (dest = "source");
- END Procedure;
- BEGIN Procedure ("destination");
- END Test.
- positive: copy statement with too short open array of character parameter as destination (truncate)
- MODULE Test;
- PROCEDURE Procedure (dest: ARRAY OF CHAR);
- VAR source: ARRAY 20 OF CHAR;
- BEGIN source := "source"; COPY (source, dest); ASSERT(dest="");
- END Procedure;
- BEGIN Procedure ("");
- END Test.
- positive: copy statement with open variable array of character parameter as destination
- MODULE Test;
- VAR dest: ARRAY 20 OF CHAR;
- PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
- VAR source: ARRAY 20 OF CHAR;
- BEGIN source := "source"; COPY (source, dest);
- END Procedure;
- BEGIN Procedure (dest); ASSERT (dest = "source");
- END Test.
- positive: copy statement with too short open variable array of character parameter as destination (truncate)
- MODULE Test;
- VAR dest: ARRAY 2 OF CHAR;
- PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
- VAR source: ARRAY 20 OF CHAR;
- BEGIN source := "source"; COPY (source, dest); ASSERT(dest="s");
- END Procedure;
- BEGIN Procedure (dest);
- END Test.
- positive: copy statement with string as source and array of character parameter as destination
- MODULE Test;
- CONST Source = "source";
- PROCEDURE Procedure (dest: ARRAY 20 OF CHAR);
- BEGIN COPY (Source, dest); ASSERT (dest = Source);
- END Procedure;
- BEGIN Procedure ("destination");
- END Test.
- positive: copy statement with empty string as source and array of character parameter as destination
- MODULE Test;
- CONST Source = "";
- PROCEDURE Procedure (dest: ARRAY 20 OF CHAR);
- BEGIN COPY (Source, dest); ASSERT (dest = Source); ASSERT (dest[0] = 0X);
- END Procedure;
- BEGIN Procedure ("destination");
- END Test.
- positive: copy statement with string as source and variable array of character parameter as destination
- MODULE Test;
- CONST Source = "source";
- VAR dest: ARRAY 20 OF CHAR;
- PROCEDURE Procedure (VAR dest: ARRAY 20 OF CHAR);
- BEGIN COPY (Source, dest);
- END Procedure;
- BEGIN Procedure (dest); ASSERT (dest = Source);
- END Test.
- positive: copy statement with empty string as source and variable array of character parameter as destination
- MODULE Test;
- CONST Source = "";
- VAR dest: ARRAY 20 OF CHAR;
- PROCEDURE Procedure (VAR dest: ARRAY 20 OF CHAR);
- BEGIN COPY (Source, dest);
- END Procedure;
- BEGIN Procedure (dest); ASSERT (dest = Source); ASSERT (dest[0] = 0X);
- END Test.
- positive: copy statement with string as source and open array of character parameter as destination
- MODULE Test;
- CONST Source = "source";
- PROCEDURE Procedure (dest: ARRAY OF CHAR);
- BEGIN COPY (Source, dest); ASSERT (dest = Source);
- END Procedure;
- BEGIN Procedure ("destination");
- END Test.
- positive: copy statement with empty string as source and open array of character parameter as destination
- MODULE Test;
- CONST Source = "";
- PROCEDURE Procedure (dest: ARRAY OF CHAR);
- BEGIN COPY (Source, dest); ASSERT (dest = Source); ASSERT (dest[0] = 0X);
- END Procedure;
- BEGIN Procedure ("destination");
- END Test.
- positive: copy statement with string as source and too short open array of character parameter as destination (truncate)
- MODULE Test;
- CONST Source = "source";
- PROCEDURE Procedure (dest: ARRAY OF CHAR);
- BEGIN COPY (Source, dest); ASSERT (dest = "");
- END Procedure;
- BEGIN Procedure ("");
- END Test.
- positive: copy statement with string as source and open variable array of character parameter as destination
- MODULE Test;
- CONST Source = "source";
- VAR dest: ARRAY 20 OF CHAR;
- PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
- BEGIN COPY (Source, dest);
- END Procedure;
- BEGIN Procedure (dest); ASSERT (dest = Source);
- END Test.
- positive: copy statement with empty string as source and open variable array of character parameter as destination
- MODULE Test;
- CONST Source = "";
- VAR dest: ARRAY 20 OF CHAR;
- PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
- BEGIN COPY (Source, dest);
- END Procedure;
- BEGIN Procedure (dest); ASSERT (dest = Source); ASSERT (dest[0] = 0X);
- END Test.
- positive: copy statement with string as source and too short open variable array of character parameter as destination (truncate)
- MODULE Test;
- CONST Source = "source";
- VAR dest: ARRAY 2 OF CHAR;
- PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
- BEGIN COPY (Source, dest);
- END Procedure;
- BEGIN Procedure (dest); ASSERT(dest="s");
- END Test.
- # string assignment
- positive: string assignment on array of character
- MODULE Test;
- CONST Source = "source";
- VAR dest: ARRAY 20 OF CHAR;
- BEGIN dest := Source; ASSERT (dest = Source);
- END Test.
- positive: string assignment on array of character parameter
- MODULE Test;
- CONST Source = "source";
- PROCEDURE Procedure (dest: ARRAY 20 OF CHAR);
- BEGIN dest := Source; ASSERT (dest = Source);
- END Procedure;
- BEGIN Procedure ("destination");
- END Test.
- positive: string assignment on variable array of character parameter
- MODULE Test;
- CONST Source = "source";
- VAR dest: ARRAY 20 OF CHAR;
- PROCEDURE Procedure (VAR dest: ARRAY 20 OF CHAR);
- BEGIN dest := Source;
- END Procedure;
- BEGIN Procedure (dest); ASSERT (dest = Source);
- END Test.
- positive: string assignment on open array of character parameter
- MODULE Test;
- CONST Source = "source";
- PROCEDURE Procedure (dest: ARRAY OF CHAR);
- BEGIN dest := Source; ASSERT (dest = Source);
- END Procedure;
- BEGIN Procedure ("destination");
- END Test.
- negative: string assignment on too short open array of character parameter
- MODULE Test;
- CONST Source = "source";
- PROCEDURE Procedure (dest: ARRAY OF CHAR);
- BEGIN dest := Source; ASSERT (dest = Source);
- END Procedure;
- BEGIN Procedure ("");
- END Test.
- positive: string assignment on open variable array of character parameter
- MODULE Test;
- CONST Source = "source";
- VAR dest: ARRAY 20 OF CHAR;
- PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
- BEGIN dest := Source;
- END Procedure;
- BEGIN Procedure (dest); ASSERT (dest = Source);
- END Test.
- positive: string assignment on too short open variable array of character parameter (truncate)
- MODULE Test;
- CONST Source = "source";
- VAR dest: ARRAY 2 OF CHAR;
- PROCEDURE Procedure (VAR dest: ARRAY OF CHAR);
- BEGIN dest := Source;
- END Procedure;
- BEGIN Procedure (dest); ASSERT(dest="s");
- END Test.
- # increment statement
- positive: increment statement with short integers
- MODULE Test;
- VAR a, b, c: SHORTINT;
- BEGIN a := 0; b := 3; c := -4;
- INC (a); ASSERT (a = 1); DEC (a); ASSERT (a = 0);
- INC (a, 2); ASSERT (a = 2); INC (a, -2); ASSERT (a = 0);
- INC (a, b); ASSERT (a = b); INC (a, -b); ASSERT (a = 0);
- INC (a, c); ASSERT (a = c); INC (a, -c); ASSERT (a = 0);
- END Test.
- positive: increment statement with integers
- MODULE Test;
- VAR a, b: INTEGER; c: SHORTINT;
- BEGIN a := 0; b := 3; c := -4;
- INC (a); ASSERT (a = 1); DEC (a); ASSERT (a = 0);
- INC (a, 2); ASSERT (a = 2); INC (a, -2); ASSERT (a = 0);
- INC (a, b); ASSERT (a = b); INC (a, -b); ASSERT (a = 0);
- INC (a, c); ASSERT (a = c); INC (a, -c); ASSERT (a = 0);
- END Test.
- positive: increment statement with long integers
- MODULE Test;
- VAR a, b: LONGINT; c: INTEGER; d: SHORTINT;
- BEGIN a := 0; b := 3; c := -4; d := 5;
- INC (a); ASSERT (a = 1); DEC (a); ASSERT (a = 0);
- INC (a, 2); ASSERT (a = 2); INC (a, -2); ASSERT (a = 0);
- INC (a, b); ASSERT (a = b); INC (a, -b); ASSERT (a = 0);
- INC (a, c); ASSERT (a = c); INC (a, -c); ASSERT (a = 0);
- INC (a, d); ASSERT (a = d); INC (a, -d); ASSERT (a = 0);
- END Test.
- positive: increment statement with huge integers
- MODULE Test;
- VAR a, b: HUGEINT; c: LONGINT; d: INTEGER; e: SHORTINT;
- BEGIN a := 0; b := 3; c := -4; d := 5; e := -6;
- INC (a); ASSERT (a = 1); DEC (a); ASSERT (a = 0);
- INC (a, 2); ASSERT (a = 2); INC (a, -2); ASSERT (a = 0);
- INC (a, b); ASSERT (a = b); INC (a, -b); ASSERT (a = 0);
- INC (a, c); ASSERT (a = c); INC (a, -c); ASSERT (a = 0);
- INC (a, d); ASSERT (a = d); INC (a, -d); ASSERT (a = 0);
- INC (a, e); ASSERT (a = e); INC (a, -e); ASSERT (a = 0);
- END Test.
- # decrement statement
- positive: decrement statement with short integers
- MODULE Test;
- VAR a, b, c: SHORTINT;
- BEGIN a := 0; b := 3; c := -4;
- DEC (a); ASSERT (a = -1); INC (a); ASSERT (a = 0);
- DEC (a, 2); ASSERT (a = -2); DEC (a, -2); ASSERT (a = 0);
- DEC (a, b); ASSERT (a = -b); DEC (a, -b); ASSERT (a = 0);
- DEC (a, c); ASSERT (a = -c); DEC (a, -c); ASSERT (a = 0);
- END Test.
- positive: decrement statement with integers
- MODULE Test;
- VAR a, b: INTEGER; c: SHORTINT;
- BEGIN a := 0; b := 3; c := -4;
- DEC (a); ASSERT (a = -1); INC (a); ASSERT (a = 0);
- DEC (a, 2); ASSERT (a = -2); DEC (a, -2); ASSERT (a = 0);
- DEC (a, b); ASSERT (a = -b); DEC (a, -b); ASSERT (a = 0);
- DEC (a, c); ASSERT (a = -c); DEC (a, -c); ASSERT (a = 0);
- END Test.
- positive: decrement statement with long integers
- MODULE Test;
- VAR a, b: LONGINT; c: INTEGER; d: SHORTINT;
- BEGIN a := 0; b := 3; c := -4; d := 5;
- DEC (a); ASSERT (a = -1); INC (a); ASSERT (a = 0);
- DEC (a, 2); ASSERT (a = -2); DEC (a, -2); ASSERT (a = 0);
- DEC (a, b); ASSERT (a = -b); DEC (a, -b); ASSERT (a = 0);
- DEC (a, c); ASSERT (a = -c); DEC (a, -c); ASSERT (a = 0);
- DEC (a, d); ASSERT (a = -d); DEC (a, -d); ASSERT (a = 0);
- END Test.
- positive: decrement statement with huge integers
- MODULE Test;
- VAR a, b: HUGEINT; c: LONGINT; d: INTEGER; e: SHORTINT;
- BEGIN a := 0; b := 3; c := -4; d := 5; e := -6;
- DEC (a); ASSERT (a = -1); INC (a); ASSERT (a = 0);
- DEC (a, 2); ASSERT (a = -2); DEC (a, -2); ASSERT (a = 0);
- DEC (a, b); ASSERT (a = -b); DEC (a, -b); ASSERT (a = 0);
- DEC (a, c); ASSERT (a = -c); DEC (a, -c); ASSERT (a = 0);
- DEC (a, d); ASSERT (a = -d); DEC (a, -d); ASSERT (a = 0);
- DEC (a, e); ASSERT (a = -e); DEC (a, -e); ASSERT (a = 0);
- END Test.
- # include statement
- positive: include statement with short integer as set element
- MODULE Test;
- VAR set: SET; element: SHORTINT;
- BEGIN
- set := {}; element := MIN (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
- set := {}; element := MAX (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
- element := MIN (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
- element := MAX (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
- END Test.
- negative: include statement with too small short integer as set element
- MODULE Test;
- VAR set: SET; element: SHORTINT;
- BEGIN set := {}; element := MIN (SET) - 1; INCL (set, element);
- END Test.
- negative: include statement with too large short integer as set element
- MODULE Test;
- VAR set: SET; element: SHORTINT;
- BEGIN set := {}; element := MAX (SET) + 1; INCL (set, element);
- END Test.
- positive: include statement with integer as set element
- MODULE Test;
- VAR set: SET; element: INTEGER;
- BEGIN
- set := {}; element := MIN (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
- set := {}; element := MAX (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
- element := MIN (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
- element := MAX (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
- END Test.
- negative: include statement with too small integer as set element
- MODULE Test;
- VAR set: SET; element: INTEGER;
- BEGIN set := {}; element := MIN (SET) - 1; INCL (set, element);
- END Test.
- negative: include statement with too large integer as set element
- MODULE Test;
- VAR set: SET; element: INTEGER;
- BEGIN set := {}; element := MAX (SET) + 1; INCL (set, element);
- END Test.
- positive: include statement with long integer as set element
- MODULE Test;
- VAR set: SET; element: LONGINT;
- BEGIN
- set := {}; element := MIN (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
- set := {}; element := MAX (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
- element := MIN (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
- element := MAX (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
- END Test.
- negative: include statement with too small long integer as set element
- MODULE Test;
- VAR set: SET; element: LONGINT;
- BEGIN set := {}; element := MIN (SET) - 1; INCL (set, element);
- END Test.
- negative: include statement with too large long integer as set element
- MODULE Test;
- VAR set: SET; element: LONGINT;
- BEGIN set := {}; element := MAX (SET) + 1; INCL (set, element);
- END Test.
- positive: include statement with huge integer as set element
- MODULE Test;
- VAR set: SET; element: HUGEINT;
- BEGIN
- set := {}; element := MIN (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
- set := {}; element := MAX (SET); INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
- element := MIN (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MIN (SET)}); ASSERT (element IN set);
- element := MAX (SET); set := {element}; INCL (set, element); ASSERT (set = {element}); ASSERT (set = {MAX (SET)}); ASSERT (element IN set);
- END Test.
- negative: include statement with too small huge integer as set element
- MODULE Test;
- VAR set: SET; element: HUGEINT;
- BEGIN set := {}; element := MIN (SET) - 1; INCL (set, element);
- END Test.
- negative: include statement with too large huge integer as set element
- MODULE Test;
- VAR set: SET; element: HUGEINT;
- BEGIN set := {}; element := MAX (SET) + 1; INCL (set, element);
- END Test.
- # exclude statement
- positive: exclude statement with short integer as set element
- MODULE Test;
- VAR set: SET; element: SHORTINT;
- BEGIN
- set := {}; element := MIN (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- set := {}; element := MAX (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- element := MIN (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- element := MAX (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- END Test.
- negative: exclude statement with too small short integer as set element
- MODULE Test;
- VAR set: SET; element: SHORTINT;
- BEGIN set := {}; element := MIN (SET) - 1; EXCL (set, element);
- END Test.
- negative: exclude statement with too large short integer as set element
- MODULE Test;
- VAR set: SET; element: SHORTINT;
- BEGIN set := {}; element := MAX (SET) + 1; EXCL (set, element);
- END Test.
- positive: exclude statement with integer as set element
- MODULE Test;
- VAR set: SET; element: INTEGER;
- BEGIN
- set := {}; element := MIN (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- set := {}; element := MAX (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- element := MIN (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- element := MAX (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- END Test.
- negative: exclude statement with too small integer as set element
- MODULE Test;
- VAR set: SET; element: INTEGER;
- BEGIN set := {}; element := MIN (SET) - 1; EXCL (set, element);
- END Test.
- negative: exclude statement with too large integer as set element
- MODULE Test;
- VAR set: SET; element: INTEGER;
- BEGIN set := {}; element := MAX (SET) + 1; EXCL (set, element);
- END Test.
- positive: exclude statement with long integer as set element
- MODULE Test;
- VAR set: SET; element: LONGINT;
- BEGIN
- set := {}; element := MIN (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- set := {}; element := MAX (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- element := MIN (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- element := MAX (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- END Test.
- negative: exclude statement with too small long integer as set element
- MODULE Test;
- VAR set: SET; element: LONGINT;
- BEGIN set := {}; element := MIN (SET) - 1; EXCL (set, element);
- END Test.
- negative: exclude statement with too large long integer as set element
- MODULE Test;
- VAR set: SET; element: LONGINT;
- BEGIN set := {}; element := MAX (SET) + 1; EXCL (set, element);
- END Test.
- positive: exclude statement with huge integer as set element
- MODULE Test;
- VAR set: SET; element: HUGEINT;
- BEGIN
- set := {}; element := MIN (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- set := {}; element := MAX (SET); EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- element := MIN (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- element := MAX (SET); set := {element}; EXCL (set, element); ASSERT (set = {}); ASSERT (~(element IN set));
- END Test.
- negative: exclude statement with too small huge integer as set element
- MODULE Test;
- VAR set: SET; element: HUGEINT;
- BEGIN set := {}; element := MIN (SET) - 1; EXCL (set, element);
- END Test.
- negative: exclude statement with too large huge integer as set element
- MODULE Test;
- VAR set: SET; element: HUGEINT;
- BEGIN set := {}; element := MAX (SET) + 1; EXCL (set, element);
- END Test.
- # await statement
- positive: await statement in exclusive block
- MODULE Test;
- VAR condition: BOOLEAN;
- PROCEDURE Await; BEGIN AWAIT (condition) END Await;
- BEGIN {EXCLUSIVE} condition := TRUE; Await;
- END Test.
- negative: await statement in non-exclusive block
- MODULE Test;
- VAR condition: BOOLEAN;
- PROCEDURE Await; BEGIN AWAIT (condition) END Await;
- BEGIN condition := FALSE; Await;
- END Test.
- positive: await statement satisfied by active object
- MODULE Test;
- VAR done: BOOLEAN;
- VAR o: OBJECT BEGIN{ACTIVE} Done; END;
- PROCEDURE Done; BEGIN{EXCLUSIVE} done := TRUE; END Done;
- PROCEDURE P; BEGIN{EXCLUSIVE} AWAIT(done) END P;
- BEGIN done := FALSE; NEW(o); P;
- END Test.
- negative: await statement after exit statement in exclusive block
- MODULE Test;
- VAR condition: BOOLEAN;
- BEGIN condition := FALSE; LOOP BEGIN {EXCLUSIVE} EXIT; END; END; AWAIT (condition);
- END Test.
- # procedure variables
- positive: calling global procedure variable
- MODULE Test;
- VAR p: PROCEDURE (VAR x: INTEGER); i: INTEGER;
- PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
- BEGIN i := 2; p := P; p (i); ASSERT (i = 4);
- END Test.
- negative: calling global nil procedure variable
- MODULE Test;
- VAR p: PROCEDURE;
- BEGIN p := NIL; p;
- END Test.
- positive: calling global procedure variable in array
- MODULE Test;
- VAR p: ARRAY 10 OF PROCEDURE (VAR x: INTEGER); i: INTEGER;
- PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
- BEGIN i := 2; p[i] := P; p[i](i); ASSERT (i = 4);
- END Test.
- negative: calling global nil procedure variable in array
- MODULE Test;
- VAR p: ARRAY 10 OF PROCEDURE; i: INTEGER;
- BEGIN i := 2; p[i] := NIL; p[i];
- END Test.
- positive: calling local procedure variable
- MODULE Test;
- PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
- PROCEDURE Procedure;
- VAR p: PROCEDURE (VAR x: INTEGER); i: INTEGER;
- BEGIN i := 2; p := P; p (i); ASSERT (i = 4);
- END Procedure;
- BEGIN Procedure;
- END Test.
- negative: calling local nil procedure variable
- MODULE Test;
- PROCEDURE Procedure;
- VAR p: PROCEDURE;
- BEGIN p := NIL; p;
- END Procedure;
- BEGIN Procedure;
- END Test.
- positive: calling local procedure variable in array
- MODULE Test;
- PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
- PROCEDURE Procedure;
- VAR p: ARRAY 10 OF PROCEDURE (VAR x: INTEGER); i: INTEGER;
- BEGIN i := 2; p[i] := P; p[i](i); ASSERT (i = 4);
- END Procedure;
- BEGIN Procedure;
- END Test.
- negative: calling local nil procedure variable in array
- MODULE Test;
- PROCEDURE Procedure;
- VAR p: ARRAY 10 OF PROCEDURE; i: INTEGER;
- BEGIN i := 2; p[i] := NIL; p[i];
- END Procedure;
- BEGIN Procedure;
- END Test.
- positive: calling parameter procedure variable
- MODULE Test;
- PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
- PROCEDURE Procedure (p: PROCEDURE (VAR x: INTEGER));
- VAR i: INTEGER;
- BEGIN i := 2; p := P; p (i); ASSERT (i = 4);
- END Procedure;
- BEGIN Procedure (P);
- END Test.
- negative: calling parameter nil procedure variable
- MODULE Test;
- PROCEDURE Procedure (p: PROCEDURE);
- BEGIN p;
- END Procedure;
- BEGIN Procedure (NIL);
- END Test.
- positive: calling variable parameter procedure variable
- MODULE Test;
- VAR p: PROCEDURE (VAR x: INTEGER);
- PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
- PROCEDURE Procedure (VAR p: PROCEDURE (VAR x: INTEGER));
- VAR i: INTEGER;
- BEGIN i := 2; p := P; p (i); ASSERT (i = 4);
- END Procedure;
- BEGIN p := P; Procedure (p);
- END Test.
- negative: calling variable parameter nil procedure variable
- MODULE Test;
- VAR p: PROCEDURE;
- PROCEDURE Procedure (VAR p: PROCEDURE);
- BEGIN p;
- END Procedure;
- BEGIN p := NIL; Procedure (p);
- END Test.
- positive: calling parameter procedure variable of object
- MODULE Test;
- VAR i: INTEGER; o: OBJECT
- VAR p: PROCEDURE (VAR x: INTEGER);
- END;
- PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
- BEGIN i := 2; NEW (o); o.p := P; o.p (i); ASSERT (i = 4);
- END Test.
- negative: calling parameter nil procedure variable of object
- MODULE Test;
- VAR o: OBJECT
- VAR p: PROCEDURE;
- END;
- BEGIN NEW (o); o.p := NIL; o.p;
- END Test.
- positive: calling parameter procedure variable within object
- MODULE Test;
- VAR o: OBJECT
- VAR p: PROCEDURE (VAR x: INTEGER);
- PROCEDURE &Procedure;
- VAR i: INTEGER;
- BEGIN i := 2; p := P; p (i); ASSERT (i = 4);
- END Procedure;
- END;
- PROCEDURE P (VAR x: INTEGER); BEGIN x := 4; END P;
- BEGIN NEW (o);
- END Test.
- negative: calling parameter nil procedure variable within object
- MODULE Test;
- VAR o: OBJECT
- VAR p: PROCEDURE;
- PROCEDURE &Procedure;
- BEGIN p := NIL; p;
- END Procedure;
- END;
- BEGIN NEW (o);
- END Test.
- # concurrency
- positive: exclusive section in procedure in module scope
- MODULE Test;
- PROCEDURE P;
- BEGIN{EXCLUSIVE}
- END P;
- BEGIN P END Test.
- positive: exclusive section in procedure in object scope
- MODULE Test;
- VAR a: OBJECT
- PROCEDURE P;
- BEGIN{EXCLUSIVE}
- END P;
- END;
- BEGIN NEW(a); a.P END Test.
- positive: positive await statement in procedure in module scope
- MODULE Test;
- VAR done: BOOLEAN;
- PROCEDURE P;
- BEGIN{EXCLUSIVE}
- AWAIT(done)
- END P;
- BEGIN done := TRUE; P END Test.
- negative: active body
- MODULE Test;
- VAR start,called: BOOLEAN;
- VAR o:OBJECT VAR i: LONGINT; BEGIN{ACTIVE} WHILE ~start DO END; called := TRUE END;
- BEGIN
- start := FALSE; called := FALSE;
- NEW(o);
- start := TRUE;
- WHILE ~called DO END;
- HALT(100);
- END Test.
- positive: negative await statement in procedure in module scope
- MODULE Test;
- VAR done: BOOLEAN;
- VAR o:OBJECT VAR i: LONGINT; BEGIN{ACTIVE} FOR i := 0 TO 10000 DO END; Done END;
- PROCEDURE Done;
- BEGIN{EXCLUSIVE}
- done := TRUE
- END Done;
- PROCEDURE P;
- BEGIN{EXCLUSIVE}
- AWAIT(done)
- END P;
- BEGIN done := FALSE; NEW(o); P END Test.
- positive: positive await statement in procedure in object scope
- MODULE Test;
- VAR o:OBJECT
- VAR done: BOOLEAN;
- PROCEDURE P;
- BEGIN{EXCLUSIVE}
- AWAIT(done)
- END P;
- BEGIN done := TRUE;
- END;
- BEGIN NEW(o); o.P; END Test.
- positive: negative await statement in procedure in object scope
- MODULE Test;
- VAR o:OBJECT
- VAR done: BOOLEAN; i: LONGINT;
- PROCEDURE & Init; BEGIN done := FALSE END Init;
- PROCEDURE P;
- BEGIN{EXCLUSIVE}
- AWAIT(done)
- END P;
- PROCEDURE Done;
- BEGIN{EXCLUSIVE}
- done := TRUE
- END Done;
- BEGIN{ACTIVE} FOR i := 0 TO 10000 DO END; Done
- END;
- BEGIN NEW(o); o.P; END Test.
- # programs
- positive: Gaussian natural sum using arrays
- MODULE Test;
- CONST Count = 100;
- VAR i, sum: LONGINT; a: ARRAY Count OF LONGINT;
- BEGIN
- FOR i := 0 TO Count - 1 DO
- a[i] := i;
- END;
- i := 0; sum := 0;
- WHILE i < Count DO
- INC (sum, a[i]); INC (i);
- END;
- ASSERT (sum = Count * (Count-1) DIV 2);
- END Test.
- positive: natural sum with several synchronous concurrent accumulators
- MODULE Test;
- TYPE Accumulator = OBJECT
- VAR i: INTEGER; done: BOOLEAN;
- PROCEDURE &Init; BEGIN done := FALSE; END Init;
- PROCEDURE Await; BEGIN {EXCLUSIVE} AWAIT (done); END Await;
- BEGIN {ACTIVE, EXCLUSIVE} FOR i := 1 TO 100 DO Add END; done := TRUE;
- END Accumulator;
- VAR acc0, acc1, acc2: Accumulator; sum: INTEGER;
- PROCEDURE Busy; VAR i: INTEGER; BEGIN FOR i := 1 TO 100 DO END; END Busy;
- PROCEDURE Add; VAR temp: INTEGER; BEGIN {EXCLUSIVE} temp := sum; Busy; sum := temp + 1 END Add;
- BEGIN sum := 0; NEW (acc0); NEW (acc1); NEW (acc2); acc0.Await; acc1.Await; acc2.Await; ASSERT (sum = 300);
- END Test.
- positive: dining philosophers
- MODULE Test;
- CONST Forks = 5;
- TYPE Fork = OBJECT
- VAR taken: BOOLEAN;
- PROCEDURE &Init; BEGIN taken := FALSE; END Init;
- PROCEDURE PickUp; BEGIN {EXCLUSIVE} AWAIT (~taken); taken := TRUE; END PickUp;
- PROCEDURE PutDown; BEGIN {EXCLUSIVE} taken := FALSE; END PutDown;
- END Fork;
- TYPE Philosopher = OBJECT
- VAR first, second, i: INTEGER; done: BOOLEAN
- 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;
- PROCEDURE Await; BEGIN {EXCLUSIVE} AWAIT (done); END Await;
- BEGIN {EXCLUSIVE, ACTIVE} FOR i := 1 TO 10 DO Think;
- fork[first].PickUp; fork[second].PickUp; Eat; fork[second].PutDown; fork[first].PutDown;
- END; done := TRUE;
- END Philosopher;
- VAR fork: ARRAY Forks OF Fork; philosopher: ARRAY Forks OF Philosopher; id: INTEGER;
- PROCEDURE Think; VAR i: INTEGER; BEGIN FOR i := 1 TO 100 DO END; END Think;
- PROCEDURE Eat; VAR i: INTEGER; BEGIN FOR i := 1 TO 1000 DO END; END Eat;
- BEGIN
- FOR id := 0 TO Forks - 1 DO NEW (fork[id]) END;
- FOR id := 0 TO Forks - 1 DO NEW (philosopher[id], id) END;
- FOR id := 0 TO Forks - 1 DO philosopher[id].Await END;
- END Test.
- positive: bounded buffer
- MODULE Test;
- TYPE Buffer = OBJECT
- VAR in, out, size: LONGINT;
- VAR data: POINTER TO ARRAY OF INTEGER;
- PROCEDURE &Init (len: LONGINT); BEGIN in := 0; out := 0; size := 0; NEW (data, len); END Init;
- PROCEDURE Put (item: INTEGER); BEGIN {EXCLUSIVE} AWAIT (size # LEN (data)); data[in] := item; in := (in + 1) MOD LEN (data); INC (size) END Put;
- PROCEDURE Get (VAR item: INTEGER); BEGIN {EXCLUSIVE} AWAIT (size # 0); item := data[out]; out := (out + 1) MOD LEN (data); DEC (size) END Get;
- END Buffer;
- TYPE Process = OBJECT
- VAR count: INTEGER; buffer: Buffer; done: BOOLEAN;
- PROCEDURE &Init (count: INTEGER; buffer: Buffer); BEGIN SELF.count := count; SELF.buffer := buffer; done := FALSE; END Init;
- PROCEDURE Await; BEGIN {EXCLUSIVE} AWAIT (done); END Await;
- PROCEDURE Handle; END Handle;
- BEGIN {EXCLUSIVE, ACTIVE} Handle; done := TRUE;
- END Process;
- TYPE Producer = OBJECT (Process)
- PROCEDURE Handle; VAR i: INTEGER; BEGIN FOR i := 1 TO count DO buffer.Put (i); END; END Handle;
- END Producer;
- TYPE Consumer = OBJECT (Process)
- PROCEDURE Handle; VAR i, item: INTEGER; BEGIN FOR i := 1 TO count DO buffer.Get (item); ASSERT (item = i); END; END Handle;
- END Consumer;
- PROCEDURE Test (len, count: INTEGER);
- VAR buffer: Buffer; consumer: Consumer; producer: Producer;
- BEGIN NEW (buffer, len); NEW (consumer, count, buffer); NEW (producer, count, buffer); consumer.Await; producer.Await;
- END Test;
- BEGIN Test (1, 1000); Test (10, 1000); Test (1000, 1000); Test (1000, 100);
- END Test.
- positive: sudoku solver
- MODULE Test;
- CONST Empty = '0'; Blocks = 3; Columns = Blocks * Blocks; Cells = Columns * Columns;
- TYPE Cell = INTEGER; Value = CHAR; Game = ARRAY Cells + 1 OF Value;
- PROCEDURE IsValidCell (CONST game: Game; cell: Cell): BOOLEAN;
- VAR value: Value; VAR row, column: Cell;
- PROCEDURE Check (start, stride: Cell): BOOLEAN;
- VAR cells, count: Cell;
- BEGIN count := stride; FOR cells := 0 TO Columns - 1 DO IF (start # cell) & (game[start] = value) THEN RETURN FALSE END;
- DEC (count); IF count = 0 THEN count := stride; INC (start, Columns + 1 - stride) ELSE INC (start) END; END; RETURN TRUE;
- END Check;
- BEGIN value := game[cell]; IF value = Empty THEN RETURN TRUE END; row := cell DIV Columns; column := cell MOD Columns;
- RETURN Check (cell - column, Columns) & Check (column, 1) & Check (cell - row MOD Blocks * Columns - column MOD Blocks, Blocks);
- END IsValidCell;
- PROCEDURE IsValid (CONST game: Game): BOOLEAN;
- VAR cell: Cell; BEGIN FOR cell := 0 TO Cells - 1 DO IF ~IsValidCell (game, cell) THEN RETURN FALSE END END; RETURN TRUE;
- END IsValid;
- PROCEDURE Solve (VAR game: Game): BOOLEAN;
- VAR cell: Cell; value: SHORTINT;
- 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);
- IF IsValidCell (game, cell) & Solve (game) THEN RETURN TRUE END; END; game[cell] := Empty; RETURN FALSE; END END; RETURN IsValid (game);
- END Solve;
- PROCEDURE Check (CONST problem, solution: Game);
- VAR game: Game; BEGIN ASSERT (IsValid (problem)); ASSERT (IsValid (solution)); game := problem; ASSERT (Solve (game)); ASSERT (game = solution);
- END Check;
- BEGIN Check ("003020080090500000018609074600047390080205040059160007930402760000006010040070900", "563724189794581236218639574621847395387295641459163827935412768872956413146378952");
- END Test.
- # miscellaneous
- positive: SYSTEM.VAL on designator and non-designator expression
- MODULE Test;
- IMPORT SYSTEM;
- PROCEDURE P;
- VAR c1,c2,c3,c4: CHAR;
- BEGIN
- c1 := 0FFX;
- c2 := 0FFX;
- c3 := 0FFX;
- c4 := 0FFX;
- ASSERT(SYSTEM.VAL(LONGINT,c4) = -1);
- ASSERT(SYSTEM.VAL(LONGINT,ORD(c4)) = 255);
- END P;
- BEGIN P;
- END Test.
- positive: reimporting an object type with initializer
- MODULE A;
- TYPE D1*= OBJECT END D1;
- END A.
- MODULE B;
- IMPORT A;
- TYPE
- D1*= OBJECT (A.D1)
- PROCEDURE &Init*;
- BEGIN
- END Init;
- END D1;
- END B.
- MODULE Test;
- IMPORT B;
- PROCEDURE P*;
- VAR o: B.D1;
- BEGIN NEW(o);
- END P;
- BEGIN P;
- END Test.
- positive: reimporting objects and execute bodies
- MODULE A;
- TYPE O*= OBJECT
- VAR initZ-: LONGINT;
- BEGIN initZ := 999;
- END O;
- END A.
- MODULE B;
- IMPORT A;
- TYPE O*= OBJECT (A.O)
- VAR initY-: LONGINT;
- BEGIN initY := 998;
- END O;
- END B.
- MODULE Test;
- IMPORT B;
- TYPE O*=OBJECT (B.O)
- VAR initO: LONGINT;
- BEGIN initO := 997
- END O;
- VAR o: O;
- BEGIN
- NEW(o); ASSERT(o.initO=997); ASSERT(o.initY =998); ASSERT(o.initZ=999);
- END Test.
- positive: importing protected object
- MODULE A;
- TYPE O*= OBJECT
- PROCEDURE P*;
- BEGIN{EXCLUSIVE}
- END P;
- END O;
- END A.
- MODULE Test;
- IMPORT A;
- VAR o: A.O;
- BEGIN
- NEW(o); o.P;
- END Test.
- positive: importing and extending protected object
- MODULE Test;
- IMPORT A;
- TYPE O*= OBJECT (A.O)
- VAR
- PROCEDURE Q*;
- BEGIN
- P;
- END Q;
- END O;
- VAR o: O;
- BEGIN
- NEW(o); o.Q;
- END Test.
- positive: passing string parameter to procedure returning pointer
- MODULE Test;
- TYPE String= POINTER TO ARRAY OF CHAR;
- PROCEDURE TestString*(CONST str: ARRAY OF CHAR): String;
- VAR ch: CHAR;
- BEGIN
- ch := str[0];
- RETURN NIL
- END TestString;
- PROCEDURE Test*;
- VAR str: String;
- BEGIN
- str := TestString("TestStr");
- END Test;
- BEGIN Test
- END Test.
- positive: passing array parameter to nested procedure
- MODULE Test;
- PROCEDURE Enum();
- VAR name: ARRAY 256 OF CHAR;
- PROCEDURE GetNextSymbol(VAR s: ARRAY OF CHAR );
- BEGIN
- s[0] := 0X;
- END GetNextSymbol;
- BEGIN
- GetNextSymbol(name);
- END Enum;
- BEGIN Enum();
- END Test.
- positive: nested procedure calls itself with parameter
- MODULE Test;
- PROCEDURE Test;
- VAR k: LONGINT;
- PROCEDURE Test0(l: LONGINT);
- BEGIN
- ASSERT(l = 999);
- INC(k);
- IF k < 10 THEN Test0(l) END;
- END Test0;
- BEGIN
- k := 0;
- Test0(999);
- END Test;
- BEGIN Test;
- END Test.
- positive: object type declared in procedure scope
- MODULE Test;
- PROCEDURE Test;
- TYPE
- O=OBJECT
- VAR i:LONGINT;
- PROCEDURE &Init;
- BEGIN
- i := 999;
- END Init;
- PROCEDURE P;
- BEGIN
- ASSERT(i=999);
- END P;
- END O;
- VAR o:O;
- BEGIN
- NEW(o); o.P;
- END Test;
- BEGIN Test;
- END Test.
- positive: expression involving multiple register savings on stack
- MODULE Test;
- PROCEDURE Test;
- VAR a: POINTER TO ARRAY OF LONGINT; i : LONGINT;
- PROCEDURE Add(i: LONGINT): LONGINT;
- BEGIN
- RETURN i+10
- END Add;
- BEGIN
- NEW(a,10);
- i := 5;
- a[i] := 10;
- a[i] := a[i]+Add(a[i]+Add(a[i] + Add(a[i])));
- ASSERT(a[i] = 70);
- END Test;
- BEGIN Test;
- END Test.
- positive: GETPROCEDURE with procedure returning an object
- MODULE A;
- TYPE Object*=OBJECT VAR a-: LONGINT; END Object;
- PROCEDURE TheProcedure*(): Object;
- VAR o: Object;
- BEGIN
- NEW(o); o.a := 100; RETURN o;
- END TheProcedure;
- END A.
- MODULE Test;
- IMPORT A;
- PROCEDURE Test;
- VAR p: PROCEDURE(): A.Object; o: A.Object;
- BEGIN
- GETPROCEDURE("A","TheProcedure",p);
- o := p();
- ASSERT(o.a = 100);
- END Test;
- BEGIN Test;
- END Test.
- positive: import object and use initializer on alias
- MODULE A;
- TYPE
- O*= OBJECT
- VAR a*: LONGINT;
- PROCEDURE &Init*;
- BEGIN
- END Init;
- END O;
- O2*=O;
- END A.
- MODULE Test;
- IMPORT X :=A;
- VAR o: X.O2;
- BEGIN
- NEW(o); o.a :=10;
- END Test.
- positive: procedure returning record
- MODULE Test;
- TYPE R= RECORD a,b: LONGINT END;
- VAR r: R;
- PROCEDURE P(b,a: LONGINT): R;
- VAR r: R;
- BEGIN
- r.a := a; r.b := b;
- RETURN r
- END P;
- BEGIN
- r := P(10,20);
- ASSERT(r.a =20); ASSERT(r.b = 10);
- END Test.
- positive: procedure returning static array
- MODULE Test;
- TYPE S= ARRAY 128 OF CHAR;
- VAR s:S;
- PROCEDURE Q(CONST name: ARRAY OF CHAR): S;
- VAR s:S;
- BEGIN
- COPY(name,s);
- RETURN s;
- END Q;
- BEGIN
- s := Q("TestText");
- ASSERT(s= "TestText");
- END Test.
- positive: assign static array of char to static VAR parameter arrray of char
- MODULE Test;
- TYPE String = ARRAY 1024 OF CHAR;
- VAR o:OBJECT
- VAR
- x,y,z: LONGINT;
- string:String;
- END;
- name: String;
- PROCEDURE P(VAR name: String);
- BEGIN
- name := o.string;
- END P;
- BEGIN
- NEW(o); o.string := "test"; P(name); ASSERT(name = "test");
- END Test.
- positive: procedure returning record containing pointer
- MODULE Test;
- TYPE R= RECORD any: POINTER TO R; a,b: LONGINT END;
- VAR r: R;
- PROCEDURE P(b,a: LONGINT): R;
- VAR r: R;
- BEGIN
- r.a := a; r.b := b;
- RETURN r
- END P;
- BEGIN
- r := P(10,20);
- ASSERT(r.a =20); ASSERT(r.b = 10);
- END Test.
- positive: pass record by value, variable and as a constant
- MODULE Test;
- TYPE Record= RECORD min,max: LONGINT END;
- PROCEDURE P(x: Record);
- BEGIN
- ASSERT(x.min = -123); ASSERT(x.max = 123);
- END P;
- PROCEDURE Q(VAR x: Record);
- BEGIN
- ASSERT(x.min = -123); ASSERT(x.max = 123);
- END Q;
- PROCEDURE R(CONST x: Record);
- BEGIN
- ASSERT(x.min = -123); ASSERT(x.max = 123);
- END R;
- PROCEDURE T;
- VAR r: Record;
- BEGIN
- r.min := -123; r.max := 123;
- P(r); Q(r); R(r);
- END T;
- BEGIN
- T
- END Test.
- positive: procedure returning record called as parameter
- MODULE Test;
- TYPE
- Rectangle=RECORD l,t,r,b: LONGINT END;
- Object = OBJECT VAR w: LONGINT END Object;
- PROCEDURE Check(y: Object; r1: Rectangle; x: Object; CONST r2: Rectangle);
- BEGIN
- ASSERT(r1.l = r2.l); ASSERT(r1.t = r2.t);
- ASSERT(r1.r = 10); ASSERT(r1.b = 20);
- ASSERT(r2.r = 101); ASSERT(r2.b = 102);
- ASSERT(x.w = 10);
- END Check;
- PROCEDURE Q(l,t,r,b: LONGINT): Rectangle;
- VAR R: Rectangle;
- BEGIN
- R.l := l; R.t := t; R.r := r; R.b := b;
- RETURN R
- END Q;
- PROCEDURE P;
- VAR r1,r2: Rectangle; o: Object;
- BEGIN
- NEW(o); o.w := 10;
- r1.l := 0; r2.l := 0; r1.t := -100; r2.t := -100;
- r1.r := 10; r1.b := 20;
- r2.r := 101; r2.b := 102;
- Check(o,r1,o,r2);
- Check(o,Q(0,-100,10,20),o,Q(0,-100,101,102));
- END P;
- BEGIN P
- END Test.
- positive: pass delegate as parameter
- MODULE Test;
- TYPE
- Procedure = PROCEDURE {DELEGATE}(): LONGINT;
- TYPE
- O= OBJECT
- VAR g: LONGINT;
- PROCEDURE Test;
- BEGIN
- CallProc(OProc);
- CallProc(GProc);
- END Test;
- PROCEDURE OProc(): LONGINT;
- BEGIN
- RETURN g
- END OProc;
- BEGIN g := 10;
- END O;
- PROCEDURE CallProc(p: Procedure);
- BEGIN
- ASSERT(p() = 10);
- END CallProc;
- PROCEDURE GProc(): LONGINT;
- BEGIN
- RETURN 10
- END GProc;
- PROCEDURE P;
- VAR o: O;
- BEGIN
- NEW(o); o.Test;
- END P;
- BEGIN P
- END Test.
- positive: reimport indirectly published procedure
- MODULE A;
- TYPE AO*= OBJECT
- VAR called*: BOOLEAN;
- PROCEDURE P*;
- BEGIN called := TRUE;
- END P;
- BEGIN
- called := FALSE;
- END AO;
- AO2*= OBJECT(AO);
- PROCEDURE P;
- BEGIN P^
- END P;
- END AO2;
- END A.
- MODULE B;
- IMPORT A;
- TYPE BO*= OBJECT(A.AO2);
- PROCEDURE P;
- BEGIN P^
- END P;
- END BO;
- END B.
- MODULE Test;
- IMPORT B;
- TYPE O*= OBJECT(B.BO);
- PROCEDURE P;
- BEGIN
- P^;
- END P;
- END O;
- PROCEDURE P;
- VAR o:O;
- BEGIN
- NEW(o);
- o.P; ASSERT(o.called);
- END P;
- BEGIN P;
- END Test.
- positive: pass static array by value, reference and as constant
- MODULE Test;
- TYPE Array= ARRAY 10 OF LONGINT;
- PROCEDURE P(x: Array);
- BEGIN
- ASSERT(x[5] = -123); ASSERT(x[8] = 123);
- END P;
- PROCEDURE Q(VAR x: Array);
- BEGIN
- ASSERT(x[5] = -123); ASSERT(x[8] = 123);
- END Q;
- PROCEDURE R(CONST x: Array);
- BEGIN
- ASSERT(x[5] = -123); ASSERT(x[8] = 123);
- END R;
- PROCEDURE T;
- VAR r: Array;
- BEGIN
- r[5] := -123; r[8] := 123;
- P(r); Q(r); R(r);
- END T;
- BEGIN
- T
- END Test.
- positive: procedure returning static array called as parameter
- MODULE Test;
- TYPE
- Rectangle=ARRAY 10 OF LONGINT;
- Object = OBJECT VAR w: LONGINT END Object;
- PROCEDURE Check(y: Object; r1: Rectangle; x: Object; CONST r2: Rectangle);
- BEGIN
- ASSERT(r1[3] = r2[3]); ASSERT(r1[5] = r2[5]);
- ASSERT(r1[6] = 10); ASSERT(r1[7] = 20);
- ASSERT(r2[6] = 101); ASSERT(r2[7] = 102);
- ASSERT(x.w = 10);
- END Check;
- PROCEDURE Q(l,t,r,b: LONGINT): Rectangle;
- VAR R: Rectangle;
- BEGIN
- R[3] := l; R[5] := t; R[6] := r; R[7] := b;
- RETURN R
- END Q;
- PROCEDURE P;
- VAR r1,r2: Rectangle; o: Object;
- BEGIN
- NEW(o); o.w := 10;
- r1[3] := 0; r2[3] := 0; r1[5] := -100; r2[5] := -100;
- r1[6] := 10; r1[7] := 20;
- r2[6] := 101; r2[7] := 102;
- Check(o,r1,o,r2);
- Check(o,Q(0,-100,10,20),o,Q(0,-100,101,102));
- END P;
- BEGIN P
- END Test.
- positive: new on var parameter object
- MODULE Test;
- TYPE O = OBJECT
- VAR x: LONGINT;
- PROCEDURE &init;
- BEGIN x := 10;
- END init;
- END O;
- PROCEDURE Q(VAR o: O);
- BEGIN
- NEW(o); ASSERT(o # NIL,101); ASSERT(o.x = 10,102);
- END Q;
- PROCEDURE P;
- VAR o: O;
- BEGIN
- Q(o); ASSERT(o.x = 10,103);
- END P;
- BEGIN P
- END Test.
- positive: new on var parameter array
- MODULE Test;
- TYPE O=POINTER TO ARRAY OF INTEGER;
- PROCEDURE Q(VAR o: O);
- BEGIN
- NEW(o,10); o[5] := 10;
- END Q;
- PROCEDURE P;
- VAR o: O;
- BEGIN
- Q(o); ASSERT(o[5] = 10); ASSERT(LEN(o)=10);
- END P;
- BEGIN P
- END Test.
- positive: call procedure returning a basic type within an exclusive section
- MODULE Test;
- TYPE
- O= OBJECT
- PROCEDURE P(): LONGINT;
- VAR a: LONGINT;
- BEGIN{EXCLUSIVE}
- a := 4;
- RETURN a*a
- END P;
- END O;
- PROCEDURE P;
- VAR o: O;
- BEGIN
- NEW(o);
- ASSERT(o.P() = 16);
- END P;
- BEGIN P
- END Test.
- positive: pass Delegate nil value
- MODULE Test;
- TYPE
- Delegate= PROCEDURE{DELEGATE};
- PROCEDURE P(p: Delegate);
- BEGIN
- ASSERT(p=NIL);
- END P;
- BEGIN
- P(NIL); (* if incorrect then stack will be invalid => hard brakedown *)
- END Test.
- positive: type tests and guards on records and pointers on direct and indirect parameters
- MODULE Test;
- TYPE
- R0=RECORD END;
- R1=RECORD(R0) v: LONGINT END;
- R2=RECORD(R0) END;
- P0=POINTER TO RECORD END;
- P1=POINTER TO RECORD(P0) v: LONGINT; END;
- P2=POINTER TO RECORD(P1) END;
- PROCEDURE R(VAR r: R0);
- BEGIN
- ASSERT(r IS R1);
- ASSERT(~(r IS R2));
- WITH r: R1 DO
- r.v := 10;
- END;
- r(R1).v := 10;
- END R;
- PROCEDURE S(VAR r: R0);
- BEGIN
- R(r);
- END S;
- PROCEDURE RC(CONST r: R0);
- VAR i: LONGINT;
- BEGIN
- ASSERT(r IS R1);
- ASSERT(~(r IS R2));
- WITH r: R1 DO
- i := r.v
- END;
- i := r(R1).v;
- END RC;
- PROCEDURE SC(CONST r: R0);
- BEGIN
- RC(r);
- END SC;
- PROCEDURE P(p: P0);
- BEGIN
- ASSERT(p IS P1);
- ASSERT(~(p IS P2));
- WITH p: P1 DO
- p.v := 10;
- END;
- p(P1).v := 10;
- END P;
- PROCEDURE PV(VAR p: P0);
- BEGIN
- ASSERT(p IS P1);
- ASSERT(~(p IS P2));
- WITH p: P1 DO
- p.v := 10;
- END;
- p(P1).v := 10;
- END PV;
- PROCEDURE PC(CONST p: P0);
- BEGIN
- ASSERT(p IS P1);
- ASSERT(~(p IS P2));
- WITH p: P1 DO
- p.v := 10;
- END;
- p(P1).v := 10;
- END PC;
- PROCEDURE Test;
- VAR r: R1; p: P1; p0: P0;
- BEGIN
- R(r); S(r); RC(r); SC(r);
- NEW(p);
- p0 := p;
- P(p); PC(p); PV(p0);
- END Test;
- BEGIN
- Test;
- END Test.
- positive: inline procedure with fixups
- MODULE Test;
- IMPORT SYSTEM;
- CONST const = 123;
- VAR a, b: LONGINT;
- PROCEDURE -P(): LONGINT;
- CODE{SYSTEM.i386}
- MOV EAX,b
- MOV a,const
- JMP end
- MOV EAX,10
- end:
- END P;
- PROCEDURE Q;
- VAR b: LONGINT;
- BEGIN
- b := P();
- ASSERT(a=123);
- ASSERT(b=1234);
- END Q;
- BEGIN
- b := 1234;
- Q;
- a := P();
- ASSERT(a=1234);
- END Test.
- positive: import inline assembler procedure
- MODULE A;
- IMPORT SYSTEM;
- PROCEDURE -P*(a: LONGINT): LONGINT;
- CODE{SYSTEM.i386}
- POP EAX
- ADD EAX,10
- END P;
- BEGIN
- ASSERT(P(10) = 20);
- END A.
- MODULE Test;
- IMPORT A;
- BEGIN
- ASSERT(A.P(10)=20)
- END Test.
- positive: call a winapi procedure with an array of system byte
- MODULE Test;
- IMPORT SYSTEM;
- PROCEDURE{WINAPI} ReadFile (VAR lpBuffer: ARRAY OF SYSTEM.BYTE);
- BEGIN
- ASSERT(SYSTEM.VAL(CHAR,lpBuffer[0]) = 'A');
- END ReadFile;
- PROCEDURE P;
- VAR a: ARRAY 2 OF CHAR;
- BEGIN
- a[0] := 'A';
- ReadFile(a);
- END P;
- BEGIN P
- END Test.
- positive: unlock with or without return statements
- MODULE Test;
- VAR q: LONGINT;
- PROCEDURE P;
- BEGIN{EXCLUSIVE}
- END P;
- PROCEDURE P2;
- BEGIN{EXCLUSIVE}
- RETURN
- END P2;
- PROCEDURE Q(): LONGINT;
- BEGIN{EXCLUSIVE}
- RETURN 0
- END Q;
- BEGIN P; P2; P; q := Q(); P;
- END Test.
- positive: conversion to 32 bit in ash
- MODULE Test;
- PROCEDURE P;
- VAR l: LONGINT; ch: CHAR;
- BEGIN
- ch := CHR(237); l := 8;
- l := ASH(ORD(ch),l); ASSERT(l=60672);
- END P;
- BEGIN
- P
- END Test.
- positive: pass delegate as variable or value parameter
- MODULE Test;
- TYPE
- Array = POINTER TO ARRAY OF CHAR;
- Delegate = PROCEDURE{DELEGATE}(): LONGINT;
- O= OBJECT
- VAR a: Array;
- PROCEDURE P(): LONGINT;
- BEGIN
- ASSERT(a # NIL);
- RETURN LEN(a);
- END P;
- PROCEDURE &Init(a: Array);
- BEGIN
- SELF.a := a;
- END Init;
- END O;
- VAR dd: Delegate; o: O; a: Array;
- PROCEDURE SetDelegate(d: Delegate);
- BEGIN
- dd := d;
- END SetDelegate;
- PROCEDURE GetDelegate(VAR d: Delegate);
- BEGIN
- d := o.P;
- END GetDelegate;
- PROCEDURE P;
- VAR d: Delegate;
- BEGIN
- GetDelegate(d);
- SetDelegate(d);
- ASSERT(dd() = 123);
- END P;
- BEGIN NEW(a,123); NEW(o,a); P;
- END Test.
- positive: import same module with different aliases
- MODULE A;
- PROCEDURE P*; BEGIN END P;
- END A.
- MODULE Test;
- IMPORT A,B := A;
- PROCEDURE P;
- BEGIN
- A.P;
- B.P;
- END P;
- BEGIN P
- END Test.
- positive: procedures returning a record (checks correct return parameter size)
- MODULE Test;
- TYPE
- Rectangle=RECORD t,l,r,b: LONGINT END;
- Container= POINTER TO RECORD r: Rectangle END;
- PROCEDURE GetWMCoordinates(VAR r : Rectangle) : Rectangle;
- VAR rect : Rectangle;
- BEGIN
- rect.l := r.l+1;
- rect.r := r.r+2;
- rect.t := r.t+3;
- rect.b := r.b+4;
- RETURN rect;
- END GetWMCoordinates;
- PROCEDURE GetWMCoordinates2() : Rectangle;
- VAR rect : Rectangle;
- BEGIN
- rect.l := 1;
- rect.r := 2;
- rect.t := 3;
- rect.b := 4;
- RETURN rect;
- END GetWMCoordinates2;
- PROCEDURE P1;
- VAR r2: Rectangle;
- BEGIN
- r2 := GetWMCoordinates2();
- ASSERT(r2.l = 1,101);
- ASSERT(r2.r = 2,102);
- ASSERT(r2.t = 3,103);
- ASSERT(r2.b = 4,104);
- END P1;
- PROCEDURE P2;
- VAR r1,r2: Rectangle;
- BEGIN
- r1.l := 1; r1.r := 2; r1.t := 3; r1.b := 4;
- r2 := GetWMCoordinates(r1);
- ASSERT(r2.l = 2,201);
- ASSERT(r2.r = 4,202);
- ASSERT(r2.t = 6,203);
- ASSERT(r2.b = 8,204);
- END P2;
- PROCEDURE P3;
- VAR c1,c2: Container;
- BEGIN
- NEW(c1); NEW(c2);
- c1.r.l := 1; c1.r.r := 2; c1.r.t := 3; c1.r.b := 4;
- c2.r := GetWMCoordinates(c1.r);
- ASSERT(c2.r.l = 2);
- ASSERT(c2.r.r = 4);
- ASSERT(c2.r.t = 6);
- ASSERT(c2.r.b = 8);
- END P3;
- BEGIN P1;P2;P3;
- END Test.
- positive: conversion on return types
- MODULE Test;
- PROCEDURE GetInt () : LONGINT;
- VAR integer: INTEGER;
- BEGIN
- integer := -56;
- RETURN integer
- END GetInt;
- PROCEDURE GetShortint () : LONGINT;
- VAR integer: INTEGER;
- BEGIN
- integer := -56;
- RETURN integer
- END GetShortint;
- PROCEDURE P;
- VAR i: LONGINT;
- BEGIN
- i := GetInt();
- ASSERT(i=-56);
- i := GetShortint();
- ASSERT(i=-56);
- END P;
- BEGIN P;
- END Test.
- positive: allocate imported variable
- MODULE A;
- TYPE Record*= RECORD a*: LONGINT; p*: POINTER TO ARRAY OF CHAR; c*: LONGINT; END;
- VAR a*: Record;
- END A.
- MODULE Test;
- IMPORT A;
- PROCEDURE P;
- BEGIN
- NEW(A.a.p,10);
- ASSERT(A.a.p # NIL,101);
- END P;
- BEGIN P;
- END Test.
- positive: bitwise rotate
- MODULE Test;
- IMPORT SYSTEM;
- PROCEDURE P;
- VAR val,rot: SET; by: LONGINT;
- BEGIN
- val := {1,2,3,30,31};
- rot := SYSTEM.VAL(SET,ROT(SYSTEM.VAL(LONGINT,val),7));
- ASSERT(rot ={5..6,8..10});
- rot := SYSTEM.VAL(SET,ROT(SYSTEM.VAL(LONGINT,val),-7));
- ASSERT(rot={23..24,26..28});
- val := {1,2,3,30,31};
- by := 7;
- rot := SYSTEM.VAL(SET,ROT(SYSTEM.VAL(LONGINT,val),by));
- ASSERT(rot ={5..6,8..10});
- by := -7;
- rot := SYSTEM.VAL(SET,ROT(SYSTEM.VAL(LONGINT,val),by));
- ASSERT(rot={23..24,26..28});
- END P;
- BEGIN P;
- END Test.
- positive: huge stack frames to check for ensured stack allocation
- MODULE Test;
- PROCEDURE P(count: LONGINT);
- VAR x: ARRAY 16000 OF CHAR;
- BEGIN
- IF count > 5 THEN RETURN END;
- P(count+1);
- END P;
- BEGIN P(0);
- END Test.
- positive: finally statement, direct and indirect
- MODULE Test;
- VAR b: BOOLEAN;
- PROCEDURE P;
- BEGIN
- HALT(100);
- RETURN
- FINALLY
- b := TRUE
- END P;
- PROCEDURE R;
- BEGIN
- HALT(100);
- END R;
- PROCEDURE Q;
- BEGIN
- R; RETURN
- FINALLY
- b := TRUE
- END Q;
- PROCEDURE S;
- PROCEDURE R;
- BEGIN
- HALT(100);
- END R;
- BEGIN
- R; RETURN
- FINALLY
- b := TRUE
- END S;
- BEGIN
- b := FALSE; P(); ASSERT(b=TRUE);
- b := FALSE; Q(); ASSERT(b=TRUE);
- b := FALSE; S(); ASSERT(b=TRUE);
- END Test.
- positive: negate hugeint zero
- MODULE Test;
- PROCEDURE Test;
- VAR x: INTEGER; h,j: HUGEINT;
- BEGIN
- h := 0;
- j := -h;
- ASSERT(j=0);
- END Test;
- BEGIN Test
- END Test.
- positive: allocation of a partially exported record type
- MODULE A;
- TYPE
- P*=POINTER TO Desc;
- Desc=RECORD a*,b: LONGINT END;
- END A.
- MODULE Test;
- IMPORT A;
- PROCEDURE Test;
- VAR a: A.P;
- BEGIN
- NEW(a); a.a := 10; ASSERT(a.a = 10);
- END Test;
- BEGIN Test
- END Test.
- positive: allocation of a partially exported record type in a multiply imported module
- MODULE A;
- TYPE
- P*=POINTER TO Desc;
- Desc=RECORD a*,b: LONGINT END;
- END A.
- MODULE B;
- END B.
- MODULE Test;
- IMPORT BB := B, BBB := B, AA := A, BBBB := B, AAA := A, B, A;
- PROCEDURE Test;
- VAR a: AAA.P;
- BEGIN
- NEW(a); a.a := 10; ASSERT(a.a = 10);
- END Test;
- BEGIN Test
- END Test.
- positive: pass sub-array (computation of address needs multiplication with base size)
- MODULE Test;
- VAR a: ARRAY 10 OF ARRAY 10 OF INTEGER;
- PROCEDURE Q(VAR a: ARRAY OF INTEGER; i: INTEGER);
- VAR j: INTEGER;
- BEGIN
- FOR j := 0 TO SHORT(LEN(a)-1 ) DO
- ASSERT(a[j] = i*10+j);
- END;
- END Q;
- PROCEDURE P(VAR a: ARRAY OF ARRAY OF INTEGER);
- VAR i,j: INTEGER;
- BEGIN
- FOR i := 0 TO SHORT(LEN(a,0)-1) DO
- FOR j := 0 TO SHORT(LEN(a,1)-1) DO
- a[i,j] := i*10+j;
- END;
- END;
- FOR i := 0 TO SHORT(LEN(a,0)-1) DO
- Q(a[i],i);
- END;
- END P;
- BEGIN P(a);
- END Test.
- positive: array length operator for static and dynamic arrays with static and dynamic dimension parameter
- MODULE Test;
- PROCEDURE Test;
- VAR a: ARRAY 1,2,3,4 OF LONGINT;
- b: POINTER TO ARRAY OF ARRAY OF ARRAY 3,4 OF LONGINT;
- c: POINTER TO ARRAY OF ARRAY OF ARRAY OF ARRAY OF LONGINT;
- l0,l1,l2,l3,lv,v: LONGINT;
- BEGIN
- v := 2;
- NEW(b,1,2);
- NEW(c,1,2,3,4);
- l0 := LEN(a,0);
- ASSERT(l0=1,1000);
- l1 := LEN(a,1);
- ASSERT(l1=2,1001);
- l2 := LEN(a,2);
- ASSERT(l2=3,1002);
- l3 := LEN(a,3);
- ASSERT(l3=4,1003);
- FOR v := 0 TO 3 DO
- lv := LEN(a,v);
- ASSERT(lv=v+1,1004);
- END;
- l0 := LEN(b,0);
- ASSERT(l0=1,2000);
- l1 := LEN(b,1);
- ASSERT(l1=2,2001);
- l2 := LEN(b,2);
- ASSERT(l2=3,2002);
- l3 := LEN(b,3);
- ASSERT(l3=4,2003);
- FOR v := 0 TO 3 DO
- lv := LEN(b,v);
- ASSERT(lv=v+1,2004);
- END;
- l0 := LEN(c,0);
- ASSERT(l0=1,3000);
- l1 := LEN(c,1);
- ASSERT(l1=2,3001);
- l2 := LEN(c,2);
- ASSERT(l2=3,3002);
- l3 := LEN(c,3);
- ASSERT(l3=4,3003);
- FOR v := 0 TO 3 DO
- lv := LEN(c,v);
- ASSERT(lv=v+1,3004);
- END;
- END Test;
- BEGIN Test
- END Test.
- positive: assignment of extended record type to base type (check destination size)
- MODULE Test;
- TYPE
- R= RECORD a,b,c: LONGINT END;
- S= RECORD (R) d,e: LONGINT END;
- PROCEDURE Test;
- VAR a0,a1,a2: LONGINT; b: R; c: LONGINT; d: S;
- BEGIN
- a0 := 0;
- a1 := 0;
- a2 := 0;
- c := 0;
- d.a := MAX(LONGINT);
- d.b := MAX(LONGINT);
- d.c := MAX(LONGINT);
- d.d := MAX(LONGINT);
- d.e := MAX(LONGINT);
- b := d;
- ASSERT(c=0);
- ASSERT(a0=0);
- ASSERT(a1=0);
- ASSERT(a2=0);
- ASSERT(b.a = MAX(LONGINT));
- ASSERT(b.b = MAX(LONGINT));
- ASSERT(b.c = MAX(LONGINT));
- END Test;
- BEGIN Test
- END Test.
- positive: return of real number (was: problem in AMD float stack)
- MODULE Test; (** AUTHOR ""; PURPOSE ""; *)
- VAR r: LONGREAL;
- PROCEDURE P(): LONGREAL;
- VAR x,y : LONGREAL;
- BEGIN
- x := 10;
- y := 20;
- x := x*x;
- RETURN y
- END P;
- BEGIN
- ASSERT(P()=20);
- END Test.
- positive: multiplication with 8-bit number (was: problem in AMD backend register reuse)
- MODULE Test;
- VAR longint: LONGINT;
- PROCEDURE Mul16(ch1,ch2: CHAR; VAR long:LONGINT);
- VAR
- int1,int0: INTEGER;
- BEGIN
- int1 := ORD(ch1);
- int0 := ORD(ch2);
- long := 256 * LONG(int1) + int0;
- END Mul16;
- BEGIN
- Mul16(10X,20X,longint);
- ASSERT(longint = 256*10H+20H);
- END Test.
- positive: test for correct use of SYSTEM.VAL (without conversion)
- MODULE Test;
- IMPORT SYSTEM;
- VAR r: REAL; x: LONGREAL; l: LONGINT; h: HUGEINT;
- PROCEDURE Real(): LONGINT;
- VAR r: REAL; l: LONGINT;
- BEGIN
- r := 10;
- (* trick to store real value in original format in longint variable wihout using SYSTEM.VAL, for testing SYSTEM.VAL ! *)
- SYSTEM.MOVE(SYSTEM.ADR(r),SYSTEM.ADR(l),SIZEOF(REAL));
- RETURN l;
- END Real;
- PROCEDURE Longreal(): HUGEINT;
- VAR r: LONGREAL; l: HUGEINT;
- BEGIN
- r := 10;
- (* trick to store real value in original format in longint variable wihout using SYSTEM.VAL, for testing SYSTEM.VAL ! *)
- SYSTEM.MOVE(SYSTEM.ADR(r),SYSTEM.ADR(l),SIZEOF(HUGEINT));
- RETURN l;
- END Longreal;
- PROCEDURE Longint(): REAL;
- VAR r: REAL; l: LONGINT;
- BEGIN
- l := 10;
- (* trick to store real value in original format in longint variable wihout using SYSTEM.VAL, for testing SYSTEM.VAL ! *)
- SYSTEM.MOVE(SYSTEM.ADR(l),SYSTEM.ADR(r),SIZEOF(REAL));
- RETURN r;
- END Longint;
- PROCEDURE Hugeint(): LONGREAL;
- VAR r: LONGREAL; l: HUGEINT;
- BEGIN
- l := 10;
- (* trick to store real value in original format in longint variable wihout using SYSTEM.VAL, for testing SYSTEM.VAL ! *)
- SYSTEM.MOVE(SYSTEM.ADR(l),SYSTEM.ADR(r),SIZEOF(LONGREAL));
- RETURN r;
- END Hugeint;
- BEGIN
- r := SYSTEM.VAL(REAL,Real());
- ASSERT(r = 10);
- x := SYSTEM.VAL(LONGREAL,Longreal());
- ASSERT(x = 10);
- l := SYSTEM.VAL(LONGINT, Longint());
- ASSERT(l=10);
- h := SYSTEM.VAL(HUGEINT, Hugeint());
- ASSERT(h=10);
- END Test.
- positive: correct use of indexers for (static) array of array
- MODULE Test;
- TYPE Elem = ARRAY 4 OF LONGINT;
- PROCEDURE P;
- VAR a: ARRAY 8 OF Elem;
- x: Elem; i: LONGINT;
- BEGIN
- FOR i := 0 TO LEN(a)-1 DO
- a[i,0] := i*1;
- a[i,1] := i*2;
- a[i,2] := i*3;
- a[i,3] := i*4;
- END;
- x := a[2];
- ASSERT(x[0] = 2);
- ASSERT(x[1] = 2*2);
- ASSERT(x[2] = 3*2);
- ASSERT(x[3] = 4*2);
- END P;
- BEGIN P
- END Test.
- positive: testing calling convention, in particular return of complex types
- MODULE Test;
- TYPE
- Object = OBJECT VAR a,b,c: INTEGER END Object;
- Record = RECORD a,b,c: INTEGER END;
- StaticArray=ARRAY 6 OF INTEGER;
- DynamicArray = POINTER TO ARRAY OF INTEGER;
- StaticMathArray= ARRAY [7] OF INTEGER;
- DynamicMathArray= ARRAY [*] OF INTEGER;
- TensorMathArray = ARRAY [?] OF INTEGER;
- PROCEDURE O(a,b,c: INTEGER): Object;
- VAR o: Object;
- BEGIN
- NEW(o); o.a := a; o.b := b; o.c := c;
- RETURN o;
- END O;
- PROCEDURE RO(a,b,c: INTEGER): Object;
- BEGIN
- IF RESULT = NIL THEN NEW(RESULT) END;
- RESULT.a := a; RESULT.b := b; RESULT.c := c;
- RETURN RESULT;
- END RO;
- PROCEDURE R(a,b,c: INTEGER): Record;
- VAR r: Record
- BEGIN
- r.a := a; r.b := b; r.c := c;
- RETURN r
- END R;
- PROCEDURE A(x,y,z: INTEGER): StaticArray;
- VAR a: StaticArray;
- BEGIN
- a[0] := x; a[1] := y; a[2] := z;
- RETURN a;
- END A;
- PROCEDURE RA(x,y,z: INTEGER): StaticArray;
- BEGIN
- RESULT[0] := x; RESULT[1] := y; RESULT[2] := z;
- RETURN RESULT;
- END RA;
- PROCEDURE DA(x,y,z: INTEGER): DynamicArray;
- VAR a: DynamicArray;
- BEGIN
- NEW(a,3);
- a[0] := x; a[1] := y; a[2] := z;
- RETURN a
- END DA;
- PROCEDURE RDA(x,y,z: INTEGER): DynamicArray;
- BEGIN
- IF RESULT = NIL THEN NEW(RESULT,3) END;
- RESULT[0] := x; RESULT[1] := y; RESULT[2] := z;
- RETURN RESULT
- END RDA;
- PROCEDURE MA(x,y,z: INTEGER): StaticMathArray;
- VAR a: StaticMathArray;
- BEGIN
- a[0] := x; a[1] := y; a[2] := z;
- RETURN a;
- END MA;
- PROCEDURE RMA(x,y,z: INTEGER): StaticMathArray;
- BEGIN
- RESULT[0] := x; RESULT[1] := y; RESULT[2] := z;
- RETURN RESULT;
- END RMA;
- PROCEDURE DMA(x,y,z: INTEGER): DynamicMathArray;
- VAR a: DynamicMathArray;
- BEGIN
- NEW(a,3);
- a[0] := x; a[1] := y; a[2] := z;
- RETURN a;
- END DMA;
- PROCEDURE RDMA(x,y,z: INTEGER): DynamicMathArray;
- BEGIN
- IF LEN(RESULT) < 3 THEN NEW(RESULT,3) END;
- RESULT[0] := x; RESULT[1] := y; RESULT[2] := z;
- RETURN RESULT;
- END RDMA;
- PROCEDURE TA(x,y,z: INTEGER): TensorMathArray;
- VAR a: TensorMathArray;
- BEGIN
- NEW(a,3);
- a[0] := x; a[1] := y; a[2] := z;
- RETURN a;
- END TA;
- PROCEDURE RTA(x,y,z: INTEGER): TensorMathArray;
- BEGIN
- IF (DIM(RESULT)# 1) OR (LEN(RESULT,0) < 3) THEN NEW(RESULT,3) END;
- RESULT[0] := x; RESULT[1] := y; RESULT[2] := z;
- RETURN RESULT;
- END RTA;
- PROCEDURE S(r: Record; a,b,c: INTEGER);
- BEGIN
- ASSERT(r.a=a); ASSERT(r.b = b); ASSERT(r.c = c);
- END S;
- PROCEDURE T(CONST r: Record; a,b,c: INTEGER);
- BEGIN
- ASSERT(r.a=a); ASSERT(r.b = b); ASSERT(r.c = c);
- END T;
- PROCEDURE U(o: Object; a,b,c: INTEGER);
- BEGIN
- ASSERT(o.a=a); ASSERT(o.b = b); ASSERT(o.c = c);
- END U;
- PROCEDURE V(a: StaticArray; x,y,z: INTEGER);
- BEGIN
- ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
- END V;
- PROCEDURE W(CONST a: StaticArray; x,y,z: INTEGER);
- BEGIN
- ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
- END W;
- PROCEDURE WM(CONST a: StaticMathArray; x,y,z: INTEGER);
- BEGIN
- ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
- END WM;
- PROCEDURE WVM(CONST a: StaticMathArray; x,y,z: INTEGER);
- BEGIN
- ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
- END WVM;
- PROCEDURE WDM(CONST a: DynamicMathArray; x,y,z: INTEGER);
- BEGIN
- ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
- END WDM;
- PROCEDURE WDVM(CONST a: DynamicMathArray; x,y,z: INTEGER);
- BEGIN
- ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
- END WDVM;
- PROCEDURE WTM(CONST a: TensorMathArray; x,y,z: INTEGER);
- BEGIN
- ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
- END WTM;
- PROCEDURE WTVM(CONST a: TensorMathArray; x,y,z: INTEGER);
- BEGIN
- ASSERT(a[0]=x); ASSERT(a[1] = y); ASSERT(a[2] =z);
- END WTVM;
- PROCEDURE P;
- VAR o: Object; r: Record; a: StaticArray; d: DynamicArray; ma: StaticMathArray; dma: DynamicMathArray; tma: TensorMathArray;
- BEGIN
- o := O(1,2,3); U(o,1,2,3);
- o := RO(10,20,30); U(o,10,20,30);
- o := NIL;
- o := RO(11,22,33); U(o,11,22,33);
- r := R(10,20,30);
- ASSERT(r.a = 10); ASSERT(r.b = 20); ASSERT(r.c = 30);
- S(R(10,20,30),10,20,30);
- T(R(10,20,30),10,20,30);
- U(O(10,20,30),10,20,30);
- a := A(10,20,30);
- V(a,10,20,30);
- V(A(10,20,30),10,20,30);
- W(A(10,20,30),10,20,30);
- ma := MA(10,20,30);
- WM(ma,10,20,30);
- WM(MA(1,2,3),1,2,3);
- WVM(MA(2,3,4),2,3,4);
- dma := DMA(10,20,30); WDM(dma,10,20,30);
- WDM(DMA(1,2,3),1,2,3);
- WDVM(DMA(1,2,3),1,2,3);
- dma := RDMA(10,20,30); WDM(dma,10,20,30);
- WDM(RDMA(1,2,3),1,2,3);
- WDVM(RDMA(1,2,3),1,2,3);
- tma := TA(4,5,6); WTM(tma,4,5,6);
- WTM(TA(2,3,4),2,3,4);
- WTVM(TA(3,4,5),3,4,5);
- tma := RTA(4,5,6); WTM(tma,4,5,6);
- WTM(RTA(2,3,4),2,3,4);
- WTVM(RTA(3,4,5),3,4,5);
- END P;
- BEGIN P;
- END Test.
- positive: simple calling convention test (c and winapi returning pointer)
- MODULE Test;
- TYPE
- Pointer = POINTER TO RECORD x,y: LONGINT END;
- PROCEDURE {C} P(x,y: LONGINT): Pointer;
- VAR p: Pointer;
- BEGIN
- NEW(p);
- p.x := x;
- p.y := y;
- RETURN p
- END P;
- PROCEDURE {WINAPI} Q(x,y: LONGINT): Pointer;
- VAR p: Pointer;
- BEGIN
- NEW(p);
- p.x := x;
- p.y := y;
- RETURN p
- END Q;
- PROCEDURE R(x,y: LONGINT): Pointer;
- VAR p: Pointer;
- BEGIN
- NEW(p);
- p.x := x;
- p.y := y;
- RETURN p
- END R;
- PROCEDURE Test*;
- VAR p,q,r: Pointer;
- BEGIN
- p := P(1,2);
- ASSERT(p.x = 1); ASSERT(p.y = 2);
- q := Q(1,2);
- ASSERT(q.x = 1); ASSERT(q.y = 2);
- r := R(1,2);
- ASSERT(r.x = 1); ASSERT(r.y = 2);
- END Test;
- BEGIN
- Test
- END Test.
- positive: use local variable as value and as reference (optimizer test)
- MODULE Test;
- PROCEDURE P(VAR x: LONGINT);
- BEGIN
- x := 20;
- END P;
- PROCEDURE T;
- VAR x: LONGINT;
- BEGIN
- x := 10;
- P(x);
- ASSERT(x=20);
- END T;
- BEGIN
- T;
- END Test.
- positive: pass record size to array of system.byte with dynamic dize for varpars and dereferences
- MODULE Test;
- IMPORT SYSTEM;
- TYPE Base = RECORD END;
- TYPE Record = RECORD(Base) a,b,c: LONGINT END
- PROCEDURE TestS(VAR a: ARRAY OF SYSTEM.BYTE);
- BEGIN
- ASSERT(LEN(a) = SIZEOF(Record));
- END TestS;
- PROCEDURE TestI(VAR a: Base);
- BEGIN
- TestS(a);
- END TestI;
- VAR a: POINTER TO Base; b: POINTER TO Record; c: Record;
- BEGIN
- NEW(b); a := b;
- TestS(a^);
- TestI(a^);
- TestI(c);
- END Test.
- positive: pass variables and values to array of byte
- MODULE Test;
- IMPORT SYSTEM;
- PROCEDURE Pass(CONST a: ARRAY OF SYSTEM.BYTE; len: LONGINT);
- VAR i: LONGINT;
- BEGIN
- ASSERT(LEN(a) = len);
- END Pass;
- PROCEDURE Test;
- VAR i: LONGINT;
- BEGIN
- Pass(3,1);
- Pass(i,4);
- Pass(3+i,4);
- Pass(65000, 2);
- END Test;
-
- BEGIN
- Test;
- END Test.
-
- positive: pass three-dimensional arrays A[x,y,z] with missing dimensions, e.g. A[x]
-
- MODULE Test;
- IMPORT SYSTEM;
- PROCEDURE Pass(CONST a: ARRAY OF SYSTEM.BYTE; adr, len: ADDRESS);
- VAR i: LONGINT;
- BEGIN
- ASSERT(ADDRESS OF a[0] = adr);
- ASSERT(LEN(a) = len);
- END Pass;
- PROCEDURE Test;
- TYPE
- R= RECORD a,b,c: LONGINT END;
- S= ARRAY 3 OF LONGINT;
- VAR
- b: POINTER TO ARRAY OF ARRAY OF ARRAY OF LONGINT;
- c: POINTER TO ARRAY OF ARRAY OF ARRAY OF R;
- d: POINTER TO ARRAY OF ARRAY OF ARRAY OF S;
- BEGIN
- NEW(b,7,8,9);
- Pass(b^, ADDRESS OF b[0,0,0], LEN(b,0)*LEN(b,1)*LEN(b,2)*SIZEOF(LONGINT));
- Pass(b[1], ADDRESS OF b[1,0,0], LEN(b,1)*LEN(b,2)*SIZEOF(LONGINT));
- Pass(b[1,2], ADDRESS OF b[1,2,0], LEN(b,2)*SIZEOF(LONGINT));
- Pass(b[1,2,3], ADDRESS OF b[1,2,3], SIZEOF(LONGINT));
- NEW(c,7,8,9);
- Pass(c^, ADDRESS OF c[0,0,0], LEN(c,0)*LEN(c,1)*LEN(c,2)*SIZEOF(R));
- Pass(c[1], ADDRESS OF c[1,0,0], LEN(c,1)*LEN(c,2)*SIZEOF(R));
- Pass(c[1,2], ADDRESS OF c[1,2,0], LEN(c,2)*SIZEOF(R));
- Pass(c[1,2,3], ADDRESS OF c[1,2,3], SIZEOF(R));
- NEW(d,7,8,9);
- Pass(d^, ADDRESS OF d[0,0,0], LEN(d,0)*LEN(d,1)*LEN(d,2)*SIZEOF(S));
- Pass(d[1], ADDRESS OF d[1,0,0], LEN(d,1)*LEN(d,2)*SIZEOF(S));
- Pass(d[1,2], ADDRESS OF d[1,2,0], LEN(d,2)*SIZEOF(S));
- Pass(d[1,2,3], ADDRESS OF d[1,2,3], SIZEOF(S));
- END Test;
- BEGIN
- Test;
- END Test.
|