test_all.py 229 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658
  1. import unittest
  2. import sys
  3. try:
  4. from unit.utils import *
  5. import unit.log_output as log_output
  6. except ImportError: #for Python2
  7. from utils import *
  8. import log_output as log_output
  9. sys.path.append("wrappers")
  10. from modelverse import *
  11. import threading
  12. ### Model operations
  13. def null_operation(model):
  14. pass
  15. def model_is_empty_operation(model):
  16. assert model is None
  17. def ops_manual_callback(model):
  18. p1 = instantiate(model, "PetriNet_Runtime/Place")
  19. p2 = instantiate(model, "PetriNet_Runtime/Place")
  20. p3 = instantiate(model, "PetriNet_Runtime/Place")
  21. t1 = instantiate(model, "PetriNet_Runtime/Transition")
  22. p2t1 = instantiate(model, "PetriNet_Runtime/P2T", (p1, t1))
  23. p2t2 = instantiate(model, "PetriNet_Runtime/P2T", (p2, t1))
  24. t2p1 = instantiate(model, "PetriNet_Runtime/T2P", (t1, p3))
  25. attr_assign(model, p1, "tokens", 1)
  26. attr_assign(model, p1, "name", "p1")
  27. attr_assign(model, p2, "tokens", 2)
  28. attr_assign(model, p2, "name", "p2")
  29. attr_assign(model, p3, "tokens", 3)
  30. attr_assign(model, p3, "name", "p3")
  31. attr_assign(model, t1, "name", "t1")
  32. attr_assign(model, t1, "executing", False)
  33. attr_assign(model, p2t1, "weight", 1)
  34. attr_assign(model, p2t2, "weight", 1)
  35. attr_assign(model, t2p1, "weight", 2)
  36. def pn_subfunc_callback_refine_PN(model):
  37. p1 = instantiate(model, "PetriNet/Place")
  38. attr_assign(model, p1, "name", "p1")
  39. attr_assign(model, p1, "tokens", 1)
  40. t1 = instantiate(model, "PetriNet/Transition")
  41. attr_assign(model, t1, "name", "t1")
  42. p2t = instantiate(model, "PetriNet/P2T", (p1, t1))
  43. attr_assign(model, p2t, "weight", 1)
  44. def render_add_tracability(model):
  45. instantiate(model, "Association", ("abstract/Block", "rendered/Group"), ID="TracabilityLink")
  46. def ops_add_tracability_D2R(model):
  47. instantiate(model, "Association", ("PetriNet/Place", "PetriNet_Runtime/Place"), ID="D2R_PlaceLink")
  48. instantiate(model, "Association", ("PetriNet/Transition", "PetriNet_Runtime/Transition"), ID="D2R_TransitionLink")
  49. def ops_add_tracability_R2D(model):
  50. instantiate(model, "Association", ("PetriNet_Runtime/Place", "PetriNet/Place"), ID="R2D_PlaceLink")
  51. instantiate(model, "Association", ("PetriNet_Runtime/Transition", "PetriNet/Transition"), ID="R2D_TransitionLink")
  52. def operation_exec_1(model):
  53. assert model is not None
  54. assert [{"__id": "MODEL_A/__0", "__type": "MODEL_A/A", "name": None}] == element_list_nice(model)
  55. instantiate(model, "MODEL_B/B")
  56. def operation_MAN_0(model):
  57. # Check if both are present
  58. lst = element_list_nice(model)
  59. assert len(lst) == 6
  60. assert {"__id": "MODEL_A/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  61. assert {"__id": "MODEL_A/A", "__type": "Class", "name": "A", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  62. assert {"__id": "MODEL_A/A_name", "__type": "AttributeLink", "__source": "MODEL_A/A", "__target": "MODEL_A/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  63. assert {"__id": "MODEL_B/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  64. assert {"__id": "MODEL_B/B", "__type": "Class", "name": "B", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  65. assert {"__id": "MODEL_B/B_name", "__type": "AttributeLink", "__source": "MODEL_B/B", "__target": "MODEL_B/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  66. # Do minor merge operation
  67. instantiate(model, "Association", edge=("MODEL_A/A", "MODEL_B/B"), ID="trace")
  68. # Check again
  69. lst = element_list_nice(model)
  70. assert len(lst) == 7
  71. assert {"__id": "MODEL_A/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  72. assert {"__id": "MODEL_A/A", "__type": "Class", "name": "A", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  73. assert {"__id": "MODEL_A/A_name", "__type": "AttributeLink", "__source": "MODEL_A/A", "__target": "MODEL_A/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  74. assert {"__id": "MODEL_B/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  75. assert {"__id": "MODEL_B/B", "__type": "Class", "name": "B", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  76. assert {"__id": "MODEL_B/B_name", "__type": "AttributeLink", "__source": "MODEL_B/B", "__target": "MODEL_B/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  77. assert {"__id": "trace", "__type": "Association", "__source": "MODEL_A/A", "__target": "MODEL_B/B", "name": None, "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}, "lower_cardinality": None, "upper_cardinality": None} in lst
  78. def operation_MAN_1(model):
  79. # Check if both are present
  80. lst = element_list_nice(model)
  81. assert len(lst) == 6
  82. assert {"__id": "MODEL_A/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  83. assert {"__id": "MODEL_A/A", "__type": "Class", "name": "A", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  84. assert {"__id": "MODEL_A/A_name", "__type": "AttributeLink", "__source": "MODEL_A/A", "__target": "MODEL_A/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  85. assert {"__id": "MODEL_B/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  86. assert {"__id": "MODEL_B/B", "__type": "Class", "name": "B", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  87. assert {"__id": "MODEL_B/B_name", "__type": "AttributeLink", "__source": "MODEL_B/B", "__target": "MODEL_B/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  88. def operation_MT_0(model):
  89. # Check if both are present
  90. lst = element_list_nice(model)
  91. assert len(lst) == 6
  92. assert {"__id": "MODEL_A/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  93. assert {"__id": "MODEL_A/A", "__type": "Class", "name": "A", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  94. assert {"__id": "MODEL_A/A_name", "__type": "AttributeLink", "__source": "MODEL_A/A", "__target": "MODEL_A/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  95. assert {"__id": "MODEL_B/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  96. assert {"__id": "MODEL_B/B", "__type": "Class", "name": "B", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  97. assert {"__id": "MODEL_B/B_name", "__type": "AttributeLink", "__source": "MODEL_B/B", "__target": "MODEL_B/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  98. # Do minor merge operation
  99. instantiate(model, "Association", edge=("MODEL_A/A", "MODEL_B/B"), ID="trace")
  100. # Check again
  101. lst = element_list_nice(model)
  102. assert len(lst) == 7
  103. assert {"__id": "MODEL_A/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  104. assert {"__id": "MODEL_A/A", "__type": "Class", "name": "A", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  105. assert {"__id": "MODEL_A/A_name", "__type": "AttributeLink", "__source": "MODEL_A/A", "__target": "MODEL_A/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  106. assert {"__id": "MODEL_B/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  107. assert {"__id": "MODEL_B/B", "__type": "Class", "name": "B", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  108. assert {"__id": "MODEL_B/B_name", "__type": "AttributeLink", "__source": "MODEL_B/B", "__target": "MODEL_B/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  109. assert {"__id": "trace", "__type": "Association", "__source": "MODEL_A/A", "__target": "MODEL_B/B", "name": None, "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}, "lower_cardinality": None, "upper_cardinality": None} in lst
  110. def operation_MT_1(model):
  111. # Check if both are present
  112. lst = element_list_nice(model)
  113. assert len(lst) == 6
  114. assert {"__id": "MODEL_A/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  115. assert {"__id": "MODEL_A/A", "__type": "Class", "name": "A", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  116. assert {"__id": "MODEL_A/A_name", "__type": "AttributeLink", "__source": "MODEL_A/A", "__target": "MODEL_A/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  117. assert {"__id": "MODEL_B/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  118. assert {"__id": "MODEL_B/B", "__type": "Class", "name": "B", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  119. assert {"__id": "MODEL_B/B_name", "__type": "AttributeLink", "__source": "MODEL_B/B", "__target": "MODEL_B/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  120. def operation_AL_0(model):
  121. # Check if both are present
  122. lst = element_list_nice(model)
  123. assert len(lst) == 6
  124. assert {"__id": "MODEL_A/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  125. assert {"__id": "MODEL_A/A", "__type": "Class", "name": "A", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  126. assert {"__id": "MODEL_A/A_name", "__type": "AttributeLink", "__source": "MODEL_A/A", "__target": "MODEL_A/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  127. assert {"__id": "MODEL_B/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  128. assert {"__id": "MODEL_B/B", "__type": "Class", "name": "B", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  129. assert {"__id": "MODEL_B/B_name", "__type": "AttributeLink", "__source": "MODEL_B/B", "__target": "MODEL_B/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  130. # Do minor merge operation
  131. instantiate(model, "Association", edge=("MODEL_A/A", "MODEL_B/B"), ID="trace")
  132. # Check again
  133. lst = element_list_nice(model)
  134. assert len(lst) == 7
  135. assert {"__id": "MODEL_A/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  136. assert {"__id": "MODEL_A/A", "__type": "Class", "name": "A", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  137. assert {"__id": "MODEL_A/A_name", "__type": "AttributeLink", "__source": "MODEL_A/A", "__target": "MODEL_A/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  138. assert {"__id": "MODEL_B/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  139. assert {"__id": "MODEL_B/B", "__type": "Class", "name": "B", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  140. assert {"__id": "MODEL_B/B_name", "__type": "AttributeLink", "__source": "MODEL_B/B", "__target": "MODEL_B/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  141. assert {"__id": "trace", "__type": "Association", "__source": "MODEL_A/A", "__target": "MODEL_B/B", "name": None, "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}, "lower_cardinality": None, "upper_cardinality": None} in lst
  142. def operation_AL_1(model):
  143. # Check if both are present
  144. lst = element_list_nice(model)
  145. assert len(lst) == 6
  146. assert {"__id": "MODEL_A/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  147. assert {"__id": "MODEL_A/A", "__type": "Class", "name": "A", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  148. assert {"__id": "MODEL_A/A_name", "__type": "AttributeLink", "__source": "MODEL_A/A", "__target": "MODEL_A/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  149. assert {"__id": "MODEL_B/String", "__type": "SimpleAttribute", "name": None, "constraint": {"AL": ""}} in lst
  150. assert {"__id": "MODEL_B/B", "__type": "Class", "name": "B", "lower_cardinality": None, "upper_cardinality": None, "abstract": None, "constraint": {"AL": ""}} in lst
  151. assert {"__id": "MODEL_B/B_name", "__type": "AttributeLink", "__source": "MODEL_B/B", "__target": "MODEL_B/String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  152. model_hierarchy = \
  153. {"formalisms/": {"SimpleClassDiagrams": {},
  154. "TypeMapping": {},
  155. "Tracability": {},
  156. "ProcessModel": {},
  157. "ActionLanguage": {},
  158. "ManualOperation": {},
  159. "Bottom": {},
  160. },
  161. "models/": {},
  162. "administration/": {"core": {},
  163. "CoreFormalism": {},
  164. },
  165. "users/": {"admin/": {},
  166. "LoLA/": {},
  167. "HUTN/": {},
  168. "files/": {},
  169. "DEVS/": {},
  170. "DEVS_batch/": {},
  171. "JSON/": {},
  172. },
  173. "type mappings/": {"1": {},
  174. "2": {},
  175. "3": {},
  176. "4": {},
  177. "5": {},
  178. "6": {},
  179. "7": {},
  180. "8": {},
  181. "9": {},
  182. },
  183. "merged/": {},
  184. "tmp/": {},
  185. "RAMified/": {},
  186. }
  187. def verify_clean():
  188. compare_locations("", set())
  189. compare_locations("models", set())
  190. compare_locations("formalisms", set())
  191. def get_model_list(location):
  192. try:
  193. location_parts = location.split("/")
  194. current = model_hierarchy
  195. while location_parts:
  196. l = location_parts.pop(0)
  197. if l != "":
  198. current = current[l + "/"]
  199. return set(current.keys())
  200. except:
  201. return set([])
  202. def compare_locations(location, extra_to_default):
  203. assert model_list(location) == get_model_list(location) | set(extra_to_default)
  204. def compare_unordered_lists(got, expected):
  205. assert len(got) == len(expected)
  206. for i in got:
  207. assert i in expected
  208. for i in expected:
  209. assert i in got
  210. class TestModelverse(unittest.TestCase):
  211. proc = None
  212. def runTest(self):
  213. pass
  214. @classmethod
  215. def setUpClass(self):
  216. TestModelverse.proc, address = start_mvc()
  217. init(address)
  218. login("user", "user")
  219. @classmethod
  220. def tearDownClass(self):
  221. try:
  222. kill(TestModelverse.proc)
  223. except:
  224. print("Got exception during teardown.")
  225. def setUp(self):
  226. verify_clean()
  227. folder_create("users/user/test")
  228. def tearDown(self):
  229. model_delete("users/user/test")
  230. verify_clean()
  231. reset_context()
  232. def test_op_model_list(self):
  233. assert model_list("") == set(["formalisms/",
  234. "models/",
  235. "administration/",
  236. "type mappings/",
  237. "users/",
  238. "merged/",
  239. "RAMified/",
  240. "tmp/",
  241. ])
  242. assert model_list("formalisms") == set(["SimpleClassDiagrams",
  243. "ActionLanguage",
  244. "TypeMapping",
  245. "Tracability",
  246. "ProcessModel",
  247. "ManualOperation",
  248. "Bottom",
  249. ])
  250. assert model_list("formalisms/") == set(["SimpleClassDiagrams",
  251. "ActionLanguage",
  252. "TypeMapping",
  253. "Tracability",
  254. "ProcessModel",
  255. "ManualOperation",
  256. "Bottom",
  257. ])
  258. # Try unreadable location
  259. try:
  260. model_list("administration")
  261. self.fail()
  262. except ReadPermissionDenied:
  263. pass
  264. # Try non-existing location
  265. try:
  266. model_list("adfjafdla")
  267. self.fail()
  268. except UnknownLocation:
  269. pass
  270. # Try model list of a model itself
  271. assert model_list("formalisms/SimpleClassDiagrams") == set([])
  272. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  273. model_add("users/user/test/b", "formalisms/SimpleClassDiagrams")
  274. model_add("users/user/test/c", "formalisms/SimpleClassDiagrams")
  275. assert model_list("users/user/test") == set(["a", "b", "c"])
  276. assert model_list("users/user/test/") == set(["a", "b", "c"])
  277. def test_op_model_list_full(self):
  278. assert model_list_full("") == set([("formalisms/", "admin", "admin", "221"),
  279. ("models/", "admin", "admin", "221"),
  280. ("administration/", "admin", "admin", "110"),
  281. ("type mappings/", "admin", "admin", "221"),
  282. ("users/", "admin", "admin", "221"),
  283. ("merged/", "admin", "nobody", "222"),
  284. ("RAMified/", "admin", "nobody", "222"),
  285. ("tmp/", "admin", "nobody", "222"),
  286. ])
  287. assert model_list_full("formalisms") == set([("SimpleClassDiagrams", "admin", "admin", "221"),
  288. ("ActionLanguage", "admin", "admin", "221"),
  289. ("TypeMapping", "admin", "admin", "221"),
  290. ("Tracability", "admin", "admin", "221"),
  291. ("ProcessModel", "admin", "admin", "221"),
  292. ("ManualOperation", "admin", "admin", "221"),
  293. ("Bottom", "admin", "admin", "221"),
  294. ])
  295. # Try unreadable location
  296. try:
  297. model_list_full("administration")
  298. self.fail()
  299. except ReadPermissionDenied:
  300. pass
  301. # Try non-existing location
  302. try:
  303. model_list_full("adfjafdla")
  304. self.fail()
  305. except UnknownLocation:
  306. pass
  307. # Try model list of a model itself
  308. assert model_list_full("formalisms/SimpleClassDiagrams") == set([])
  309. def test_op_verify(self):
  310. # Verify M3 --> M3
  311. assert verify("formalisms/SimpleClassDiagrams", "formalisms/SimpleClassDiagrams") == "OK"
  312. # Verify with bottom
  313. assert verify("formalisms/SimpleClassDiagrams", "formalisms/Bottom") == "OK"
  314. # Verify the type mapping models
  315. for tm in model_types("formalisms/SimpleClassDiagrams"):
  316. assert verify(tm[1], "formalisms/TypeMapping") == "OK"
  317. # Verify wrong
  318. try:
  319. verify("formalisms/SimpleClassDiagrams", "formalisms/ProcessModel")
  320. self.fail()
  321. except UnknownMetamodellingHierarchy:
  322. pass
  323. # Verify M2 --> M3
  324. assert verify("formalisms/ProcessModel", "formalisms/SimpleClassDiagrams") == "OK"
  325. assert verify("formalisms/ProcessModel", "formalisms/Bottom") == "OK"
  326. for tm in model_types("formalisms/ProcessModel"):
  327. assert verify(tm[1], "formalisms/TypeMapping") == "OK"
  328. try:
  329. verify("formalisms/ProcessModel", "formalisms/ProcessModel")
  330. self.fail()
  331. except UnknownMetamodellingHierarchy:
  332. pass
  333. # Verify M1 --> M2
  334. model_add("users/user/test/a", "formalisms/ProcessModel")
  335. # Fails with lacking instances of Start and Finish class
  336. assert verify("users/user/test/a", "formalisms/ProcessModel").startswith("Lower cardinality violated for class: ")
  337. instantiate("users/user/test/a", "Start")
  338. # Fails with lacking instances of Finish class
  339. assert verify("users/user/test/a", "formalisms/ProcessModel") == "Lower cardinality violated for class: Finish"
  340. instantiate("users/user/test/a", "Finish")
  341. # Succeeds
  342. assert verify("users/user/test/a", "formalisms/ProcessModel") == "OK"
  343. # Test unreadable model
  344. try:
  345. verify("administration/core", "formalisms/ProcessModel")
  346. self.fail()
  347. except ReadPermissionDenied:
  348. pass
  349. # Test unreadable metamodel
  350. try:
  351. verify("formalisms/Bottom", "administration/core")
  352. self.fail()
  353. except ReadPermissionDenied:
  354. pass
  355. # Test non-existing model
  356. try:
  357. verify("adfadf", "formalisms/SimpleClassDiagrams")
  358. self.fail()
  359. except UnknownModel:
  360. pass
  361. # Test non-existing metamodel
  362. try:
  363. verify("formalisms/SimpleClassDiagrams", "adfka")
  364. self.fail()
  365. except UnknownModel:
  366. pass
  367. # Test verify of a folder (model)
  368. try:
  369. verify("users", "formalisms/SimpleClassDiagrams")
  370. self.fail()
  371. except NotAModel:
  372. pass
  373. # Test verify of a folder (metamodel)
  374. try:
  375. verify("users/user/test/a", "users")
  376. self.fail()
  377. except NotAModel:
  378. pass
  379. def test_op_permission_modify(self):
  380. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  381. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200")])
  382. # Check that we can read
  383. element_list_nice("users/user/test/a")
  384. # Check that we can write
  385. instantiate("users/user/test/a", "Class")
  386. assert permission_modify("users/user/test/a", "100") == None
  387. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "100")])
  388. # Check that we can read
  389. element_list_nice("users/user/test/a")
  390. # Check that we can't write
  391. try:
  392. instantiate("users/user/test/a", "Class")
  393. self.fail()
  394. except WritePermissionDenied:
  395. pass
  396. assert permission_modify("users/user/test/a", "000") == None
  397. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "000")])
  398. # Check that we can't read
  399. try:
  400. element_list_nice("users/user/test/a")
  401. self.fail()
  402. except ReadPermissionDenied:
  403. pass
  404. # Check that we can't write
  405. try:
  406. instantiate("users/user/test/a", "Class")
  407. self.fail()
  408. except WritePermissionDenied:
  409. pass
  410. except ReadPermissionDenied:
  411. pass
  412. assert permission_modify("users/user/test/a", "200") == None
  413. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200")])
  414. # Check that we can read
  415. element_list_nice("users/user/test/a")
  416. # Check that we can write
  417. instantiate("users/user/test/a", "Class")
  418. # Cannot modify permissions if we don't own the model
  419. try:
  420. permission_modify("formalisms/SimpleClassDiagrams", "222")
  421. self.fail()
  422. except UserPermissionDenied:
  423. pass
  424. # Cannot modify permissions even if we have full access, as long as we are not the owner
  425. model_add("users/user/test/z", "formalisms/SimpleClassDiagrams")
  426. permission_owner("users/user/test/z", "admin")
  427. try:
  428. permission_modify("users/user/test/z", "222")
  429. self.fail()
  430. except UserPermissionDenied:
  431. pass
  432. try:
  433. permission_owner("users/user/test/z", "user")
  434. self.fail()
  435. except UserPermissionDenied:
  436. pass
  437. # Cannot change non-existing model
  438. before = model_list("")
  439. try:
  440. permission_modify("adfadf", "111")
  441. self.fail()
  442. except UnknownModel:
  443. assert model_list("") == before
  444. # Check for type of permission string
  445. # Too long
  446. try:
  447. permission_modify("users/user/test/a", "1111")
  448. self.fail()
  449. except IncorrectFormat:
  450. assert [i[3] for i in model_list_full("users/user/test/") if i[0] == "a"][0] == "200"
  451. # Above 2
  452. try:
  453. permission_modify("users/user/test/a", "131")
  454. self.fail()
  455. except IncorrectFormat:
  456. assert [i[3] for i in model_list_full("users/user/test/") if i[0] == "a"][0] == "200"
  457. # Below 0
  458. try:
  459. permission_modify("users/user/test/a", "-111")
  460. self.fail()
  461. except IncorrectFormat:
  462. assert [i[3] for i in model_list_full("users/user/test/") if i[0] == "a"][0] == "200"
  463. # Non-integer
  464. try:
  465. permission_modify("users/user/test/a", "2a1")
  466. self.fail()
  467. except IncorrectFormat:
  468. assert [i[3] for i in model_list_full("users/user/test/") if i[0] == "a"][0] == "200"
  469. def test_op_model_add(self):
  470. assert model_list_full("users/user/test") == set([])
  471. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  472. # Test permissions of newly created empty model
  473. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200")])
  474. model_add("users/user/test/b", "formalisms/SimpleClassDiagrams", \
  475. """
  476. Class A {
  477. name = "A"
  478. }
  479. Class B {
  480. name = "B"
  481. abstract = True
  482. }
  483. """)
  484. # Test permissions of newly created non-empty model
  485. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200"), ("b", "user", "nobody", "200")])
  486. # Test content of newly created model with code upload
  487. lst = element_list_nice("users/user/test/b")
  488. assert len(lst) == 2
  489. assert {'__id': "A", "__type": "Class", "abstract": None, "constraint": {"AL": ""}, "lower_cardinality": None, "upper_cardinality": None, "name": "A"} in lst
  490. assert {'__id': "B", "__type": "Class", "abstract": True, "constraint": {"AL": ""}, "lower_cardinality": None, "upper_cardinality": None, "name": "B"} in lst
  491. try:
  492. # Cannot upload model to unwritable location at root
  493. model_add("z", "formalisms/SimpleClassDiagrams")
  494. self.fail()
  495. except WritePermissionDenied:
  496. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200"), ("b", "user", "nobody", "200")])
  497. try:
  498. # Cannot upload model to unwritable location somewhere in hierarchy
  499. model_add("users/new_model", "formalisms/SimpleClassDiagrams")
  500. self.fail()
  501. except WritePermissionDenied:
  502. assert "new_model/" not in model_list("users/")
  503. try:
  504. # Cannot upload model to unwritable location somewhere in hierarchy with multiple new branches
  505. model_add("users/new_username/new_model", "formalisms/SimpleClassDiagrams")
  506. self.fail()
  507. except WritePermissionDenied:
  508. assert "new_username/" not in model_list("users/")
  509. model_add("users/user/test/c", "users/user/test/b", """
  510. A a {}
  511. """)
  512. try:
  513. # Cannot add this model, as it cannot be auto-typecasted to formalisms/SimpleClassDiagrams
  514. model_add("users/user/test/d", "users/user/test/c", """
  515. a c {}
  516. """)
  517. self.fail()
  518. except UnknownM3:
  519. assert model_list("users/user/test") == set(["a", "b", "c"])
  520. # We can add this model for multiple levels, as it can be automatically typecasted to formalisms/SimpleClassDiagrams, since it is empty
  521. model_add("users/user/test/d", "users/user/test/b")
  522. model_add("users/user/test/e", "users/user/test/d")
  523. model_add("users/user/test/f", "users/user/test/e")
  524. # Cannot instantiate a folder metamodel
  525. try:
  526. model_add("users/user/test/z", "users")
  527. self.fail()
  528. except NotAModel:
  529. assert "z" not in model_list("users/user/test")
  530. def test_op_model_add_compilation_error(self):
  531. #try:
  532. # model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  533. # abdfaefeaf
  534. # """)
  535. # self.fail()
  536. #except CompilationError:
  537. # pass
  538. #try:
  539. # model_add("users/user/test/b", "formalisms/SimpleClassDiagrams", """
  540. # Crass A {
  541. # name = "b"
  542. # }
  543. # """)
  544. # #TODO at the moment, this still succeeds!
  545. # self.fail()
  546. #except:
  547. # raise
  548. pass
  549. def test_op_model_move(self):
  550. # Test basic scenario
  551. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  552. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200")])
  553. assert model_move("users/user/test/a", "users/user/test/b") == None
  554. assert model_list_full("users/user/test") == set([("b", "user", "nobody", "200")])
  555. # Test if permissions are copied as well
  556. permission_modify("users/user/test/b", "222")
  557. assert model_list_full("users/user/test") == set([("b", "user", "nobody", "222")])
  558. assert model_move("users/user/test/b", "users/user/test/a") == None
  559. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "222")])
  560. model_add("users/user/test/b", "formalisms/SimpleClassDiagrams")
  561. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "222"), ("b", "user", "nobody", "200")])
  562. try:
  563. model_move("users/user/test/a", "users/user/test/b")
  564. self.fail()
  565. except LocationExists:
  566. pass
  567. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "222"), ("b", "user", "nobody", "200")])
  568. # Test move if source doesn't exist
  569. try:
  570. model_move("users/user/test/z", "users/user/test/y")
  571. self.fail()
  572. except UnknownModel:
  573. pass
  574. # Test if we can move a model we can't write to (i.e., not allowed to remove it)
  575. try:
  576. model_move("formalisms/ProcessModel", "users/user/test/x")
  577. self.fail()
  578. except WritePermissionDenied:
  579. pass
  580. # Test if we can move a model to a place we can't write to
  581. try:
  582. model_move("users/user/test/a", "administration/ProcessModel2")
  583. self.fail()
  584. except WritePermissionDenied:
  585. pass
  586. # Test moving an entire folder
  587. folder_create("users/user/test/folder_a")
  588. model_add("users/user/test/folder_a/a", "formalisms/SimpleClassDiagrams")
  589. model_add("users/user/test/folder_a/b", "formalisms/SimpleClassDiagrams")
  590. model_add("users/user/test/folder_a/c", "formalisms/SimpleClassDiagrams")
  591. all_models = model_list_full("users/user/test/folder_a")
  592. model_move("users/user/test/folder_a", "users/user/test/folder_b")
  593. assert model_list_full("users/user/test/folder_b") == all_models
  594. def test_op_model_delete(self):
  595. # Test basic delete
  596. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  597. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200")])
  598. assert model_delete("users/user/test/a") == None
  599. assert model_list_full("users/user/test") == set([])
  600. # Test delete of non-existing
  601. assert model_list_full("users/user/test") == set([])
  602. try:
  603. model_delete("users/user/test/a")
  604. self.fail()
  605. except UnknownModel:
  606. pass
  607. # Test delete of non-writable models
  608. try:
  609. model_delete("formalisms/SimpleClassDiagrams")
  610. self.fail()
  611. except WritePermissionDenied:
  612. pass
  613. # Try delete of a folder
  614. folder_create("users/user/test/b/c/d")
  615. model_add("users/user/test/b/c/d/e", "formalisms/SimpleClassDiagrams")
  616. assert model_list("users/user/test") == set(["b/"])
  617. assert model_list("users/user/test/b") == set(["c/"])
  618. assert model_list("users/user/test/b/c") == set(["d/"])
  619. assert model_list("users/user/test/b/c/d") == set(["e"])
  620. assert model_delete("users/user/test/b/c") == None
  621. # Removes recursively all subfolders and containing models
  622. assert model_list("users/user/test") == set(["b/"])
  623. assert model_list("users/user/test/b") == set([])
  624. try:
  625. model_list("users/user/test/b/c")
  626. self.fail()
  627. except UnknownLocation:
  628. pass
  629. try:
  630. element_list("users/user/test/b/c/d/e")
  631. self.fail()
  632. except UnknownModel:
  633. pass
  634. def test_op_model_overwrite(self):
  635. # Test overwrite of simple model
  636. assert model_list_full("users/user/test") == set([])
  637. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  638. # Test permissions of newly created empty model
  639. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200")])
  640. assert element_list_nice("users/user/test/a") == []
  641. model_overwrite("users/user/test/a", \
  642. """
  643. Class A {
  644. name = "A"
  645. }
  646. Class B {
  647. name = "B"
  648. abstract = True
  649. }
  650. """)
  651. # Test permissions of newly created non-empty model
  652. assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200")])
  653. # Test content of newly created model with code upload
  654. lst = element_list_nice("users/user/test/a")
  655. assert len(lst) == 2
  656. assert {'__id': "A", "__type": "Class", "abstract": None, "constraint": {"AL": ""}, "lower_cardinality": None, "upper_cardinality": None, "name": "A"} in lst
  657. assert {'__id': "B", "__type": "Class", "abstract": True, "constraint": {"AL": ""}, "lower_cardinality": None, "upper_cardinality": None, "name": "B"} in lst
  658. # Test non-writable model
  659. before = element_list("formalisms/SimpleClassDiagrams")
  660. try:
  661. model_overwrite("formalisms/SimpleClassDiagrams", "")
  662. self.fail()
  663. except WritePermissionDenied:
  664. # No changes were made
  665. assert element_list("formalisms/SimpleClassDiagrams") == before
  666. # Test non-existing model
  667. assert "adfafd" not in model_list("")
  668. try:
  669. model_overwrite("adfafd", "")
  670. self.fail()
  671. except UnknownModel:
  672. assert "adfafd" not in model_list("")
  673. # Test compilation error
  674. before = element_list_nice("users/user/test/a")
  675. try:
  676. model_overwrite("users/user/test/a", "afajk")
  677. self.fail()
  678. except CompilationError:
  679. assert element_list_nice("users/user/test/a") == before
  680. # Test overwrite of non-model location
  681. before = model_list("users/user/test")
  682. try:
  683. model_overwrite("users/user/test", "")
  684. self.fail()
  685. except NotAModel:
  686. assert model_list("users/user/test") == before
  687. def test_op_user_logout(self):
  688. try:
  689. element_list_nice("administration/core")
  690. self.fail()
  691. except ReadPermissionDenied:
  692. pass
  693. user_logout()
  694. login("admin", "admin")
  695. # Test user permissions
  696. assert len(element_list_nice("administration/core")) > 0
  697. user_logout()
  698. login("user", "user")
  699. try:
  700. element_list_nice("administration/core")
  701. self.fail()
  702. except ReadPermissionDenied:
  703. pass
  704. def test_op_all_instances(self):
  705. # Test M2 level
  706. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  707. Class A {}
  708. Class B : A {}
  709. Association C (A, B) {}
  710. """)
  711. assert all_instances("users/user/test/a", "Class") == set(["A", "B", "C"])
  712. assert all_instances("users/user/test/a", "Association") == set(["C"])
  713. # Test M1 level
  714. model_add("users/user/test/b", "users/user/test/a", """
  715. A a {}
  716. B b {}
  717. C c(a, b) {}
  718. A d {}
  719. """)
  720. assert all_instances("users/user/test/b", "A") == set(["a", "b", "d"])
  721. assert all_instances("users/user/test/b", "B") == set(["b"])
  722. assert all_instances("users/user/test/b", "C") == set(["c"])
  723. # Test non-existing type
  724. try:
  725. all_instances("users/user/test/a", "non-existing")
  726. self.fail()
  727. except UnknownElement:
  728. pass
  729. # Test non-existing model
  730. try:
  731. all_instances("users/user/test/c", "Class")
  732. self.fail()
  733. except UnknownModel:
  734. pass
  735. # No read permission
  736. try:
  737. all_instances("administration/core", "Class")
  738. self.fail()
  739. except ReadPermissionDenied:
  740. pass
  741. # No write permission, but can query
  742. assert type(all_instances("formalisms/SimpleClassDiagrams", "Class")) == set
  743. # Check with "folder" model
  744. try:
  745. all_instances("users", "a")
  746. self.fail()
  747. except NotAModel:
  748. pass
  749. def test_op_admin_promote_demote(self):
  750. # Verify that user doesn't have admin permissions
  751. try:
  752. element_list("administration/core")
  753. self.fail()
  754. except ReadPermissionDenied:
  755. pass
  756. # Cannot do admin_promote ourselves
  757. try:
  758. admin_promote("user")
  759. except AdminPermissionDenied:
  760. pass
  761. # Cannot do admin_demote ourselves
  762. try:
  763. admin_demote("user")
  764. except AdminPermissionDenied:
  765. pass
  766. # Switch to admin for now
  767. self.do_as_user("admin", admin_promote, ["user"])
  768. # Verify that we can do admin operations
  769. assert len(element_list("administration/core")) > 0
  770. # And check that we can promote/demote other users
  771. admin_promote("HUTN")
  772. admin_demote("HUTN")
  773. # Unknown user
  774. try:
  775. admin_promote("user3")
  776. self.fail()
  777. except UnknownUser:
  778. pass
  779. try:
  780. admin_demote("user4")
  781. self.fail()
  782. except UnknownUser:
  783. pass
  784. # Try with folders
  785. try:
  786. admin_promote("users")
  787. self.fail()
  788. except UnknownUser:
  789. pass
  790. try:
  791. admin_demote("users")
  792. self.fail()
  793. except UnknownUser:
  794. pass
  795. # Can also demote ourselves again
  796. admin_demote("user")
  797. # Verify that user doesn't have admin permissions
  798. try:
  799. element_list("administration/core")
  800. self.fail()
  801. except ReadPermissionDenied:
  802. pass
  803. def test_op_user_password(self):
  804. # Test initial password
  805. user_logout()
  806. try:
  807. login("user", "user2")
  808. self.fail()
  809. except PermissionDenied:
  810. pass
  811. login("user", "user")
  812. # Change it to user2
  813. user_password("user", "user2")
  814. user_logout()
  815. try:
  816. login("user", "user")
  817. self.fail()
  818. except PermissionDenied:
  819. pass
  820. login("user", "user2")
  821. # Reset for further tests
  822. user_password("user", "user")
  823. # Change other users password
  824. try:
  825. user_password("user2", "user10")
  826. self.fail()
  827. except UserPermissionDenied:
  828. user_logout()
  829. login("user2", "user2")
  830. user_logout()
  831. login("user", "user")
  832. # But admin can do that
  833. self.do_as_user("admin", user_password, ["user2", "user10"])
  834. user_logout()
  835. login("user2", "user10")
  836. user_logout()
  837. login("user", "user")
  838. # Admin cannot change password of non-existing user
  839. try:
  840. self.do_as_user("admin", user_password, ["user10", "user10"])
  841. self.fail()
  842. except UnknownUser:
  843. user_logout()
  844. # Check that we can still create the new user with whatever password we want
  845. login("user10", "user11")
  846. user_logout()
  847. login("user", "user")
  848. # Check on folder "model"
  849. try:
  850. self.do_as_user("admin", user_password, ["users", "users2"])
  851. self.fail()
  852. except UnknownUser:
  853. pass
  854. def test_op_model_types(self):
  855. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  856. # Read model types of simple model
  857. lst = model_types("users/user/test/a")
  858. assert len(lst) == 1
  859. entry = lst.pop()
  860. assert entry[0] == "formalisms/SimpleClassDiagrams"
  861. assert entry[1].startswith("type mappings/")
  862. assert entry[2] == None
  863. # Create bottom and query afterwards
  864. alter_context("users/user/test/a", "formalisms/Bottom")
  865. element_list_nice("users/user/test/a")
  866. alter_context("users/user/test/a", "formalisms/SimpleClassDiagrams")
  867. lst = model_types("users/user/test/a")
  868. assert len(lst) == 2
  869. got = set()
  870. while lst:
  871. entry = lst.pop()
  872. assert entry[0] in ["formalisms/SimpleClassDiagrams", "formalisms/Bottom"]
  873. assert entry[0] not in got
  874. got.add(entry[0])
  875. assert entry[1].startswith("type mappings/")
  876. assert entry[2] == None
  877. # No type mapping for type mappings
  878. assert model_types(entry[1]) == set([("formalisms/TypeMapping", None, None)])
  879. # But there will be as soon as we open it
  880. element_list_nice(entry[1])
  881. lst = model_types(entry[1])
  882. assert len(lst) == 1
  883. entry = lst.pop()
  884. assert entry[0] == "formalisms/TypeMapping"
  885. assert entry[1].startswith("type mappings/")
  886. assert entry[2] == None
  887. # Test non-existing model
  888. try:
  889. model_types("adfadf")
  890. self.fail()
  891. except UnknownModel:
  892. pass
  893. # Check on folder "model"
  894. try:
  895. model_types("users")
  896. self.fail()
  897. except NotAModel:
  898. pass
  899. def test_op_folder_create(self):
  900. # Create a folder
  901. assert folder_create("users/user/test/folder_a") == None
  902. assert model_list_full("users/user/test/") == set([("folder_a/", "user", "nobody", "200")])
  903. # Create folder with trailing slash
  904. assert folder_create("users/user/test/folder_b/") == None
  905. assert model_list_full("users/user/test/") == set([("folder_a/", "user", "nobody", "200"), ("folder_b/", "user", "nobody", "200")])
  906. assert model_list_full("users/user/test/folder_b") == set()
  907. # Create multiple folders
  908. assert folder_create("users/user/test/folder_a/folder_b/folder_c/folder_d") == None
  909. assert model_list_full("users/user/test/") == set([("folder_a/", "user", "nobody", "200"), ("folder_b/", "user", "nobody", "200")])
  910. assert model_list_full("users/user/test/folder_a") == set([("folder_b/", "user", "nobody", "200")])
  911. assert model_list_full("users/user/test/folder_a/folder_b") == set([("folder_c/", "user", "nobody", "200")])
  912. assert model_list_full("users/user/test/folder_a/folder_b/folder_c") == set([("folder_d/", "user", "nobody", "200")])
  913. # Create folder in non-writable location
  914. try:
  915. folder_create("a")
  916. self.fail()
  917. except WritePermissionDenied:
  918. pass
  919. assert "a" not in model_list("")
  920. # Create folder that already exists
  921. try:
  922. folder_create("users/user/test/folder_a")
  923. self.fail()
  924. except FolderExists:
  925. pass
  926. def test_op_alter_context(self):
  927. # Create a model that we will use
  928. model_add("users/user/test/a", "formalisms/ProcessModel", """
  929. Start start {}
  930. Finish finish {}
  931. """)
  932. # List elements using default context, that of creation
  933. lst = element_list_nice("users/user/test/a")
  934. assert len(lst) == 2
  935. assert {"__id": "start", "__type": "Start"} in lst
  936. assert {"__id": "finish", "__type": "Finish"} in lst
  937. # List elements using bottom context
  938. alter_context("users/user/test/a", "formalisms/Bottom")
  939. lst = element_list_nice("users/user/test/a")
  940. assert len(lst) == 2
  941. assert {"__id": "start", "__type": "Node"} in lst
  942. assert {"__id": "finish", "__type": "Node"} in lst
  943. # Switch back to default context
  944. alter_context("users/user/test/a", "formalisms/ProcessModel")
  945. lst = element_list_nice("users/user/test/a")
  946. assert len(lst) == 2
  947. assert {"__id": "start", "__type": "Start"} in lst
  948. assert {"__id": "finish", "__type": "Finish"} in lst
  949. # Switch to a non-existing context
  950. alter_context("users/user/test/a", "non-existing")
  951. try:
  952. element_list_nice("users/user/test/a")
  953. self.fail()
  954. except UnknownModel:
  955. pass
  956. # Set context for an unknown model
  957. # Note that this will only register locally, without communicating with the Modelverse
  958. # as such, errors are not noticed until the element is accessed!
  959. alter_context("non-existing", "formalisms/SimpleClassDiagrams")
  960. def test_op_element_list(self):
  961. model_add("users/user/test/a", "formalisms/ProcessModel", """
  962. Start start {}
  963. Finish finish {}
  964. Next nxt (start, finish) {}
  965. """)
  966. # Basic operation
  967. lst = element_list("users/user/test/a")
  968. assert len(lst) == 3
  969. assert ("start", "Start") in lst
  970. assert ("finish", "Finish") in lst
  971. assert ("nxt", "Next") in lst
  972. # Try on non-existing model
  973. try:
  974. element_list("a")
  975. self.fail()
  976. except UnknownModel:
  977. pass
  978. # Try a non-readable model
  979. try:
  980. element_list("administration/core")
  981. self.fail()
  982. except ReadPermissionDenied:
  983. pass
  984. # No write permission, but can query
  985. assert type(element_list("formalisms/SimpleClassDiagrams")) == set
  986. # Check on folder "model"
  987. try:
  988. element_list("users")
  989. self.fail()
  990. except NotAModel:
  991. pass
  992. def test_op_element_list_nice(self):
  993. # Test simple element_list_nice
  994. model_add("users/user/test/a", "formalisms/ProcessModel", """
  995. Start start {}
  996. Finish finish {}
  997. Next nxt (start, finish) {}
  998. """)
  999. # Basic operation
  1000. lst = element_list_nice("users/user/test/a")
  1001. assert len(lst) == 3
  1002. assert {"__id": "start", "__type": "Start"} in lst
  1003. assert {"__id": "finish", "__type": "Finish"} in lst
  1004. assert {"__id": "nxt", "__type": "Next", "__source": "start", "__target": "finish"} in lst
  1005. # Test a model with attributes
  1006. model_add("users/user/test/b", "formalisms/ProcessModel", """
  1007. Start start {}
  1008. Exec exec1 {
  1009. name = "first exec"
  1010. }
  1011. Finish finish {}
  1012. Data d1 {
  1013. name = "data 1"
  1014. type = "type 1"
  1015. }
  1016. Next n1 (start, exec1) {}
  1017. Next n2 (exec1, finish) {}
  1018. Produces p1 (exec1, d1) {
  1019. name = "producer"
  1020. }
  1021. """)
  1022. lst = element_list_nice("users/user/test/b")
  1023. assert len(lst) == 7
  1024. assert {"__id": "start", "__type": "Start"} in lst
  1025. assert {"__id": "finish", "__type": "Finish"} in lst
  1026. assert {"__id": "exec1", "__type": "Exec", "name": "first exec"} in lst
  1027. assert {"__id": "d1", "__type": "Data", "name": "data 1", "type": "type 1"} in lst
  1028. assert {"__id": "n1", "__type": "Next", "__source": "start", "__target": "exec1"} in lst
  1029. assert {"__id": "n2", "__type": "Next", "__source": "exec1", "__target": "finish"} in lst
  1030. assert {"__id": "p1", "__type": "Produces", "__source": "exec1", "__target": "d1", "name": "producer"} in lst
  1031. # Try one with defined attributes
  1032. model_add("users/user/test/c", "formalisms/SimpleClassDiagrams", """
  1033. SimpleAttribute Natural {
  1034. name = "natural"
  1035. }
  1036. SimpleAttribute String {
  1037. name = "string"
  1038. }
  1039. Class place {
  1040. name = "Place"
  1041. name : String
  1042. capacity : Natural
  1043. }
  1044. Class transition {
  1045. name = "Transition"
  1046. name : String
  1047. }
  1048. Association p2t (place, transition) {
  1049. name = "P2T"
  1050. weight : Natural
  1051. }
  1052. Association t2p (transition, place) {
  1053. name = "T2P"
  1054. weight : Natural
  1055. }
  1056. """)
  1057. lst = element_list_nice("users/user/test/c")
  1058. assert len(lst) == 11
  1059. assert {"__id": "Natural", "__type": "SimpleAttribute", "constraint": {"AL": ""}, "name": "natural"} in lst
  1060. assert {"__id": "String", "__type": "SimpleAttribute", "constraint": {"AL": ""}, "name": "string"} in lst
  1061. assert {"__id": "place", "name": "Place", "__type": "Class", "constraint": {"AL": ""}, "lower_cardinality": None, "upper_cardinality": None, "abstract": None} in lst
  1062. assert {"__id": "transition", "name": "Transition", "__type": "Class", "constraint": {"AL": ""}, "lower_cardinality": None, "upper_cardinality": None, "abstract": None} in lst
  1063. assert {"__id": "p2t", "name": "P2T", "__type": "Association", "__source": "place", "__target": "transition", "constraint": {"AL": ""}, "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None, "abstract": None, "lower_cardinality": None, "upper_cardinality": None} in lst
  1064. assert {"__id": "t2p", "name": "T2P", "__type": "Association", "__source": "transition", "__target": "place", "constraint": {"AL": ""}, "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None, "abstract": None, "lower_cardinality": None, "upper_cardinality": None} in lst
  1065. assert {"__id": "place_name", "__type": "AttributeLink", "__source": "place", "__target": "String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  1066. assert {"__id": "place_capacity", "__type": "AttributeLink", "__source": "place", "__target": "Natural", "name": "capacity", "optional": False, "constraint": {"AL": ""}} in lst
  1067. assert {"__id": "transition_name", "__type": "AttributeLink", "__source": "transition", "__target": "String", "name": "name", "optional": False, "constraint": {"AL": ""}} in lst
  1068. assert {"__id": "p2t_weight", "__type": "AttributeLink", "__source": "p2t", "__target": "Natural", "name": "weight", "optional": False, "constraint": {"AL": ""}} in lst
  1069. assert {"__id": "t2p_weight", "__type": "AttributeLink", "__source": "t2p", "__target": "Natural", "name": "weight", "optional": False, "constraint": {"AL": ""}} in lst
  1070. # Try on non-existing model
  1071. try:
  1072. element_list_nice("a")
  1073. self.fail()
  1074. except UnknownModel:
  1075. pass
  1076. # Try a non-readable model
  1077. try:
  1078. element_list_nice("administration/core")
  1079. self.fail()
  1080. except ReadPermissionDenied:
  1081. pass
  1082. # No write permission, but can query
  1083. assert type(element_list_nice("formalisms/SimpleClassDiagrams")) == list
  1084. # Check on folder "model"
  1085. try:
  1086. element_list_nice("users")
  1087. self.fail()
  1088. except NotAModel:
  1089. pass
  1090. def test_op_types(self):
  1091. # Try operation of unopened model
  1092. assert types("formalisms/ProcessModel") == element_list("formalisms/SimpleClassDiagrams")
  1093. # Try simple operation
  1094. model_add("users/user/test/a", "formalisms/ProcessModel", """
  1095. Start start {}
  1096. Finish finish {}
  1097. Next nxt (start, finish) {}
  1098. """)
  1099. assert types("users/user/test/a") == element_list("formalisms/ProcessModel")
  1100. alter_context("users/user/test/a", "formalisms/Bottom")
  1101. assert types("users/user/test/a") == element_list("formalisms/Bottom")
  1102. # Try for model that we cannot read
  1103. try:
  1104. types("administration/core")
  1105. self.fail()
  1106. except ReadPermissionDenied:
  1107. pass
  1108. # Try for non-existing model
  1109. try:
  1110. types("a")
  1111. self.fail()
  1112. except UnknownModel:
  1113. pass
  1114. # Try for a metamodel that we are not allowed to read, although the model may be read
  1115. model_add("users/user/test/b", "formalisms/SimpleClassDiagrams")
  1116. assert types("users/user/test/b") == element_list("formalisms/SimpleClassDiagrams")
  1117. alter_context("users/user/test/b", "administration/core")
  1118. try:
  1119. types("users/user/test/b")
  1120. self.fail()
  1121. except ReadPermissionDenied:
  1122. pass
  1123. # No write permission for either M or MM, but can query
  1124. assert type(types("formalisms/SimpleClassDiagrams")) == set
  1125. # Check on folder "model"
  1126. try:
  1127. types("users")
  1128. self.fail()
  1129. except NotAModel:
  1130. pass
  1131. def test_op_read_info(self):
  1132. # Basic case
  1133. model_add("users/user/test/a", "formalisms/ProcessModel", """
  1134. Start start {}
  1135. Finish finish {}
  1136. Next nxt (start, finish) {}
  1137. """)
  1138. assert read_info("users/user/test/a", "start") == ("Start", None)
  1139. assert read_info("users/user/test/a", "finish") == ("Finish", None)
  1140. assert read_info("users/user/test/a", "nxt") == ("Next", ("start", "finish"))
  1141. # Read using different metamodel
  1142. alter_context("users/user/test/a", "formalisms/Bottom")
  1143. assert read_info("users/user/test/a", "start") == ("Node", None)
  1144. assert read_info("users/user/test/a", "finish") == ("Node", None)
  1145. assert read_info("users/user/test/a", "nxt") == ("Edge", ("start", "finish"))
  1146. # Non-existing element
  1147. try:
  1148. read_info("users/user/test/a", "notthere")
  1149. self.fail()
  1150. except UnknownElement:
  1151. pass
  1152. # Non-existing model
  1153. try:
  1154. read_info("users/user/test/b", "start")
  1155. self.fail()
  1156. except UnknownModel:
  1157. pass
  1158. # No read permission
  1159. try:
  1160. read_info("administration/core", "administration")
  1161. self.fail()
  1162. except ReadPermissionDenied:
  1163. pass
  1164. # No write permission, but can query
  1165. assert type(read_info("formalisms/SimpleClassDiagrams", "Class")) == tuple
  1166. # Check on folder "model"
  1167. try:
  1168. read_info("users", "a")
  1169. self.fail()
  1170. except NotAModel:
  1171. pass
  1172. def test_op_read_attrs(self):
  1173. # Basic behaviour
  1174. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  1175. SimpleAttribute Natural {
  1176. name = "natural"
  1177. }
  1178. SimpleAttribute String {
  1179. name = "string"
  1180. }
  1181. Class Place {
  1182. name = "Place"
  1183. name : String
  1184. capacity : Natural
  1185. }
  1186. Class Transition {
  1187. name = "Transition"
  1188. name : String
  1189. }
  1190. Association P2T (Place, Transition) {
  1191. name = "P2T"
  1192. weight : Natural
  1193. }
  1194. Association T2P (Transition, Place) {
  1195. name = "T2P"
  1196. weight : Natural
  1197. }
  1198. """)
  1199. assert read_attrs("users/user/test/a", "Natural") == {"constraint": {"AL": ""}, "name": "natural"}
  1200. assert read_attrs("users/user/test/a", "String") == {"constraint": {"AL": ""}, "name": "string"}
  1201. assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "Place", "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1202. assert read_attrs("users/user/test/a", "Transition") == {"constraint": {"AL": ""}, "name": "Transition", "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1203. assert read_attrs("users/user/test/a", "P2T") == {"constraint": {"AL": ""}, "name": "P2T", "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None, "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1204. assert read_attrs("users/user/test/a", "T2P") == {"constraint": {"AL": ""}, "name": "T2P", "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None, "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1205. model_add("users/user/test/b", "users/user/test/a", """
  1206. Place p1 {
  1207. name = "place 1"
  1208. capacity = 2
  1209. }
  1210. Place p2 {
  1211. name = "place 2"
  1212. capacity = 1
  1213. }
  1214. Transition t1 {
  1215. name = "transition"
  1216. }
  1217. P2T p2t (p1, t1) {
  1218. weight = 4
  1219. }
  1220. T2P t2p (t1, p2) {
  1221. weight = 10
  1222. }
  1223. """)
  1224. assert read_attrs("users/user/test/b", "p1") == {"name": "place 1", "capacity": 2}
  1225. assert read_attrs("users/user/test/b", "p2") == {"name": "place 2", "capacity": 1}
  1226. assert read_attrs("users/user/test/b", "t1") == {"name": "transition"}
  1227. assert read_attrs("users/user/test/b", "p2t") == {"weight": 4}
  1228. assert read_attrs("users/user/test/b", "t2p") == {"weight": 10}
  1229. # Non-existing model
  1230. try:
  1231. read_attrs("users/afa", "p1")
  1232. self.fail()
  1233. except UnknownModel:
  1234. pass
  1235. # Non-existing element
  1236. try:
  1237. read_attrs("users/user/test/a", "PPPPPPP")
  1238. self.fail()
  1239. except UnknownElement:
  1240. pass
  1241. # No read permissions
  1242. try:
  1243. read_attrs("administration/core", "formalisms")
  1244. self.fail()
  1245. except ReadPermissionDenied:
  1246. pass
  1247. # No write permissions, but can query
  1248. assert type(read_attrs("formalisms/SimpleClassDiagrams", "Class")) == type(dict())
  1249. # Check on folder "model"
  1250. try:
  1251. read_attrs("users", "a")
  1252. self.fail()
  1253. except NotAModel:
  1254. pass
  1255. def test_op_attr_assign(self):
  1256. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  1257. SimpleAttribute Natural {
  1258. name = "natural"
  1259. }
  1260. SimpleAttribute String {
  1261. name = "string"
  1262. }
  1263. Class Place {
  1264. name = "Place"
  1265. name : String
  1266. capacity : Natural
  1267. }
  1268. Class Transition {
  1269. name = "Transition"
  1270. name : String
  1271. }
  1272. Association P2T (Place, Transition) {
  1273. name = "P2T"
  1274. weight : Natural
  1275. }
  1276. Association T2P (Transition, Place) {
  1277. name = "T2P"
  1278. weight : Natural
  1279. }
  1280. """)
  1281. assert read_attrs("users/user/test/a", "Natural") == {"constraint": {"AL": ""}, "name": "natural"}
  1282. assert attr_assign("users/user/test/a", "Natural", "name", "nat") == None
  1283. assert read_attrs("users/user/test/a", "Natural") == {"constraint": {"AL": ""}, "name": "nat"}
  1284. assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "Place", "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1285. assert attr_assign("users/user/test/a", "Place", "name", "NewPlace") == None
  1286. assert attr_assign("users/user/test/a", "Place", "abstract", False) == None
  1287. assert attr_assign("users/user/test/a", "Place", "lower_cardinality", 4) == None
  1288. assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "NewPlace", "abstract": False, "lower_cardinality": 4, "upper_cardinality": None}
  1289. assert read_attrs("users/user/test/a", "P2T") == {"constraint": {"AL": ""}, "name": "P2T", "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None, "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1290. assert attr_assign("users/user/test/a", "P2T", "name", "PPP") == None
  1291. assert attr_assign("users/user/test/a", "P2T", "source_lower_cardinality", 1) == None
  1292. assert attr_assign("users/user/test/a", "P2T", "target_upper_cardinality", 10) == None
  1293. assert read_attrs("users/user/test/a", "P2T") == {"constraint": {"AL": ""}, "name": "PPP", "source_lower_cardinality": 1, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": 10, "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1294. model_add("users/user/test/b", "users/user/test/a", """
  1295. Place p1 {
  1296. name = "place 1"
  1297. capacity = 2
  1298. }
  1299. Place p2 {
  1300. name = "place 2"
  1301. capacity = 1
  1302. }
  1303. Transition t1 {
  1304. name = "transition"
  1305. }
  1306. P2T p2t (p1, t1) {
  1307. weight = 4
  1308. }
  1309. T2P t2p (t1, p2) {
  1310. weight = 10
  1311. }
  1312. """)
  1313. assert read_attrs("users/user/test/b", "p1") == {"name": "place 1", "capacity": 2}
  1314. assert attr_assign("users/user/test/b", "p1", "name", "place 3") == None
  1315. assert attr_assign("users/user/test/b", "p1", "capacity", 3) == None
  1316. assert read_attrs("users/user/test/b", "p1") == {"name": "place 3", "capacity": 3}
  1317. assert read_attrs("users/user/test/b", "p2t") == {"weight": 4}
  1318. assert attr_assign("users/user/test/b", "p2t", "weight", 0) == None
  1319. assert read_attrs("users/user/test/b", "p2t") == {"weight": 0}
  1320. # Non-existing model
  1321. try:
  1322. attr_assign("users/afa", "p1", "name", "abc")
  1323. self.fail()
  1324. except UnknownModel:
  1325. pass
  1326. # Non-existing element
  1327. try:
  1328. attr_assign("users/user/test/a", "PPPPPPP", "name", "abc")
  1329. self.fail()
  1330. except UnknownElement:
  1331. pass
  1332. # No read permissions
  1333. try:
  1334. attr_assign("administration/core", "formalisms", "name", "abc")
  1335. self.fail()
  1336. except ReadPermissionDenied:
  1337. pass
  1338. # No write permissions
  1339. try:
  1340. attr_assign("formalisms/SimpleClassDiagrams", "Class", "name", "abc")
  1341. self.fail()
  1342. except WritePermissionDenied:
  1343. pass
  1344. # No such attribute
  1345. try:
  1346. attr_assign("users/user/test/a", "Place", "ddd", 1)
  1347. self.fail()
  1348. except UnknownAttribute:
  1349. pass
  1350. # Assign None, equals to attr_delete
  1351. assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "NewPlace", "abstract": False, "lower_cardinality": 4, "upper_cardinality": None}
  1352. attr_assign("users/user/test/a", "Place", "name", None)
  1353. assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": None, "abstract": False, "lower_cardinality": 4, "upper_cardinality": None}
  1354. # Check on folder "model"
  1355. try:
  1356. attr_assign("users", "a", "b", "c")
  1357. self.fail()
  1358. except NotAModel:
  1359. pass
  1360. def test_op_attr_delete(self):
  1361. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  1362. SimpleAttribute Natural {
  1363. name = "natural"
  1364. }
  1365. SimpleAttribute String {
  1366. name = "string"
  1367. }
  1368. Class Place {
  1369. name = "Place"
  1370. name : String
  1371. capacity : Natural
  1372. }
  1373. Class Transition {
  1374. name = "Transition"
  1375. name : String
  1376. }
  1377. Association P2T (Place, Transition) {
  1378. name = "P2T"
  1379. weight : Natural
  1380. }
  1381. Association T2P (Transition, Place) {
  1382. name = "T2P"
  1383. weight : Natural
  1384. }
  1385. """)
  1386. assert read_attrs("users/user/test/a", "Natural") == {"constraint": {"AL": ""}, "name": "natural"}
  1387. assert attr_delete("users/user/test/a", "Natural", "name") == None
  1388. assert read_attrs("users/user/test/a", "Natural") == {"constraint": {"AL": ""}, "name": None}
  1389. assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "Place", "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1390. assert attr_delete("users/user/test/a", "Place", "name") == None
  1391. assert attr_delete("users/user/test/a", "Place", "abstract") == None
  1392. assert attr_delete("users/user/test/a", "Place", "lower_cardinality") == None
  1393. assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": None, "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1394. assert read_attrs("users/user/test/a", "P2T") == {"constraint": {"AL": ""}, "name": "P2T", "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None, "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1395. assert attr_delete("users/user/test/a", "P2T", "name") == None
  1396. assert attr_delete("users/user/test/a", "P2T", "source_lower_cardinality") == None
  1397. assert attr_delete("users/user/test/a", "P2T", "target_upper_cardinality") == None
  1398. assert read_attrs("users/user/test/a", "P2T") == {"constraint": {"AL": ""}, "name": None, "source_lower_cardinality": None, "source_upper_cardinality": None, "target_lower_cardinality": None, "target_upper_cardinality": None, "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1399. model_add("users/user/test/b", "users/user/test/a", """
  1400. Place p1 {
  1401. name = "place 1"
  1402. capacity = 2
  1403. }
  1404. Place p2 {
  1405. name = "place 2"
  1406. capacity = 1
  1407. }
  1408. Transition t1 {
  1409. name = "transition"
  1410. }
  1411. P2T p2t (p1, t1) {
  1412. weight = 4
  1413. }
  1414. T2P t2p (t1, p2) {
  1415. weight = 10
  1416. }
  1417. """)
  1418. assert read_attrs("users/user/test/b", "p1") == {"name": "place 1", "capacity": 2}
  1419. assert attr_delete("users/user/test/b", "p1", "capacity") == None
  1420. assert read_attrs("users/user/test/b", "p1") == {"name": "place 1", "capacity": None}
  1421. assert read_attrs("users/user/test/b", "p2t") == {"weight": 4}
  1422. assert attr_delete("users/user/test/b", "p2t", "weight") == None
  1423. assert read_attrs("users/user/test/b", "p2t") == {"weight": None}
  1424. # Non-existing model
  1425. try:
  1426. attr_delete("users/afa", "p1", "name")
  1427. self.fail()
  1428. except UnknownModel:
  1429. pass
  1430. # Non-existing element
  1431. try:
  1432. attr_delete("users/user/test/a", "PPPPPPP", "name")
  1433. self.fail()
  1434. except UnknownElement:
  1435. pass
  1436. # No read permissions
  1437. try:
  1438. attr_delete("administration/core", "formalisms", "name")
  1439. self.fail()
  1440. except ReadPermissionDenied:
  1441. pass
  1442. # No write permissions
  1443. try:
  1444. attr_delete("formalisms/SimpleClassDiagrams", "Class", "name")
  1445. self.fail()
  1446. except WritePermissionDenied:
  1447. pass
  1448. # No such attribute
  1449. try:
  1450. attr_delete("users/user/test/a", "Place", "ddd")
  1451. self.fail()
  1452. except UnknownAttribute:
  1453. pass
  1454. # Check on folder "model"
  1455. try:
  1456. attr_delete("users", "a", "b")
  1457. self.fail()
  1458. except NotAModel:
  1459. pass
  1460. def test_op_attr_delete_code(self):
  1461. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  1462. SimpleAttribute Natural {
  1463. name = "natural"
  1464. }
  1465. SimpleAttribute String {
  1466. name = "string"
  1467. }
  1468. Class Place {
  1469. name = "Place"
  1470. name : String
  1471. capacity : Natural
  1472. }
  1473. Class Transition {
  1474. name = "Transition"
  1475. name : String
  1476. }
  1477. Association P2T (Place, Transition) {
  1478. name = "P2T"
  1479. weight : Natural
  1480. }
  1481. Association T2P (Transition, Place) {
  1482. name = "T2P"
  1483. weight : Natural
  1484. }
  1485. """)
  1486. # Test what happens if removing a non-existing AL attribute
  1487. assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "Place", "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1488. attr_delete("users/user/test/a", "Place", "constraint")
  1489. assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "Place", "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1490. # Test what happens if removing an existing AL attribute
  1491. attr_assign_code("users/user/test/a", "Place", "constraint", """
  1492. String function a(value : Element):
  1493. return "OK"!
  1494. """)
  1495. attrs = read_attrs("users/user/test/a", "Place")
  1496. assert "AL" in attrs["constraint"]
  1497. assert attrs["constraint"]["AL"] != ""
  1498. attr_delete("users/user/test/a", "Place", "constraint")
  1499. assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "Place", "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1500. # Check on folder "model"
  1501. try:
  1502. attr_delete("users", "a", "b")
  1503. self.fail()
  1504. except NotAModel:
  1505. pass
  1506. def test_op_attr_assign_code(self):
  1507. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  1508. SimpleAttribute Natural {
  1509. name = "natural"
  1510. }
  1511. SimpleAttribute String {
  1512. name = "string"
  1513. }
  1514. Class Place {
  1515. name = "Place"
  1516. name : String
  1517. capacity : Natural
  1518. }
  1519. Class Transition {
  1520. name = "Transition"
  1521. name : String
  1522. }
  1523. Association P2T (Place, Transition) {
  1524. name = "P2T"
  1525. weight : Natural
  1526. }
  1527. Association T2P (Transition, Place) {
  1528. name = "T2P"
  1529. weight : Natural
  1530. }
  1531. """)
  1532. # Test ordinary case
  1533. assert read_attrs("users/user/test/a", "Place") == {"constraint": {"AL": ""}, "name": "Place", "abstract": None, "lower_cardinality": None, "upper_cardinality": None}
  1534. assert attr_assign_code("users/user/test/a", "Place", "constraint", """
  1535. String function a(value : Element):
  1536. return "OK"!
  1537. """) == None
  1538. attrs = read_attrs("users/user/test/a", "Place")
  1539. assert "AL" in attrs["constraint"]
  1540. assert attrs["constraint"]["AL"] != ""
  1541. assert AL_text(attrs["constraint"]["AL"]).strip() == """
  1542. String function a(value : Element):
  1543. return "OK"!
  1544. """.strip()
  1545. # Test assign when already assigned
  1546. attrs = read_attrs("users/user/test/a", "Place")
  1547. old_location = attrs["constraint"]["AL"]
  1548. old_text = AL_text(attrs["constraint"]["AL"])
  1549. assert attr_assign_code("users/user/test/a", "Place", "constraint", """
  1550. String function a(value : Element):
  1551. return "NOK"!
  1552. """) == None
  1553. attrs = read_attrs("users/user/test/a", "Place")
  1554. assert "AL" in attrs["constraint"]
  1555. assert attrs["constraint"]["AL"] != ""
  1556. assert attrs["constraint"]["AL"] != old_location
  1557. assert AL_text(attrs["constraint"]["AL"]).strip() == """
  1558. String function a(value : Element):
  1559. return "NOK"!
  1560. """.strip()
  1561. assert AL_text(attrs["constraint"]["AL"]).strip () != old_text.strip()
  1562. simple_code = \
  1563. """
  1564. String function a(value : Element):
  1565. return "OK"!
  1566. """
  1567. # Non-existing model
  1568. try:
  1569. attr_assign_code("users/afa", "p1", "name", simple_code)
  1570. self.fail()
  1571. except UnknownModel:
  1572. pass
  1573. # Non-existing element
  1574. try:
  1575. attr_assign_code("users/user/test/a", "PPPPPPP", "name", simple_code)
  1576. self.fail()
  1577. except UnknownElement:
  1578. pass
  1579. # No read permissions
  1580. try:
  1581. attr_assign_code("administration/core", "formalisms", "name", simple_code)
  1582. self.fail()
  1583. except ReadPermissionDenied:
  1584. pass
  1585. # No write permissions
  1586. try:
  1587. attr_assign_code("formalisms/SimpleClassDiagrams", "Class", "name", simple_code)
  1588. self.fail()
  1589. except WritePermissionDenied:
  1590. pass
  1591. # No such attribute
  1592. try:
  1593. attr_assign_code("users/user/test/a", "Place", "ddd", simple_code)
  1594. self.fail()
  1595. except UnknownAttribute:
  1596. pass
  1597. # Compilation error
  1598. try:
  1599. attr_assign_code("users/user/test/a", "Place", "constraint", "abc")
  1600. self.fail()
  1601. except CompilationError:
  1602. pass
  1603. # Check on folder "model"
  1604. try:
  1605. attr_assign_code("users", "a", "b", "c")
  1606. self.fail()
  1607. except NotAModel:
  1608. pass
  1609. def test_op_instantiate(self):
  1610. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  1611. assert element_list("users/user/test/a") == set([])
  1612. # Instantiate node element
  1613. ID = instantiate("users/user/test/a", "Class")
  1614. assert element_list("users/user/test/a") == set([(ID, "Class")])
  1615. assert read_info("users/user/test/a", ID) == ("Class", None)
  1616. # Instantiate node element with ID
  1617. ID2 = instantiate("users/user/test/a", "Class", ID="new_node")
  1618. assert ID2 == "new_node"
  1619. assert element_list("users/user/test/a") == set([(ID, "Class"), (ID2, "Class")])
  1620. assert read_info("users/user/test/a", ID2) == ("Class", None)
  1621. # Instantiate edge element
  1622. ID3 = instantiate("users/user/test/a", "Association", edge=(ID, ID2))
  1623. assert element_list("users/user/test/a") == set([(ID, "Class"), (ID2, "Class"), (ID3, "Association")])
  1624. assert read_info("users/user/test/a", ID3) == ("Association", (ID, ID2))
  1625. # Instantiate edge element with ID
  1626. ID4 = instantiate("users/user/test/a", "Association", edge=(ID, ID2), ID="new_edge")
  1627. assert ID4 == "new_edge"
  1628. assert element_list("users/user/test/a") == set([(ID, "Class"), (ID2, "Class"), (ID3, "Association"), (ID4, "Association")])
  1629. assert read_info("users/user/test/a", ID4) == ("Association", (ID, ID2))
  1630. # Instantiate edge from edge (source)
  1631. ID5 = instantiate("users/user/test/a", "Association", edge=(ID3, ID))
  1632. assert element_list("users/user/test/a") == set([(ID, "Class"), (ID2, "Class"), (ID3, "Association"), (ID4, "Association"), (ID5, "Association")])
  1633. assert read_info("users/user/test/a", ID5) == ("Association", (ID3, ID))
  1634. # Instantiate edge from edge (target)
  1635. ID6 = instantiate("users/user/test/a", "Association", edge=(ID, ID3))
  1636. assert element_list("users/user/test/a") == set([(ID, "Class"), (ID2, "Class"), (ID3, "Association"), (ID4, "Association"), (ID5, "Association"), (ID6, "Association")])
  1637. assert read_info("users/user/test/a", ID6) == ("Association", (ID, ID3))
  1638. # Instantiate edge from edge (source and target)
  1639. ID7 = instantiate("users/user/test/a", "Association", edge=(ID3, ID4))
  1640. assert element_list("users/user/test/a") == set([(ID, "Class"), (ID2, "Class"), (ID3, "Association"), (ID4, "Association"), (ID5, "Association"), (ID6, "Association"), (ID7, "Association")])
  1641. assert read_info("users/user/test/a", ID7) == ("Association", (ID3, ID4))
  1642. # Non-existing model
  1643. try:
  1644. instantiate("users/afa", "Association")
  1645. self.fail()
  1646. except UnknownModel:
  1647. pass
  1648. # Non-existing element
  1649. before = element_list("users/user/test/a")
  1650. try:
  1651. instantiate("users/user/test/a", "AAAAAAA")
  1652. self.fail()
  1653. except UnknownElement:
  1654. assert element_list("users/user/test/a") == before
  1655. # No read permissions
  1656. try:
  1657. instantiate("administration/core", "formalisms")
  1658. self.fail()
  1659. except ReadPermissionDenied:
  1660. pass
  1661. # No write permissions
  1662. before = element_list("users/user/test/a")
  1663. try:
  1664. instantiate("formalisms/SimpleClassDiagrams", "Class")
  1665. self.fail()
  1666. except WritePermissionDenied:
  1667. assert element_list("users/user/test/a") == before
  1668. # Pre-existing ID requested (node)
  1669. before = element_list("users/user/test/a")
  1670. try:
  1671. instantiate("users/user/test/a", "Class", ID=ID)
  1672. self.fail()
  1673. except ElementExists:
  1674. assert element_list("users/user/test/a") == before
  1675. # Pre-existing ID requested (edge)
  1676. before = element_list("users/user/test/a")
  1677. try:
  1678. instantiate("users/user/test/a", "Association", ID=ID, edge=(ID2, ID3))
  1679. self.fail()
  1680. except ElementExists:
  1681. assert element_list("users/user/test/a") == before
  1682. # Edge from non-existing ID
  1683. before = element_list("users/user/test/a")
  1684. try:
  1685. instantiate("users/user/test/a", "Association", ID=ID, edge=("non-existing", ID3))
  1686. self.fail()
  1687. except ElementExists:
  1688. assert element_list("users/user/test/a") == before
  1689. # Edge to non-existing ID
  1690. before = element_list("users/user/test/a")
  1691. try:
  1692. instantiate("users/user/test/a", "Association", ID=ID, edge=("non-existing", ID3))
  1693. self.fail()
  1694. except ElementExists:
  1695. assert element_list("users/user/test/a") == before
  1696. # Edge both non-existing ID
  1697. before = element_list("users/user/test/a")
  1698. try:
  1699. instantiate("users/user/test/a", "Association", ID=ID, edge=("non-existing", "non-existing2"))
  1700. self.fail()
  1701. except ElementExists:
  1702. assert element_list("users/user/test/a") == before
  1703. # Garbage type
  1704. before = element_list("users/user/test/a")
  1705. try:
  1706. instantiate("users/user/test/a", ("a", "b"))
  1707. self.fail()
  1708. except UnknownElement:
  1709. assert element_list("users/user/test/a") == before
  1710. # Garbage edge src
  1711. before = element_list("users/user/test/a")
  1712. try:
  1713. instantiate("users/user/test/a", "Association", edge=(('a', 'b'), "non-existing2"))
  1714. self.fail()
  1715. except UnknownElement:
  1716. assert element_list("users/user/test/a") == before
  1717. # Garbage edge dst
  1718. before = element_list("users/user/test/a")
  1719. try:
  1720. instantiate("users/user/test/a", "Association", edge=("non-existing", ('a', 'b')))
  1721. self.fail()
  1722. except UnknownElement:
  1723. assert element_list("users/user/test/a") == before
  1724. # Test instantiating node as edge
  1725. before = element_list("users/user/test/a")
  1726. try:
  1727. instantiate("users/user/test/a", "Class", edge=("a", "b"))
  1728. self.fail()
  1729. except IncorrectFormat:
  1730. assert element_list("users/user/test/a") == before
  1731. # Test instantiating edge as node
  1732. before = element_list("users/user/test/a")
  1733. try:
  1734. instantiate("users/user/test/a", "Association")
  1735. self.fail()
  1736. except IncorrectFormat:
  1737. assert element_list("users/user/test/a") == before
  1738. # Check on folder "model"
  1739. try:
  1740. instantiate("users", "a")
  1741. self.fail()
  1742. except NotAModel:
  1743. pass
  1744. def test_op_delete_element(self):
  1745. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  1746. Class A {}
  1747. """)
  1748. # Test simple delete
  1749. assert len(element_list_nice("users/user/test/a")) == 1
  1750. assert delete_element("users/user/test/a", "A") == None
  1751. assert len(element_list_nice("users/user/test/a")) == 0
  1752. model_add("users/user/test/b", "formalisms/SimpleClassDiagrams", """
  1753. Class A {}
  1754. Class B {}
  1755. Association (A, B) {}
  1756. """)
  1757. # Test delete of element that causes other elements to be deleted as well
  1758. assert len(element_list_nice("users/user/test/b")) == 3
  1759. assert delete_element("users/user/test/b", "A") == None
  1760. assert len(element_list_nice("users/user/test/b")) == 1
  1761. model_add("users/user/test/c", "formalisms/SimpleClassDiagrams", """
  1762. Class A {}
  1763. Class B {}
  1764. Association C (A, B) {}
  1765. """)
  1766. # Test delete of edge that causes other elements to be deleted as well
  1767. assert len(element_list_nice("users/user/test/c")) == 3
  1768. assert delete_element("users/user/test/c", "C") == None
  1769. assert len(element_list_nice("users/user/test/c")) == 2
  1770. model_add("users/user/test/d", "formalisms/SimpleClassDiagrams", """
  1771. Class A {
  1772. name = "A"
  1773. }
  1774. """)
  1775. # Test delete of a "hidden" element
  1776. assert element_list_nice("users/user/test/d") == [{"__type" : "Class", "__id": "A", "lower_cardinality": None, "upper_cardinality": None, "constraint": {"AL": ""}, "name": "A", "abstract": None}]
  1777. ID = [i for i in element_list("users/user/test/d") if i[1] == "Class_name"][0][0]
  1778. assert delete_element("users/user/test/d", ID) == None
  1779. assert element_list_nice("users/user/test/d") == [{"__type" : "Class", "__id": "A", "lower_cardinality": None, "upper_cardinality": None, "constraint": {"AL": ""}, "name": None, "abstract": None}]
  1780. # Non-existing model
  1781. try:
  1782. delete_element("users/afa", "Association")
  1783. self.fail()
  1784. except UnknownModel:
  1785. pass
  1786. # Non-existing element
  1787. before = element_list("users/user/test/a")
  1788. try:
  1789. delete_element("users/user/test/a", "AAAAAAA")
  1790. self.fail()
  1791. except UnknownElement:
  1792. assert element_list("users/user/test/a") == before
  1793. # No read permissions
  1794. try:
  1795. delete_element("administration/core", "formalisms")
  1796. self.fail()
  1797. except ReadPermissionDenied:
  1798. pass
  1799. # No write permissions
  1800. before = element_list("formalisms/SimpleClassDiagrams")
  1801. try:
  1802. delete_element("formalisms/SimpleClassDiagrams", "Class")
  1803. self.fail()
  1804. except WritePermissionDenied:
  1805. assert element_list("formalisms/SimpleClassDiagrams") == before
  1806. # Give garbage
  1807. assert element_list_nice("users/user/test/d") == [{"__type" : "Class", "__id": "A", "lower_cardinality": None, "upper_cardinality": None, "constraint": {"AL": ""}, "name": None, "abstract": None}]
  1808. try:
  1809. delete_element("users/user/test/d", ('abc', 'def'))
  1810. except UnknownElement:
  1811. assert element_list_nice("users/user/test/d") == [{"__type" : "Class", "__id": "A", "lower_cardinality": None, "upper_cardinality": None, "constraint": {"AL": ""}, "name": None, "abstract": None}]
  1812. # Check on folder "model"
  1813. try:
  1814. delete_element("users", "a")
  1815. self.fail()
  1816. except NotAModel:
  1817. pass
  1818. def test_op_AL_text(self):
  1819. # Test normal situation with code provided by assignment
  1820. model_add("users/user/test/b", "formalisms/SimpleClassDiagrams", """
  1821. Class A {}
  1822. """)
  1823. attr_assign_code("users/user/test/b", "A", "constraint", """
  1824. String function main(value : Element):
  1825. return "OK"!
  1826. """)
  1827. assert AL_text(read_attrs("users/user/test/b", "A")["constraint"]["AL"]).strip() == """
  1828. String function main(value : Element):
  1829. return "OK"!
  1830. """.strip()
  1831. # Test normal situation with code provided by HUTN parser (model)
  1832. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  1833. Class A {
  1834. constraint = $
  1835. String function main(value : Element):
  1836. return "OK"!
  1837. $
  1838. }
  1839. """)
  1840. assert AL_text(read_attrs("users/user/test/a", "A")["constraint"]["AL"]).strip() == 'String function main(value : Element):\n\treturn "OK"!'
  1841. # Test AL_text on non-existing location
  1842. try:
  1843. AL_text("abc")
  1844. self.fail()
  1845. except UnknownLocation:
  1846. pass
  1847. # No permissions on locations directly, so there are no checks that have to be done
  1848. def test_op_read_outgoing(self):
  1849. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  1850. SimpleAttribute String {}
  1851. Class A {
  1852. name : String
  1853. }
  1854. Class B {}
  1855. Association C (A, B) {}
  1856. Association D (C, B) {}
  1857. """)
  1858. # Test normal operation
  1859. assert read_outgoing("users/user/test/a", "A", "Association") == set(["C"])
  1860. assert read_outgoing("users/user/test/a", "A", "AttributeLink") == set(["A_name"])
  1861. # Test wildcard
  1862. assert read_outgoing("users/user/test/a", "A", "") == set(["A_name", "C"])
  1863. # Test association on association
  1864. assert read_outgoing("users/user/test/a", "C", "") == set(["D"])
  1865. # Test empty result
  1866. assert read_outgoing("users/user/test/a", "B", "") == set([])
  1867. # Test simpleattribute
  1868. assert read_outgoing("users/user/test/a", "String", "") == set([])
  1869. # Non-existing model
  1870. try:
  1871. read_outgoing("users/afa", "Association", "")
  1872. self.fail()
  1873. except UnknownModel:
  1874. pass
  1875. # Non-existing element
  1876. before = element_list("users/user/test/a")
  1877. try:
  1878. read_outgoing("users/user/test/a", "AAAAAAA", "")
  1879. self.fail()
  1880. except UnknownElement:
  1881. assert element_list("users/user/test/a") == before
  1882. # Non-existing type
  1883. before = element_list("users/user/test/a")
  1884. try:
  1885. read_outgoing("users/user/test/a", "A", "AAAAAAA")
  1886. self.fail()
  1887. except UnknownElement:
  1888. assert element_list("users/user/test/a") == before
  1889. # No read permissions
  1890. try:
  1891. read_outgoing("administration/core", "formalisms", "")
  1892. self.fail()
  1893. except ReadPermissionDenied:
  1894. pass
  1895. # No write permissions, but can query
  1896. assert type(read_outgoing("formalisms/SimpleClassDiagrams", "Class", "")) == type(set())
  1897. # Check on folder "model"
  1898. try:
  1899. read_outgoing("users", "a", "")
  1900. self.fail()
  1901. except NotAModel:
  1902. pass
  1903. def test_op_read_incoming(self):
  1904. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  1905. SimpleAttribute String {}
  1906. Class A {
  1907. name : String
  1908. }
  1909. Class B {}
  1910. Association C (A, B) {}
  1911. Association E (A, A) {}
  1912. Association D (C, B) {}
  1913. Association F (D, E) {}
  1914. """)
  1915. # Test normal operation
  1916. assert read_incoming("users/user/test/a", "B", "Association") == set(["C", "D"])
  1917. # Test wildcard
  1918. assert read_incoming("users/user/test/a", "B", "") == set(["C", "D"])
  1919. # Test association on association
  1920. assert read_incoming("users/user/test/a", "E", "") == set(["F"])
  1921. # Test double result
  1922. assert read_incoming("users/user/test/a", "A", "") == set(["E"])
  1923. # Test simpleattribute
  1924. assert read_incoming("users/user/test/a", "String", "") == set(["A_name"])
  1925. # Test empty result
  1926. assert read_incoming("users/user/test/a", "F", "") == set([])
  1927. # Non-existing model
  1928. try:
  1929. read_incoming("users/afa", "Association", "")
  1930. self.fail()
  1931. except UnknownModel:
  1932. pass
  1933. # Non-existing element
  1934. before = element_list("users/user/test/a")
  1935. try:
  1936. read_incoming("users/user/test/a", "AAAAAAA", "")
  1937. self.fail()
  1938. except UnknownElement:
  1939. assert element_list("users/user/test/a") == before
  1940. # Non-existing type
  1941. before = element_list("users/user/test/a")
  1942. try:
  1943. read_incoming("users/user/test/a", "A", "AAAAAAA")
  1944. self.fail()
  1945. except UnknownElement:
  1946. assert element_list("users/user/test/a") == before
  1947. # No read permissions
  1948. try:
  1949. read_incoming("administration/core", "formalisms", "")
  1950. self.fail()
  1951. except ReadPermissionDenied:
  1952. pass
  1953. # No write permissions, but can query
  1954. assert type(read_incoming("formalisms/SimpleClassDiagrams", "Class", "")) == type(set())
  1955. # Check on folder "model"
  1956. try:
  1957. read_incoming("users", "a", "")
  1958. self.fail()
  1959. except NotAModel:
  1960. pass
  1961. def test_op_read_association_source(self):
  1962. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  1963. SimpleAttribute String {}
  1964. Class A {
  1965. name : String
  1966. }
  1967. Class B {}
  1968. Association C (A, B) {}
  1969. Association E (A, A) {}
  1970. Association D (C, B) {}
  1971. Association F (D, E) {}
  1972. """)
  1973. # Test normal operation
  1974. assert read_association_source("users/user/test/a", "C") == "A"
  1975. # Test association on association
  1976. assert read_association_source("users/user/test/a", "D") == "C"
  1977. # Test node
  1978. try:
  1979. assert read_association_source("users/user/test/a", "A")
  1980. self.fail()
  1981. except NotAnAssociation:
  1982. pass
  1983. # Non-existing model
  1984. try:
  1985. read_association_source("users/afa", "Association")
  1986. self.fail()
  1987. except UnknownModel:
  1988. pass
  1989. # Non-existing element
  1990. before = element_list("users/user/test/a")
  1991. try:
  1992. read_association_source("users/user/test/a", "AAAAAAA")
  1993. self.fail()
  1994. except UnknownElement:
  1995. assert element_list("users/user/test/a") == before
  1996. # No read permissions
  1997. try:
  1998. read_association_source("administration/core", "formalisms")
  1999. self.fail()
  2000. except ReadPermissionDenied:
  2001. pass
  2002. # No write permissions, but can query
  2003. assert read_association_source("formalisms/SimpleClassDiagrams", "Association") == "Class"
  2004. # Not an association
  2005. try:
  2006. read_association_source("users/user/test/a", "A")
  2007. self.fail()
  2008. except NotAnAssociation:
  2009. pass
  2010. # Check on folder "model"
  2011. try:
  2012. read_association_source("users", "a")
  2013. self.fail()
  2014. except NotAModel:
  2015. pass
  2016. def test_op_read_association_destination(self):
  2017. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  2018. SimpleAttribute String {}
  2019. Class A {
  2020. name : String
  2021. }
  2022. Class B {}
  2023. Association C (A, B) {}
  2024. Association E (A, A) {}
  2025. Association D (C, B) {}
  2026. Association F (D, E) {}
  2027. """)
  2028. # Test normal operation
  2029. assert read_association_destination("users/user/test/a", "C") == "B"
  2030. # Test association on association
  2031. assert read_association_destination("users/user/test/a", "F") == "E"
  2032. # Test node
  2033. try:
  2034. assert read_association_destination("users/user/test/a", "A")
  2035. self.fail()
  2036. except NotAnAssociation:
  2037. pass
  2038. # Non-existing model
  2039. try:
  2040. read_association_destination("users/afa", "Association")
  2041. self.fail()
  2042. except UnknownModel:
  2043. pass
  2044. # Non-existing element
  2045. before = element_list("users/user/test/a")
  2046. try:
  2047. read_association_destination("users/user/test/a", "AAAAAAA")
  2048. self.fail()
  2049. except UnknownElement:
  2050. assert element_list("users/user/test/a") == before
  2051. # No read permissions
  2052. try:
  2053. read_association_destination("administration/core", "formalisms")
  2054. self.fail()
  2055. except ReadPermissionDenied:
  2056. pass
  2057. # No write permissions, but can query
  2058. assert read_association_destination("formalisms/SimpleClassDiagrams", "Association") == "Class"
  2059. # Not an association
  2060. try:
  2061. read_association_destination("users/user/test/a", "A")
  2062. self.fail()
  2063. except NotAnAssociation:
  2064. pass
  2065. # Check on folder "model"
  2066. try:
  2067. read_association_destination("users", "a")
  2068. self.fail()
  2069. except NotAModel:
  2070. pass
  2071. def test_op_connections_between(self):
  2072. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  2073. SimpleAttribute String {}
  2074. Class A {
  2075. name1 : String
  2076. name2 : String
  2077. }
  2078. Class B {}
  2079. Association C (A, B) {}
  2080. Association D (A, B) {}
  2081. Association E (A, A) {}
  2082. Association F (C, B) {}
  2083. Association G (E, F) {}
  2084. """)
  2085. # Test normal operation
  2086. assert connections_between("users/user/test/a", "A", "A") == set(["Association", "Inheritance"])
  2087. assert connections_between("users/user/test/a", "A", "B") == set(["Association", "Inheritance"])
  2088. assert connections_between("users/user/test/a", "A", "C") == set(["Association", "Inheritance"])
  2089. # Test none allowed
  2090. assert connections_between("users/user/test/a", "A_name1", "A_name2") == set([])
  2091. # Non-existing model
  2092. try:
  2093. connections_between("users/afa", "A", "B")
  2094. self.fail()
  2095. except UnknownModel:
  2096. pass
  2097. # Non-existing element (1)
  2098. before = element_list("users/user/test/a")
  2099. try:
  2100. connections_between("users/user/test/a", "AA", "B")
  2101. self.fail()
  2102. except UnknownElement:
  2103. assert element_list("users/user/test/a") == before
  2104. # Non-existing element (2)
  2105. before = element_list("users/user/test/a")
  2106. try:
  2107. connections_between("users/user/test/a", "A", "BB")
  2108. self.fail()
  2109. except UnknownElement:
  2110. assert element_list("users/user/test/a") == before
  2111. # No read permissions
  2112. try:
  2113. connections_between("administration/core", "formalisms", "formalisms")
  2114. self.fail()
  2115. except ReadPermissionDenied:
  2116. pass
  2117. # No write permissions, but can query
  2118. assert connections_between("formalisms/SimpleClassDiagrams", "Association", "Association") == set(["Association", "Inheritance"])
  2119. # Check on folder "model"
  2120. try:
  2121. connections_between("users", "a", "b")
  2122. self.fail()
  2123. except NotAModel:
  2124. pass
  2125. def test_op_define_attribute(self):
  2126. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  2127. SimpleAttribute String {}
  2128. SimpleAttribute Natural {}
  2129. Class A {}
  2130. Class B {}
  2131. Association C (A, B) {}
  2132. Association D (C, A) {}
  2133. """)
  2134. assert read_defined_attrs("users/user/test/a", "A") == ({}, {})
  2135. # Test normal operation
  2136. define_attribute("users/user/test/a", "A", "my_attr", "String")
  2137. assert read_defined_attrs("users/user/test/a", "A") == ({"my_attr": "String"}, {})
  2138. # Test second attribute of same type
  2139. define_attribute("users/user/test/a", "A", "my_second_attr", "String")
  2140. assert read_defined_attrs("users/user/test/a", "A") == ({"my_attr": "String", "my_second_attr": "String"}, {})
  2141. # Test third attribute with different type
  2142. define_attribute("users/user/test/a", "A", "a_third_one", "Natural")
  2143. assert read_defined_attrs("users/user/test/a", "A") == ({"my_attr": "String", "my_second_attr": "String", "a_third_one": "Natural"}, {})
  2144. # Test same on associations
  2145. define_attribute("users/user/test/a", "C", "my_attr", "String")
  2146. assert read_defined_attrs("users/user/test/a", "C") == ({"my_attr": "String"}, {})
  2147. # Test second attribute of same type
  2148. define_attribute("users/user/test/a", "C", "my_second_attr", "String")
  2149. assert read_defined_attrs("users/user/test/a", "C") == ({"my_attr": "String", "my_second_attr": "String"}, {})
  2150. # Test third attribute with different type
  2151. define_attribute("users/user/test/a", "C", "a_third_one", "Natural")
  2152. assert read_defined_attrs("users/user/test/a", "C") == ({"my_attr": "String", "my_second_attr": "String", "a_third_one": "Natural"}, {})
  2153. # Non-existing model
  2154. try:
  2155. define_attribute("users/afa", "A", "B", "C")
  2156. self.fail()
  2157. except UnknownModel:
  2158. pass
  2159. # Non-existing element (1)
  2160. before = element_list("users/user/test/a")
  2161. try:
  2162. define_attribute("users/user/test/a", "AA", "B", "Natural")
  2163. self.fail()
  2164. except UnknownElement:
  2165. assert element_list("users/user/test/a") == before
  2166. # Non-existing element (2)
  2167. before = element_list("users/user/test/a")
  2168. try:
  2169. define_attribute("users/user/test/a", "A", "B", "Natural2")
  2170. self.fail()
  2171. except UnknownElement:
  2172. assert element_list("users/user/test/a") == before
  2173. # Attribute exists
  2174. before = element_list("users/user/test/a")
  2175. try:
  2176. define_attribute("users/user/test/a", "A", "my_attr", "Natural")
  2177. self.fail()
  2178. except AttributeExists:
  2179. assert element_list("users/user/test/a") == before
  2180. # No read permissions
  2181. before = element_list("users/user/test/a")
  2182. try:
  2183. define_attribute("administration/core", "formalisms", "name", "A")
  2184. self.fail()
  2185. except ReadPermissionDenied:
  2186. assert element_list("users/user/test/a") == before
  2187. # No write permissions
  2188. before = element_list("users/user/test/a")
  2189. try:
  2190. define_attribute("formalisms/SimpleClassDiagrams", "Association", "new_name", "String")
  2191. self.fail()
  2192. except WritePermissionDenied:
  2193. assert element_list("users/user/test/a") == before
  2194. # None defined in non-SCD model
  2195. model_add("users/user/test/b", "users/user/test/a", "A a {}")
  2196. try:
  2197. define_attribute("users/user/test/b", "a", "abc", "a")
  2198. self.fail()
  2199. except UnknownM3:
  2200. pass
  2201. # Check on folder "model"
  2202. try:
  2203. define_attribute("users", "a", "b", "c")
  2204. self.fail()
  2205. except NotAModel:
  2206. pass
  2207. def test_op_read_defined_attrs(self):
  2208. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  2209. SimpleAttribute String {}
  2210. SimpleAttribute Natural {}
  2211. Class A {
  2212. name = "ABC"
  2213. value : Natural
  2214. new_name ?: String
  2215. name : String
  2216. }
  2217. Association B (A, A) {
  2218. name = "DEF"
  2219. edge_value : Natural
  2220. name : String
  2221. other_value ?: String
  2222. }
  2223. Class C {}
  2224. Class D : A {
  2225. additional_attr : Natural
  2226. }
  2227. Association E : B (D, A) {
  2228. next_attr : String
  2229. }
  2230. """)
  2231. # Normal operation
  2232. assert read_defined_attrs("users/user/test/a", "A") == ({"value": "Natural", "name": "String"}, {"new_name": "String"})
  2233. assert read_defined_attrs("users/user/test/a", "B") == ({"edge_value": "Natural", "name": "String"}, {"other_value": "String"})
  2234. assert read_defined_attrs("users/user/test/a", "C") == ({}, {})
  2235. # Works with inheritance
  2236. assert read_defined_attrs("users/user/test/a", "D") == ({"value": "Natural", "name": "String", "additional_attr": "Natural"}, {"new_name": "String"})
  2237. assert read_defined_attrs("users/user/test/a", "E") == ({"edge_value": "Natural", "name": "String", "next_attr": "String"}, {"other_value": "String"})
  2238. # Non-existing model
  2239. try:
  2240. read_defined_attrs("users/afa", "A")
  2241. self.fail()
  2242. except UnknownModel:
  2243. pass
  2244. # Non-existing element
  2245. before = element_list("users/user/test/a")
  2246. try:
  2247. read_defined_attrs("users/user/test/a", "AA")
  2248. self.fail()
  2249. except UnknownElement:
  2250. assert element_list("users/user/test/a") == before
  2251. # No read permissions
  2252. before = element_list("users/user/test/a")
  2253. try:
  2254. read_defined_attrs("administration/core", "formalisms")
  2255. self.fail()
  2256. except ReadPermissionDenied:
  2257. assert element_list("users/user/test/a") == before
  2258. # No write permissions, but can still query
  2259. assert read_defined_attrs("formalisms/SimpleClassDiagrams", "Association") == ({"name": "String"}, {"abstract": "Boolean", "constraint": "ActionCode", "lower_cardinality": "Natural", "upper_cardinality": "Natural", "source_lower_cardinality": "Natural", "source_upper_cardinality": "Natural", "target_lower_cardinality": "Natural", "target_upper_cardinality": "Natural"})
  2260. # None defined in non-SCD model
  2261. model_add("users/user/test/b", "users/user/test/a", "A a {}")
  2262. try:
  2263. read_defined_attrs("users/user/test/b", "a")
  2264. self.fail()
  2265. except UnknownM3:
  2266. pass
  2267. # Check on folder "model"
  2268. try:
  2269. read_defined_attrs("users", "a")
  2270. self.fail()
  2271. except NotAModel:
  2272. pass
  2273. def test_op_undefine_attribute(self):
  2274. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  2275. SimpleAttribute String {}
  2276. SimpleAttribute Natural {}
  2277. Class A {
  2278. name = "ABC"
  2279. value : Natural
  2280. new_name ?: String
  2281. name : String
  2282. }
  2283. Association B (A, A) {
  2284. name = "DEF"
  2285. edge_value : Natural
  2286. name : String
  2287. other_value ?: String
  2288. }
  2289. Class C {}
  2290. Class D : A {
  2291. additional_attr : Natural
  2292. }
  2293. Association E : B (D, A) {
  2294. next_attr : String
  2295. }
  2296. """)
  2297. assert read_defined_attrs("users/user/test/a", "A") == ({"value": "Natural", "name": "String"}, {"new_name": "String"})
  2298. assert read_defined_attrs("users/user/test/a", "D") == ({"value": "Natural", "name": "String", "additional_attr": "Natural"}, {"new_name": "String"})
  2299. undefine_attribute("users/user/test/a", "A", "name")
  2300. assert read_defined_attrs("users/user/test/a", "A") == ({"value": "Natural"}, {"new_name": "String"})
  2301. assert read_defined_attrs("users/user/test/a", "D") == ({"value": "Natural", "additional_attr": "Natural"}, {"new_name": "String"})
  2302. assert read_defined_attrs("users/user/test/a", "B") == ({"edge_value": "Natural", "name": "String"}, {"other_value": "String"})
  2303. assert read_defined_attrs("users/user/test/a", "E") == ({"edge_value": "Natural", "name": "String", "next_attr": "String"}, {"other_value": "String"})
  2304. undefine_attribute("users/user/test/a", "B", "other_value")
  2305. assert read_defined_attrs("users/user/test/a", "B") == ({"edge_value": "Natural", "name": "String"}, {})
  2306. assert read_defined_attrs("users/user/test/a", "E") == ({"edge_value": "Natural", "name": "String", "next_attr": "String"}, {})
  2307. # Remove superclass definition
  2308. assert read_defined_attrs("users/user/test/a", "D") == ({"value": "Natural", "additional_attr": "Natural"}, {"new_name": "String"})
  2309. try:
  2310. undefine_attribute("users/user/test/a", "D", "value")
  2311. self.fail()
  2312. except SuperclassAttribute:
  2313. pass
  2314. assert read_defined_attrs("users/user/test/a", "D") == ({"value": "Natural", "additional_attr": "Natural"}, {"new_name": "String"})
  2315. # Non-existing model
  2316. try:
  2317. undefine_attribute("users/afa", "A", "B")
  2318. self.fail()
  2319. except UnknownModel:
  2320. pass
  2321. # Non-existing element
  2322. before = read_defined_attrs("users/user/test/a", "A")
  2323. try:
  2324. undefine_attribute("users/user/test/a", "AA", "B")
  2325. self.fail()
  2326. except UnknownElement:
  2327. assert read_defined_attrs("users/user/test/a", "A") == before
  2328. # Non-existing attribute
  2329. before = read_defined_attrs("users/user/test/a", "A")
  2330. try:
  2331. undefine_attribute("users/user/test/a", "A", "adfadf")
  2332. self.fail()
  2333. except UnknownAttribute:
  2334. assert read_defined_attrs("users/user/test/a", "A") == before
  2335. # No read permissions
  2336. try:
  2337. undefine_attribute("administration/core", "formalisms", "name")
  2338. self.fail()
  2339. except ReadPermissionDenied:
  2340. pass
  2341. # No write permissions
  2342. before = read_defined_attrs("formalisms/SimpleClassDiagrams", "Class")
  2343. try:
  2344. undefine_attribute("formalisms/SimpleClassDiagrams", "Class", "name")
  2345. self.fail()
  2346. except WritePermissionDenied:
  2347. assert read_defined_attrs("formalisms/SimpleClassDiagrams", "Class") == before
  2348. # Check on folder "model"
  2349. try:
  2350. undefine_attribute("users", "a", "b")
  2351. self.fail()
  2352. except NotAModel:
  2353. pass
  2354. def test_op_attribute_optional(self):
  2355. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  2356. SimpleAttribute String {}
  2357. SimpleAttribute Natural {}
  2358. Class A {
  2359. name = "ABC"
  2360. value : Natural
  2361. new_name ?: String
  2362. name : String
  2363. }
  2364. Association B (A, A) {
  2365. name = "DEF"
  2366. edge_value : Natural
  2367. name : String
  2368. other_value ?: String
  2369. }
  2370. Class C {}
  2371. Class D : A {
  2372. additional_attr : Natural
  2373. }
  2374. Association E : B (D, A) {
  2375. next_attr : String
  2376. }
  2377. """)
  2378. # Check initial situation
  2379. assert read_defined_attrs("users/user/test/a", "A") == ({"value": "Natural", "name": "String"}, {"new_name": "String"})
  2380. assert read_defined_attrs("users/user/test/a", "B") == ({"edge_value": "Natural", "name": "String"}, {"other_value": "String"})
  2381. assert read_defined_attrs("users/user/test/a", "C") == ({}, {})
  2382. assert read_defined_attrs("users/user/test/a", "D") == ({"value": "Natural", "name": "String", "additional_attr": "Natural"}, {"new_name": "String"})
  2383. assert read_defined_attrs("users/user/test/a", "E") == ({"edge_value": "Natural", "name": "String", "next_attr": "String"}, {"other_value": "String"})
  2384. # mandatory -> optional
  2385. attribute_optional("users/user/test/a", "A", "value", True)
  2386. assert read_defined_attrs("users/user/test/a", "A") == ({"name": "String"}, {"new_name": "String", "value": "Natural"})
  2387. # Check inheritance as well
  2388. assert read_defined_attrs("users/user/test/a", "D") == ({"name": "String", "additional_attr": "Natural"}, {"new_name": "String", "value": "Natural"})
  2389. # optional -> mandatory
  2390. attribute_optional("users/user/test/a", "A", "new_name", False)
  2391. assert read_defined_attrs("users/user/test/a", "A") == ({"name": "String", "new_name": "String"}, {"value": "Natural"})
  2392. # Check inheritance as well
  2393. assert read_defined_attrs("users/user/test/a", "D") == ({"name": "String", "additional_attr": "Natural", "new_name": "String"}, {"value": "Natural"})
  2394. # mandatory -> mandatory
  2395. attribute_optional("users/user/test/a", "A", "new_name", False)
  2396. assert read_defined_attrs("users/user/test/a", "A") == ({"name": "String", "new_name": "String"}, {"value": "Natural"})
  2397. # Check inheritance as well
  2398. assert read_defined_attrs("users/user/test/a", "D") == ({"name": "String", "additional_attr": "Natural", "new_name": "String"}, {"value": "Natural"})
  2399. # optional -> optional
  2400. attribute_optional("users/user/test/a", "A", "value", True)
  2401. assert read_defined_attrs("users/user/test/a", "A") == ({"name": "String", "new_name": "String"}, {"value": "Natural"})
  2402. # Check inheritance as well
  2403. assert read_defined_attrs("users/user/test/a", "D") == ({"name": "String", "additional_attr": "Natural", "new_name": "String"}, {"value": "Natural"})
  2404. # Non-existing model
  2405. try:
  2406. attribute_optional("users/afa", "A", "value", False)
  2407. self.fail()
  2408. except UnknownModel:
  2409. pass
  2410. # Non-existing element
  2411. before = element_list("users/user/test/a")
  2412. try:
  2413. attribute_optional("users/user/test/a", "AA", "value", False)
  2414. self.fail()
  2415. except UnknownElement:
  2416. assert element_list("users/user/test/a") == before
  2417. # No read permissions
  2418. try:
  2419. attribute_optional("administration/core", "formalisms", "name", True)
  2420. self.fail()
  2421. except ReadPermissionDenied:
  2422. pass
  2423. # No write permissions, but can still query
  2424. before = element_list("formalisms/SimpleClassDiagrams")
  2425. try:
  2426. attribute_optional("formalisms/SimpleClassDiagrams", "Class", "name", True)
  2427. self.fail()
  2428. except WritePermissionDenied:
  2429. assert element_list("formalisms/SimpleClassDiagrams") == before
  2430. # None defined in non-SCD model
  2431. model_add("users/user/test/b", "users/user/test/a", "A a {}")
  2432. try:
  2433. attribute_optional("users/user/test/b", "a", "b", False)
  2434. self.fail()
  2435. except UnknownM3:
  2436. pass
  2437. # Attribute not defined here
  2438. try:
  2439. attribute_optional("users/user/test/a", "D", "value", False)
  2440. self.fail()
  2441. except SuperclassAttribute:
  2442. assert read_defined_attrs("users/user/test/a", "D") == ({"name": "String", "additional_attr": "Natural", "new_name": "String"}, {"value": "Natural"})
  2443. # Non-existing attribute
  2444. try:
  2445. attribute_optional("users/user/test/a", "D", "adf", True)
  2446. self.fail()
  2447. except UnknownAttribute:
  2448. assert read_defined_attrs("users/user/test/a", "D") == ({"name": "String", "additional_attr": "Natural", "new_name": "String"}, {"value": "Natural"})
  2449. # Check on folder "model"
  2450. try:
  2451. attribute_optional("users", "a", "b", True)
  2452. self.fail()
  2453. except NotAModel:
  2454. pass
  2455. def test_op_attribute_type(self):
  2456. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  2457. SimpleAttribute String {}
  2458. SimpleAttribute Natural {}
  2459. Class A {
  2460. name = "ABC"
  2461. value : Natural
  2462. new_name ?: String
  2463. name : String
  2464. }
  2465. Association B (A, A) {
  2466. name = "DEF"
  2467. edge_value : Natural
  2468. name : String
  2469. other_value ?: String
  2470. }
  2471. Class C {}
  2472. Class D : A {
  2473. additional_attr : Natural
  2474. }
  2475. Association E : B (D, A) {
  2476. next_attr : String
  2477. }
  2478. """)
  2479. # Check initial situation
  2480. assert read_defined_attrs("users/user/test/a", "A") == ({"value": "Natural", "name": "String"}, {"new_name": "String"})
  2481. assert read_defined_attrs("users/user/test/a", "B") == ({"edge_value": "Natural", "name": "String"}, {"other_value": "String"})
  2482. assert read_defined_attrs("users/user/test/a", "C") == ({}, {})
  2483. assert read_defined_attrs("users/user/test/a", "D") == ({"value": "Natural", "name": "String", "additional_attr": "Natural"}, {"new_name": "String"})
  2484. assert read_defined_attrs("users/user/test/a", "E") == ({"edge_value": "Natural", "name": "String", "next_attr": "String"}, {"other_value": "String"})
  2485. # Change type of node
  2486. attribute_type("users/user/test/a", "A", "value", "String")
  2487. assert read_defined_attrs("users/user/test/a", "A") == ({"value": "String", "name": "String"}, {"new_name": "String"})
  2488. # Check inheritance as well
  2489. assert read_defined_attrs("users/user/test/a", "D") == ({"value": "String", "name": "String", "additional_attr": "Natural"}, {"new_name": "String"})
  2490. # Change type of edge
  2491. attribute_type("users/user/test/a", "B", "name", "Natural")
  2492. assert read_defined_attrs("users/user/test/a", "B") == ({"edge_value": "Natural", "name": "Natural"}, {"other_value": "String"})
  2493. # Check inheritance as well
  2494. assert read_defined_attrs("users/user/test/a", "E") == ({"edge_value": "Natural", "name": "Natural", "next_attr": "String"}, {"other_value": "String"})
  2495. # Non-existing model
  2496. try:
  2497. attribute_type("users/afa", "A", "value", "String")
  2498. self.fail()
  2499. except UnknownModel:
  2500. pass
  2501. # Non-existing element
  2502. before = element_list("users/user/test/a")
  2503. try:
  2504. attribute_type("users/user/test/a", "AA", "value", "String")
  2505. self.fail()
  2506. except UnknownElement:
  2507. assert element_list("users/user/test/a") == before
  2508. # Non-existing type
  2509. before = element_list("users/user/test/a")
  2510. try:
  2511. attribute_type("users/user/test/a", "A", "value", "SSS")
  2512. self.fail()
  2513. except UnknownElement:
  2514. assert element_list("users/user/test/a") == before
  2515. # No read permissions
  2516. try:
  2517. attribute_type("administration/core", "formalisms", "name", "Natural")
  2518. self.fail()
  2519. except ReadPermissionDenied:
  2520. pass
  2521. # No write permissions
  2522. before = element_list("formalisms/SimpleClassDiagrams")
  2523. try:
  2524. attribute_type("formalisms/SimpleClassDiagrams", "Class", "name", "Natural")
  2525. self.fail()
  2526. except WritePermissionDenied:
  2527. assert element_list("formalisms/SimpleClassDiagrams") == before
  2528. # None defined in non-SCD model
  2529. model_add("users/user/test/b", "users/user/test/a", "A a {}")
  2530. try:
  2531. attribute_type("users/user/test/b", "a", "b", "a")
  2532. self.fail()
  2533. except UnknownM3:
  2534. pass
  2535. # Attribute not defined here
  2536. try:
  2537. attribute_type("users/user/test/a", "D", "value", "Natural")
  2538. self.fail()
  2539. except SuperclassAttribute:
  2540. assert read_defined_attrs("users/user/test/a", "D") == ({"value": "String", "name": "String", "additional_attr": "Natural"}, {"new_name": "String"})
  2541. # Non-existing attribute
  2542. try:
  2543. attribute_type("users/user/test/a", "D", "adf", "Natural")
  2544. self.fail()
  2545. except UnknownAttribute:
  2546. assert read_defined_attrs("users/user/test/a", "D") == ({"value": "String", "name": "String", "additional_attr": "Natural"}, {"new_name": "String"})
  2547. # Check on folder "model"
  2548. try:
  2549. attribute_type("users", "a", "b", "c")
  2550. self.fail()
  2551. except NotAModel:
  2552. pass
  2553. def test_op_attribute_name(self):
  2554. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  2555. SimpleAttribute String {}
  2556. SimpleAttribute Natural {}
  2557. Class A {
  2558. name = "ABC"
  2559. value : Natural
  2560. new_name ?: String
  2561. name : String
  2562. }
  2563. Association B (A, A) {
  2564. name = "DEF"
  2565. edge_value : Natural
  2566. name : String
  2567. other_value ?: String
  2568. }
  2569. Class C {}
  2570. Class D : A {
  2571. additional_attr : Natural
  2572. }
  2573. Association E : B (D, A) {
  2574. next_attr : String
  2575. }
  2576. """)
  2577. # Check initial situation
  2578. assert read_defined_attrs("users/user/test/a", "A") == ({"value": "Natural", "name": "String"}, {"new_name": "String"})
  2579. assert read_defined_attrs("users/user/test/a", "B") == ({"edge_value": "Natural", "name": "String"}, {"other_value": "String"})
  2580. assert read_defined_attrs("users/user/test/a", "C") == ({}, {})
  2581. assert read_defined_attrs("users/user/test/a", "D") == ({"value": "Natural", "name": "String", "additional_attr": "Natural"}, {"new_name": "String"})
  2582. assert read_defined_attrs("users/user/test/a", "E") == ({"edge_value": "Natural", "name": "String", "next_attr": "String"}, {"other_value": "String"})
  2583. # Change name of node
  2584. attribute_name("users/user/test/a", "A", "value", "new_value")
  2585. assert read_defined_attrs("users/user/test/a", "A") == ({"new_value": "Natural", "name": "String"}, {"new_name": "String"})
  2586. # Check inheritance as well
  2587. assert read_defined_attrs("users/user/test/a", "D") == ({"new_value": "Natural", "name": "String", "additional_attr": "Natural"}, {"new_name": "String"})
  2588. # Change name of edge
  2589. attribute_name("users/user/test/a", "B", "name", "other_name")
  2590. assert read_defined_attrs("users/user/test/a", "B") == ({"edge_value": "Natural", "other_name": "String"}, {"other_value": "String"})
  2591. # Check inheritance as well
  2592. assert read_defined_attrs("users/user/test/a", "E") == ({"edge_value": "Natural", "other_name": "String", "next_attr": "String"}, {"other_value": "String"})
  2593. # Attribute not defined here
  2594. try:
  2595. attribute_name("users/user/test/a", "D", "new_value", "newer_value")
  2596. self.fail()
  2597. except SuperclassAttribute:
  2598. pass
  2599. # Non-existing model
  2600. try:
  2601. attribute_name("users/afa", "A", "value", "str")
  2602. self.fail()
  2603. except UnknownModel:
  2604. pass
  2605. # Non-existing element
  2606. before = element_list("users/user/test/a")
  2607. try:
  2608. attribute_name("users/user/test/a", "AA", "value", "val2")
  2609. self.fail()
  2610. except UnknownElement:
  2611. assert element_list("users/user/test/a") == before
  2612. # Pre-existing name
  2613. before = element_list("users/user/test/a")
  2614. try:
  2615. attribute_name("users/user/test/a", "A", "new_value", "name")
  2616. self.fail()
  2617. except AttributeExists:
  2618. assert element_list("users/user/test/a") == before
  2619. # No read permissions
  2620. try:
  2621. attribute_name("administration/core", "formalisms", "name", "natural")
  2622. self.fail()
  2623. except ReadPermissionDenied:
  2624. pass
  2625. # No write permissions, but can still query
  2626. before = element_list("formalisms/SimpleClassDiagrams")
  2627. try:
  2628. attribute_name("formalisms/SimpleClassDiagrams", "Class", "name", "value")
  2629. self.fail()
  2630. except WritePermissionDenied:
  2631. assert element_list("formalisms/SimpleClassDiagrams") == before
  2632. # None defined in non-SCD model
  2633. model_add("users/user/test/b", "users/user/test/a", "A a {}")
  2634. try:
  2635. attribute_name("users/user/test/b", "a", "b", "c")
  2636. self.fail()
  2637. except UnknownM3:
  2638. pass
  2639. # Check on folder "model"
  2640. try:
  2641. attribute_name("users", "a", "b", "c")
  2642. self.fail()
  2643. except NotAModel:
  2644. pass
  2645. def test_op_group_create(self):
  2646. # Test normal operation
  2647. group_name_1 = "new_group"
  2648. group_name_2 = "group2"
  2649. group_name_3 = "other_group"
  2650. group_name_4 = "second_group"
  2651. assert group_list() == set([])
  2652. group_create(group_name_1)
  2653. assert group_list() == set([(group_name_1, True)])
  2654. # Test second group
  2655. assert group_list() == set([(group_name_1, True)])
  2656. group_create(group_name_2)
  2657. assert group_list() == set([(group_name_1, True), (group_name_2, True)])
  2658. # Test other groups
  2659. self.do_as_user("user2", group_create, [group_name_3])
  2660. self.do_as_user("user2", group_create, [group_name_4])
  2661. assert group_list() == set([(group_name_1, True), (group_name_2, True)])
  2662. # Test non-admin groups
  2663. self.do_as_user("user2", group_join, [group_name_3, "user"])
  2664. assert group_list() == set([(group_name_1, True), (group_name_2, True), (group_name_3, False)])
  2665. # Test create of existing group (member)
  2666. before = group_list()
  2667. try:
  2668. group_create(group_name_1)
  2669. self.fail()
  2670. except GroupExists:
  2671. assert group_list() == before
  2672. # Test create of existing group (non-member)
  2673. before = group_list()
  2674. try:
  2675. group_create(group_name_4)
  2676. self.fail()
  2677. except GroupExists:
  2678. assert group_list() == before
  2679. # Delete all groups again
  2680. self.do_as_user("admin", group_delete, [group_name_1])
  2681. self.do_as_user("admin", group_delete, [group_name_2])
  2682. self.do_as_user("admin", group_delete, [group_name_3])
  2683. self.do_as_user("admin", group_delete, [group_name_4])
  2684. def test_op_group_delete(self):
  2685. group_name_1 = "new_group" # Group with admin permissions
  2686. group_name_2 = "group2" # Group without permissions
  2687. group_name_3 = "other_group" # No member
  2688. group_name_4 = "second_group" # Non-existing group
  2689. # Ensure user2 exists
  2690. self.do_as_user("user2", lambda : 1, [])
  2691. # Create some groups first
  2692. group_create(group_name_1)
  2693. self.do_as_user("admin", group_create, [group_name_2])
  2694. self.do_as_user("admin", group_join, [group_name_2, "user"])
  2695. self.do_as_user("admin", group_create, [group_name_3])
  2696. # Try to delete all
  2697. assert group_list() == set([(group_name_1, True), (group_name_2, False)])
  2698. group_delete(group_name_1)
  2699. assert group_list() == set([(group_name_2, False)])
  2700. # Remove group that we don't own
  2701. try:
  2702. group_delete(group_name_2)
  2703. self.fail()
  2704. except GroupPermissionDenied:
  2705. assert group_list() == set([(group_name_2, False)])
  2706. # Remove group that we are not even member of
  2707. try:
  2708. group_delete(group_name_3)
  2709. self.fail()
  2710. except GroupPermissionDenied:
  2711. assert group_list() == set([(group_name_2, False)])
  2712. # Remove non-existing group
  2713. try:
  2714. group_delete(group_name_4)
  2715. except UnknownGroup:
  2716. assert group_list() == set([(group_name_2, False)])
  2717. # Test if other users can no longer see removed groups
  2718. group_create(group_name_1)
  2719. group_join(group_name_1, "user2")
  2720. assert self.do_as_user("user2", group_list, []) == set([(group_name_1, False)])
  2721. group_delete(group_name_1)
  2722. assert self.do_as_user("user2", group_list, []) == set([])
  2723. # Delete all groups again
  2724. self.do_as_user("admin", group_delete, [group_name_2])
  2725. self.do_as_user("admin", group_delete, [group_name_3])
  2726. def test_op_group_list(self):
  2727. group_name_1 = "new_group" # Group with admin permissions
  2728. group_name_2 = "group2" # Group without permissions
  2729. group_name_3 = "other_group" # No member
  2730. group_name_4 = "second_group" # Non-existing group
  2731. # Ensure user2 exists
  2732. self.do_as_user("user2", lambda : 1, [])
  2733. # Create some groups first
  2734. group_create(group_name_1)
  2735. self.do_as_user("admin", group_create, [group_name_2])
  2736. self.do_as_user("admin", group_join, [group_name_2, "user"])
  2737. self.do_as_user("admin", group_create, [group_name_3])
  2738. # Assure that groups of all users are correct
  2739. assert group_list() == set([(group_name_1, True), (group_name_2, False)])
  2740. assert self.do_as_user("user2", group_list, []) == set([])
  2741. assert self.do_as_user("admin", group_list, []) == set([("admin", False), (group_name_2, True), (group_name_3, True)])
  2742. # Delete a group to check that everything is correctly listed afterwards
  2743. self.do_as_user("admin", group_delete, [group_name_2])
  2744. assert group_list() == set([(group_name_1, True)])
  2745. assert self.do_as_user("user2", group_list, []) == set([])
  2746. assert self.do_as_user("admin", group_list, []) == set([("admin", False), (group_name_3, True)])
  2747. # Delete all groups again
  2748. self.do_as_user("admin", group_delete, [group_name_1])
  2749. self.do_as_user("admin", group_delete, [group_name_3])
  2750. def do_as_user(self, username, operation, args):
  2751. user_logout()
  2752. login(username, username)
  2753. try:
  2754. result = operation(*args)
  2755. except:
  2756. user_logout()
  2757. login("user", "user")
  2758. raise
  2759. else:
  2760. user_logout()
  2761. login("user", "user")
  2762. return result
  2763. def test_op_group_join(self):
  2764. group_name_1 = "new_group" # Group with admin permissions
  2765. group_name_2 = "group2" # Group without permissions
  2766. group_name_3 = "other_group" # No member
  2767. group_name_4 = "second_group" # Non-existing group
  2768. # Ensure user2 exists
  2769. self.do_as_user("user2", lambda : 1, [])
  2770. # Create some groups first
  2771. group_create(group_name_1)
  2772. self.do_as_user("admin", group_create, [group_name_2])
  2773. self.do_as_user("admin", group_join, [group_name_2, "user"])
  2774. self.do_as_user("admin", group_create, [group_name_3])
  2775. # Test for group join basic use, of group where we are admin
  2776. assert group_join(group_name_1, "user2") == None
  2777. assert self.do_as_user("user2", group_list, []) == set([(group_name_1, False)])
  2778. # Test for group join of group where we are no admin
  2779. try:
  2780. group_join(group_name_2, "user2") == None
  2781. self.fail()
  2782. except GroupPermissionDenied:
  2783. assert self.do_as_user("user2", group_list, []) == set([(group_name_1, False)])
  2784. # Test for group join of group where we are not even a member
  2785. try:
  2786. group_join(group_name_3, "user2") == None
  2787. self.fail()
  2788. except GroupPermissionDenied:
  2789. assert self.do_as_user("user2", group_list, []) == set([(group_name_1, False)])
  2790. # Test for group join of group that already has user as member
  2791. assert self.do_as_user("user2", group_list, []) == set([(group_name_1, False)])
  2792. try:
  2793. group_join(group_name_1, "user2") == None
  2794. self.fail()
  2795. except UserExists:
  2796. assert self.do_as_user("user2", group_list, []) == set([(group_name_1, False)])
  2797. # Test for group join of non-existing user
  2798. try:
  2799. group_join(group_name_1, "user123") == None
  2800. self.fail()
  2801. except UnknownUser:
  2802. pass
  2803. # Test for group join of non-existing group
  2804. try:
  2805. group_join(group_name_4, "user2") == None
  2806. self.fail()
  2807. except UnknownGroup:
  2808. pass
  2809. # Delete all groups again
  2810. self.do_as_user("admin", group_delete, [group_name_1])
  2811. self.do_as_user("admin", group_delete, [group_name_2])
  2812. self.do_as_user("admin", group_delete, [group_name_3])
  2813. def test_op_group_kick(self):
  2814. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  2815. group_name_1 = "new_group" # Group with admin permissions
  2816. group_name_2 = "group2" # Group without permissions
  2817. group_name_3 = "other_group" # No member
  2818. group_name_4 = "second_group" # Non-existing group
  2819. # Ensure user2 exists
  2820. self.do_as_user("user2", lambda : 1, [])
  2821. # Create some groups first
  2822. group_create(group_name_1)
  2823. self.do_as_user("admin", group_create, [group_name_2])
  2824. self.do_as_user("admin", group_join, [group_name_2, "user"])
  2825. # Kick user from group
  2826. assert group_list() == set([(group_name_1, True), (group_name_2, False)])
  2827. self.do_as_user("admin", group_kick, [group_name_2, "user"])
  2828. assert group_list() == set([(group_name_1, True)])
  2829. # Kick self (owner) from group
  2830. assert group_list() == set([(group_name_1, True)])
  2831. group_create(group_name_3)
  2832. assert group_list() == set([(group_name_1, True), (group_name_3, True)])
  2833. assert group_kick(group_name_3, "user") == None
  2834. assert group_list() == set([(group_name_1, True)])
  2835. # Empty groups are not deleted
  2836. self.do_as_user("admin", group_join, [group_name_3, "user"])
  2837. # Kick user not in group
  2838. try:
  2839. self.do_as_user("admin", group_kick, [group_name_2, "user2"])
  2840. self.fail()
  2841. except UserNotInGroup:
  2842. pass
  2843. # Non-existing user
  2844. try:
  2845. group_kick(group_name_1, "adfafd")
  2846. self.fail()
  2847. except UnknownUser:
  2848. pass
  2849. # Non-existing group
  2850. try:
  2851. group_kick("adfadf", "user")
  2852. self.fail()
  2853. except UnknownGroup:
  2854. pass
  2855. # Not admin of group
  2856. self.do_as_user("admin", group_join, [group_name_2, "user"])
  2857. self.do_as_user("admin", group_join, [group_name_2, "user2"])
  2858. assert group_list() == set([(group_name_1, True), (group_name_2, False), (group_name_3, False)])
  2859. assert self.do_as_user("user2", group_list, []) == set([(group_name_2, False)])
  2860. try:
  2861. group_kick(group_name_2, "user2")
  2862. self.fail()
  2863. except GroupPermissionDenied:
  2864. assert self.do_as_user("user2", group_list, []) == set([(group_name_2, False)])
  2865. self.do_as_user("admin", group_delete, [group_name_1])
  2866. self.do_as_user("admin", group_delete, [group_name_2])
  2867. self.do_as_user("admin", group_delete, [group_name_3])
  2868. def do_create_user(self, name):
  2869. self.do_as_user(name, lambda : 1, [])
  2870. def do_test_permission(self, model, expected_permissions):
  2871. for user, permission in expected_permissions.items():
  2872. assert self.do_as_user(user, read_permissions, [model]) == permission
  2873. def test_op_permission_owner_model(self):
  2874. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  2875. group_create("users")
  2876. permission_group("users/user/test/a", "users")
  2877. permission_modify("users/user/test/a", "210")
  2878. self.do_create_user("group_user")
  2879. self.do_create_user("other_user")
  2880. group_join("users", "group_user")
  2881. # Test initial situation, where we have owners user:users with permission 210
  2882. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "R", "other_user": ""})
  2883. # Change owner, but permissions stay the same
  2884. permission_owner("users/user/test/a", "group_user")
  2885. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "R", "group_user": "RW", "other_user": ""})
  2886. # Can no longer modify permissions: only owner can do that
  2887. try:
  2888. permission_owner("users/user/test/a", "admin")
  2889. self.fail()
  2890. except UserPermissionDenied:
  2891. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "R", "group_user": "RW", "other_user": ""})
  2892. # Change owner to admin, who always has RW permissions
  2893. self.do_as_user("group_user", permission_owner, ["users/user/test/a", "admin"])
  2894. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "R", "group_user": "R", "other_user": ""})
  2895. # Give permissions back to someone else, and test that admin can always do operations, even if not owner
  2896. self.do_as_user("admin", permission_owner, ["users/user/test/a", "group_user"])
  2897. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "R", "group_user": "RW", "other_user": ""})
  2898. self.do_as_user("admin", permission_owner, ["users/user/test/a", "user"])
  2899. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "R", "other_user": ""})
  2900. # Test non-existing model
  2901. try:
  2902. permission_owner("adfadf", "admin")
  2903. self.fail()
  2904. except UnknownModel:
  2905. pass
  2906. # Test non-existing user
  2907. try:
  2908. self.do_as_user("admin", permission_owner, ["users/user/test/a", "dfadf"])
  2909. self.fail()
  2910. except UnknownUser:
  2911. pass
  2912. # Test assign to user who is already owner
  2913. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "R", "other_user": ""})
  2914. self.do_as_user("admin", permission_owner, ["users/user/test/a", "user"])
  2915. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "R", "other_user": ""})
  2916. group_delete("users")
  2917. def test_op_permission_owner_folder(self):
  2918. folder_create("users/user/test/a/b/c")
  2919. group_create("users")
  2920. self.do_create_user("group_user")
  2921. group_join("users", "group_user")
  2922. permission_group("users/user/test/a/b", "users")
  2923. permission_modify("users/user/test/a/b", "210")
  2924. # Test permissions
  2925. self.do_test_permission("users/user/test/", {"admin": "RW", "user": "RW", "group_user": "", "other_user": ""})
  2926. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "", "other_user": ""})
  2927. self.do_test_permission("users/user/test/a/b", {"admin": "RW", "user": "RW", "group_user": "R", "other_user": ""})
  2928. self.do_test_permission("users/user/test/a/b/c", {"admin": "RW", "user": "RW", "group_user": "", "other_user": ""})
  2929. # But test if they are really applicable
  2930. try:
  2931. self.do_as_user("group_user", model_list, ["users/user/test"])
  2932. self.fail()
  2933. except ReadPermissionDenied:
  2934. pass
  2935. try:
  2936. self.do_as_user("group_user", model_list, ["users/user/test/a"])
  2937. self.fail()
  2938. except ReadPermissionDenied:
  2939. pass
  2940. self.do_as_user("group_user", model_list, ["users/user/test/a/b"])
  2941. try:
  2942. self.do_as_user("group_user", model_list, ["users/user/test/a/b/c"])
  2943. self.fail()
  2944. except ReadPermissionDenied:
  2945. pass
  2946. group_delete("users")
  2947. def test_op_read_permissions_model(self):
  2948. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  2949. group_create("users")
  2950. self.do_create_user("group_user")
  2951. self.do_create_user("other_user")
  2952. group_join("users", "group_user")
  2953. permission_group("users/user/test/a", "users")
  2954. permission_modify("users/user/test/a", "210")
  2955. # Test all four cases
  2956. assert self.do_as_user("user", read_permissions, ["users/user/test/a"]) == "RW"
  2957. assert self.do_as_user("group_user", read_permissions, ["users/user/test/a"]) == "R"
  2958. assert self.do_as_user("other_user", read_permissions, ["users/user/test/a"]) == ""
  2959. assert self.do_as_user("admin", read_permissions, ["users/user/test/a"]) == "RW"
  2960. # Test same for root location (empty string)
  2961. assert self.do_as_user("user", read_permissions, [""]) == "R"
  2962. assert self.do_as_user("group_user", read_permissions, [""]) == "R"
  2963. assert self.do_as_user("other_user", read_permissions, [""]) == "R"
  2964. assert self.do_as_user("admin", read_permissions, [""]) == "RW"
  2965. # Test for non-existing location
  2966. try:
  2967. read_permissions("adfadsf")
  2968. self.fail()
  2969. except UnknownLocation:
  2970. pass
  2971. group_delete("users")
  2972. def test_op_read_permissions_folder(self):
  2973. folder_create("users/user/test/a")
  2974. group_create("users")
  2975. self.do_create_user("group_user")
  2976. self.do_create_user("other_user")
  2977. group_join("users", "group_user")
  2978. permission_group("users/user/test/a", "users")
  2979. permission_modify("users/user/test/a", "210")
  2980. # Test all four cases
  2981. assert self.do_as_user("user", read_permissions, ["users/user/test/a"]) == "RW"
  2982. assert self.do_as_user("group_user", read_permissions, ["users/user/test/a"]) == "R"
  2983. assert self.do_as_user("other_user", read_permissions, ["users/user/test/a"]) == ""
  2984. assert self.do_as_user("admin", read_permissions, ["users/user/test/a"]) == "RW"
  2985. # Test for non-existing location
  2986. try:
  2987. read_permissions("adfadsf")
  2988. self.fail()
  2989. except UnknownLocation:
  2990. pass
  2991. group_delete("users")
  2992. def test_op_permission_group_model(self):
  2993. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
  2994. group_create("users")
  2995. group_create("other_group")
  2996. permission_modify("users/user/test/a", "210")
  2997. self.do_create_user("group_user")
  2998. self.do_create_user("other_user")
  2999. group_join("users", "group_user")
  3000. # Test initial situation, where we have owners user:users with permission 210
  3001. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "", "other_user": ""})
  3002. # Change owner, but permissions stay the same
  3003. permission_group("users/user/test/a", "users")
  3004. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "R", "other_user": ""})
  3005. # Only owner can modify group permissions
  3006. try:
  3007. self.do_as_user("group_user", permission_group, ["users/user/test/a", "other_group"])
  3008. self.fail()
  3009. except UserPermissionDenied:
  3010. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "R", "other_user": ""})
  3011. # Test that admin can always do operations, even if not owner
  3012. # And test that user permissions still override group permissions
  3013. self.do_as_user("admin", permission_group, ["users/user/test/a", "admin"])
  3014. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "", "other_user": ""})
  3015. self.do_as_user("admin", permission_group, ["users/user/test/a", "other_group"])
  3016. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "", "other_user": ""})
  3017. self.do_as_user("admin", permission_group, ["users/user/test/a", "users"])
  3018. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "R", "other_user": ""})
  3019. # Test non-existing model
  3020. try:
  3021. permission_group("adfadf", "admin")
  3022. self.fail()
  3023. except UnknownModel:
  3024. pass
  3025. # Test non-existing group
  3026. try:
  3027. self.do_as_user("admin", permission_group, ["users/user/test/a", "dfadf"])
  3028. self.fail()
  3029. except UnknownGroup:
  3030. pass
  3031. # Test assign to group which is already owning group, resulting in no change
  3032. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "R", "other_user": ""})
  3033. self.do_as_user("admin", permission_group, ["users/user/test/a", "users"])
  3034. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "R", "other_user": ""})
  3035. self.do_as_user("admin", group_delete, ["other_group"])
  3036. self.do_as_user("admin", group_delete, ["users"])
  3037. def test_op_permission_group_folder(self):
  3038. folder_create("users/user/test/a/b/c")
  3039. group_create("users")
  3040. self.do_create_user("group_user")
  3041. group_join("users", "group_user")
  3042. permission_group("users/user/test/a/b", "users")
  3043. permission_modify("users/user/test/a/b", "210")
  3044. # Test permissions
  3045. self.do_test_permission("users/user/test/", {"admin": "RW", "user": "RW", "group_user": "", "other_user": ""})
  3046. self.do_test_permission("users/user/test/a", {"admin": "RW", "user": "RW", "group_user": "", "other_user": ""})
  3047. self.do_test_permission("users/user/test/a/b", {"admin": "RW", "user": "RW", "group_user": "R", "other_user": ""})
  3048. self.do_test_permission("users/user/test/a/b/c", {"admin": "RW", "user": "RW", "group_user": "", "other_user": ""})
  3049. # But test if they are really applicable
  3050. try:
  3051. self.do_as_user("group_user", model_list, ["users/user/test"])
  3052. self.fail()
  3053. except ReadPermissionDenied:
  3054. pass
  3055. try:
  3056. self.do_as_user("group_user", model_list, ["users/user/test/a"])
  3057. self.fail()
  3058. except ReadPermissionDenied:
  3059. pass
  3060. self.do_as_user("group_user", model_list, ["users/user/test/a/b"])
  3061. try:
  3062. self.do_as_user("group_user", model_list, ["users/user/test/a/b/c"])
  3063. self.fail()
  3064. except ReadPermissionDenied:
  3065. pass
  3066. group_delete("users")
  3067. def test_op_group_owner_add(self):
  3068. group_create("group1")
  3069. group_create("group2")
  3070. group_create("group3")
  3071. self.do_create_user("new_user")
  3072. group_join("group1", "new_user")
  3073. # Basic use of group owner: promote a user
  3074. assert self.do_as_user("new_user", group_list, []) == set([("group1", False)])
  3075. assert group_owner_add("group1", "new_user") == None
  3076. assert self.do_as_user("new_user", group_list, []) == set([("group1", True)])
  3077. # Or instantaneously make owner, thereby also making a member
  3078. assert self.do_as_user("new_user", group_list, []) == set([("group1", True)])
  3079. assert group_owner_add("group2", "new_user") == None
  3080. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", True)])
  3081. # Test for user that is already an owner
  3082. assert group_owner_add("group1", "new_user") == None
  3083. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", True)])
  3084. # Test non-existing user
  3085. try:
  3086. group_owner_add("group1", "abc")
  3087. self.fail()
  3088. except UnknownUser:
  3089. pass
  3090. # Test non-existing group
  3091. try:
  3092. group_owner_add("group4", "new_user")
  3093. self.fail()
  3094. except UnknownGroup:
  3095. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", True)])
  3096. # Only an owner of the group can do this
  3097. group_owner_delete("group2", "new_user")
  3098. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", False)])
  3099. try:
  3100. self.do_as_user("new_user", group_owner_add, ["group2", "user"])
  3101. self.fail()
  3102. except GroupPermissionDenied:
  3103. pass
  3104. # Also non-members can't modify
  3105. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", False)])
  3106. try:
  3107. self.do_as_user("new_user", group_owner_add, ["group3", "user"])
  3108. self.fail()
  3109. except GroupPermissionDenied:
  3110. pass
  3111. # Delete all groups again
  3112. group_delete("group1")
  3113. group_delete("group2")
  3114. group_delete("group3")
  3115. def test_op_group_owner_delete(self):
  3116. group_create("group1")
  3117. group_create("group2")
  3118. group_create("group3")
  3119. self.do_create_user("new_user")
  3120. group_owner_add("group1", "new_user")
  3121. group_owner_add("group2", "new_user")
  3122. # Basic use: remove owner, but stay a member
  3123. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", True)])
  3124. assert group_owner_delete("group2", "new_user") == None
  3125. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", False)])
  3126. # Test for user that is already not an owner
  3127. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", False)])
  3128. assert group_owner_delete("group2", "new_user") == None
  3129. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", False)])
  3130. # Test for user that is not even a member
  3131. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", False)])
  3132. try:
  3133. group_owner_delete("group3", "new_user")
  3134. self.fail()
  3135. except UserNotInGroup:
  3136. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", False)])
  3137. # Test non-existing user
  3138. try:
  3139. group_owner_delete("group1", "abc")
  3140. self.fail()
  3141. except UnknownUser:
  3142. pass
  3143. # Test non-existing group
  3144. try:
  3145. group_owner_delete("group4", "new_user")
  3146. self.fail()
  3147. except UnknownGroup:
  3148. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", False)])
  3149. # Only an owner of the group can do this
  3150. group_owner_delete("group2", "new_user")
  3151. assert group_list() == set([("group1", True), ("group2", True), ("group3", True)])
  3152. try:
  3153. self.do_as_user("new_user", group_owner_delete, ["group2", "user"])
  3154. self.fail()
  3155. except GroupPermissionDenied:
  3156. assert group_list() == set([("group1", True), ("group2", True), ("group3", True)])
  3157. # Also non-members can't modify
  3158. assert self.do_as_user("new_user", group_list, []) == set([("group1", True), ("group2", False)])
  3159. try:
  3160. self.do_as_user("new_user", group_owner_delete, ["group3", "user"])
  3161. self.fail()
  3162. except GroupPermissionDenied:
  3163. pass
  3164. # Delete all groups again
  3165. group_delete("group1")
  3166. group_delete("group2")
  3167. group_delete("group3")
  3168. def test_op_conformance_add(self):
  3169. # Add some conformance relations
  3170. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  3171. Class A {}
  3172. Class B {}
  3173. Association C (A, B) {}
  3174. """)
  3175. # Add conformance bottom relation
  3176. t = model_types("users/user/test/a")
  3177. assert len(t) == 1
  3178. t = t.pop()
  3179. print(t)
  3180. assert t[0] == "formalisms/SimpleClassDiagrams"
  3181. assert t[1] != None
  3182. assert t[2] == None
  3183. # Check if the type is added, but without any type mapping associated to it
  3184. conformance_add("users/user/test/a", "formalisms/Bottom")
  3185. ts = model_types("users/user/test/a")
  3186. assert len(ts) == 2
  3187. while ts:
  3188. t = ts.pop()
  3189. assert t[0] in ["formalisms/SimpleClassDiagrams", "formalisms/Bottom"]
  3190. if t[0] == "formalisms/SimpleClassDiagrams":
  3191. assert t[1] != None
  3192. elif t[1] == "formalisms/Bottom":
  3193. # Type mapping is empty
  3194. assert t[1] == None
  3195. assert t[2] == None
  3196. # Check if a type mapping is created when model is opened as bottom
  3197. alter_context("users/user/test/a", "formalisms/Bottom")
  3198. element_list("users/user/test/a")
  3199. alter_context("users/user/test/a", "formalisms/SimpleClassDiagrams")
  3200. ts = model_types("users/user/test/a")
  3201. assert len(ts) == 2
  3202. while ts:
  3203. t = ts.pop()
  3204. assert t[0] in ["formalisms/SimpleClassDiagrams", "formalisms/Bottom"]
  3205. assert t[1] != None
  3206. assert t[2] == None
  3207. # Check if we can add a second one to the same MM
  3208. conformance_add("users/user/test/a", "formalisms/Bottom")
  3209. ts = model_types("users/user/test/a")
  3210. assert len(ts) == 3
  3211. assert ("formalisms/Bottom", None, None) in ts
  3212. found = False
  3213. while ts:
  3214. t = ts.pop()
  3215. assert t[0] in ["formalisms/SimpleClassDiagrams", "formalisms/Bottom"]
  3216. if t[0] == "formalisms/SimpleClassDiagrams":
  3217. assert t[1] != None
  3218. elif t[0] == "formalisms/Bottom":
  3219. # Type mapping is empty
  3220. if t[1] != None:
  3221. found = True
  3222. assert t[2] == None
  3223. assert found
  3224. # Check add of non-existing model
  3225. try:
  3226. conformance_add("users/user/test/b", "formalisms/Bottom")
  3227. self.fail()
  3228. except UnknownModel:
  3229. pass
  3230. # Check add of non-existing metamodel
  3231. model_add("users/user/test/b", "formalisms/SimpleClassDiagrams")
  3232. before = model_types("users/user/test/b")
  3233. try:
  3234. conformance_add("users/user/test/b", "formalisms/Bottom2")
  3235. self.fail()
  3236. except UnknownModel:
  3237. assert model_types("users/user/test/b") == before
  3238. # Check conformance_add for a folder model
  3239. try:
  3240. conformance_add("users/user/test", "formalisms/Bottom")
  3241. self.fail()
  3242. except NotAModel:
  3243. pass
  3244. # Check conformance_add for a folder metamodel
  3245. try:
  3246. conformance_add("users/user/test/a", "formalisms")
  3247. self.fail()
  3248. except NotAModel:
  3249. pass
  3250. def test_op_conformance_delete(self):
  3251. model_add("users/user/test/a", "formalisms/SimpleClassDiagrams", """
  3252. Class A {}
  3253. Class B {}
  3254. Association C (A, B) {}
  3255. """)
  3256. # Add conformance bottom relation
  3257. conformance_add("users/user/test/a", "formalisms/Bottom")
  3258. # Verify initial state
  3259. ts = model_types("users/user/test/a")
  3260. assert len(ts) == 2
  3261. while ts:
  3262. t = ts.pop()
  3263. assert t[0] in ["formalisms/SimpleClassDiagrams", "formalisms/Bottom"]
  3264. if t[0] == "formalisms/SimpleClassDiagrams":
  3265. assert t[1] != None
  3266. elif t[1] == "formalisms/Bottom":
  3267. # Type mapping is empty
  3268. assert t[1] == None
  3269. assert t[2] == None
  3270. # Now remove it again
  3271. conformance_delete("users/user/test/a", "formalisms/Bottom", "")
  3272. ts = model_types("users/user/test/a")
  3273. assert len(ts) == 1
  3274. t = ts.pop()
  3275. assert t[0] == "formalisms/SimpleClassDiagrams"
  3276. assert t[1] != None
  3277. assert t[2] == None
  3278. # Add conformance bottom relation twice
  3279. conformance_add("users/user/test/a", "formalisms/Bottom")
  3280. conformance_add("users/user/test/a", "formalisms/Bottom")
  3281. # Should be there twice, but set flattens it to once
  3282. ts = model_types("users/user/test/a")
  3283. assert len(ts) == 2
  3284. while ts:
  3285. t = ts.pop()
  3286. assert t[0] in ["formalisms/SimpleClassDiagrams", "formalisms/Bottom"]
  3287. if t[0] == "formalisms/SimpleClassDiagrams":
  3288. assert t[1] != None
  3289. elif t[1] == "formalisms/Bottom":
  3290. # Type mapping is empty
  3291. assert t[1] == None
  3292. assert t[2] == None
  3293. # Now remove it (once called, but invoked for all occurences!)
  3294. conformance_delete("users/user/test/a", "formalisms/Bottom", "")
  3295. ts = model_types("users/user/test/a")
  3296. assert len(ts) == 1
  3297. t = ts.pop()
  3298. assert t[0] == "formalisms/SimpleClassDiagrams"
  3299. assert t[1] != None
  3300. assert t[2] == None
  3301. # Now actually test filtering capabilities
  3302. alter_context("users/user/test/a", "formalisms/Bottom")
  3303. element_list("users/user/test/a")
  3304. alter_context("users/user/test/a", "formalisms/SimpleClassDiagrams")
  3305. # Model should be there with a type mapping model
  3306. ts = model_types("users/user/test/a")
  3307. assert len(ts) == 2
  3308. while ts:
  3309. t = ts.pop()
  3310. assert t[0] in ["formalisms/SimpleClassDiagrams", "formalisms/Bottom"]
  3311. assert t[1] != None
  3312. assert t[2] == None
  3313. # Add a second bottom relation
  3314. conformance_add("users/user/test/a", "formalisms/Bottom")
  3315. # And remove the one without model, to make sure that it is not a wildcard!
  3316. conformance_delete("users/user/test/a", "formalisms/Bottom", "")
  3317. ts = model_types("users/user/test/a")
  3318. assert len(ts) == 2
  3319. while ts:
  3320. t = ts.pop()
  3321. assert t[0] in ["formalisms/SimpleClassDiagrams", "formalisms/Bottom"]
  3322. assert t[1] != None
  3323. assert t[2] == None
  3324. # Add again, but now remove the one with type mapping
  3325. conformance_add("users/user/test/a", "formalisms/Bottom")
  3326. # First try one that doesn't match...
  3327. conformance_delete("users/user/test/a", "formalisms/Bottom", "NOTHING")
  3328. ts = model_types("users/user/test/a")
  3329. assert len(ts) == 3
  3330. while ts:
  3331. t = ts.pop()
  3332. assert t[0] in ["formalisms/SimpleClassDiagrams", "formalisms/Bottom"]
  3333. assert t[2] == None
  3334. # Now try one with the actual name
  3335. actual_name = [i for i in model_types("users/user/test/a") if i[0] == "formalisms/Bottom" and i[1] != None][0][1]
  3336. assert len(model_types("users/user/test/a")) == 3
  3337. conformance_delete("users/user/test/a", "formalisms/SimpleClassDiagrams", actual_name)
  3338. # Nothing removed, because of wrong TM model
  3339. assert len(model_types("users/user/test/a")) == 3
  3340. # Now remove correct one
  3341. conformance_delete("users/user/test/a", "formalisms/Bottom", actual_name)
  3342. ts = model_types("users/user/test/a")
  3343. assert len(ts) == 2
  3344. while ts:
  3345. t = ts.pop()
  3346. assert t[0] in ["formalisms/SimpleClassDiagrams", "formalisms/Bottom"]
  3347. if t[0] == "formalisms/SimpleClassDiagrams":
  3348. assert t[1] != None
  3349. elif t[1] == "formalisms/Bottom":
  3350. # Type mapping is empty
  3351. assert t[1] == None
  3352. assert t[2] == None
  3353. # Check non-existing model
  3354. try:
  3355. conformance_delete("users/user/test/b", "formalisms/Bottom", "")
  3356. self.fail()
  3357. except UnknownModel:
  3358. pass
  3359. # Check add of non-existing metamodel
  3360. model_add("users/user/test/b", "formalisms/SimpleClassDiagrams")
  3361. before = model_types("users/user/test/b")
  3362. try:
  3363. conformance_delete("users/user/test/b", "formalisms/Bottom2", "")
  3364. self.fail()
  3365. except UnknownModel:
  3366. assert model_types("users/user/test/b") == before
  3367. # Check folder as model
  3368. try:
  3369. conformance_delete("users/user/test", "formalisms/Bottom", "")
  3370. self.fail()
  3371. except NotAModel:
  3372. pass
  3373. # Check folder as metamodel
  3374. try:
  3375. conformance_delete("users/user/test/a", "formalisms", "")
  3376. self.fail()
  3377. except NotAModel:
  3378. pass
  3379. def test_op_transformation_between_MANUAL(self):
  3380. # Add set of transformations
  3381. def create_transf(name, inputs, outputs):
  3382. transformation_add_MANUAL({"key_%s" % i: "users/user/test/" + i for i in inputs}, {"key_%s" % i: "users/user/test/" + i for i in outputs}, "users/user/test/" + name)
  3383. model_add("users/user/test/A", "formalisms/SimpleClassDiagrams")
  3384. model_add("users/user/test/B", "formalisms/SimpleClassDiagrams")
  3385. model_add("users/user/test/C", "formalisms/SimpleClassDiagrams")
  3386. model_add("users/user/test/D", "formalisms/SimpleClassDiagrams")
  3387. model_add("users/user/test/E", "formalisms/SimpleClassDiagrams")
  3388. create_transf("1", ["A"], ["B"])
  3389. create_transf("2", ["A"], ["C", "D"])
  3390. create_transf("3", ["B", "C"], ["D"])
  3391. create_transf("4", ["A", "B"], ["D", "E"])
  3392. # Test normal operation
  3393. def check_transformations(inputs, outputs, expected):
  3394. assert transformation_between({"key_" + i: "users/user/test/" + i for i in inputs}, {"key_" + i: "users/user/test/" + i for i in outputs}) == set(["users/user/test/" + i for i in expected])
  3395. # Obvious ones, with a perfect signature match
  3396. check_transformations(["A"], ["B"], ["1"])
  3397. check_transformations(["A"], ["C", "D"], ["2"])
  3398. check_transformations(["B", "C"], ["D"], ["3"])
  3399. check_transformations(["A", "B"], ["D", "E"], ["4"])
  3400. # Incomplete matches
  3401. check_transformations(["A"], [], ["1", "2", "4"])
  3402. check_transformations(["B"], [], ["3", "4"])
  3403. check_transformations(["C"], [], ["3"])
  3404. check_transformations(["D"], [], [])
  3405. check_transformations(["E"], [], [])
  3406. check_transformations([], ["A"], [])
  3407. check_transformations([], ["B"], ["1"])
  3408. check_transformations([], ["C"], ["2"])
  3409. check_transformations([], ["D"], ["2", "3", "4"])
  3410. check_transformations([], ["E"], ["4"])
  3411. # Complete match, which doesn't return as it would give all transformations in the Modelverse...
  3412. try:
  3413. check_transformations([], [], [])
  3414. self.fail()
  3415. except IncorrectFormat:
  3416. pass
  3417. # Non-existing model (source)
  3418. try:
  3419. assert transformation_between({"key_A": "users/user/test/Z"}, {"key_B": "users/user/test/B"}) == set([])
  3420. self.fail()
  3421. except UnknownModel:
  3422. pass
  3423. # Key mismatch (source)
  3424. assert transformation_between({"key_B": "users/user/test/A"}, {"key_B": "users/user/test/B"}) == set([])
  3425. # Model mismatch (source)
  3426. assert transformation_between({"key_A": "users/user/test/B"}, {"key_B": "users/user/test/B"}) == set([])
  3427. # Non-existing model (target)
  3428. try:
  3429. assert transformation_between({"key_A": "users/user/test/A"}, {"key_B": "users/user/test/Z"}) == set([])
  3430. self.fail()
  3431. except UnknownModel:
  3432. pass
  3433. # Key mismatch (target)
  3434. assert transformation_between({"key_A": "users/user/test/A"}, {"key_A": "users/user/test/B"}) == set([])
  3435. # Model mismatch (target)
  3436. assert transformation_between({"key_A": "users/user/test/A"}, {"key_B": "users/user/test/A"}) == set([])
  3437. # Source model is folder
  3438. try:
  3439. transformation_between({"key_A": "users"}, {})
  3440. self.fail()
  3441. except NotAModel:
  3442. pass
  3443. # Target model is folder
  3444. try:
  3445. transformation_between({}, {"key_A": "users"})
  3446. self.fail()
  3447. except NotAModel:
  3448. pass
  3449. def test_op_transformation_between_AL(self):
  3450. # Add set of transformations
  3451. def create_transf(name, inputs, outputs):
  3452. transformation_add_AL({"key_%s" % i: "users/user/test/" + i for i in inputs}, {"key_%s" % i: "users/user/test/" + i for i in outputs}, "users/user/test/" + name, "Void function main():\n\treturn!")
  3453. model_add("users/user/test/A", "formalisms/SimpleClassDiagrams")
  3454. model_add("users/user/test/B", "formalisms/SimpleClassDiagrams")
  3455. model_add("users/user/test/C", "formalisms/SimpleClassDiagrams")
  3456. model_add("users/user/test/D", "formalisms/SimpleClassDiagrams")
  3457. model_add("users/user/test/E", "formalisms/SimpleClassDiagrams")
  3458. create_transf("1", ["A"], ["B"])
  3459. create_transf("2", ["A"], ["C", "D"])
  3460. create_transf("3", ["B", "C"], ["D"])
  3461. create_transf("4", ["A", "B"], ["D", "E"])
  3462. # Test normal operation
  3463. def check_transformations(inputs, outputs, expected):
  3464. assert transformation_between({"key_" + i: "users/user/test/" + i for i in inputs}, {"key_" + i: "users/user/test/" + i for i in outputs}) == set(["users/user/test/" + i for i in expected])
  3465. # Obvious ones, with a perfect signature match
  3466. check_transformations(["A"], ["B"], ["1"])
  3467. check_transformations(["A"], ["C", "D"], ["2"])
  3468. check_transformations(["B", "C"], ["D"], ["3"])
  3469. check_transformations(["A", "B"], ["D", "E"], ["4"])
  3470. # Incomplete matches
  3471. check_transformations(["A"], [], ["1", "2", "4"])
  3472. check_transformations(["B"], [], ["3", "4"])
  3473. check_transformations(["C"], [], ["3"])
  3474. check_transformations(["D"], [], [])
  3475. check_transformations(["E"], [], [])
  3476. check_transformations([], ["A"], [])
  3477. check_transformations([], ["B"], ["1"])
  3478. check_transformations([], ["C"], ["2"])
  3479. check_transformations([], ["D"], ["2", "3", "4"])
  3480. check_transformations([], ["E"], ["4"])
  3481. # Complete match, which doesn't return as it would give all transformations in the Modelverse...
  3482. try:
  3483. check_transformations([], [], [])
  3484. self.fail()
  3485. except IncorrectFormat:
  3486. pass
  3487. # Non-existing model (source)
  3488. try:
  3489. assert transformation_between({"key_A": "users/user/test/Z"}, {"key_B": "users/user/test/B"}) == set([])
  3490. self.fail()
  3491. except UnknownModel:
  3492. pass
  3493. # Key mismatch (source)
  3494. assert transformation_between({"key_B": "users/user/test/A"}, {"key_B": "users/user/test/B"}) == set([])
  3495. # Model mismatch (source)
  3496. assert transformation_between({"key_A": "users/user/test/B"}, {"key_B": "users/user/test/B"}) == set([])
  3497. # Non-existing model (target)
  3498. try:
  3499. assert transformation_between({"key_A": "users/user/test/A"}, {"key_B": "users/user/test/Z"}) == set([])
  3500. self.fail()
  3501. except UnknownModel:
  3502. pass
  3503. # Key mismatch (target)
  3504. assert transformation_between({"key_A": "users/user/test/A"}, {"key_A": "users/user/test/B"}) == set([])
  3505. # Model mismatch (target)
  3506. assert transformation_between({"key_A": "users/user/test/A"}, {"key_B": "users/user/test/A"}) == set([])
  3507. # Source model is folder
  3508. try:
  3509. transformation_between({"key_A": "users"}, {})
  3510. self.fail()
  3511. except NotAModel:
  3512. pass
  3513. # Target model is folder
  3514. try:
  3515. transformation_between({}, {"key_A": "users"})
  3516. self.fail()
  3517. except NotAModel:
  3518. pass
  3519. def test_op_transformation_between_MT(self):
  3520. # Add set of transformations
  3521. def create_transf(name, inputs, outputs):
  3522. transformation_add_MT({"key_%s" % i: "users/user/test/" + i for i in inputs}, {"key_%s" % i: "users/user/test/" + i for i in outputs}, "users/user/test/" + name, "Composite a{}")
  3523. model_add("users/user/test/A", "formalisms/SimpleClassDiagrams")
  3524. model_add("users/user/test/B", "formalisms/SimpleClassDiagrams")
  3525. model_add("users/user/test/C", "formalisms/SimpleClassDiagrams")
  3526. model_add("users/user/test/D", "formalisms/SimpleClassDiagrams")
  3527. model_add("users/user/test/E", "formalisms/SimpleClassDiagrams")
  3528. create_transf("1", ["A"], ["B"])
  3529. create_transf("2", ["A"], ["C", "D"])
  3530. create_transf("3", ["B", "C"], ["D"])
  3531. create_transf("4", ["A", "B"], ["D", "E"])
  3532. # Test normal operation
  3533. def check_transformations(inputs, outputs, expected):
  3534. assert transformation_between({"key_" + i: "users/user/test/" + i for i in inputs}, {"key_" + i: "users/user/test/" + i for i in outputs}) == set(["users/user/test/" + i for i in expected])
  3535. # Obvious ones, with a perfect signature match
  3536. check_transformations(["A"], ["B"], ["1"])
  3537. check_transformations(["A"], ["C", "D"], ["2"])
  3538. check_transformations(["B", "C"], ["D"], ["3"])
  3539. check_transformations(["A", "B"], ["D", "E"], ["4"])
  3540. # Incomplete matches
  3541. check_transformations(["A"], [], ["1", "2", "4"])
  3542. check_transformations(["B"], [], ["3", "4"])
  3543. check_transformations(["C"], [], ["3"])
  3544. check_transformations(["D"], [], [])
  3545. check_transformations(["E"], [], [])
  3546. check_transformations([], ["A"], [])
  3547. check_transformations([], ["B"], ["1"])
  3548. check_transformations([], ["C"], ["2"])
  3549. check_transformations([], ["D"], ["2", "3", "4"])
  3550. check_transformations([], ["E"], ["4"])
  3551. # Complete match, which doesn't return as it would give all transformations in the Modelverse...
  3552. try:
  3553. check_transformations([], [], [])
  3554. self.fail()
  3555. except IncorrectFormat:
  3556. pass
  3557. # Non-existing model (source)
  3558. try:
  3559. assert transformation_between({"key_A": "users/user/test/Z"}, {"key_B": "users/user/test/B"}) == set([])
  3560. self.fail()
  3561. except UnknownModel:
  3562. pass
  3563. # Key mismatch (source)
  3564. assert transformation_between({"key_B": "users/user/test/A"}, {"key_B": "users/user/test/B"}) == set([])
  3565. # Model mismatch (source)
  3566. assert transformation_between({"key_A": "users/user/test/B"}, {"key_B": "users/user/test/B"}) == set([])
  3567. # Non-existing model (target)
  3568. try:
  3569. assert transformation_between({"key_A": "users/user/test/A"}, {"key_B": "users/user/test/Z"}) == set([])
  3570. self.fail()
  3571. except UnknownModel:
  3572. pass
  3573. # Key mismatch (target)
  3574. assert transformation_between({"key_A": "users/user/test/A"}, {"key_A": "users/user/test/B"}) == set([])
  3575. # Model mismatch (target)
  3576. assert transformation_between({"key_A": "users/user/test/A"}, {"key_B": "users/user/test/A"}) == set([])
  3577. # Source model is folder
  3578. try:
  3579. transformation_between({"key_A": "users"}, {})
  3580. self.fail()
  3581. except NotAModel:
  3582. pass
  3583. # Target model is folder
  3584. try:
  3585. transformation_between({}, {"key_A": "users"})
  3586. self.fail()
  3587. except NotAModel:
  3588. pass
  3589. def test_op_transformation_add_MANUAL(self):
  3590. # Add models for transformation
  3591. model_add("users/user/test/A", "formalisms/SimpleClassDiagrams", """
  3592. SimpleAttribute String {}
  3593. Class A {
  3594. name = "A"
  3595. name : String
  3596. }
  3597. """)
  3598. model_add("users/user/test/B", "formalisms/SimpleClassDiagrams", """
  3599. SimpleAttribute String {}
  3600. Class B {
  3601. name = "B"
  3602. name : String
  3603. }
  3604. """)
  3605. model_add("users/user/test/a", "users/user/test/A", "A {}")
  3606. model_add("users/user/test/b", "users/user/test/B", "B {}")
  3607. # Add a transformation with normal signature
  3608. transformation_add_MANUAL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/c")
  3609. # Add a transformation with normal signature and merged metamodel changes
  3610. transformation_add_MANUAL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/d", operation_MAN_0)
  3611. transformation_add_MANUAL({"MODEL_A": "users/user/test/A", "MODEL_B": "users/user/test/B"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/e", operation_MAN_1)
  3612. try:
  3613. transformation_add_MANUAL({"MODEL_A": "users/user/test/A", "MODEL_B": "users/user/test/B"}, {"MODEL_B": "users/user/test/A"}, "users/user/test/f")
  3614. self.fail()
  3615. except DifferingModelsForKey:
  3616. pass
  3617. # Add a transformation with empty signature
  3618. transformation_add_MANUAL({}, {}, "users/user/test/g")
  3619. # Add a transformation with empty signature and a callback
  3620. try:
  3621. transformation_add_MANUAL({}, {}, "users/user/test/h", null_operation)
  3622. self.fail()
  3623. except CallbackOnEmptySignature:
  3624. assert "h" not in model_list("users/user/test")
  3625. # Add transformation with unknown metamodel in signature (input)
  3626. try:
  3627. transformation_add_MANUAL({"MODEL_A": "adbdsf"}, {"MODEL_B": "users/user/test/A"}, "users/user/test/i")
  3628. self.fail()
  3629. except UnknownModel:
  3630. assert "i" not in model_list("users/user/test")
  3631. # Add transformation with unknown metamodel in signature (output)
  3632. try:
  3633. transformation_add_MANUAL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "adfad"}, "users/user/test/j")
  3634. self.fail()
  3635. except UnknownModel:
  3636. assert "j" not in model_list("users/user/test")
  3637. # Add transformation with unreadable metamodel in signature (input)
  3638. try:
  3639. transformation_add_MANUAL({"MODEL_A": "administration/core"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/k")
  3640. self.fail()
  3641. except ReadPermissionDenied:
  3642. assert "k" not in model_list("users/user/test")
  3643. # Add transformation with unreadable metamodel in signature (output)
  3644. try:
  3645. transformation_add_MANUAL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "administration/core"}, "users/user/test/l")
  3646. self.fail()
  3647. except ReadPermissionDenied:
  3648. assert "l" not in model_list("users/user/test")
  3649. # Try to use a non-RAMifiable metamodel in input
  3650. try:
  3651. transformation_add_MANUAL({"MODEL_A": "users/user/test/a"}, {}, "users/user/test/m")
  3652. self.fail()
  3653. except UnknownM3:
  3654. assert "m" not in model_list("users/user/test")
  3655. # Try to use a non-RAMifiable metamodel in output
  3656. try:
  3657. transformation_add_MANUAL({}, {"MODEL_A": "users/user/test/a"}, "users/user/test/n")
  3658. self.fail()
  3659. except UnknownM3:
  3660. assert "n" not in model_list("users/user/test")
  3661. # Source metamodel is folder
  3662. try:
  3663. transformation_add_MANUAL({"MODEL_A": "users"}, {"MODEL_B": "formalisms/SimpleClassDiagrams"}, "users/user/test/p")
  3664. self.fail()
  3665. except NotAModel:
  3666. assert "p" not in model_list("users/user/test")
  3667. # Target metamodel is folder
  3668. try:
  3669. transformation_add_MANUAL({"MODEL_A": "formalisms/SimpleClassDiagrams"}, {"MODEL_B": "users"}, "users/user/test/q")
  3670. self.fail()
  3671. except NotAModel:
  3672. assert "q" not in model_list("users/user/test")
  3673. def test_op_transformation_add_AL(self):
  3674. # Add models for transformation
  3675. model_add("users/user/test/A", "formalisms/SimpleClassDiagrams", """
  3676. SimpleAttribute String {}
  3677. Class A {
  3678. name = "A"
  3679. name : String
  3680. }
  3681. """)
  3682. model_add("users/user/test/B", "formalisms/SimpleClassDiagrams", """
  3683. SimpleAttribute String {}
  3684. Class B {
  3685. name = "B"
  3686. name : String
  3687. }
  3688. """)
  3689. model_add("users/user/test/a", "users/user/test/A", "A {}")
  3690. model_add("users/user/test/b", "users/user/test/B", "B {}")
  3691. default_function = "Boolean function main(model : Element):\n\treturn True!"
  3692. # Add a transformation with normal signature
  3693. transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/c", default_function)
  3694. # Add a transformation with normal signature and merged metamodel changes
  3695. transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/d", default_function, operation_AL_0)
  3696. transformation_add_AL({"MODEL_A": "users/user/test/A", "MODEL_B": "users/user/test/B"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/e", default_function, operation_AL_1)
  3697. try:
  3698. transformation_add_AL({"MODEL_A": "users/user/test/A", "MODEL_B": "users/user/test/B"}, {"MODEL_B": "users/user/test/A"}, "users/user/test/f", default_function)
  3699. self.fail()
  3700. except DifferingModelsForKey:
  3701. pass
  3702. # Add a transformation with empty signature
  3703. transformation_add_AL({}, {}, "users/user/test/g", default_function)
  3704. # Add a transformation with empty signature and a callback
  3705. try:
  3706. transformation_add_AL({}, {}, "users/user/test/h", default_function, null_operation)
  3707. self.fail()
  3708. except CallbackOnEmptySignature:
  3709. assert "h" not in model_list("users/user/test")
  3710. # Add transformation with unknown metamodel in signature (input)
  3711. try:
  3712. transformation_add_AL({"MODEL_A": "adbdsf"}, {"MODEL_B": "users/user/test/A"}, "users/user/test/i", default_function)
  3713. self.fail()
  3714. except UnknownModel:
  3715. assert "i" not in model_list("users/user/test")
  3716. # Add transformation with unknown metamodel in signature (output)
  3717. try:
  3718. transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "adfad"}, "users/user/test/j", default_function)
  3719. self.fail()
  3720. except UnknownModel:
  3721. assert "j" not in model_list("users/user/test")
  3722. # Add transformation with unreadable metamodel in signature (input)
  3723. try:
  3724. transformation_add_AL({"MODEL_A": "administration/core"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/k", default_function)
  3725. self.fail()
  3726. except ReadPermissionDenied:
  3727. assert "k" not in model_list("users/user/test")
  3728. # Add transformation with unreadable metamodel in signature (output)
  3729. try:
  3730. transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "administration/core"}, "users/user/test/l", default_function)
  3731. self.fail()
  3732. except ReadPermissionDenied:
  3733. assert "l" not in model_list("users/user/test")
  3734. # Try to use a non-RAMifiable metamodel in input
  3735. try:
  3736. transformation_add_AL({"MODEL_A": "users/user/test/a"}, {}, "users/user/test/m", default_function)
  3737. self.fail()
  3738. except UnknownM3:
  3739. assert "m" not in model_list("users/user/test")
  3740. # Try to use a non-RAMifiable metamodel in output
  3741. try:
  3742. transformation_add_AL({}, {"MODEL_A": "users/user/test/a"}, "users/user/test/n", default_function)
  3743. self.fail()
  3744. except UnknownM3:
  3745. assert "n" not in model_list("users/user/test")
  3746. # Compilation error
  3747. try:
  3748. transformation_add_AL({}, {}, "users/user/test/o", "adfadf")
  3749. self.fail()
  3750. except CompilationError:
  3751. assert "o" not in model_list("users/user/test")
  3752. # Source metamodel is folder
  3753. try:
  3754. transformation_add_AL({"MODEL_A": "users"}, {"MODEL_B": "formalisms/SimpleClassDiagrams"}, "users/user/test/p", default_function)
  3755. self.fail()
  3756. except NotAModel:
  3757. assert "p" not in model_list("users/user/test")
  3758. # Target metamodel is folder
  3759. try:
  3760. transformation_add_AL({"MODEL_A": "formalisms/SimpleClassDiagrams"}, {"MODEL_B": "users"}, "users/user/test/q", default_function)
  3761. self.fail()
  3762. except NotAModel:
  3763. assert "q" not in model_list("users/user/test")
  3764. def test_op_transformation_add_MT(self):
  3765. # Add models for transformation
  3766. model_add("users/user/test/A", "formalisms/SimpleClassDiagrams", """
  3767. SimpleAttribute String {}
  3768. Class A {
  3769. name = "A"
  3770. name : String
  3771. }
  3772. """)
  3773. model_add("users/user/test/B", "formalisms/SimpleClassDiagrams", """
  3774. SimpleAttribute String {}
  3775. Class B {
  3776. name = "B"
  3777. name : String
  3778. }
  3779. """)
  3780. model_add("users/user/test/a", "users/user/test/A", "A {}")
  3781. model_add("users/user/test/b", "users/user/test/B", "B {}")
  3782. default_function = "Composite c{}"
  3783. # Add a transformation with normal signature
  3784. transformation_add_MT({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/c", default_function)
  3785. # Add a transformation with normal signature and merged metamodel changes
  3786. transformation_add_MT({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/d", default_function, operation_MT_0)
  3787. transformation_add_MT({"MODEL_A": "users/user/test/A", "MODEL_B": "users/user/test/B"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/e", default_function, operation_MT_1)
  3788. try:
  3789. transformation_add_MT({"MODEL_A": "users/user/test/A", "MODEL_B": "users/user/test/B"}, {"MODEL_B": "users/user/test/A"}, "users/user/test/f", default_function)
  3790. self.fail()
  3791. except DifferingModelsForKey:
  3792. pass
  3793. # Add a transformation with empty signature
  3794. try:
  3795. transformation_add_MT({}, {}, "users/user/test/g", default_function)
  3796. self.fail()
  3797. except EmptySignature:
  3798. assert "g" not in model_list("users/user/test")
  3799. # Add a transformation with empty signature and a callback
  3800. try:
  3801. transformation_add_MT({}, {}, "users/user/test/h", default_function, null_operation)
  3802. self.fail()
  3803. except CallbackOnEmptySignature:
  3804. assert "h" not in model_list("users/user/test")
  3805. # Add transformation with unknown metamodel in signature (input)
  3806. try:
  3807. transformation_add_MT({"MODEL_A": "adbdsf"}, {"MODEL_B": "users/user/test/A"}, "users/user/test/i", default_function)
  3808. self.fail()
  3809. except UnknownModel:
  3810. assert "i" not in model_list("users/user/test")
  3811. # Add transformation with unknown metamodel in signature (output)
  3812. try:
  3813. transformation_add_MT({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "adfad"}, "users/user/test/j", default_function)
  3814. self.fail()
  3815. except UnknownModel:
  3816. assert "j" not in model_list("users/user/test")
  3817. # Add transformation with unreadable metamodel in signature (input)
  3818. try:
  3819. transformation_add_MT({"MODEL_A": "administration/core"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/k", default_function)
  3820. self.fail()
  3821. except ReadPermissionDenied:
  3822. assert "k" not in model_list("users/user/test")
  3823. # Add transformation with unreadable metamodel in signature (output)
  3824. try:
  3825. transformation_add_MT({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "administration/core"}, "users/user/test/l", default_function)
  3826. self.fail()
  3827. except ReadPermissionDenied:
  3828. assert "l" not in model_list("users/user/test")
  3829. # Try to use a non-RAMifiable metamodel in input
  3830. try:
  3831. transformation_add_MT({"MODEL_A": "users/user/test/a"}, {}, "users/user/test/m", default_function)
  3832. self.fail()
  3833. except UnknownM3:
  3834. assert "m" not in model_list("users/user/test")
  3835. # Try to use a non-RAMifiable metamodel in output
  3836. try:
  3837. transformation_add_MT({}, {"MODEL_A": "users/user/test/a"}, "users/user/test/n", default_function)
  3838. self.fail()
  3839. except UnknownM3:
  3840. assert "n" not in model_list("users/user/test")
  3841. # Compilation error
  3842. try:
  3843. transformation_add_MT({"MODEL_A": "users/user/test/A"}, {}, "users/user/test/o", "adfa")
  3844. self.fail()
  3845. except CompilationError:
  3846. assert "o" not in model_list("users/user/test")
  3847. # Source metamodel is folder
  3848. try:
  3849. transformation_add_MT({"MODEL_A": "users"}, {"MODEL_B": "formalisms/SimpleClassDiagrams"}, "users/user/test/p", default_function)
  3850. self.fail()
  3851. except NotAModel:
  3852. assert "p" not in model_list("users/user/test")
  3853. # Target metamodel is folder
  3854. try:
  3855. transformation_add_MT({"MODEL_A": "formalisms/SimpleClassDiagrams"}, {"MODEL_B": "users"}, "users/user/test/q", default_function)
  3856. self.fail()
  3857. except NotAModel:
  3858. assert "q" not in model_list("users/user/test")
  3859. def test_op_transformation_execute_MANUAL(self):
  3860. # Add models for transformation
  3861. model_add("users/user/test/A", "formalisms/SimpleClassDiagrams", """
  3862. SimpleAttribute String {}
  3863. Class A {
  3864. name = "A"
  3865. name : String
  3866. }
  3867. """)
  3868. model_add("users/user/test/B", "formalisms/SimpleClassDiagrams", """
  3869. SimpleAttribute String {}
  3870. Class B {
  3871. name = "B"
  3872. name : String
  3873. }
  3874. """)
  3875. model_add("users/user/test/a", "users/user/test/A", "A {}")
  3876. model_add("users/user/test/b", "users/user/test/B", "B {}")
  3877. # Add some activity to execute
  3878. transformation_add_MANUAL({}, {}, "users/user/test/c")
  3879. # Now execute
  3880. transformation_execute_MANUAL("users/user/test/c", {}, {}, model_is_empty_operation)
  3881. # Now do the same, but with a model
  3882. transformation_add_MANUAL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/d")
  3883. transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/aa"}, operation_exec_1)
  3884. lst = element_list_nice("users/user/test/aa")
  3885. assert len(lst) == 1
  3886. assert lst[0]["__type"] == "B"
  3887. assert lst[0]["name"] == None
  3888. assert lst[0]["__id"].startswith("__")
  3889. # Execute activity with non-existing model (input)
  3890. try:
  3891. transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "dfadf"}, {"MODEL_B": "users/user/test/f"}, null_operation)
  3892. self.fail()
  3893. except UnknownModel:
  3894. assert "f" not in model_list("users/user/test")
  3895. # Execute non-existing activity
  3896. try:
  3897. transformation_execute_MANUAL("adfadf", {}, {"MODEL_B": "users/user/test/abc"}, null_operation)
  3898. self.fail()
  3899. except UnknownModel:
  3900. assert "abc" not in model_list("users/user/test")
  3901. # Unbound source model
  3902. try:
  3903. transformation_execute_MANUAL("users/user/test/d", {}, {"MODEL_B": "users/user/test/f"}, null_operation)
  3904. self.fail()
  3905. except SourceModelNotBound:
  3906. pass
  3907. # Unknown source key
  3908. try:
  3909. transformation_execute_MANUAL("users/user/test/d", {"ABC": "users/user/test/a", "MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/f"}, null_operation)
  3910. self.fail()
  3911. except SourceModelNotBound:
  3912. pass
  3913. # Unknown target key
  3914. try:
  3915. transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"DEF": "users/user/test/b"}, null_operation)
  3916. self.fail()
  3917. except TargetModelNotBound:
  3918. pass
  3919. # Read permissions denied source
  3920. try:
  3921. transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "administration/core"}, {"MODEL_B": "users/user/test/f"}, null_operation)
  3922. self.fail()
  3923. except ReadPermissionDenied:
  3924. pass
  3925. # Execute permissions denied activity
  3926. try:
  3927. transformation_execute_MANUAL("administration/core", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/f"}, null_operation)
  3928. self.fail()
  3929. except ExecutePermissionDenied:
  3930. pass
  3931. # Write permissions denied target (folder)
  3932. try:
  3933. transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "administration/abc"}, null_operation)
  3934. self.fail()
  3935. except WritePermissionDenied:
  3936. pass
  3937. # Write permissions denied target (model)
  3938. try:
  3939. transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "administration/core"}, null_operation)
  3940. self.fail()
  3941. except WritePermissionDenied:
  3942. pass
  3943. # Execute activity with non-conforming input models
  3944. try:
  3945. transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users/user/test/f"}, null_operation)
  3946. self.fail()
  3947. except TypeMismatch:
  3948. assert "f" not in model_list("users/user/test")
  3949. # Execute activity with non-conforming output models that already exist
  3950. assert len(element_list_nice("users/user/test/aa")) > 0
  3951. try:
  3952. transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users/user/test/aa"}, null_operation)
  3953. self.fail()
  3954. except TypeMismatch:
  3955. assert len(element_list_nice("users/user/test/aa")) > 0
  3956. # Source model is folder
  3957. try:
  3958. transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "users"}, {"MODEL_B": "users/user/test/f"})
  3959. self.fail()
  3960. except NotAModel:
  3961. pass
  3962. # Target model is folder
  3963. try:
  3964. transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users"})
  3965. self.fail()
  3966. except NotAModel:
  3967. pass
  3968. # Execute activity with colliding models, which means that it is copied
  3969. transformation_add_MANUAL({"MODEL_A": "users/user/test/A"}, {"MODEL_A": "users/user/test/A"}, "users/user/test/f")
  3970. transformation_execute_MANUAL("users/user/test/f", {"MODEL_A": "users/user/test/a"}, {"MODEL_A": "users/user/test/aaa"}, null_operation)
  3971. assert len(element_list_nice("users/user/test/a")) == len(element_list_nice("users/user/test/aaa"))
  3972. def test_op_transformation_execute_AL(self):
  3973. # Add models for transformation
  3974. model_add("users/user/test/A", "formalisms/SimpleClassDiagrams", """
  3975. SimpleAttribute String {}
  3976. Class A {
  3977. name = "A"
  3978. name : String
  3979. }
  3980. """)
  3981. model_add("users/user/test/B", "formalisms/SimpleClassDiagrams", """
  3982. SimpleAttribute String {}
  3983. Class B {
  3984. name = "B"
  3985. name : String
  3986. }
  3987. """)
  3988. model_add("users/user/test/a", "users/user/test/A", "A a {}")
  3989. model_add("users/user/test/b", "users/user/test/B", "B b {}")
  3990. default_code_empty = "Boolean function main(model : Element):\n\treturn True!"
  3991. default_code_true = "include \"modelling.alh\"\nBoolean function main(model : Element):\n\tinstantiate_attribute(model, \"MODEL_A/a\", \"name\", \"CHANGED\")\n\tinstantiate_node(model, \"MODEL_B/B\", \"\")\n\treturn True!"
  3992. default_code_false = "include \"modelling.alh\"\nBoolean function main(model : Element):\n\tinstantiate_attribute(model, \"MODEL_A/a\", \"name\", \"CHANGED\")\n\tinstantiate_node(model, \"MODEL_B/B\", \"\")\n\treturn False!"
  3993. # Add some activity to execute
  3994. transformation_add_AL({}, {}, "users/user/test/c", default_code_true)
  3995. # Now execute
  3996. transformation_execute_AL("users/user/test/c", {}, {})
  3997. # Now do the same, but with a model
  3998. transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/d", default_code_true)
  3999. transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/aa"})
  4000. lst = element_list_nice("users/user/test/aa")
  4001. assert len(lst) == 1
  4002. assert lst[0]["__type"] == "B"
  4003. assert lst[0]["name"] == None
  4004. assert lst[0]["__id"].startswith("__")
  4005. # Original input model remains unchanged, as it is not an output model
  4006. lst = element_list_nice("users/user/test/a")
  4007. assert len(lst) == 1
  4008. assert lst[0]["__type"] == "A"
  4009. assert lst[0]["name"] == None
  4010. assert lst[0]["__id"] == "a"
  4011. # Execute activity with non-existing model (input)
  4012. try:
  4013. transformation_execute_AL("users/user/test/d", {"MODEL_A": "dfadf"}, {"MODEL_B": "users/user/test/f"})
  4014. self.fail()
  4015. except UnknownModel:
  4016. assert "f" not in model_list("users/user/test")
  4017. # Execute non-existing activity
  4018. try:
  4019. transformation_execute_AL("adfadf", {}, {"MODEL_B": "users/user/test/abc"})
  4020. self.fail()
  4021. except UnknownModel:
  4022. assert "abc" not in model_list("users/user/test")
  4023. # Unbound source model
  4024. try:
  4025. transformation_execute_AL("users/user/test/d", {}, {"MODEL_B": "users/user/test/f"})
  4026. self.fail()
  4027. except SourceModelNotBound:
  4028. pass
  4029. # Unknown source key
  4030. try:
  4031. transformation_execute_AL("users/user/test/d", {"ABC": "users/user/test/a", "MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/f"})
  4032. self.fail()
  4033. except SourceModelNotBound:
  4034. pass
  4035. # Unknown target key
  4036. try:
  4037. transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"DEF": "users/user/test/b"})
  4038. self.fail()
  4039. except TargetModelNotBound:
  4040. pass
  4041. # Read permissions denied source
  4042. try:
  4043. transformation_execute_AL("users/user/test/d", {"MODEL_A": "administration/core"}, {"MODEL_B": "users/user/test/f"})
  4044. self.fail()
  4045. except ReadPermissionDenied:
  4046. pass
  4047. # Execute permissions denied activity
  4048. try:
  4049. transformation_execute_AL("administration/core", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/f"})
  4050. self.fail()
  4051. except ExecutePermissionDenied:
  4052. pass
  4053. # Write permissions denied target (folder)
  4054. try:
  4055. transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "administration/abc"})
  4056. self.fail()
  4057. except WritePermissionDenied:
  4058. pass
  4059. # Write permissions denied target (model)
  4060. try:
  4061. transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "administration/core"})
  4062. self.fail()
  4063. except WritePermissionDenied:
  4064. pass
  4065. # Execute activity with non-conforming input models
  4066. try:
  4067. transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users/user/test/f"})
  4068. self.fail()
  4069. except TypeMismatch:
  4070. assert "f" not in model_list("users/user/test")
  4071. # Execute activity with non-conforming output models that already exist
  4072. try:
  4073. transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users/user/test/c"})
  4074. self.fail()
  4075. except TypeMismatch:
  4076. assert len(element_list("users/user/test/c")) > 0
  4077. # Source model is folder
  4078. try:
  4079. transformation_execute_AL("users/user/test/d", {"MODEL_A": "users"}, {"MODEL_B": "users/user/test/f"})
  4080. self.fail()
  4081. except NotAModel:
  4082. pass
  4083. # Target model is folder
  4084. try:
  4085. transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users"})
  4086. self.fail()
  4087. except NotAModel:
  4088. pass
  4089. # Execute activity with colliding models, which means that it is copied
  4090. transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_A": "users/user/test/A"}, "users/user/test/f", default_code_empty)
  4091. transformation_execute_AL("users/user/test/f", {"MODEL_A": "users/user/test/a"}, {"MODEL_A": "users/user/test/aaa"})
  4092. assert len(element_list_nice("users/user/test/a")) == len(element_list_nice("users/user/test/aaa"))
  4093. # Make sure that models are not written when returning False
  4094. transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/h", default_code_false)
  4095. transformation_execute_AL("users/user/test/h", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/bb"})
  4096. assert "bb" not in model_list("users/user/test")
  4097. # Try out SC communication: requires back and forth computation
  4098. code_SC = """
  4099. include "io.alh"
  4100. include "primitives.alh"
  4101. Boolean function main(model : Element):
  4102. output("init")
  4103. log("Init OK")
  4104. output(cast_integer(input()) + cast_integer(input()))
  4105. log("Sent out value")
  4106. return True!
  4107. """
  4108. import exec_AL
  4109. ctrl = exec_AL.Controller(keep_running=False)
  4110. thrd = threading.Thread(target=ctrl.start)
  4111. thrd.daemon = True
  4112. transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/i", code_SC)
  4113. thrd.start()
  4114. transformation_execute_AL("users/user/test/i", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/bb"}, statechart=(ctrl, "inp", "outp"))
  4115. thrd.join()
  4116. def test_op_transformation_execute_MT(self):
  4117. # Add models for transformation
  4118. model_add("users/user/test/A", "formalisms/SimpleClassDiagrams", """
  4119. SimpleAttribute String {}
  4120. Class A {
  4121. name = "A"
  4122. name : String
  4123. }
  4124. """)
  4125. model_add("users/user/test/B", "formalisms/SimpleClassDiagrams", """
  4126. SimpleAttribute String {}
  4127. Class B {
  4128. name = "B"
  4129. name : String
  4130. }
  4131. """)
  4132. model_add("users/user/test/a", "users/user/test/A", "A a {}")
  4133. model_add("users/user/test/b", "users/user/test/B", "B b {}")
  4134. default_code_empty = """
  4135. Composite a {
  4136. {Contains} Success success {}
  4137. }
  4138. Initial (a, success) {}
  4139. """
  4140. default_code_true = """
  4141. Composite a {
  4142. {Contains} Success success {}
  4143. {Contains} Atomic b {
  4144. LHS {
  4145. Pre_MODEL_A/A {
  4146. label = "0"
  4147. }
  4148. }
  4149. RHS {
  4150. Post_MODEL_A/A {
  4151. label = "0"
  4152. value_name = $
  4153. String function value(model : Element, name : String, mapping : Element):
  4154. return "CHANGED"!
  4155. $
  4156. }
  4157. Post_MODEL_B/B {
  4158. label = "1"
  4159. }
  4160. }
  4161. }
  4162. }
  4163. Initial (a, b) {}
  4164. OnSuccess (b, success) {}
  4165. OnFailure (b, success) {}
  4166. """
  4167. default_code_false = """
  4168. Composite a {
  4169. {Contains} Failure failure {}
  4170. {Contains} Atomic b {
  4171. LHS {
  4172. Pre_MODEL_A/A {
  4173. label = "0"
  4174. }
  4175. }
  4176. RHS {
  4177. Post_MODEL_A/A {
  4178. label = "0"
  4179. value_name = $
  4180. String function value(model : Element, name : String, mapping : Element):
  4181. return "CHANGED"!
  4182. $
  4183. }
  4184. Post_MODEL_B/B {
  4185. label = "1"
  4186. }
  4187. }
  4188. }
  4189. }
  4190. Initial (a, b) {}
  4191. OnSuccess (b, failure) {}
  4192. OnFailure (b, failure) {}
  4193. """
  4194. # Add some activity to execute
  4195. try:
  4196. transformation_add_MT({}, {}, "users/user/test/c", default_code_true)
  4197. self.fail()
  4198. except EmptySignature:
  4199. assert "c" not in model_list("users/user/test")
  4200. # Now do the same, but with a model
  4201. transformation_add_MT({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/d", default_code_true)
  4202. transformation_execute_MT("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/aa"})
  4203. lst = element_list_nice("users/user/test/aa")
  4204. assert len(lst) == 1
  4205. assert lst[0]["__type"] == "B"
  4206. assert lst[0]["name"] == None
  4207. assert lst[0]["__id"].startswith("__")
  4208. # Original input model remains unchanged, as it is not an output model
  4209. lst = element_list_nice("users/user/test/a")
  4210. assert len(lst) == 1
  4211. assert lst[0]["__type"] == "A"
  4212. assert lst[0]["name"] == None
  4213. assert lst[0]["__id"] == "a"
  4214. # Execute activity with non-existing model (input)
  4215. try:
  4216. transformation_execute_MT("users/user/test/d", {"MODEL_A": "dfadf"}, {"MODEL_B": "users/user/test/f"})
  4217. self.fail()
  4218. except UnknownModel:
  4219. assert "f" not in model_list("users/user/test")
  4220. # Execute non-existing activity
  4221. try:
  4222. transformation_execute_MT("adfadf", {}, {"MODEL_B": "users/user/test/abc"})
  4223. self.fail()
  4224. except UnknownModel:
  4225. assert "abc" not in model_list("users/user/test")
  4226. # Unbound source model
  4227. try:
  4228. transformation_execute_MT("users/user/test/d", {}, {"MODEL_B": "users/user/test/f"})
  4229. self.fail()
  4230. except SourceModelNotBound:
  4231. pass
  4232. # Unknown source key
  4233. try:
  4234. transformation_execute_MT("users/user/test/d", {"ABC": "users/user/test/a", "MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/f"})
  4235. self.fail()
  4236. except SourceModelNotBound:
  4237. pass
  4238. # Unknown target key
  4239. try:
  4240. transformation_execute_MT("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"DEF": "users/user/test/b"})
  4241. self.fail()
  4242. except TargetModelNotBound:
  4243. pass
  4244. # Read permissions denied source
  4245. try:
  4246. transformation_execute_MT("users/user/test/d", {"MODEL_A": "administration/core"}, {"MODEL_B": "users/user/test/f"})
  4247. self.fail()
  4248. except ReadPermissionDenied:
  4249. pass
  4250. # Execute permissions denied activity
  4251. try:
  4252. transformation_execute_MT("administration/core", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/f"})
  4253. self.fail()
  4254. except ExecutePermissionDenied:
  4255. pass
  4256. # Write permissions denied target (folder)
  4257. try:
  4258. transformation_execute_MT("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "administration/abc"})
  4259. self.fail()
  4260. except WritePermissionDenied:
  4261. pass
  4262. # Write permissions denied target (model)
  4263. try:
  4264. transformation_execute_MT("users/user/test/d", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "administration/core"})
  4265. self.fail()
  4266. except WritePermissionDenied:
  4267. pass
  4268. # Execute activity with non-conforming input models
  4269. try:
  4270. transformation_execute_MT("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users/user/test/f"})
  4271. self.fail()
  4272. except TypeMismatch:
  4273. assert "f" not in model_list("users/user/test")
  4274. # Execute activity with non-conforming output models that already exist
  4275. try:
  4276. transformation_execute_MT("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users/user/test/d"})
  4277. self.fail()
  4278. except TypeMismatch:
  4279. assert len(element_list_nice("users/user/test/d")) > 0
  4280. # Source model is folder
  4281. try:
  4282. transformation_execute_MT("users/user/test/d", {"MODEL_A": "users"}, {"MODEL_B": "users/user/test/f"})
  4283. self.fail()
  4284. except NotAModel:
  4285. pass
  4286. # Target model is folder
  4287. try:
  4288. transformation_execute_MT("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users"})
  4289. self.fail()
  4290. except NotAModel:
  4291. pass
  4292. # Execute activity with colliding models, which means that it is copied
  4293. transformation_add_MT({"MODEL_A": "users/user/test/A"}, {"MODEL_A": "users/user/test/A"}, "users/user/test/f", default_code_empty)
  4294. transformation_execute_MT("users/user/test/f", {"MODEL_A": "users/user/test/a"}, {"MODEL_A": "users/user/test/aaa"})
  4295. assert len(element_list_nice("users/user/test/a")) == len(element_list_nice("users/user/test/aaa"))
  4296. # Make sure that models are not written when returning False
  4297. transformation_add_MT({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/h", default_code_false)
  4298. transformation_execute_MT("users/user/test/h", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/bb"})
  4299. assert "bb" not in model_list("users/user/test")
  4300. # Try out SC communication: requires back and forth computation
  4301. code_SC = """
  4302. include "primitives.alh"
  4303. include "io.alh"
  4304. Composite a {
  4305. {Contains} Success success {}
  4306. {Contains} Atomic b {
  4307. LHS {}
  4308. RHS {
  4309. action = $
  4310. Void function act(model : Element, mapping : Element):
  4311. output("init")
  4312. log("Init OK")
  4313. output(cast_integer(input()) + cast_integer(input()))
  4314. log("Sent out value")
  4315. return!
  4316. $
  4317. }
  4318. }
  4319. }
  4320. Initial (a, b) {}
  4321. OnSuccess (b, success) {}
  4322. OnFailure (b, success) {}
  4323. """
  4324. import exec_MT
  4325. ctrl = exec_MT.Controller(keep_running=False)
  4326. thrd = threading.Thread(target=ctrl.start)
  4327. thrd.daemon = True
  4328. transformation_add_MT({"MODEL_A": "users/user/test/A"}, {"MODEL_B": "users/user/test/B"}, "users/user/test/i", code_SC)
  4329. thrd.start()
  4330. transformation_execute_MT("users/user/test/i", {"MODEL_A": "users/user/test/a"}, {"MODEL_B": "users/user/test/bb"}, statechart=(ctrl, "inp", "outp"))
  4331. thrd.join()
  4332. def test_op_transformation_signature(self):
  4333. # Add some transformations, content of them doesn't matter, only the signature
  4334. model_add("users/user/test/A", "formalisms/SimpleClassDiagrams")
  4335. model_add("users/user/test/B", "formalisms/SimpleClassDiagrams")
  4336. model_add("users/user/test/C", "formalisms/SimpleClassDiagrams")
  4337. import uuid
  4338. def do_test_signature(inputs, outputs):
  4339. counter = str(uuid.uuid4())
  4340. # Test manual
  4341. transformation_add_MANUAL(inputs, outputs, "users/user/test/manual/" + counter)
  4342. assert transformation_signature("users/user/test/manual/" + counter) == (inputs, outputs)
  4343. # Test AL
  4344. transformation_add_AL(inputs, outputs, "users/user/test/al/" + counter, "Boolean function main(model : Element):\n\treturn True!")
  4345. assert transformation_signature("users/user/test/al/" + counter) == (inputs, outputs)
  4346. # Test MT
  4347. if len(inputs) + len(outputs) > 1:
  4348. transformation_add_MT(inputs, outputs, "users/user/test/mt/" + counter, "")
  4349. assert transformation_signature("users/user/test/mt/" + counter) == (inputs, outputs)
  4350. # Test normal operation for all three types of transformation
  4351. do_test_signature({}, {})
  4352. do_test_signature({"A": "users/user/test/A"}, {"B": "users/user/test/B"})
  4353. do_test_signature({}, {"B": "users/user/test/B"})
  4354. do_test_signature({"A": "users/user/test/A"}, {})
  4355. do_test_signature({"A": "users/user/test/A", "B": "users/user/test/B"}, {"A": "users/user/test/A", "B": "users/user/test/B"})
  4356. # Test non-existing model (type of transformation doesn't matter, as never created)
  4357. try:
  4358. transformation_signature("adfadf")
  4359. self.fail()
  4360. except UnknownModel:
  4361. pass
  4362. # Test non-executable model
  4363. try:
  4364. transformation_signature("administration/core")
  4365. self.fail()
  4366. except ExecutePermissionDenied:
  4367. pass
  4368. # Test model that is not an activity
  4369. try:
  4370. transformation_signature("users/user/test/A")
  4371. self.fail()
  4372. except NotAnActivity:
  4373. pass
  4374. # Try folder
  4375. try:
  4376. transformation_signature("users")
  4377. self.fail()
  4378. except NotAnActivity:
  4379. pass
  4380. def test_op_process_signature(self):
  4381. # Add simple process
  4382. model_add("users/user/test/a", "formalisms/ProcessModel", """
  4383. Data a {
  4384. name = "abc"
  4385. type = "def"
  4386. }
  4387. """)
  4388. # Query its signature
  4389. assert process_signature("users/user/test/a") == {"abc": "def"}
  4390. # Add process with some operations
  4391. model_add("users/user/test/b", "formalisms/ProcessModel", """
  4392. Start start {}
  4393. Finish finish {}
  4394. Exec initializePN {
  4395. name = "users/user/test/initialize_PN"
  4396. }
  4397. Exec refinePN {
  4398. name = "users/user/test/refine_PN"
  4399. }
  4400. Exec reachability {
  4401. name = "users/user/test/reachability"
  4402. }
  4403. Exec reachability_print{
  4404. name = "users/user/test/reachability_print"
  4405. }
  4406. Data pn {
  4407. name = "pn"
  4408. type = "users/user/test/PetriNet"
  4409. }
  4410. Data reachability_graph {
  4411. name = "reachability"
  4412. type = "users/user/test/ReachabilityGraph"
  4413. }
  4414. Next (start, initializePN) {}
  4415. Next (initializePN, refinePN) {}
  4416. Next (refinePN, reachability) {}
  4417. Next (reachability, reachability_print) {}
  4418. Next (reachability_print, finish) {}
  4419. Produces (initializePN, pn) {
  4420. name = "PetriNet"
  4421. }
  4422. Consumes (refinePN, pn) {
  4423. name = "PetriNet"
  4424. }
  4425. Produces (refinePN, pn) {
  4426. name = "PetriNet"
  4427. }
  4428. Consumes (reachability, pn) {
  4429. name = "PetriNet"
  4430. }
  4431. Produces (reachability, reachability_graph) {
  4432. name = "ReachabilityGraph"
  4433. }
  4434. Consumes (reachability_print, reachability_graph) {
  4435. name = "ReachabilityGraph"
  4436. }
  4437. """)
  4438. # Query its signature
  4439. assert process_signature("users/user/test/b") == {"pn": "users/user/test/PetriNet", "reachability": "users/user/test/ReachabilityGraph"}
  4440. # Empty model
  4441. model_add("users/user/test/c", "formalisms/ProcessModel")
  4442. assert process_signature("users/user/test/c") == {}
  4443. # Multiple with same name (and same type)
  4444. model_add("users/user/test/d", "formalisms/ProcessModel", """
  4445. Data {
  4446. name = "a"
  4447. type = "b"
  4448. }
  4449. Data {
  4450. name = "a"
  4451. type = "b"
  4452. }
  4453. """)
  4454. try:
  4455. process_signature("users/user/test/d")
  4456. self.fail()
  4457. except NotAValidProcess:
  4458. pass
  4459. # Multiple with same name (and different type)
  4460. model_add("users/user/test/e", "formalisms/ProcessModel", """
  4461. Data {
  4462. name = "a"
  4463. type = "b"
  4464. }
  4465. Data {
  4466. name = "a"
  4467. type = "c"
  4468. }
  4469. """)
  4470. try:
  4471. process_signature("users/user/test/e")
  4472. self.fail()
  4473. except NotAValidProcess:
  4474. pass
  4475. # Try with something that is not even a process model
  4476. model_add("users/user/test/f", "formalisms/SimpleClassDiagrams", """
  4477. Class a {
  4478. name = "a"
  4479. }
  4480. """)
  4481. try:
  4482. process_signature("users/user/test/f")
  4483. self.fail()
  4484. except NotAProcess:
  4485. pass
  4486. # Try non-existing model
  4487. try:
  4488. process_signature("users/user/test/g")
  4489. self.fail()
  4490. except UnknownModel:
  4491. pass
  4492. # Try folder
  4493. try:
  4494. process_signature("users")
  4495. self.fail()
  4496. except NotAModel:
  4497. pass
  4498. # Try unreadable model
  4499. try:
  4500. process_signature("administration/core")
  4501. self.fail()
  4502. except ExecutePermissionDenied:
  4503. pass
  4504. def test_op_process_execute(self):
  4505. # This is only a minimal test, as actual execution will take a long time.
  4506. # For example, the integration tests rely solely on the process_execute operation, thereby being a good test for this.
  4507. # We now just test the execution in corner cases
  4508. # Test with non-existing model
  4509. try:
  4510. process_execute("abc", {})
  4511. self.fail()
  4512. except UnknownModel:
  4513. pass
  4514. # Test with folder model
  4515. try:
  4516. process_execute("formalisms", {})
  4517. self.fail()
  4518. except NotAModel:
  4519. pass
  4520. # Test with unreadable model
  4521. try:
  4522. process_execute("administration/core", {})
  4523. self.fail()
  4524. except ExecutePermissionDenied:
  4525. pass
  4526. # Test with non-process model
  4527. try:
  4528. process_execute("formalisms/SimpleClassDiagrams", {})
  4529. self.fail()
  4530. except NotAProcess:
  4531. pass
  4532. # Test non-existing key in binding
  4533. model_add("users/user/test/a", "formalisms/ProcessModel", """
  4534. Data a {
  4535. name = "abc"
  4536. type = "def"
  4537. }
  4538. Exec b {
  4539. name = "b"
  4540. }
  4541. Consumes (b, a) {
  4542. name = "a"
  4543. }
  4544. Start {}
  4545. Finish {}
  4546. """)
  4547. try:
  4548. process_execute("users/user/test/a", {"def": "users/user/test/b"})
  4549. self.fail()
  4550. except SignatureMismatch:
  4551. pass
  4552. # Test non-readable model in binding
  4553. model_add("users/user/test/b", "formalisms/ProcessModel", """
  4554. Data a {
  4555. name = "abc"
  4556. type = "def"
  4557. }
  4558. Exec b {
  4559. name = "b"
  4560. }
  4561. Consumes (b, a) {
  4562. name = "a"
  4563. }
  4564. Start {}
  4565. Finish {}
  4566. """)
  4567. try:
  4568. process_execute("users/user/test/b", {"abc": "administration/core"})
  4569. self.fail()
  4570. except ReadPermissionDenied:
  4571. pass
  4572. # Test non-writeable model in binding
  4573. model_add("users/user/test/c", "formalisms/ProcessModel", """
  4574. Data a {
  4575. name = "abc"
  4576. type = "def"
  4577. }
  4578. Exec b {
  4579. name = "b"
  4580. }
  4581. Produces (b, a) {
  4582. name = "a"
  4583. }
  4584. Start {}
  4585. Finish {}
  4586. """)
  4587. try:
  4588. process_execute("users/user/test/c", {"abc": "formalisms/SimpleClassDiagrams"})
  4589. self.fail()
  4590. except WritePermissionDenied:
  4591. pass
  4592. # Test combination of both produce and consume
  4593. model_add("users/user/test/d", "formalisms/ProcessModel", """
  4594. Data a {
  4595. name = "abc"
  4596. type = "def"
  4597. }
  4598. Exec b {
  4599. name = "b"
  4600. }
  4601. Produces (b, a) {
  4602. name = "a"
  4603. }
  4604. Consumes (b, a) {
  4605. name = "a"
  4606. }
  4607. Start {}
  4608. Finish {}
  4609. """)
  4610. try:
  4611. process_execute("users/user/test/d", {"abc": "formalisms/SimpleClassDiagrams"})
  4612. self.fail()
  4613. except WritePermissionDenied:
  4614. pass
  4615. # Test unused data
  4616. model_add("users/user/test/e", "formalisms/ProcessModel", """
  4617. Data a {
  4618. name = "abc"
  4619. type = "def"
  4620. }
  4621. Start b {}
  4622. Finish c {}
  4623. Next (b, c) {}
  4624. """)
  4625. process_execute("users/user/test/e", {"abc": "administration/core"})
  4626. # Test folder model in binding
  4627. try:
  4628. process_execute("users/user/test/a", {"abc": "formalisms"})
  4629. self.fail()
  4630. except NotAModel:
  4631. pass
  4632. def test_modelling(self):
  4633. # Add a model
  4634. model_add("users/user/test/Empty", "formalisms/SimpleClassDiagrams")
  4635. # Check that it exists
  4636. compare_locations("users/user/test", set(["Empty"]))
  4637. # Check that it conforms
  4638. assert verify("users/user/test/Empty", "formalisms/SimpleClassDiagrams") == "OK"
  4639. # Check for permissions
  4640. assert model_list_full("users/user/test") == set([(name, "user", "nobody", "221") for name in get_model_list("users/user/test")]) | \
  4641. set([("Empty", "user", "nobody", "200")])
  4642. # Instantiate it further
  4643. model_add("users/user/test/my_empty", "users/user/test/Empty")
  4644. assert verify("users/user/test/my_empty", "users/user/test/Empty") == "OK"
  4645. # Check that it exists
  4646. compare_locations("users/user/test", set(["my_empty", "Empty"]))
  4647. # Check that an instantiate of "A" fails
  4648. try:
  4649. res = instantiate("users/user/test/my_empty", "A")
  4650. assert False
  4651. except UnknownIdentifier:
  4652. assert verify("users/user/test/Empty", "formalisms/SimpleClassDiagrams") == "OK"
  4653. # Create something in the formalism
  4654. instantiate("users/user/test/Empty", "Class", ID="A")
  4655. attr_assign("users/user/test/Empty", "A", "name", "A")
  4656. assert verify("users/user/test/Empty", "formalisms/SimpleClassDiagrams") == "OK"
  4657. # Now instantiate that in the model as well, which now works
  4658. instantiate("users/user/test/my_empty", "A")
  4659. assert verify("users/user/test/my_empty", "users/user/test/Empty") == "OK"
  4660. def test_overwrite(self):
  4661. model_add("users/user/test/Empty", "formalisms/SimpleClassDiagrams")
  4662. assert element_list("users/user/test/Empty") == set([])
  4663. instantiate("users/user/test/Empty", "Class", ID="A")
  4664. assert element_list("users/user/test/Empty") == set([("A", "Class")])
  4665. model_overwrite("users/user/test/Empty", "")
  4666. assert element_list("users/user/test/Empty") == set([])
  4667. compare_locations("users/user/test", set(["Empty"]))
  4668. assert element_list("users/user/test/Empty") == set([])
  4669. instantiate("users/user/test/Empty", "Class", ID="B")
  4670. compare_locations("users/user/test", set(["Empty"]))
  4671. def test_operations(self):
  4672. log = []
  4673. model_add("users/user/test/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_design.mvc", "r").read())
  4674. model_add("users/user/test/PetriNet_Runtime", "formalisms/SimpleClassDiagrams", open("integration/code/pn_runtime.mvc", "r").read())
  4675. model_add("users/user/test/my_pn", "users/user/test/PetriNet", open("integration/code/pn_design_model.mvc", "r").read())
  4676. transformation_add_MT({"PetriNet": "users/user/test/PetriNet"}, {}, "users/user/test/print_pn", open("integration/code/pn_print.mvc").read())
  4677. transformation_add_MANUAL({"PetriNet": "users/user/test/PetriNet"}, {"PetriNet_Runtime": "users/user/test/PetriNet_Runtime"}, "users/user/test/pn_design_to_runtime", ops_add_tracability_D2R)
  4678. transformation_add_AL({"PetriNet_Runtime": "users/user/test/PetriNet_Runtime"}, {"PetriNet_Runtime": "users/user/test/PetriNet_Runtime"}, "users/user/test/pn_simulate", open("integration/code/pn_simulate.alc").read())
  4679. transformation_add_MT({"PetriNet_Runtime": "users/user/test/PetriNet_Runtime"}, {"PetriNet": "users/user/test/PetriNet"}, "users/user/test/pn_runtime_to_design", open("integration/code/pn_runtime_to_design.mvc").read(), ops_add_tracability_R2D)
  4680. log = []
  4681. ctrl = log_output.Controller(log, keep_running=False)
  4682. thrd = threading.Thread(target=ctrl.start)
  4683. thrd.daemon = True
  4684. thrd.start()
  4685. assert transformation_execute_MT("users/user/test/print_pn", {"PetriNet": "users/user/test/my_pn"}, {}, (ctrl, "inp", "outp")) == True
  4686. thrd.join()
  4687. assert set(log) == set(['"p1" --> 1',
  4688. '"p2" --> 2',
  4689. '"p3" --> 3'])
  4690. assert transformation_execute_MANUAL("users/user/test/pn_design_to_runtime", {"PetriNet": "users/user/test/my_pn"}, {"PetriNet_Runtime": "users/user/test/my_pn_RT"}, ops_manual_callback) == True
  4691. assert transformation_execute_AL("users/user/test/pn_simulate", {"PetriNet_Runtime": "users/user/test/my_pn_RT"}, {"PetriNet_Runtime": "users/user/test/my_pn_RT"}) == True
  4692. assert transformation_execute_MT("users/user/test/pn_runtime_to_design", {"PetriNet_Runtime": "users/user/test/my_pn_RT"}, {"PetriNet": "users/user/test/my_pn"}) == True
  4693. log = []
  4694. ctrl = log_output.Controller(log, keep_running=False)
  4695. thrd = threading.Thread(target=ctrl.start)
  4696. thrd.daemon = True
  4697. thrd.start()
  4698. assert transformation_execute_MT("users/user/test/print_pn", {"PetriNet": "users/user/test/my_pn"}, {}, (ctrl, "inp", "outp")) == True
  4699. thrd.join()
  4700. assert set(log) == set(['"p1" --> 0',
  4701. '"p2" --> 1',
  4702. '"p3" --> 5'])
  4703. def test_process_model_trivial_pn_subfunction(self):
  4704. model_add("users/user/test/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_design.mvc", "r").read())
  4705. model_add("users/user/test/ReachabilityGraph", "formalisms/SimpleClassDiagrams", open("integration/code/reachability_graph.mvc", "r").read())
  4706. model_add("users/user/test/pn_reachability", "formalisms/ProcessModel", open("integration/code/pm_pn_reachability.mvc", "r").read())
  4707. transformation_add_MT({}, {"PetriNet": "users/user/test/PetriNet"}, "users/user/test/initialize_PN", open("integration/code/initialize_PN.mvc", "r").read())
  4708. transformation_add_MANUAL({"PetriNet": "users/user/test/PetriNet"}, {"PetriNet": "users/user/test/PetriNet"}, "users/user/test/refine_PN")
  4709. transformation_add_AL({"PetriNet": "users/user/test/PetriNet"}, {"ReachabilityGraph": "users/user/test/ReachabilityGraph"}, "users/user/test/reachability", open("integration/code/reachability_subfunction.alc", "r").read())
  4710. transformation_add_MT({"ReachabilityGraph": "users/user/test/ReachabilityGraph"}, {}, "users/user/test/reachability_print", open("integration/code/reachabilitygraph_print.mvc", 'r').read())
  4711. log = []
  4712. ctrl = log_output.Controller(log, keep_running=False)
  4713. thrd = threading.Thread(target=ctrl.start)
  4714. thrd.daemon = True
  4715. thrd.start()
  4716. process_execute("users/user/test/pn_reachability", {}, {"users/user/test/refine_PN": pn_subfunc_callback_refine_PN, "users/user/test/reachability_print": (ctrl, "inp", "outp")})
  4717. thrd.join()
  4718. assert set(log) == set(['"0": {"p1": 1}',
  4719. '"1": {"p1": 0}',
  4720. '"0" --["t1"]--> "1"'])
  4721. def test_render(self):
  4722. model_add("users/user/test/CausalBlockDiagrams", "formalisms/SimpleClassDiagrams", open("integration/code/cbd_design.mvc", 'r').read())
  4723. model_add("users/user/test/MM_rendered_graphical", "formalisms/SimpleClassDiagrams", open("integration/code/MM_rendered_graphical.mvc", 'r').read())
  4724. model_add("users/user/test/my_CBD", "users/user/test/CausalBlockDiagrams", open("integration/code/my_cbd.mvc", 'r').read())
  4725. transformation_add_MT({"abstract": "users/user/test/CausalBlockDiagrams", "rendered": "users/user/test/MM_rendered_graphical"}, {"abstract": "users/user/test/CausalBlockDiagrams", "rendered": "users/user/test/MM_rendered_graphical"}, "users/user/test/render_graphical_CBD", open("integration/code/CBD_mapper.mvc", 'r').read(), render_add_tracability)
  4726. result = model_render("users/user/test/my_CBD", "users/user/test/render_graphical_CBD", "users/user/test/my_perceptualized_CBD")
  4727. assert len(result) == 23
  4728. def test_SCCD_basic(self):
  4729. model_add("users/user/test/SCCD", "formalisms/SimpleClassDiagrams", open("integration/code/SCCD.mvc", 'r').read())
  4730. model_add("users/user/test/SCCD_Trace", "formalisms/SimpleClassDiagrams", open("integration/code/SCCD_Trace.mvc", 'r').read())
  4731. model_add("users/user/test/my_SCCD", "users/user/test/SCCD", open("integration/code/SCCD_all.mvc", 'r').read())
  4732. transformation_add_AL({"SCCD": "users/user/test/SCCD"}, {"trace": "users/user/test/SCCD_Trace"}, "users/user/test/SCCD_execute_afap", open("integration/code/SCCD_execute.alc", 'r').read().replace("afap = False", "afap = True"))
  4733. transformation_execute_AL("users/user/test/SCCD_execute_afap", {"SCCD": "users/user/test/my_SCCD"}, {"trace": "users/user/test/my_SCCD_trace"})
  4734. alter_context("users/user/test/my_SCCD_trace", "users/user/test/SCCD_Trace")
  4735. lst = element_list_nice("users/user/test/my_SCCD_trace")
  4736. lst.sort(key=lambda i: (i["timestamp"], i["name"]))
  4737. result = [(i["timestamp"], str(i["name"])) for i in lst if i["name"] not in ["updateTimerValue", "updateTimerColour", "resetTimer"]]
  4738. assert result == [(5.0, "displayRed"),
  4739. (20.0, "displayYellow"),
  4740. (20.5, "displayNone"),
  4741. (21.0, "displayYellow"),
  4742. (21.5, "displayNone"),
  4743. (22.0, "displayYellow"),
  4744. (22.5, "displayNone"),
  4745. (23.0, "displayYellow"),
  4746. (23.5, "displayNone"),
  4747. (24.0, "displayYellow"),
  4748. (24.5, "displayNone"),
  4749. (25.0, "displayYellow"),
  4750. (25.5, "displayNone"),
  4751. (26.0, "displayYellow"),
  4752. (26.5, "displayNone"),
  4753. (27.0, "displayYellow"),
  4754. (27.5, "displayNone"),
  4755. (28.0, "displayYellow"),
  4756. (28.5, "displayNone"),
  4757. (29.0, "displayYellow"),
  4758. (29.4, "displayNone"),
  4759. (29.4, "displayRed"),
  4760. (89.4, "displayGreen"),
  4761. (129.4, "displayNone"),
  4762. (129.4, "displayRed"),
  4763. (139.4, "displayYellow"),
  4764. (139.9, "displayNone"),
  4765. (140.4, "displayYellow"),
  4766. (140.9, "displayNone"),
  4767. (141.4, "displayYellow"),
  4768. (141.9, "displayNone"),
  4769. (142.4, "displayYellow"),
  4770. (142.9, "displayNone"),
  4771. (143.4, "displayYellow"),
  4772. (143.9, "displayNone"),
  4773. (144.4, "displayYellow"),
  4774. (144.9, "displayNone"),
  4775. (145.4, "displayYellow"),
  4776. (145.9, "displayNone"),
  4777. (146.4, "displayYellow"),
  4778. (146.9, "displayNone"),
  4779. (147.4, "displayYellow"),
  4780. (147.9, "displayNone"),
  4781. (148.4, "displayYellow"),
  4782. ]
  4783. def test_userhome_expand(self):
  4784. assert "my_model" not in model_list("~/test")
  4785. model_add("~/test/my_model", "formalisms/SimpleClassDiagrams")
  4786. assert "my_model" in model_list("~/test")
  4787. assert model_list("~/test") == model_list("users/user/test")
  4788. def test_switch_MM(self):
  4789. model_add("users/user/test/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_design.mvc", "r").read())
  4790. model_add("users/user/test/my_pn", "users/user/test/PetriNet", open("integration/code/pn_design_model.mvc", "r").read())
  4791. got = element_list_nice("users/user/test/PetriNet")
  4792. expected = \
  4793. [{'__id': 'Natural', '__type': 'SimpleAttribute', 'constraint': {'AL': ''}, 'name': 'Natural'},
  4794. {'__id': 'String', '__type': 'SimpleAttribute', 'constraint': {'AL': ''}, 'name': 'String'},
  4795. {'__id': 'Place', '__type': 'Class', 'lower_cardinality': None, 'upper_cardinality': None, 'constraint': {'AL': ''}, 'name': 'Place', 'abstract': None},
  4796. {'__id': 'Place_tokens', '__type': 'AttributeLink', '__source': 'Place', '__target': 'Natural', 'name': 'tokens', 'optional': False, 'constraint': {'AL': ''}},
  4797. {'__id': 'Place_name', '__type': 'AttributeLink', '__source': 'Place', '__target': 'String', 'name': 'name', 'optional': False, 'constraint': {'AL': ''}},
  4798. {'__id': 'Transition', '__type': 'Class', 'lower_cardinality': None, 'upper_cardinality': None, 'constraint': {'AL': ''}, 'name': 'Transition', 'abstract': None},
  4799. {'__id': 'Transition_name', '__type': 'AttributeLink', '__source': 'Transition', '__target': 'String', 'name': 'name', 'optional': False, 'constraint': {'AL': ''}},
  4800. {'__id': 'P2T', '__type': 'Association', '__source': 'Place', '__target': 'Transition', 'source_lower_cardinality': None, 'target_lower_cardinality': None, 'source_upper_cardinality': None, 'target_upper_cardinality': None, 'constraint': {'AL': ''}, 'name': 'P2T', "abstract": None, "lower_cardinality": None, "upper_cardinality": None},
  4801. {'__id': 'P2T_weight', '__type': 'AttributeLink', '__source': 'P2T', '__target': 'Natural', 'name': 'weight', 'optional': False, 'constraint': {'AL': ''}},
  4802. {'__id': 'T2P', '__type': 'Association', '__source': 'Transition', '__target': 'Place', 'source_lower_cardinality': None, 'target_lower_cardinality': None, 'source_upper_cardinality': None, 'target_upper_cardinality': None, 'constraint': {'AL': ''}, 'name': 'T2P', "abstract": None, "lower_cardinality": None, "upper_cardinality": None},
  4803. {'__id': 'T2P_weight', '__type': 'AttributeLink', '__source': 'T2P', '__target': 'Natural', 'name': 'weight', 'optional': False, 'constraint': {'AL': ''}},
  4804. ]
  4805. compare_unordered_lists(got, expected)
  4806. got = element_list_nice("users/user/test/my_pn")
  4807. expected = \
  4808. [{'__id': 'p1', '__type': 'Place', 'tokens': 1, 'name': 'p1'},
  4809. {'__id': 'p2', '__type': 'Place', 'tokens': 2, 'name': 'p2'},
  4810. {'__id': 'p3', '__type': 'Place', 'tokens': 3, 'name': 'p3'},
  4811. {'__id': 't1', '__type': 'Transition', 'name': 't1'},
  4812. {'__id': '__0', '__type': 'P2T', '__source': 'p1', '__target': 't1', 'weight': 1},
  4813. {'__id': '__1', '__type': 'P2T', '__source': 'p2', '__target': 't1', 'weight': 1},
  4814. {'__id': '__2', '__type': 'T2P', '__source': 't1', '__target': 'p3', 'weight': 2}
  4815. ]
  4816. compare_unordered_lists(got, expected)
  4817. alter_context("users/user/test/PetriNet", "formalisms/Bottom")
  4818. alter_context("users/user/test/my_pn", "formalisms/Bottom")
  4819. count_nodes = 0
  4820. count_edges = 0
  4821. for entry in element_list_nice("users/user/test/PetriNet"):
  4822. print(entry)
  4823. assert entry["__type"] in ["Node", "Edge"]
  4824. if entry["__type"] == "Node":
  4825. assert len(entry) == 2
  4826. count_nodes += 1
  4827. else:
  4828. assert len(entry) == 4
  4829. count_edges += 1
  4830. assert count_nodes == 20
  4831. assert count_edges == 23
  4832. count_nodes = 0
  4833. count_edges = 0
  4834. for entry in element_list_nice("users/user/test/my_pn"):
  4835. assert entry["__type"] in ["Node", "Edge"]
  4836. if entry["__type"] == "Node":
  4837. assert len(entry) == 2
  4838. count_nodes += 1
  4839. else:
  4840. assert len(entry) == 4
  4841. count_edges += 1
  4842. assert count_nodes == 14
  4843. assert count_edges == 13
  4844. alter_context("users/user/test/PetriNet", "users/user/test/PetriNet")
  4845. alter_context("users/user/test/my_pn", "formalisms/SimpleClassDiagrams")
  4846. try:
  4847. element_list_nice("users/user/test/PetriNet")
  4848. self.fail()
  4849. except:
  4850. pass
  4851. try:
  4852. element_list_nice("users/user/test/my_pn")
  4853. self.fail()
  4854. except:
  4855. pass