123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289 |
- ;;; python-tests.el --- Test suite for python.el
- ;; Copyright (C) 2013-2016 Free Software Foundation, Inc.
- ;; This file is part of GNU Emacs.
- ;; GNU Emacs is free software: you can redistribute it and/or modify
- ;; it under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation, either version 3 of the License, or
- ;; (at your option) any later version.
- ;; GNU Emacs is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;; GNU General Public License for more details.
- ;; You should have received a copy of the GNU General Public License
- ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
- ;;; Commentary:
- ;;; Code:
- (require 'ert)
- (require 'python)
- ;; Dependencies for testing:
- (require 'electric)
- (require 'hideshow)
- (require 'tramp-sh)
- (defmacro python-tests-with-temp-buffer (contents &rest body)
- "Create a `python-mode' enabled temp buffer with CONTENTS.
- BODY is code to be executed within the temp buffer. Point is
- always located at the beginning of buffer."
- (declare (indent 1) (debug t))
- `(with-temp-buffer
- (let ((python-indent-guess-indent-offset nil))
- (python-mode)
- (insert ,contents)
- (goto-char (point-min))
- ,@body)))
- (defmacro python-tests-with-temp-file (contents &rest body)
- "Create a `python-mode' enabled file with CONTENTS.
- BODY is code to be executed within the temp buffer. Point is
- always located at the beginning of buffer."
- (declare (indent 1) (debug t))
- ;; temp-file never actually used for anything?
- `(let* ((temp-file (make-temp-file "python-tests" nil ".py"))
- (buffer (find-file-noselect temp-file))
- (python-indent-guess-indent-offset nil))
- (unwind-protect
- (with-current-buffer buffer
- (python-mode)
- (insert ,contents)
- (goto-char (point-min))
- ,@body)
- (and buffer (kill-buffer buffer))
- (delete-file temp-file))))
- (defun python-tests-look-at (string &optional num restore-point)
- "Move point at beginning of STRING in the current buffer.
- Optional argument NUM defaults to 1 and is an integer indicating
- how many occurrences must be found, when positive the search is
- done forwards, otherwise backwards. When RESTORE-POINT is
- non-nil the point is not moved but the position found is still
- returned. When searching forward and point is already looking at
- STRING, it is skipped so the next STRING occurrence is selected."
- (let* ((num (or num 1))
- (starting-point (point))
- (string (regexp-quote string))
- (search-fn (if (> num 0) #'re-search-forward #'re-search-backward))
- (deinc-fn (if (> num 0) #'1- #'1+))
- (found-point))
- (prog2
- (catch 'exit
- (while (not (= num 0))
- (when (and (> num 0)
- (looking-at string))
- ;; Moving forward and already looking at STRING, skip it.
- (forward-char (length (match-string-no-properties 0))))
- (and (not (funcall search-fn string nil t))
- (throw 'exit t))
- (when (> num 0)
- ;; `re-search-forward' leaves point at the end of the
- ;; occurrence, move back so point is at the beginning
- ;; instead.
- (forward-char (- (length (match-string-no-properties 0)))))
- (setq
- num (funcall deinc-fn num)
- found-point (point))))
- found-point
- (and restore-point (goto-char starting-point)))))
- (defun python-tests-self-insert (char-or-str)
- "Call `self-insert-command' for chars in CHAR-OR-STR."
- (let ((chars
- (cond
- ((characterp char-or-str)
- (list char-or-str))
- ((stringp char-or-str)
- (string-to-list char-or-str))
- ((not
- (cl-remove-if #'characterp char-or-str))
- char-or-str)
- (t (error "CHAR-OR-STR must be a char, string, or list of char")))))
- (mapc
- (lambda (char)
- (let ((last-command-event char))
- (call-interactively 'self-insert-command)))
- chars)))
- (defun python-tests-visible-string (&optional min max)
- "Return the buffer string excluding invisible overlays.
- Argument MIN and MAX delimit the region to be returned and
- default to `point-min' and `point-max' respectively."
- (let* ((min (or min (point-min)))
- (max (or max (point-max)))
- (buffer (current-buffer))
- (buffer-contents (buffer-substring-no-properties min max))
- (overlays
- (sort (overlays-in min max)
- (lambda (a b)
- (let ((overlay-end-a (overlay-end a))
- (overlay-end-b (overlay-end b)))
- (> overlay-end-a overlay-end-b))))))
- (with-temp-buffer
- (insert buffer-contents)
- (dolist (overlay overlays)
- (if (overlay-get overlay 'invisible)
- (delete-region (overlay-start overlay)
- (overlay-end overlay))))
- (buffer-substring-no-properties (point-min) (point-max)))))
- ;;; Tests for your tests, so you can test while you test.
- (ert-deftest python-tests-look-at-1 ()
- "Test forward movement."
- (python-tests-with-temp-buffer
- "Lorem ipsum dolor sit amet, consectetur adipisicing elit,
- sed do eiusmod tempor incididunt ut labore et dolore magna
- aliqua."
- (let ((expected (save-excursion
- (dotimes (i 3)
- (re-search-forward "et" nil t))
- (forward-char -2)
- (point))))
- (should (= (python-tests-look-at "et" 3 t) expected))
- ;; Even if NUM is bigger than found occurrences the point of last
- ;; one should be returned.
- (should (= (python-tests-look-at "et" 6 t) expected))
- ;; If already looking at STRING, it should skip it.
- (dotimes (i 2) (re-search-forward "et"))
- (forward-char -2)
- (should (= (python-tests-look-at "et") expected)))))
- (ert-deftest python-tests-look-at-2 ()
- "Test backward movement."
- (python-tests-with-temp-buffer
- "Lorem ipsum dolor sit amet, consectetur adipisicing elit,
- sed do eiusmod tempor incididunt ut labore et dolore magna
- aliqua."
- (let ((expected
- (save-excursion
- (re-search-forward "et" nil t)
- (forward-char -2)
- (point))))
- (dotimes (i 3)
- (re-search-forward "et" nil t))
- (should (= (python-tests-look-at "et" -3 t) expected))
- (should (= (python-tests-look-at "et" -6 t) expected)))))
- ;;; Bindings
- ;;; Python specialized rx
- ;;; Font-lock and syntax
- (ert-deftest python-syntax-after-python-backspace ()
- ;; `python-indent-dedent-line-backspace' garbles syntax
- :expected-result :failed
- (python-tests-with-temp-buffer
- "\"\"\""
- (goto-char (point-max))
- (python-indent-dedent-line-backspace 1)
- (should (string= (buffer-string) "\"\""))
- (should (null (nth 3 (syntax-ppss))))))
- ;;; Indentation
- ;; See: http://www.python.org/dev/peps/pep-0008/#indentation
- (ert-deftest python-indent-pep8-1 ()
- "First pep8 case."
- (python-tests-with-temp-buffer
- "# Aligned with opening delimiter
- foo = long_function_name(var_one, var_two,
- var_three, var_four)
- "
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "foo = long_function_name(var_one, var_two,")
- (should (eq (car (python-indent-context)) :after-comment))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "var_three, var_four)")
- (should (eq (car (python-indent-context)) :inside-paren))
- (should (= (python-indent-calculate-indentation) 25))))
- (ert-deftest python-indent-pep8-2 ()
- "Second pep8 case."
- (python-tests-with-temp-buffer
- "# More indentation included to distinguish this from the rest.
- def long_function_name(
- var_one, var_two, var_three,
- var_four):
- print (var_one)
- "
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "def long_function_name(")
- (should (eq (car (python-indent-context)) :after-comment))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "var_one, var_two, var_three,")
- (should (eq (car (python-indent-context))
- :inside-paren-newline-start-from-block))
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at "var_four):")
- (should (eq (car (python-indent-context))
- :inside-paren-newline-start-from-block))
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at "print (var_one)")
- (should (eq (car (python-indent-context))
- :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-pep8-3 ()
- "Third pep8 case."
- (python-tests-with-temp-buffer
- "# Extra indentation is not necessary.
- foo = long_function_name(
- var_one, var_two,
- var_three, var_four)
- "
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "foo = long_function_name(")
- (should (eq (car (python-indent-context)) :after-comment))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "var_one, var_two,")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "var_three, var_four)")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-base-case ()
- "Check base case does not trigger errors."
- (python-tests-with-temp-buffer
- "
- "
- (goto-char (point-min))
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))))
- (ert-deftest python-indent-after-comment-1 ()
- "The most simple after-comment case that shouldn't fail."
- (python-tests-with-temp-buffer
- "# Contents will be modified to correct indentation
- class Blag(object):
- def _on_child_complete(self, child_future):
- if self.in_terminal_state():
- pass
- # We only complete when all our async children have entered a
- # terminal state. At that point, if any child failed, we fail
- # with the exception with which the first child failed.
- "
- (python-tests-look-at "# We only complete")
- (should (eq (car (python-indent-context)) :after-block-end))
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at "# terminal state")
- (should (eq (car (python-indent-context)) :after-comment))
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at "# with the exception")
- (should (eq (car (python-indent-context)) :after-comment))
- ;; This one indents relative to previous block, even given the fact
- ;; that it was under-indented.
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "# terminal state" -1)
- ;; It doesn't hurt to check again.
- (should (eq (car (python-indent-context)) :after-comment))
- (python-indent-line)
- (should (= (current-indentation) 8))
- (python-tests-look-at "# with the exception")
- (should (eq (car (python-indent-context)) :after-comment))
- ;; Now everything should be lined up.
- (should (= (python-indent-calculate-indentation) 8))))
- (ert-deftest python-indent-after-comment-2 ()
- "Test after-comment in weird cases."
- (python-tests-with-temp-buffer
- "# Contents will be modified to correct indentation
- def func(arg):
- # I don't do much
- return arg
- # This comment is badly indented because the user forced so.
- # At this line python.el wont dedent, user is always right.
- comment_wins_over_ender = True
- # yeah, that.
- "
- (python-tests-look-at "# I don't do much")
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "return arg")
- ;; Comment here just gets ignored, this line is not a comment so
- ;; the rules won't apply here.
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "# This comment is badly indented")
- (should (eq (car (python-indent-context)) :after-block-end))
- ;; The return keyword do make indentation lose a level...
- (should (= (python-indent-calculate-indentation) 0))
- ;; ...but the current indentation was forced by the user.
- (python-tests-look-at "# At this line python.el wont dedent")
- (should (eq (car (python-indent-context)) :after-comment))
- (should (= (python-indent-calculate-indentation) 4))
- ;; Should behave the same for blank lines: potentially a comment.
- (forward-line 1)
- (should (eq (car (python-indent-context)) :after-comment))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "comment_wins_over_ender")
- ;; The comment won over the ender because the user said so.
- (should (eq (car (python-indent-context)) :after-comment))
- (should (= (python-indent-calculate-indentation) 4))
- ;; The indentation calculated fine for the assignment, but the user
- ;; choose to force it back to the first column. Next line should
- ;; be aware of that.
- (python-tests-look-at "# yeah, that.")
- (should (eq (car (python-indent-context)) :after-line))
- (should (= (python-indent-calculate-indentation) 0))))
- (ert-deftest python-indent-after-comment-3 ()
- "Test after-comment in buggy case."
- (python-tests-with-temp-buffer
- "
- class A(object):
- def something(self, arg):
- if True:
- return arg
- # A comment
- @adecorator
- def method(self, a, b):
- pass
- "
- (python-tests-look-at "@adecorator")
- (should (eq (car (python-indent-context)) :after-comment))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-inside-paren-1 ()
- "The most simple inside-paren case that shouldn't fail."
- (python-tests-with-temp-buffer
- "
- data = {
- 'key':
- {
- 'objlist': [
- {
- 'pk': 1,
- 'name': 'first',
- },
- {
- 'pk': 2,
- 'name': 'second',
- }
- ]
- }
- }
- "
- (python-tests-look-at "data = {")
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "'key':")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "{")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "'objlist': [")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at "{")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 12))
- (python-tests-look-at "'pk': 1,")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 16))
- (python-tests-look-at "'name': 'first',")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 16))
- (python-tests-look-at "},")
- (should (eq (car (python-indent-context))
- :inside-paren-at-closing-nested-paren))
- (should (= (python-indent-calculate-indentation) 12))
- (python-tests-look-at "{")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 12))
- (python-tests-look-at "'pk': 2,")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 16))
- (python-tests-look-at "'name': 'second',")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 16))
- (python-tests-look-at "}")
- (should (eq (car (python-indent-context))
- :inside-paren-at-closing-nested-paren))
- (should (= (python-indent-calculate-indentation) 12))
- (python-tests-look-at "]")
- (should (eq (car (python-indent-context))
- :inside-paren-at-closing-nested-paren))
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at "}")
- (should (eq (car (python-indent-context))
- :inside-paren-at-closing-nested-paren))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "}")
- (should (eq (car (python-indent-context)) :inside-paren-at-closing-paren))
- (should (= (python-indent-calculate-indentation) 0))))
- (ert-deftest python-indent-inside-paren-2 ()
- "Another more compact paren group style."
- (python-tests-with-temp-buffer
- "
- data = {'key': {
- 'objlist': [
- {'pk': 1,
- 'name': 'first'},
- {'pk': 2,
- 'name': 'second'}
- ]
- }}
- "
- (python-tests-look-at "data = {")
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "'objlist': [")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "{'pk': 1,")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at "'name': 'first'},")
- (should (eq (car (python-indent-context)) :inside-paren))
- (should (= (python-indent-calculate-indentation) 9))
- (python-tests-look-at "{'pk': 2,")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at "'name': 'second'}")
- (should (eq (car (python-indent-context)) :inside-paren))
- (should (= (python-indent-calculate-indentation) 9))
- (python-tests-look-at "]")
- (should (eq (car (python-indent-context))
- :inside-paren-at-closing-nested-paren))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "}}")
- (should (eq (car (python-indent-context))
- :inside-paren-at-closing-nested-paren))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "}")
- (should (eq (car (python-indent-context)) :inside-paren-at-closing-paren))
- (should (= (python-indent-calculate-indentation) 0))))
- (ert-deftest python-indent-inside-paren-3 ()
- "The simplest case possible."
- (python-tests-with-temp-buffer
- "
- data = ('these',
- 'are',
- 'the',
- 'tokens')
- "
- (python-tests-look-at "data = ('these',")
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :inside-paren))
- (should (= (python-indent-calculate-indentation) 8))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :inside-paren))
- (should (= (python-indent-calculate-indentation) 8))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :inside-paren))
- (should (= (python-indent-calculate-indentation) 8))))
- (ert-deftest python-indent-inside-paren-4 ()
- "Respect indentation of first column."
- (python-tests-with-temp-buffer
- "
- data = [ [ 'these', 'are'],
- ['the', 'tokens' ] ]
- "
- (python-tests-look-at "data = [ [ 'these', 'are'],")
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :inside-paren))
- (should (= (python-indent-calculate-indentation) 9))))
- (ert-deftest python-indent-inside-paren-5 ()
- "Test when :inside-paren initial parens are skipped in context start."
- (python-tests-with-temp-buffer
- "
- while ((not some_condition) and
- another_condition):
- do_something_interesting(
- with_some_arg)
- "
- (python-tests-look-at "while ((not some_condition) and")
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :inside-paren))
- (should (= (python-indent-calculate-indentation) 7))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 8))))
- (ert-deftest python-indent-inside-paren-6 ()
- "This should be aligned.."
- (python-tests-with-temp-buffer
- "
- CHOICES = (('some', 'choice'),
- ('another', 'choice'),
- ('more', 'choices'))
- "
- (python-tests-look-at "CHOICES = (('some', 'choice'),")
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :inside-paren))
- (should (= (python-indent-calculate-indentation) 11))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :inside-paren))
- (should (= (python-indent-calculate-indentation) 11))))
- (ert-deftest python-indent-inside-paren-7 ()
- "Test for Bug#21762."
- (python-tests-with-temp-buffer
- "import re as myre\nvar = [\n"
- (goto-char (point-max))
- ;; This signals an error if the test fails
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))))
- (ert-deftest python-indent-after-block-1 ()
- "The most simple after-block case that shouldn't fail."
- (python-tests-with-temp-buffer
- "
- def foo(a, b, c=True):
- "
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (goto-char (point-max))
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-after-block-2 ()
- "A weird (malformed) multiline block statement."
- (python-tests-with-temp-buffer
- "
- def foo(a, b, c={
- 'a':
- }):
- "
- (goto-char (point-max))
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-after-block-3 ()
- "A weird (malformed) sample, usually found in python shells."
- (python-tests-with-temp-buffer
- "
- In [1]:
- def func():
- pass
- In [2]:
- something
- "
- (python-tests-look-at "pass")
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "something")
- (end-of-line)
- (should (eq (car (python-indent-context)) :after-line))
- (should (= (python-indent-calculate-indentation) 0))))
- (ert-deftest python-indent-after-async-block-1 ()
- "Test PEP492 async def."
- (python-tests-with-temp-buffer
- "
- async def foo(a, b, c=True):
- "
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (goto-char (point-max))
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-after-async-block-2 ()
- "Test PEP492 async with."
- (python-tests-with-temp-buffer
- "
- async with foo(a) as mgr:
- "
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (goto-char (point-max))
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-after-async-block-3 ()
- "Test PEP492 async for."
- (python-tests-with-temp-buffer
- "
- async for a in sequencer():
- "
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (goto-char (point-max))
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-after-backslash-1 ()
- "The most common case."
- (python-tests-with-temp-buffer
- "
- from foo.bar.baz import something, something_1 \\\\
- something_2 something_3, \\\\
- something_4, something_5
- "
- (python-tests-look-at "from foo.bar.baz import something, something_1")
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "something_2 something_3,")
- (should (eq (car (python-indent-context)) :after-backslash-first-line))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "something_4, something_5")
- (should (eq (car (python-indent-context)) :after-backslash))
- (should (= (python-indent-calculate-indentation) 4))
- (goto-char (point-max))
- (should (eq (car (python-indent-context)) :after-line))
- (should (= (python-indent-calculate-indentation) 0))))
- (ert-deftest python-indent-after-backslash-2 ()
- "A pretty extreme complicated case."
- (python-tests-with-temp-buffer
- "
- objects = Thing.objects.all() \\\\
- .filter(
- type='toy',
- status='bought'
- ) \\\\
- .aggregate(
- Sum('amount')
- ) \\\\
- .values_list()
- "
- (python-tests-look-at "objects = Thing.objects.all()")
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at ".filter(")
- (should (eq (car (python-indent-context))
- :after-backslash-dotted-continuation))
- (should (= (python-indent-calculate-indentation) 23))
- (python-tests-look-at "type='toy',")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 27))
- (python-tests-look-at "status='bought'")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 27))
- (python-tests-look-at ") \\\\")
- (should (eq (car (python-indent-context)) :inside-paren-at-closing-paren))
- (should (= (python-indent-calculate-indentation) 23))
- (python-tests-look-at ".aggregate(")
- (should (eq (car (python-indent-context))
- :after-backslash-dotted-continuation))
- (should (= (python-indent-calculate-indentation) 23))
- (python-tests-look-at "Sum('amount')")
- (should (eq (car (python-indent-context)) :inside-paren-newline-start))
- (should (= (python-indent-calculate-indentation) 27))
- (python-tests-look-at ") \\\\")
- (should (eq (car (python-indent-context)) :inside-paren-at-closing-paren))
- (should (= (python-indent-calculate-indentation) 23))
- (python-tests-look-at ".values_list()")
- (should (eq (car (python-indent-context))
- :after-backslash-dotted-continuation))
- (should (= (python-indent-calculate-indentation) 23))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :after-line))
- (should (= (python-indent-calculate-indentation) 0))))
- (ert-deftest python-indent-after-backslash-3 ()
- "Backslash continuation from block start."
- (python-tests-with-temp-buffer
- "
- with open('/path/to/some/file/you/want/to/read') as file_1, \\\\
- open('/path/to/some/file/being/written', 'w') as file_2:
- file_2.write(file_1.read())
- "
- (python-tests-look-at
- "with open('/path/to/some/file/you/want/to/read') as file_1, \\\\")
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at
- "open('/path/to/some/file/being/written', 'w') as file_2")
- (should (eq (car (python-indent-context))
- :after-backslash-block-continuation))
- (should (= (python-indent-calculate-indentation) 5))
- (python-tests-look-at "file_2.write(file_1.read())")
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-after-backslash-4 ()
- "Backslash continuation from assignment."
- (python-tests-with-temp-buffer
- "
- super_awful_assignment = some_calculation() and \\\\
- another_calculation() and \\\\
- some_final_calculation()
- "
- (python-tests-look-at
- "super_awful_assignment = some_calculation() and \\\\")
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "another_calculation() and \\\\")
- (should (eq (car (python-indent-context))
- :after-backslash-assignment-continuation))
- (should (= (python-indent-calculate-indentation) 25))
- (python-tests-look-at "some_final_calculation()")
- (should (eq (car (python-indent-context)) :after-backslash))
- (should (= (python-indent-calculate-indentation) 25))))
- (ert-deftest python-indent-after-backslash-5 ()
- "Dotted continuation bizarre example."
- (python-tests-with-temp-buffer
- "
- def delete_all_things():
- Thing \\\\
- .objects.all() \\\\
- .delete()
- "
- (python-tests-look-at "Thing \\\\")
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at ".objects.all() \\\\")
- (should (eq (car (python-indent-context)) :after-backslash-first-line))
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at ".delete()")
- (should (eq (car (python-indent-context))
- :after-backslash-dotted-continuation))
- (should (= (python-indent-calculate-indentation) 16))))
- (ert-deftest python-indent-block-enders-1 ()
- "Test de-indentation for pass keyword."
- (python-tests-with-temp-buffer
- "
- Class foo(object):
- def bar(self):
- if self.baz:
- return (1,
- 2,
- 3)
- else:
- pass
- "
- (python-tests-look-at "3)")
- (forward-line 1)
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at "pass")
- (forward-line 1)
- (should (eq (car (python-indent-context)) :after-block-end))
- (should (= (python-indent-calculate-indentation) 8))))
- (ert-deftest python-indent-block-enders-2 ()
- "Test de-indentation for return keyword."
- (python-tests-with-temp-buffer
- "
- Class foo(object):
- '''raise lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
- eiusmod tempor incididunt ut labore et dolore magna aliqua.
- '''
- def bar(self):
- \"return (1, 2, 3).\"
- if self.baz:
- return (1,
- 2,
- 3)
- "
- (python-tests-look-at "def")
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "if")
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at "return")
- (should (= (python-indent-calculate-indentation) 12))
- (goto-char (point-max))
- (should (eq (car (python-indent-context)) :after-block-end))
- (should (= (python-indent-calculate-indentation) 8))))
- (ert-deftest python-indent-block-enders-3 ()
- "Test de-indentation for continue keyword."
- (python-tests-with-temp-buffer
- "
- for element in lst:
- if element is None:
- continue
- "
- (python-tests-look-at "if")
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "continue")
- (should (= (python-indent-calculate-indentation) 8))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :after-block-end))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-block-enders-4 ()
- "Test de-indentation for break keyword."
- (python-tests-with-temp-buffer
- "
- for element in lst:
- if element is None:
- break
- "
- (python-tests-look-at "if")
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "break")
- (should (= (python-indent-calculate-indentation) 8))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :after-block-end))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-block-enders-5 ()
- "Test de-indentation for raise keyword."
- (python-tests-with-temp-buffer
- "
- for element in lst:
- if element is None:
- raise ValueError('Element cannot be None')
- "
- (python-tests-look-at "if")
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "raise")
- (should (= (python-indent-calculate-indentation) 8))
- (forward-line 1)
- (should (eq (car (python-indent-context)) :after-block-end))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-dedenters-1 ()
- "Test de-indentation for the elif keyword."
- (python-tests-with-temp-buffer
- "
- if save:
- try:
- write_to_disk(data)
- finally:
- cleanup()
- elif
- "
- (python-tests-look-at "elif\n")
- (should (eq (car (python-indent-context)) :at-dedenter-block-start))
- (should (= (python-indent-calculate-indentation) 0))
- (should (= (python-indent-calculate-indentation t) 0))))
- (ert-deftest python-indent-dedenters-2 ()
- "Test de-indentation for the else keyword."
- (python-tests-with-temp-buffer
- "
- if save:
- try:
- write_to_disk(data)
- except IOError:
- msg = 'Error saving to disk'
- message(msg)
- logger.exception(msg)
- except Exception:
- if hide_details:
- logger.exception('Unhandled exception')
- else
- finally:
- data.free()
- "
- (python-tests-look-at "else\n")
- (should (eq (car (python-indent-context)) :at-dedenter-block-start))
- (should (= (python-indent-calculate-indentation) 8))
- (python-indent-line t)
- (should (= (python-indent-calculate-indentation t) 4))
- (python-indent-line t)
- (should (= (python-indent-calculate-indentation t) 0))
- (python-indent-line t)
- (should (= (python-indent-calculate-indentation t) 8))))
- (ert-deftest python-indent-dedenters-3 ()
- "Test de-indentation for the except keyword."
- (python-tests-with-temp-buffer
- "
- if save:
- try:
- write_to_disk(data)
- except
- "
- (python-tests-look-at "except\n")
- (should (eq (car (python-indent-context)) :at-dedenter-block-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-indent-line t)
- (should (= (python-indent-calculate-indentation t) 4))))
- (ert-deftest python-indent-dedenters-4 ()
- "Test de-indentation for the finally keyword."
- (python-tests-with-temp-buffer
- "
- if save:
- try:
- write_to_disk(data)
- finally
- "
- (python-tests-look-at "finally\n")
- (should (eq (car (python-indent-context)) :at-dedenter-block-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-indent-line t)
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-dedenters-5 ()
- "Test invalid levels are skipped in a complex example."
- (python-tests-with-temp-buffer
- "
- if save:
- try:
- write_to_disk(data)
- except IOError:
- msg = 'Error saving to disk'
- message(msg)
- logger.exception(msg)
- finally:
- if cleanup:
- do_cleanup()
- else
- "
- (python-tests-look-at "else\n")
- (should (eq (car (python-indent-context)) :at-dedenter-block-start))
- (should (= (python-indent-calculate-indentation) 8))
- (should (= (python-indent-calculate-indentation t) 0))
- (python-indent-line t)
- (should (= (python-indent-calculate-indentation t) 8))))
- (ert-deftest python-indent-dedenters-6 ()
- "Test indentation is zero when no opening block for dedenter."
- (python-tests-with-temp-buffer
- "
- try:
- # if save:
- write_to_disk(data)
- else
- "
- (python-tests-look-at "else\n")
- (should (eq (car (python-indent-context)) :at-dedenter-block-start))
- (should (= (python-indent-calculate-indentation) 0))
- (should (= (python-indent-calculate-indentation t) 0))))
- (ert-deftest python-indent-dedenters-7 ()
- "Test indentation case from Bug#15163."
- (python-tests-with-temp-buffer
- "
- if a:
- if b:
- pass
- else:
- pass
- else:
- "
- (python-tests-look-at "else:" 2)
- (should (eq (car (python-indent-context)) :at-dedenter-block-start))
- (should (= (python-indent-calculate-indentation) 0))
- (should (= (python-indent-calculate-indentation t) 0))))
- (ert-deftest python-indent-dedenters-8 ()
- "Test indentation for Bug#18432."
- (python-tests-with-temp-buffer
- "
- if (a == 1 or
- a == 2):
- pass
- elif (a == 3 or
- a == 4):
- "
- (python-tests-look-at "elif (a == 3 or")
- (should (eq (car (python-indent-context)) :at-dedenter-block-start))
- (should (= (python-indent-calculate-indentation) 0))
- (should (= (python-indent-calculate-indentation t) 0))
- (python-tests-look-at "a == 4):\n")
- (should (eq (car (python-indent-context)) :inside-paren))
- (should (= (python-indent-calculate-indentation) 6))
- (python-indent-line)
- (should (= (python-indent-calculate-indentation t) 4))
- (python-indent-line t)
- (should (= (python-indent-calculate-indentation t) 0))
- (python-indent-line t)
- (should (= (python-indent-calculate-indentation t) 6))))
- (ert-deftest python-indent-inside-string-1 ()
- "Test indentation for strings."
- (python-tests-with-temp-buffer
- "
- multiline = '''
- bunch
- of
- lines
- '''
- "
- (python-tests-look-at "multiline = '''")
- (should (eq (car (python-indent-context)) :no-indent))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "bunch")
- (should (eq (car (python-indent-context)) :inside-string))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "of")
- (should (eq (car (python-indent-context)) :inside-string))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "lines")
- (should (eq (car (python-indent-context)) :inside-string))
- (should (= (python-indent-calculate-indentation) 0))
- (python-tests-look-at "'''")
- (should (eq (car (python-indent-context)) :inside-string))
- (should (= (python-indent-calculate-indentation) 0))))
- (ert-deftest python-indent-inside-string-2 ()
- "Test indentation for docstrings."
- (python-tests-with-temp-buffer
- "
- def fn(a, b, c=True):
- '''docstring
- bunch
- of
- lines
- '''
- "
- (python-tests-look-at "'''docstring")
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "bunch")
- (should (eq (car (python-indent-context)) :inside-docstring))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "of")
- (should (eq (car (python-indent-context)) :inside-docstring))
- ;; Any indentation deeper than the base-indent must remain unmodified.
- (should (= (python-indent-calculate-indentation) 8))
- (python-tests-look-at "lines")
- (should (eq (car (python-indent-context)) :inside-docstring))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "'''")
- (should (eq (car (python-indent-context)) :inside-docstring))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-inside-string-3 ()
- "Test indentation for nested strings."
- (python-tests-with-temp-buffer
- "
- def fn(a, b, c=True):
- some_var = '''
- bunch
- of
- lines
- '''
- "
- (python-tests-look-at "some_var = '''")
- (should (eq (car (python-indent-context)) :after-block-start))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "bunch")
- (should (eq (car (python-indent-context)) :inside-string))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "of")
- (should (eq (car (python-indent-context)) :inside-string))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "lines")
- (should (eq (car (python-indent-context)) :inside-string))
- (should (= (python-indent-calculate-indentation) 4))
- (python-tests-look-at "'''")
- (should (eq (car (python-indent-context)) :inside-string))
- (should (= (python-indent-calculate-indentation) 4))))
- (ert-deftest python-indent-electric-colon-1 ()
- "Test indentation case from Bug#18228."
- (python-tests-with-temp-buffer
- "
- def a():
- pass
- def b()
- "
- (python-tests-look-at "def b()")
- (goto-char (line-end-position))
- (python-tests-self-insert ":")
- (should (= (current-indentation) 0))))
- (ert-deftest python-indent-electric-colon-2 ()
- "Test indentation case for dedenter."
- (python-tests-with-temp-buffer
- "
- if do:
- something()
- else
- "
- (python-tests-look-at "else")
- (goto-char (line-end-position))
- (python-tests-self-insert ":")
- (should (= (current-indentation) 0))))
- (ert-deftest python-indent-electric-colon-3 ()
- "Test indentation case for multi-line dedenter."
- (python-tests-with-temp-buffer
- "
- if do:
- something()
- elif (this
- and
- that)
- "
- (python-tests-look-at "that)")
- (goto-char (line-end-position))
- (python-tests-self-insert ":")
- (python-tests-look-at "elif" -1)
- (should (= (current-indentation) 0))
- (python-tests-look-at "and")
- (should (= (current-indentation) 6))
- (python-tests-look-at "that)")
- (should (= (current-indentation) 6))))
- (ert-deftest python-indent-region-1 ()
- "Test indentation case from Bug#18843."
- (let ((contents "
- def foo ():
- try:
- pass
- except:
- pass
- "))
- (python-tests-with-temp-buffer
- contents
- (python-indent-region (point-min) (point-max))
- (should (string= (buffer-substring-no-properties (point-min) (point-max))
- contents)))))
- (ert-deftest python-indent-region-2 ()
- "Test region indentation on comments."
- (let ((contents "
- def f():
- if True:
- pass
- # This is
- # some multiline
- # comment
- "))
- (python-tests-with-temp-buffer
- contents
- (python-indent-region (point-min) (point-max))
- (should (string= (buffer-substring-no-properties (point-min) (point-max))
- contents)))))
- (ert-deftest python-indent-region-3 ()
- "Test region indentation on comments."
- (let ((contents "
- def f():
- if True:
- pass
- # This is
- # some multiline
- # comment
- ")
- (expected "
- def f():
- if True:
- pass
- # This is
- # some multiline
- # comment
- "))
- (python-tests-with-temp-buffer
- contents
- (python-indent-region (point-min) (point-max))
- (should (string= (buffer-substring-no-properties (point-min) (point-max))
- expected)))))
- (ert-deftest python-indent-region-4 ()
- "Test region indentation block starts, dedenters and enders."
- (let ((contents "
- def f():
- if True:
- a = 5
- else:
- a = 10
- return a
- ")
- (expected "
- def f():
- if True:
- a = 5
- else:
- a = 10
- return a
- "))
- (python-tests-with-temp-buffer
- contents
- (python-indent-region (point-min) (point-max))
- (should (string= (buffer-substring-no-properties (point-min) (point-max))
- expected)))))
- (ert-deftest python-indent-region-5 ()
- "Test region indentation for docstrings."
- (let ((contents "
- def f():
- '''
- this is
- a multiline
- string
- '''
- x = \\
- '''
- this is an arbitrarily
- indented multiline
- string
- '''
- ")
- (expected "
- def f():
- '''
- this is
- a multiline
- string
- '''
- x = \\
- '''
- this is an arbitrarily
- indented multiline
- string
- '''
- "))
- (python-tests-with-temp-buffer
- contents
- (python-indent-region (point-min) (point-max))
- (should (string= (buffer-substring-no-properties (point-min) (point-max))
- expected)))))
- ;;; Mark
- (ert-deftest python-mark-defun-1 ()
- """Test `python-mark-defun' with point at defun symbol start."""
- (python-tests-with-temp-buffer
- "
- def foo(x):
- return x
- class A:
- pass
- class B:
- def __init__(self):
- self.b = 'b'
- def fun(self):
- return self.b
- class C:
- '''docstring'''
- "
- (let ((expected-mark-beginning-position
- (progn
- (python-tests-look-at "class A:")
- (1- (point))))
- (expected-mark-end-position-1
- (save-excursion
- (python-tests-look-at "pass")
- (forward-line)
- (point)))
- (expected-mark-end-position-2
- (save-excursion
- (python-tests-look-at "return self.b")
- (forward-line)
- (point)))
- (expected-mark-end-position-3
- (save-excursion
- (python-tests-look-at "'''docstring'''")
- (forward-line)
- (point))))
- ;; Select class A only, with point at bol.
- (python-mark-defun 1)
- (should (= (point) expected-mark-beginning-position))
- (should (= (marker-position (mark-marker))
- expected-mark-end-position-1))
- ;; expand to class B, start position should remain the same.
- (python-mark-defun 1)
- (should (= (point) expected-mark-beginning-position))
- (should (= (marker-position (mark-marker))
- expected-mark-end-position-2))
- ;; expand to class C, start position should remain the same.
- (python-mark-defun 1)
- (should (= (point) expected-mark-beginning-position))
- (should (= (marker-position (mark-marker))
- expected-mark-end-position-3)))))
- (ert-deftest python-mark-defun-2 ()
- """Test `python-mark-defun' with point at nested defun symbol start."""
- (python-tests-with-temp-buffer
- "
- def foo(x):
- return x
- class A:
- pass
- class B:
- def __init__(self):
- self.b = 'b'
- def fun(self):
- return self.b
- class C:
- '''docstring'''
- "
- (let ((expected-mark-beginning-position
- (progn
- (python-tests-look-at "def __init__(self):")
- (1- (line-beginning-position))))
- (expected-mark-end-position-1
- (save-excursion
- (python-tests-look-at "self.b = 'b'")
- (forward-line)
- (point)))
- (expected-mark-end-position-2
- (save-excursion
- (python-tests-look-at "return self.b")
- (forward-line)
- (point)))
- (expected-mark-end-position-3
- (save-excursion
- (python-tests-look-at "'''docstring'''")
- (forward-line)
- (point))))
- ;; Select B.__init only, with point at its start.
- (python-mark-defun 1)
- (should (= (point) expected-mark-beginning-position))
- (should (= (marker-position (mark-marker))
- expected-mark-end-position-1))
- ;; expand to B.fun, start position should remain the same.
- (python-mark-defun 1)
- (should (= (point) expected-mark-beginning-position))
- (should (= (marker-position (mark-marker))
- expected-mark-end-position-2))
- ;; expand to class C, start position should remain the same.
- (python-mark-defun 1)
- (should (= (point) expected-mark-beginning-position))
- (should (= (marker-position (mark-marker))
- expected-mark-end-position-3)))))
- (ert-deftest python-mark-defun-3 ()
- """Test `python-mark-defun' with point inside defun symbol."""
- (python-tests-with-temp-buffer
- "
- def foo(x):
- return x
- class A:
- pass
- class B:
- def __init__(self):
- self.b = 'b'
- def fun(self):
- return self.b
- class C:
- '''docstring'''
- "
- (let ((expected-mark-beginning-position
- (progn
- (python-tests-look-at "def fun(self):")
- (python-tests-look-at "(self):")
- (1- (line-beginning-position))))
- (expected-mark-end-position
- (save-excursion
- (python-tests-look-at "return self.b")
- (forward-line)
- (point))))
- ;; Should select B.fun, despite point is inside the defun symbol.
- (python-mark-defun 1)
- (should (= (point) expected-mark-beginning-position))
- (should (= (marker-position (mark-marker))
- expected-mark-end-position)))))
- ;;; Navigation
- (ert-deftest python-nav-beginning-of-defun-1 ()
- (python-tests-with-temp-buffer
- "
- def decoratorFunctionWithArguments(arg1, arg2, arg3):
- '''print decorated function call data to stdout.
- Usage:
- @decoratorFunctionWithArguments('arg1', 'arg2')
- def func(a, b, c=True):
- pass
- '''
- def wwrap(f):
- print 'Inside wwrap()'
- def wrapped_f(*args):
- print 'Inside wrapped_f()'
- print 'Decorator arguments:', arg1, arg2, arg3
- f(*args)
- print 'After f(*args)'
- return wrapped_f
- return wwrap
- "
- (python-tests-look-at "return wrap")
- (should (= (save-excursion
- (python-nav-beginning-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "def wrapped_f(*args):" -1)
- (beginning-of-line)
- (point))))
- (python-tests-look-at "def wrapped_f(*args):" -1)
- (should (= (save-excursion
- (python-nav-beginning-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "def wwrap(f):" -1)
- (beginning-of-line)
- (point))))
- (python-tests-look-at "def wwrap(f):" -1)
- (should (= (save-excursion
- (python-nav-beginning-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "def decoratorFunctionWithArguments" -1)
- (beginning-of-line)
- (point))))))
- (ert-deftest python-nav-beginning-of-defun-2 ()
- (python-tests-with-temp-buffer
- "
- class C(object):
- def m(self):
- self.c()
- def b():
- pass
- def a():
- pass
- def c(self):
- pass
- "
- ;; Nested defuns, are handled with care.
- (python-tests-look-at "def c(self):")
- (should (= (save-excursion
- (python-nav-beginning-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "def m(self):" -1)
- (beginning-of-line)
- (point))))
- ;; Defuns on same levels should be respected.
- (python-tests-look-at "def a():" -1)
- (should (= (save-excursion
- (python-nav-beginning-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "def b():" -1)
- (beginning-of-line)
- (point))))
- ;; Jump to a top level defun.
- (python-tests-look-at "def b():" -1)
- (should (= (save-excursion
- (python-nav-beginning-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "def m(self):" -1)
- (beginning-of-line)
- (point))))
- ;; Jump to a top level defun again.
- (python-tests-look-at "def m(self):" -1)
- (should (= (save-excursion
- (python-nav-beginning-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "class C(object):" -1)
- (beginning-of-line)
- (point))))))
- (ert-deftest python-nav-beginning-of-defun-3 ()
- (python-tests-with-temp-buffer
- "
- class C(object):
- async def m(self):
- return await self.c()
- async def c(self):
- pass
- "
- (python-tests-look-at "self.c()")
- (should (= (save-excursion
- (python-nav-beginning-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "async def m" -1)
- (beginning-of-line)
- (point))))))
- (ert-deftest python-nav-end-of-defun-1 ()
- (python-tests-with-temp-buffer
- "
- class C(object):
- def m(self):
- self.c()
- def b():
- pass
- def a():
- pass
- def c(self):
- pass
- "
- (should (= (save-excursion
- (python-tests-look-at "class C(object):")
- (python-nav-end-of-defun)
- (point))
- (save-excursion
- (point-max))))
- (should (= (save-excursion
- (python-tests-look-at "def m(self):")
- (python-nav-end-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "def c(self):")
- (forward-line -1)
- (point))))
- (should (= (save-excursion
- (python-tests-look-at "def b():")
- (python-nav-end-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "def b():")
- (forward-line 2)
- (point))))
- (should (= (save-excursion
- (python-tests-look-at "def c(self):")
- (python-nav-end-of-defun)
- (point))
- (save-excursion
- (point-max))))))
- (ert-deftest python-nav-end-of-defun-2 ()
- (python-tests-with-temp-buffer
- "
- def decoratorFunctionWithArguments(arg1, arg2, arg3):
- '''print decorated function call data to stdout.
- Usage:
- @decoratorFunctionWithArguments('arg1', 'arg2')
- def func(a, b, c=True):
- pass
- '''
- def wwrap(f):
- print 'Inside wwrap()'
- def wrapped_f(*args):
- print 'Inside wrapped_f()'
- print 'Decorator arguments:', arg1, arg2, arg3
- f(*args)
- print 'After f(*args)'
- return wrapped_f
- return wwrap
- "
- (should (= (save-excursion
- (python-tests-look-at "def decoratorFunctionWithArguments")
- (python-nav-end-of-defun)
- (point))
- (save-excursion
- (point-max))))
- (should (= (save-excursion
- (python-tests-look-at "@decoratorFunctionWithArguments")
- (python-nav-end-of-defun)
- (point))
- (save-excursion
- (point-max))))
- (should (= (save-excursion
- (python-tests-look-at "def wwrap(f):")
- (python-nav-end-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "return wwrap")
- (line-beginning-position))))
- (should (= (save-excursion
- (python-tests-look-at "def wrapped_f(*args):")
- (python-nav-end-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "return wrapped_f")
- (line-beginning-position))))
- (should (= (save-excursion
- (python-tests-look-at "f(*args)")
- (python-nav-end-of-defun)
- (point))
- (save-excursion
- (python-tests-look-at "return wrapped_f")
- (line-beginning-position))))))
- (ert-deftest python-nav-backward-defun-1 ()
- (python-tests-with-temp-buffer
- "
- class A(object): # A
- def a(self): # a
- pass
- def b(self): # b
- pass
- class B(object): # B
- class C(object): # C
- def d(self): # d
- pass
- # def e(self): # e
- # pass
- def c(self): # c
- pass
- # def d(self): # d
- # pass
- "
- (goto-char (point-max))
- (should (= (save-excursion (python-nav-backward-defun))
- (python-tests-look-at " def c(self): # c" -1)))
- (should (= (save-excursion (python-nav-backward-defun))
- (python-tests-look-at " def d(self): # d" -1)))
- (should (= (save-excursion (python-nav-backward-defun))
- (python-tests-look-at " class C(object): # C" -1)))
- (should (= (save-excursion (python-nav-backward-defun))
- (python-tests-look-at " class B(object): # B" -1)))
- (should (= (save-excursion (python-nav-backward-defun))
- (python-tests-look-at " def b(self): # b" -1)))
- (should (= (save-excursion (python-nav-backward-defun))
- (python-tests-look-at " def a(self): # a" -1)))
- (should (= (save-excursion (python-nav-backward-defun))
- (python-tests-look-at "class A(object): # A" -1)))
- (should (not (python-nav-backward-defun)))))
- (ert-deftest python-nav-backward-defun-2 ()
- (python-tests-with-temp-buffer
- "
- def decoratorFunctionWithArguments(arg1, arg2, arg3):
- '''print decorated function call data to stdout.
- Usage:
- @decoratorFunctionWithArguments('arg1', 'arg2')
- def func(a, b, c=True):
- pass
- '''
- def wwrap(f):
- print 'Inside wwrap()'
- def wrapped_f(*args):
- print 'Inside wrapped_f()'
- print 'Decorator arguments:', arg1, arg2, arg3
- f(*args)
- print 'After f(*args)'
- return wrapped_f
- return wwrap
- "
- (goto-char (point-max))
- (should (= (save-excursion (python-nav-backward-defun))
- (python-tests-look-at " def wrapped_f(*args):" -1)))
- (should (= (save-excursion (python-nav-backward-defun))
- (python-tests-look-at " def wwrap(f):" -1)))
- (should (= (save-excursion (python-nav-backward-defun))
- (python-tests-look-at "def decoratorFunctionWithArguments(arg1, arg2, arg3):" -1)))
- (should (not (python-nav-backward-defun)))))
- (ert-deftest python-nav-backward-defun-3 ()
- (python-tests-with-temp-buffer
- "
- '''
- def u(self):
- pass
- def v(self):
- pass
- def w(self):
- pass
- '''
- class A(object):
- pass
- "
- (goto-char (point-min))
- (let ((point (python-tests-look-at "class A(object):")))
- (should (not (python-nav-backward-defun)))
- (should (= point (point))))))
- (ert-deftest python-nav-forward-defun-1 ()
- (python-tests-with-temp-buffer
- "
- class A(object): # A
- def a(self): # a
- pass
- def b(self): # b
- pass
- class B(object): # B
- class C(object): # C
- def d(self): # d
- pass
- # def e(self): # e
- # pass
- def c(self): # c
- pass
- # def d(self): # d
- # pass
- "
- (goto-char (point-min))
- (should (= (save-excursion (python-nav-forward-defun))
- (python-tests-look-at "(object): # A")))
- (should (= (save-excursion (python-nav-forward-defun))
- (python-tests-look-at "(self): # a")))
- (should (= (save-excursion (python-nav-forward-defun))
- (python-tests-look-at "(self): # b")))
- (should (= (save-excursion (python-nav-forward-defun))
- (python-tests-look-at "(object): # B")))
- (should (= (save-excursion (python-nav-forward-defun))
- (python-tests-look-at "(object): # C")))
- (should (= (save-excursion (python-nav-forward-defun))
- (python-tests-look-at "(self): # d")))
- (should (= (save-excursion (python-nav-forward-defun))
- (python-tests-look-at "(self): # c")))
- (should (not (python-nav-forward-defun)))))
- (ert-deftest python-nav-forward-defun-2 ()
- (python-tests-with-temp-buffer
- "
- def decoratorFunctionWithArguments(arg1, arg2, arg3):
- '''print decorated function call data to stdout.
- Usage:
- @decoratorFunctionWithArguments('arg1', 'arg2')
- def func(a, b, c=True):
- pass
- '''
- def wwrap(f):
- print 'Inside wwrap()'
- def wrapped_f(*args):
- print 'Inside wrapped_f()'
- print 'Decorator arguments:', arg1, arg2, arg3
- f(*args)
- print 'After f(*args)'
- return wrapped_f
- return wwrap
- "
- (goto-char (point-min))
- (should (= (save-excursion (python-nav-forward-defun))
- (python-tests-look-at "(arg1, arg2, arg3):")))
- (should (= (save-excursion (python-nav-forward-defun))
- (python-tests-look-at "(f):")))
- (should (= (save-excursion (python-nav-forward-defun))
- (python-tests-look-at "(*args):")))
- (should (not (python-nav-forward-defun)))))
- (ert-deftest python-nav-forward-defun-3 ()
- (python-tests-with-temp-buffer
- "
- class A(object):
- pass
- '''
- def u(self):
- pass
- def v(self):
- pass
- def w(self):
- pass
- '''
- "
- (goto-char (point-min))
- (let ((point (python-tests-look-at "(object):")))
- (should (not (python-nav-forward-defun)))
- (should (= point (point))))))
- (ert-deftest python-nav-beginning-of-statement-1 ()
- (python-tests-with-temp-buffer
- "
- v1 = 123 + \
- 456 + \
- 789
- v2 = (value1,
- value2,
- value3,
- value4)
- v3 = ('this is a string'
- 'that is continued'
- 'between lines'
- 'within a paren',
- # this is a comment, yo
- 'continue previous line')
- v4 = '''
- a very long
- string
- '''
- "
- (python-tests-look-at "v2 =")
- (python-util-forward-comment -1)
- (should (= (save-excursion
- (python-nav-beginning-of-statement)
- (point))
- (python-tests-look-at "v1 =" -1 t)))
- (python-tests-look-at "v3 =")
- (python-util-forward-comment -1)
- (should (= (save-excursion
- (python-nav-beginning-of-statement)
- (point))
- (python-tests-look-at "v2 =" -1 t)))
- (python-tests-look-at "v4 =")
- (python-util-forward-comment -1)
- (should (= (save-excursion
- (python-nav-beginning-of-statement)
- (point))
- (python-tests-look-at "v3 =" -1 t)))
- (goto-char (point-max))
- (python-util-forward-comment -1)
- (should (= (save-excursion
- (python-nav-beginning-of-statement)
- (point))
- (python-tests-look-at "v4 =" -1 t)))))
- (ert-deftest python-nav-end-of-statement-1 ()
- (python-tests-with-temp-buffer
- "
- v1 = 123 + \
- 456 + \
- 789
- v2 = (value1,
- value2,
- value3,
- value4)
- v3 = ('this is a string'
- 'that is continued'
- 'between lines'
- 'within a paren',
- # this is a comment, yo
- 'continue previous line')
- v4 = '''
- a very long
- string
- '''
- "
- (python-tests-look-at "v1 =")
- (should (= (save-excursion
- (python-nav-end-of-statement)
- (point))
- (save-excursion
- (python-tests-look-at "789")
- (line-end-position))))
- (python-tests-look-at "v2 =")
- (should (= (save-excursion
- (python-nav-end-of-statement)
- (point))
- (save-excursion
- (python-tests-look-at "value4)")
- (line-end-position))))
- (python-tests-look-at "v3 =")
- (should (= (save-excursion
- (python-nav-end-of-statement)
- (point))
- (save-excursion
- (python-tests-look-at
- "'continue previous line')")
- (line-end-position))))
- (python-tests-look-at "v4 =")
- (should (= (save-excursion
- (python-nav-end-of-statement)
- (point))
- (save-excursion
- (goto-char (point-max))
- (python-util-forward-comment -1)
- (point))))))
- (ert-deftest python-nav-forward-statement-1 ()
- (python-tests-with-temp-buffer
- "
- v1 = 123 + \
- 456 + \
- 789
- v2 = (value1,
- value2,
- value3,
- value4)
- v3 = ('this is a string'
- 'that is continued'
- 'between lines'
- 'within a paren',
- # this is a comment, yo
- 'continue previous line')
- v4 = '''
- a very long
- string
- '''
- "
- (python-tests-look-at "v1 =")
- (should (= (save-excursion
- (python-nav-forward-statement)
- (point))
- (python-tests-look-at "v2 =")))
- (should (= (save-excursion
- (python-nav-forward-statement)
- (point))
- (python-tests-look-at "v3 =")))
- (should (= (save-excursion
- (python-nav-forward-statement)
- (point))
- (python-tests-look-at "v4 =")))
- (should (= (save-excursion
- (python-nav-forward-statement)
- (point))
- (point-max)))))
- (ert-deftest python-nav-backward-statement-1 ()
- (python-tests-with-temp-buffer
- "
- v1 = 123 + \
- 456 + \
- 789
- v2 = (value1,
- value2,
- value3,
- value4)
- v3 = ('this is a string'
- 'that is continued'
- 'between lines'
- 'within a paren',
- # this is a comment, yo
- 'continue previous line')
- v4 = '''
- a very long
- string
- '''
- "
- (goto-char (point-max))
- (should (= (save-excursion
- (python-nav-backward-statement)
- (point))
- (python-tests-look-at "v4 =" -1)))
- (should (= (save-excursion
- (python-nav-backward-statement)
- (point))
- (python-tests-look-at "v3 =" -1)))
- (should (= (save-excursion
- (python-nav-backward-statement)
- (point))
- (python-tests-look-at "v2 =" -1)))
- (should (= (save-excursion
- (python-nav-backward-statement)
- (point))
- (python-tests-look-at "v1 =" -1)))))
- (ert-deftest python-nav-backward-statement-2 ()
- :expected-result :failed
- (python-tests-with-temp-buffer
- "
- v1 = 123 + \
- 456 + \
- 789
- v2 = (value1,
- value2,
- value3,
- value4)
- "
- ;; FIXME: For some reason `python-nav-backward-statement' is moving
- ;; back two sentences when starting from 'value4)'.
- (goto-char (point-max))
- (python-util-forward-comment -1)
- (should (= (save-excursion
- (python-nav-backward-statement)
- (point))
- (python-tests-look-at "v2 =" -1 t)))))
- (ert-deftest python-nav-beginning-of-block-1 ()
- (python-tests-with-temp-buffer
- "
- def decoratorFunctionWithArguments(arg1, arg2, arg3):
- '''print decorated function call data to stdout.
- Usage:
- @decoratorFunctionWithArguments('arg1', 'arg2')
- def func(a, b, c=True):
- pass
- '''
- def wwrap(f):
- print 'Inside wwrap()'
- def wrapped_f(*args):
- print 'Inside wrapped_f()'
- print 'Decorator arguments:', arg1, arg2, arg3
- f(*args)
- print 'After f(*args)'
- return wrapped_f
- return wwrap
- "
- (python-tests-look-at "return wwrap")
- (should (= (save-excursion
- (python-nav-beginning-of-block)
- (point))
- (python-tests-look-at "def decoratorFunctionWithArguments" -1)))
- (python-tests-look-at "print 'Inside wwrap()'")
- (should (= (save-excursion
- (python-nav-beginning-of-block)
- (point))
- (python-tests-look-at "def wwrap(f):" -1)))
- (python-tests-look-at "print 'After f(*args)'")
- (end-of-line)
- (should (= (save-excursion
- (python-nav-beginning-of-block)
- (point))
- (python-tests-look-at "def wrapped_f(*args):" -1)))
- (python-tests-look-at "return wrapped_f")
- (should (= (save-excursion
- (python-nav-beginning-of-block)
- (point))
- (python-tests-look-at "def wwrap(f):" -1)))))
- (ert-deftest python-nav-end-of-block-1 ()
- (python-tests-with-temp-buffer
- "
- def decoratorFunctionWithArguments(arg1, arg2, arg3):
- '''print decorated function call data to stdout.
- Usage:
- @decoratorFunctionWithArguments('arg1', 'arg2')
- def func(a, b, c=True):
- pass
- '''
- def wwrap(f):
- print 'Inside wwrap()'
- def wrapped_f(*args):
- print 'Inside wrapped_f()'
- print 'Decorator arguments:', arg1, arg2, arg3
- f(*args)
- print 'After f(*args)'
- return wrapped_f
- return wwrap
- "
- (python-tests-look-at "def decoratorFunctionWithArguments")
- (should (= (save-excursion
- (python-nav-end-of-block)
- (point))
- (save-excursion
- (goto-char (point-max))
- (python-util-forward-comment -1)
- (point))))
- (python-tests-look-at "def wwrap(f):")
- (should (= (save-excursion
- (python-nav-end-of-block)
- (point))
- (save-excursion
- (python-tests-look-at "return wrapped_f")
- (line-end-position))))
- (end-of-line)
- (should (= (save-excursion
- (python-nav-end-of-block)
- (point))
- (save-excursion
- (python-tests-look-at "return wrapped_f")
- (line-end-position))))
- (python-tests-look-at "f(*args)")
- (should (= (save-excursion
- (python-nav-end-of-block)
- (point))
- (save-excursion
- (python-tests-look-at "print 'After f(*args)'")
- (line-end-position))))))
- (ert-deftest python-nav-forward-block-1 ()
- "This also accounts as a test for `python-nav-backward-block'."
- (python-tests-with-temp-buffer
- "
- if request.user.is_authenticated():
- # def block():
- # pass
- try:
- profile = request.user.get_profile()
- except Profile.DoesNotExist:
- profile = Profile.objects.create(user=request.user)
- else:
- if profile.stats:
- profile.recalculate_stats()
- else:
- profile.clear_stats()
- finally:
- profile.views += 1
- profile.save()
- "
- (should (= (save-excursion (python-nav-forward-block))
- (python-tests-look-at "if request.user.is_authenticated():")))
- (should (= (save-excursion (python-nav-forward-block))
- (python-tests-look-at "try:")))
- (should (= (save-excursion (python-nav-forward-block))
- (python-tests-look-at "except Profile.DoesNotExist:")))
- (should (= (save-excursion (python-nav-forward-block))
- (python-tests-look-at "else:")))
- (should (= (save-excursion (python-nav-forward-block))
- (python-tests-look-at "if profile.stats:")))
- (should (= (save-excursion (python-nav-forward-block))
- (python-tests-look-at "else:")))
- (should (= (save-excursion (python-nav-forward-block))
- (python-tests-look-at "finally:")))
- ;; When point is at the last block, leave it there and return nil
- (should (not (save-excursion (python-nav-forward-block))))
- ;; Move backwards, and even if the number of moves is less than the
- ;; provided argument return the point.
- (should (= (save-excursion (python-nav-forward-block -10))
- (python-tests-look-at
- "if request.user.is_authenticated():" -1)))))
- (ert-deftest python-nav-forward-sexp-1 ()
- (python-tests-with-temp-buffer
- "
- a()
- b()
- c()
- "
- (python-tests-look-at "a()")
- (python-nav-forward-sexp)
- (should (looking-at "$"))
- (should (save-excursion
- (beginning-of-line)
- (looking-at "a()")))
- (python-nav-forward-sexp)
- (should (looking-at "$"))
- (should (save-excursion
- (beginning-of-line)
- (looking-at "b()")))
- (python-nav-forward-sexp)
- (should (looking-at "$"))
- (should (save-excursion
- (beginning-of-line)
- (looking-at "c()")))
- ;; The default behavior when next to a paren should do what lisp
- ;; does and, otherwise `blink-matching-open' breaks.
- (python-nav-forward-sexp -1)
- (should (looking-at "()"))
- (should (save-excursion
- (beginning-of-line)
- (looking-at "c()")))
- (end-of-line)
- ;; Skipping parens should jump to `bolp'
- (python-nav-forward-sexp -1 nil t)
- (should (looking-at "c()"))
- (forward-line -1)
- (end-of-line)
- ;; b()
- (python-nav-forward-sexp -1)
- (should (looking-at "()"))
- (python-nav-forward-sexp -1)
- (should (looking-at "b()"))
- (end-of-line)
- (python-nav-forward-sexp -1 nil t)
- (should (looking-at "b()"))
- (forward-line -1)
- (end-of-line)
- ;; a()
- (python-nav-forward-sexp -1)
- (should (looking-at "()"))
- (python-nav-forward-sexp -1)
- (should (looking-at "a()"))
- (end-of-line)
- (python-nav-forward-sexp -1 nil t)
- (should (looking-at "a()"))))
- (ert-deftest python-nav-forward-sexp-2 ()
- (python-tests-with-temp-buffer
- "
- def func():
- if True:
- aaa = bbb
- ccc = ddd
- eee = fff
- return ggg
- "
- (python-tests-look-at "aa =")
- (python-nav-forward-sexp)
- (should (looking-at " = bbb"))
- (python-nav-forward-sexp)
- (should (looking-at "$"))
- (should (save-excursion
- (back-to-indentation)
- (looking-at "aaa = bbb")))
- (python-nav-forward-sexp)
- (should (looking-at "$"))
- (should (save-excursion
- (back-to-indentation)
- (looking-at "ccc = ddd")))
- (python-nav-forward-sexp)
- (should (looking-at "$"))
- (should (save-excursion
- (back-to-indentation)
- (looking-at "eee = fff")))
- (python-nav-forward-sexp)
- (should (looking-at "$"))
- (should (save-excursion
- (back-to-indentation)
- (looking-at "return ggg")))
- (python-nav-forward-sexp -1)
- (should (looking-at "def func():"))))
- (ert-deftest python-nav-forward-sexp-3 ()
- (python-tests-with-temp-buffer
- "
- from some_module import some_sub_module
- from another_module import another_sub_module
- def another_statement():
- pass
- "
- (python-tests-look-at "some_module")
- (python-nav-forward-sexp)
- (should (looking-at " import"))
- (python-nav-forward-sexp)
- (should (looking-at " some_sub_module"))
- (python-nav-forward-sexp)
- (should (looking-at "$"))
- (should
- (save-excursion
- (back-to-indentation)
- (looking-at
- "from some_module import some_sub_module")))
- (python-nav-forward-sexp)
- (should (looking-at "$"))
- (should
- (save-excursion
- (back-to-indentation)
- (looking-at
- "from another_module import another_sub_module")))
- (python-nav-forward-sexp)
- (should (looking-at "$"))
- (should
- (save-excursion
- (back-to-indentation)
- (looking-at
- "pass")))
- (python-nav-forward-sexp -1)
- (should (looking-at "def another_statement():"))
- (python-nav-forward-sexp -1)
- (should (looking-at "from another_module import another_sub_module"))
- (python-nav-forward-sexp -1)
- (should (looking-at "from some_module import some_sub_module"))))
- (ert-deftest python-nav-forward-sexp-safe-1 ()
- (python-tests-with-temp-buffer
- "
- profile = Profile.objects.create(user=request.user)
- profile.notify()
- "
- (python-tests-look-at "profile =")
- (python-nav-forward-sexp-safe 1)
- (should (looking-at "$"))
- (beginning-of-line 1)
- (python-tests-look-at "user=request.user")
- (python-nav-forward-sexp-safe -1)
- (should (looking-at "(user=request.user)"))
- (python-nav-forward-sexp-safe -4)
- (should (looking-at "profile ="))
- (python-tests-look-at "user=request.user")
- (python-nav-forward-sexp-safe 3)
- (should (looking-at ")"))
- (python-nav-forward-sexp-safe 1)
- (should (looking-at "$"))
- (python-nav-forward-sexp-safe 1)
- (should (looking-at "$"))))
- (ert-deftest python-nav-up-list-1 ()
- (python-tests-with-temp-buffer
- "
- def f():
- if True:
- return [i for i in range(3)]
- "
- (python-tests-look-at "3)]")
- (python-nav-up-list)
- (should (looking-at "]"))
- (python-nav-up-list)
- (should (looking-at "$"))))
- (ert-deftest python-nav-backward-up-list-1 ()
- :expected-result :failed
- (python-tests-with-temp-buffer
- "
- def f():
- if True:
- return [i for i in range(3)]
- "
- (python-tests-look-at "3)]")
- (python-nav-backward-up-list)
- (should (looking-at "(3)\\]"))
- (python-nav-backward-up-list)
- (should (looking-at
- "\\[i for i in range(3)\\]"))
- ;; FIXME: Need to move to beginning-of-statement.
- (python-nav-backward-up-list)
- (should (looking-at
- "return \\[i for i in range(3)\\]"))
- (python-nav-backward-up-list)
- (should (looking-at "if True:"))
- (python-nav-backward-up-list)
- (should (looking-at "def f():"))))
- (ert-deftest python-indent-dedent-line-backspace-1 ()
- "Check de-indentation on first call. Bug#18319."
- (python-tests-with-temp-buffer
- "
- if True:
- x ()
- if False:
- "
- (python-tests-look-at "if False:")
- (call-interactively #'python-indent-dedent-line-backspace)
- (should (zerop (current-indentation)))
- ;; XXX: This should be a call to `undo' but it's triggering errors.
- (insert " ")
- (should (= (current-indentation) 4))
- (call-interactively #'python-indent-dedent-line-backspace)
- (should (zerop (current-indentation)))))
- (ert-deftest python-indent-dedent-line-backspace-2 ()
- "Check de-indentation with tabs. Bug#19730."
- (let ((tab-width 8))
- (python-tests-with-temp-buffer
- "
- if x:
- \tabcdefg
- "
- (python-tests-look-at "abcdefg")
- (goto-char (line-end-position))
- (call-interactively #'python-indent-dedent-line-backspace)
- (should
- (string= (buffer-substring-no-properties
- (line-beginning-position) (line-end-position))
- "\tabcdef")))))
- (ert-deftest python-indent-dedent-line-backspace-3 ()
- "Paranoid check of de-indentation with tabs. Bug#19730."
- (let ((tab-width 8))
- (python-tests-with-temp-buffer
- "
- if x:
- \tif y:
- \t abcdefg
- "
- (python-tests-look-at "abcdefg")
- (goto-char (line-end-position))
- (call-interactively #'python-indent-dedent-line-backspace)
- (should
- (string= (buffer-substring-no-properties
- (line-beginning-position) (line-end-position))
- "\t abcdef"))
- (back-to-indentation)
- (call-interactively #'python-indent-dedent-line-backspace)
- (should
- (string= (buffer-substring-no-properties
- (line-beginning-position) (line-end-position))
- "\tabcdef"))
- (call-interactively #'python-indent-dedent-line-backspace)
- (should
- (string= (buffer-substring-no-properties
- (line-beginning-position) (line-end-position))
- " abcdef"))
- (call-interactively #'python-indent-dedent-line-backspace)
- (should
- (string= (buffer-substring-no-properties
- (line-beginning-position) (line-end-position))
- "abcdef")))))
- ;;; Shell integration
- (defvar python-tests-shell-interpreter "python")
- (ert-deftest python-shell-get-process-name-1 ()
- "Check process name calculation sans `buffer-file-name'."
- (python-tests-with-temp-buffer
- ""
- (should (string= (python-shell-get-process-name nil)
- python-shell-buffer-name))
- (should (string= (python-shell-get-process-name t)
- (format "%s[%s]" python-shell-buffer-name (buffer-name))))))
- (ert-deftest python-shell-get-process-name-2 ()
- "Check process name calculation with `buffer-file-name'."
- (python-tests-with-temp-file
- ""
- ;; `buffer-file-name' is non-nil but the dedicated flag is nil and
- ;; should be respected.
- (should (string= (python-shell-get-process-name nil)
- python-shell-buffer-name))
- (should (string=
- (python-shell-get-process-name t)
- (format "%s[%s]" python-shell-buffer-name (buffer-name))))))
- (ert-deftest python-shell-internal-get-process-name-1 ()
- "Check the internal process name is buffer-unique sans `buffer-file-name'."
- (python-tests-with-temp-buffer
- ""
- (should (string= (python-shell-internal-get-process-name)
- (format "%s[%s]" python-shell-internal-buffer-name (buffer-name))))))
- (ert-deftest python-shell-internal-get-process-name-2 ()
- "Check the internal process name is buffer-unique with `buffer-file-name'."
- (python-tests-with-temp-file
- ""
- (should (string= (python-shell-internal-get-process-name)
- (format "%s[%s]" python-shell-internal-buffer-name (buffer-name))))))
- (ert-deftest python-shell-calculate-command-1 ()
- "Check the command to execute is calculated correctly.
- Using `python-shell-interpreter' and
- `python-shell-interpreter-args'."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (let ((python-shell-interpreter (executable-find
- python-tests-shell-interpreter))
- (python-shell-interpreter-args "-B"))
- (should (string=
- (format "%s %s"
- (shell-quote-argument python-shell-interpreter)
- python-shell-interpreter-args)
- (python-shell-calculate-command)))))
- (ert-deftest python-shell-calculate-pythonpath-1 ()
- "Test PYTHONPATH calculation."
- (let ((process-environment '("PYTHONPATH=/path0"))
- (python-shell-extra-pythonpaths '("/path1" "/path2")))
- (should (string= (python-shell-calculate-pythonpath)
- (concat "/path1" path-separator
- "/path2" path-separator "/path0")))))
- (ert-deftest python-shell-calculate-pythonpath-2 ()
- "Test existing paths are moved to front."
- (let ((process-environment
- (list (concat "PYTHONPATH=/path0" path-separator "/path1")))
- (python-shell-extra-pythonpaths '("/path1" "/path2")))
- (should (string= (python-shell-calculate-pythonpath)
- (concat "/path1" path-separator
- "/path2" path-separator "/path0")))))
- (ert-deftest python-shell-calculate-process-environment-1 ()
- "Test `python-shell-process-environment' modification."
- (let* ((python-shell-process-environment
- '("TESTVAR1=value1" "TESTVAR2=value2"))
- (process-environment (python-shell-calculate-process-environment)))
- (should (equal (getenv "TESTVAR1") "value1"))
- (should (equal (getenv "TESTVAR2") "value2"))))
- (ert-deftest python-shell-calculate-process-environment-2 ()
- "Test `python-shell-extra-pythonpaths' modification."
- (let* ((process-environment process-environment)
- (original-pythonpath (setenv "PYTHONPATH" "/path0"))
- (python-shell-extra-pythonpaths '("/path1" "/path2"))
- (process-environment (python-shell-calculate-process-environment)))
- (should (equal (getenv "PYTHONPATH")
- (concat "/path1" path-separator
- "/path2" path-separator "/path0")))))
- (ert-deftest python-shell-calculate-process-environment-3 ()
- "Test `python-shell-virtualenv-root' modification."
- (let* ((python-shell-virtualenv-root "/env")
- (process-environment
- (let (process-environment process-environment)
- (setenv "PYTHONHOME" "/home")
- (setenv "VIRTUAL_ENV")
- (python-shell-calculate-process-environment))))
- (should (not (getenv "PYTHONHOME")))
- (should (string= (getenv "VIRTUAL_ENV") "/env"))))
- (ert-deftest python-shell-calculate-process-environment-4 ()
- "Test PYTHONUNBUFFERED when `python-shell-unbuffered' is non-nil."
- (let* ((python-shell-unbuffered t)
- (process-environment
- (let ((process-environment process-environment))
- (setenv "PYTHONUNBUFFERED")
- (python-shell-calculate-process-environment))))
- (should (string= (getenv "PYTHONUNBUFFERED") "1"))))
- (ert-deftest python-shell-calculate-process-environment-5 ()
- "Test PYTHONUNBUFFERED when `python-shell-unbuffered' is nil."
- (let* ((python-shell-unbuffered nil)
- (process-environment
- (let ((process-environment process-environment))
- (setenv "PYTHONUNBUFFERED")
- (python-shell-calculate-process-environment))))
- (should (not (getenv "PYTHONUNBUFFERED")))))
- (ert-deftest python-shell-calculate-process-environment-6 ()
- "Test PYTHONUNBUFFERED=1 when `python-shell-unbuffered' is nil."
- (let* ((python-shell-unbuffered nil)
- (process-environment
- (let ((process-environment process-environment))
- (setenv "PYTHONUNBUFFERED" "1")
- (python-shell-calculate-process-environment))))
- ;; User default settings must remain untouched:
- (should (string= (getenv "PYTHONUNBUFFERED") "1"))))
- (ert-deftest python-shell-calculate-process-environment-7 ()
- "Test no side-effects on `process-environment'."
- (let* ((python-shell-process-environment
- '("TESTVAR1=value1" "TESTVAR2=value2"))
- (python-shell-virtualenv-root "/env")
- (python-shell-unbuffered t)
- (python-shell-extra-pythonpaths'("/path1" "/path2"))
- (original-process-environment (copy-sequence process-environment)))
- (python-shell-calculate-process-environment)
- (should (equal process-environment original-process-environment))))
- (ert-deftest python-shell-calculate-process-environment-8 ()
- "Test no side-effects on `tramp-remote-process-environment'."
- (let* ((default-directory "/ssh::/example/dir/")
- (python-shell-process-environment
- '("TESTVAR1=value1" "TESTVAR2=value2"))
- (python-shell-virtualenv-root "/env")
- (python-shell-unbuffered t)
- (python-shell-extra-pythonpaths'("/path1" "/path2"))
- (original-process-environment
- (copy-sequence tramp-remote-process-environment)))
- (python-shell-calculate-process-environment)
- (should (equal tramp-remote-process-environment original-process-environment))))
- (ert-deftest python-shell-calculate-exec-path-1 ()
- "Test `python-shell-exec-path' modification."
- (let* ((exec-path '("/path0"))
- (python-shell-exec-path '("/path1" "/path2"))
- (new-exec-path (python-shell-calculate-exec-path)))
- (should (equal new-exec-path '("/path1" "/path2" "/path0")))))
- (ert-deftest python-shell-calculate-exec-path-2 ()
- "Test `python-shell-virtualenv-root' modification."
- (let* ((exec-path '("/path0"))
- (python-shell-virtualenv-root "/env")
- (new-exec-path (python-shell-calculate-exec-path)))
- (should (equal new-exec-path
- (list (expand-file-name "/env/bin") "/path0")))))
- (ert-deftest python-shell-calculate-exec-path-3 ()
- "Test complete `python-shell-virtualenv-root' modification."
- (let* ((exec-path '("/path0"))
- (python-shell-exec-path '("/path1" "/path2"))
- (python-shell-virtualenv-root "/env")
- (new-exec-path (python-shell-calculate-exec-path)))
- (should (equal new-exec-path
- (list (expand-file-name "/env/bin")
- "/path1" "/path2" "/path0")))))
- (ert-deftest python-shell-calculate-exec-path-4 ()
- "Test complete `python-shell-virtualenv-root' with remote."
- (let* ((default-directory "/ssh::/example/dir/")
- (python-shell-remote-exec-path '("/path0"))
- (python-shell-exec-path '("/path1" "/path2"))
- (python-shell-virtualenv-root "/env")
- (new-exec-path (python-shell-calculate-exec-path)))
- (should (equal new-exec-path
- (list (expand-file-name "/env/bin")
- "/path1" "/path2" "/path0")))))
- (ert-deftest python-shell-calculate-exec-path-5 ()
- "Test no side-effects on `exec-path'."
- (let* ((exec-path '("/path0"))
- (python-shell-exec-path '("/path1" "/path2"))
- (python-shell-virtualenv-root "/env")
- (original-exec-path (copy-sequence exec-path)))
- (python-shell-calculate-exec-path)
- (should (equal exec-path original-exec-path))))
- (ert-deftest python-shell-calculate-exec-path-6 ()
- "Test no side-effects on `python-shell-remote-exec-path'."
- (let* ((default-directory "/ssh::/example/dir/")
- (python-shell-remote-exec-path '("/path0"))
- (python-shell-exec-path '("/path1" "/path2"))
- (python-shell-virtualenv-root "/env")
- (original-exec-path (copy-sequence python-shell-remote-exec-path)))
- (python-shell-calculate-exec-path)
- (should (equal python-shell-remote-exec-path original-exec-path))))
- (ert-deftest python-shell-with-environment-1 ()
- "Test environment with local `default-directory'."
- (let* ((exec-path '("/path0"))
- (python-shell-exec-path '("/path1" "/path2"))
- (original-exec-path exec-path)
- (python-shell-virtualenv-root "/env"))
- (python-shell-with-environment
- (should (equal exec-path
- (list (expand-file-name "/env/bin")
- "/path1" "/path2" "/path0")))
- (should (not (getenv "PYTHONHOME")))
- (should (string= (getenv "VIRTUAL_ENV") "/env")))
- (should (equal exec-path original-exec-path))))
- (ert-deftest python-shell-with-environment-2 ()
- "Test environment with remote `default-directory'."
- (let* ((default-directory "/ssh::/example/dir/")
- (python-shell-remote-exec-path '("/remote1" "/remote2"))
- (python-shell-exec-path '("/path1" "/path2"))
- (tramp-remote-process-environment '("EMACS=t"))
- (original-process-environment (copy-sequence tramp-remote-process-environment))
- (python-shell-virtualenv-root "/env"))
- (python-shell-with-environment
- (should (equal (python-shell-calculate-exec-path)
- (list (expand-file-name "/env/bin")
- "/path1" "/path2" "/remote1" "/remote2")))
- (let ((process-environment (python-shell-calculate-process-environment)))
- (should (not (getenv "PYTHONHOME")))
- (should (string= (getenv "VIRTUAL_ENV") "/env"))
- (should (equal tramp-remote-process-environment process-environment))))
- (should (equal tramp-remote-process-environment original-process-environment))))
- (ert-deftest python-shell-with-environment-3 ()
- "Test `python-shell-with-environment' is idempotent."
- (let* ((python-shell-extra-pythonpaths '("/example/dir/"))
- (python-shell-exec-path '("path1" "path2"))
- (python-shell-virtualenv-root "/home/user/env")
- (single-call
- (python-shell-with-environment
- (list exec-path process-environment)))
- (nested-call
- (python-shell-with-environment
- (python-shell-with-environment
- (list exec-path process-environment)))))
- (should (equal single-call nested-call))))
- (ert-deftest python-shell-make-comint-1 ()
- "Check comint creation for global shell buffer."
- (skip-unless (executable-find python-tests-shell-interpreter))
- ;; The interpreter can get killed too quickly to allow it to clean
- ;; up the tempfiles that the default python-shell-setup-codes create,
- ;; so it leaves tempfiles behind, which is a minor irritation.
- (let* ((python-shell-setup-codes nil)
- (python-shell-interpreter
- (executable-find python-tests-shell-interpreter))
- (proc-name (python-shell-get-process-name nil))
- (shell-buffer
- (python-tests-with-temp-buffer
- "" (python-shell-make-comint
- (python-shell-calculate-command) proc-name)))
- (process (get-buffer-process shell-buffer)))
- (unwind-protect
- (progn
- (set-process-query-on-exit-flag process nil)
- (should (process-live-p process))
- (with-current-buffer shell-buffer
- (should (eq major-mode 'inferior-python-mode))
- (should (string= (buffer-name) (format "*%s*" proc-name)))))
- (kill-buffer shell-buffer))))
- (ert-deftest python-shell-make-comint-2 ()
- "Check comint creation for internal shell buffer."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (let* ((python-shell-setup-codes nil)
- (python-shell-interpreter
- (executable-find python-tests-shell-interpreter))
- (proc-name (python-shell-internal-get-process-name))
- (shell-buffer
- (python-tests-with-temp-buffer
- "" (python-shell-make-comint
- (python-shell-calculate-command) proc-name nil t)))
- (process (get-buffer-process shell-buffer)))
- (unwind-protect
- (progn
- (set-process-query-on-exit-flag process nil)
- (should (process-live-p process))
- (with-current-buffer shell-buffer
- (should (eq major-mode 'inferior-python-mode))
- (should (string= (buffer-name) (format " *%s*" proc-name)))))
- (kill-buffer shell-buffer))))
- (ert-deftest python-shell-make-comint-3 ()
- "Check comint creation with overridden python interpreter and args.
- The command passed to `python-shell-make-comint' as argument must
- locally override global values set in `python-shell-interpreter'
- and `python-shell-interpreter-args' in the new shell buffer."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (let* ((python-shell-setup-codes nil)
- (python-shell-interpreter "interpreter")
- (python-shell-interpreter-args "--some-args")
- (proc-name (python-shell-get-process-name nil))
- (interpreter-override
- (concat (executable-find python-tests-shell-interpreter) " " "-i"))
- (shell-buffer
- (python-tests-with-temp-buffer
- "" (python-shell-make-comint interpreter-override proc-name nil)))
- (process (get-buffer-process shell-buffer)))
- (unwind-protect
- (progn
- (set-process-query-on-exit-flag process nil)
- (should (process-live-p process))
- (with-current-buffer shell-buffer
- (should (eq major-mode 'inferior-python-mode))
- (should (file-equal-p
- python-shell-interpreter
- (executable-find python-tests-shell-interpreter)))
- (should (string= python-shell-interpreter-args "-i"))))
- (kill-buffer shell-buffer))))
- (ert-deftest python-shell-make-comint-4 ()
- "Check shell calculated prompts regexps are set."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (let* ((process-environment process-environment)
- (python-shell-setup-codes nil)
- (python-shell-interpreter
- (executable-find python-tests-shell-interpreter))
- (python-shell-interpreter-args "-i")
- (python-shell--prompt-calculated-input-regexp nil)
- (python-shell--prompt-calculated-output-regexp nil)
- (python-shell-prompt-detect-enabled t)
- (python-shell-prompt-input-regexps '("extralargeinputprompt" "sml"))
- (python-shell-prompt-output-regexps '("extralargeoutputprompt" "sml"))
- (python-shell-prompt-regexp "in")
- (python-shell-prompt-block-regexp "block")
- (python-shell-prompt-pdb-regexp "pdf")
- (python-shell-prompt-output-regexp "output")
- (startup-code (concat "import sys\n"
- "sys.ps1 = 'py> '\n"
- "sys.ps2 = '..> '\n"
- "sys.ps3 = 'out '\n"))
- (startup-file (python-shell--save-temp-file startup-code))
- (proc-name (python-shell-get-process-name nil))
- (shell-buffer
- (progn
- (setenv "PYTHONSTARTUP" startup-file)
- (python-tests-with-temp-buffer
- "" (python-shell-make-comint
- (python-shell-calculate-command) proc-name nil))))
- (process (get-buffer-process shell-buffer)))
- (unwind-protect
- (progn
- (set-process-query-on-exit-flag process nil)
- (should (process-live-p process))
- (with-current-buffer shell-buffer
- (should (eq major-mode 'inferior-python-mode))
- (should (string=
- python-shell--prompt-calculated-input-regexp
- (concat "^\\(extralargeinputprompt\\|\\.\\.> \\|"
- "block\\|py> \\|pdf\\|sml\\|in\\)")))
- (should (string=
- python-shell--prompt-calculated-output-regexp
- "^\\(extralargeoutputprompt\\|output\\|out \\|sml\\)"))))
- (delete-file startup-file)
- (kill-buffer shell-buffer))))
- (ert-deftest python-shell-get-process-1 ()
- "Check dedicated shell process preference over global."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (python-tests-with-temp-file
- ""
- (let* ((python-shell-setup-codes nil)
- (python-shell-interpreter
- (executable-find python-tests-shell-interpreter))
- (global-proc-name (python-shell-get-process-name nil))
- (dedicated-proc-name (python-shell-get-process-name t))
- (global-shell-buffer
- (python-shell-make-comint
- (python-shell-calculate-command) global-proc-name))
- (dedicated-shell-buffer
- (python-shell-make-comint
- (python-shell-calculate-command) dedicated-proc-name))
- (global-process (get-buffer-process global-shell-buffer))
- (dedicated-process (get-buffer-process dedicated-shell-buffer)))
- (unwind-protect
- (progn
- (set-process-query-on-exit-flag global-process nil)
- (set-process-query-on-exit-flag dedicated-process nil)
- ;; Prefer dedicated if global also exists.
- (should (equal (python-shell-get-process) dedicated-process))
- (kill-buffer dedicated-shell-buffer)
- ;; If there's only global, use it.
- (should (equal (python-shell-get-process) global-process))
- (kill-buffer global-shell-buffer)
- ;; No buffer available.
- (should (not (python-shell-get-process))))
- (ignore-errors (kill-buffer global-shell-buffer))
- (ignore-errors (kill-buffer dedicated-shell-buffer))))))
- (ert-deftest python-shell-internal-get-or-create-process-1 ()
- "Check internal shell process creation fallback."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (python-tests-with-temp-file
- ""
- (should (not (process-live-p (python-shell-internal-get-process-name))))
- (let* ((python-shell-interpreter
- (executable-find python-tests-shell-interpreter))
- (internal-process-name (python-shell-internal-get-process-name))
- (internal-process (python-shell-internal-get-or-create-process))
- (internal-shell-buffer (process-buffer internal-process)))
- (unwind-protect
- (progn
- (set-process-query-on-exit-flag internal-process nil)
- (should (equal (process-name internal-process)
- internal-process-name))
- (should (equal internal-process
- (python-shell-internal-get-or-create-process)))
- ;; Assert the internal process is not a user process
- (should (not (python-shell-get-process)))
- (kill-buffer internal-shell-buffer))
- (ignore-errors (kill-buffer internal-shell-buffer))))))
- (ert-deftest python-shell-prompt-detect-1 ()
- "Check prompt autodetection."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (let ((process-environment process-environment))
- ;; Ensure no startup file is enabled
- (setenv "PYTHONSTARTUP" "")
- (should python-shell-prompt-detect-enabled)
- (should (equal (python-shell-prompt-detect) '(">>> " "... " "")))))
- (ert-deftest python-shell-prompt-detect-2 ()
- "Check prompt autodetection with startup file. Bug#17370."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (let* ((process-environment process-environment)
- (startup-code (concat "import sys\n"
- "sys.ps1 = 'py> '\n"
- "sys.ps2 = '..> '\n"
- "sys.ps3 = 'out '\n"))
- (startup-file (python-shell--save-temp-file startup-code)))
- (unwind-protect
- (progn
- ;; Ensure startup file is enabled
- (setenv "PYTHONSTARTUP" startup-file)
- (should python-shell-prompt-detect-enabled)
- (should (equal (python-shell-prompt-detect) '("py> " "..> " "out "))))
- (ignore-errors (delete-file startup-file)))))
- (ert-deftest python-shell-prompt-detect-3 ()
- "Check prompts are not autodetected when feature is disabled."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (let ((process-environment process-environment)
- (python-shell-prompt-detect-enabled nil))
- ;; Ensure no startup file is enabled
- (should (not python-shell-prompt-detect-enabled))
- (should (not (python-shell-prompt-detect)))))
- (ert-deftest python-shell-prompt-detect-4 ()
- "Check warning is shown when detection fails."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (let* ((process-environment process-environment)
- ;; Trigger failure by removing prompts in the startup file
- (startup-code (concat "import sys\n"
- "sys.ps1 = ''\n"
- "sys.ps2 = ''\n"
- "sys.ps3 = ''\n"))
- (startup-file (python-shell--save-temp-file startup-code)))
- (unwind-protect
- (progn
- (kill-buffer (get-buffer-create "*Warnings*"))
- (should (not (get-buffer "*Warnings*")))
- (setenv "PYTHONSTARTUP" startup-file)
- (should python-shell-prompt-detect-failure-warning)
- (should python-shell-prompt-detect-enabled)
- (should (not (python-shell-prompt-detect)))
- (should (get-buffer "*Warnings*")))
- (ignore-errors (delete-file startup-file)))))
- (ert-deftest python-shell-prompt-detect-5 ()
- "Check disabled warnings are not shown when detection fails."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (let* ((process-environment process-environment)
- (startup-code (concat "import sys\n"
- "sys.ps1 = ''\n"
- "sys.ps2 = ''\n"
- "sys.ps3 = ''\n"))
- (startup-file (python-shell--save-temp-file startup-code))
- (python-shell-prompt-detect-failure-warning nil))
- (unwind-protect
- (progn
- (kill-buffer (get-buffer-create "*Warnings*"))
- (should (not (get-buffer "*Warnings*")))
- (setenv "PYTHONSTARTUP" startup-file)
- (should (not python-shell-prompt-detect-failure-warning))
- (should python-shell-prompt-detect-enabled)
- (should (not (python-shell-prompt-detect)))
- (should (not (get-buffer "*Warnings*"))))
- (ignore-errors (delete-file startup-file)))))
- (ert-deftest python-shell-prompt-detect-6 ()
- "Warnings are not shown when detection is disabled."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (let* ((process-environment process-environment)
- (startup-code (concat "import sys\n"
- "sys.ps1 = ''\n"
- "sys.ps2 = ''\n"
- "sys.ps3 = ''\n"))
- (startup-file (python-shell--save-temp-file startup-code))
- (python-shell-prompt-detect-failure-warning t)
- (python-shell-prompt-detect-enabled nil))
- (unwind-protect
- (progn
- (kill-buffer (get-buffer-create "*Warnings*"))
- (should (not (get-buffer "*Warnings*")))
- (setenv "PYTHONSTARTUP" startup-file)
- (should python-shell-prompt-detect-failure-warning)
- (should (not python-shell-prompt-detect-enabled))
- (should (not (python-shell-prompt-detect)))
- (should (not (get-buffer "*Warnings*"))))
- (ignore-errors (delete-file startup-file)))))
- (ert-deftest python-shell-prompt-validate-regexps-1 ()
- "Check `python-shell-prompt-input-regexps' are validated."
- (let* ((python-shell-prompt-input-regexps '("\\("))
- (error-data (should-error (python-shell-prompt-validate-regexps)
- :type 'user-error)))
- (should
- (string= (cadr error-data)
- (format-message
- "Invalid regexp \\( in `python-shell-prompt-input-regexps'")))))
- (ert-deftest python-shell-prompt-validate-regexps-2 ()
- "Check `python-shell-prompt-output-regexps' are validated."
- (let* ((python-shell-prompt-output-regexps '("\\("))
- (error-data (should-error (python-shell-prompt-validate-regexps)
- :type 'user-error)))
- (should
- (string= (cadr error-data)
- (format-message
- "Invalid regexp \\( in `python-shell-prompt-output-regexps'")))))
- (ert-deftest python-shell-prompt-validate-regexps-3 ()
- "Check `python-shell-prompt-regexp' is validated."
- (let* ((python-shell-prompt-regexp "\\(")
- (error-data (should-error (python-shell-prompt-validate-regexps)
- :type 'user-error)))
- (should
- (string= (cadr error-data)
- (format-message
- "Invalid regexp \\( in `python-shell-prompt-regexp'")))))
- (ert-deftest python-shell-prompt-validate-regexps-4 ()
- "Check `python-shell-prompt-block-regexp' is validated."
- (let* ((python-shell-prompt-block-regexp "\\(")
- (error-data (should-error (python-shell-prompt-validate-regexps)
- :type 'user-error)))
- (should
- (string= (cadr error-data)
- (format-message
- "Invalid regexp \\( in `python-shell-prompt-block-regexp'")))))
- (ert-deftest python-shell-prompt-validate-regexps-5 ()
- "Check `python-shell-prompt-pdb-regexp' is validated."
- (let* ((python-shell-prompt-pdb-regexp "\\(")
- (error-data (should-error (python-shell-prompt-validate-regexps)
- :type 'user-error)))
- (should
- (string= (cadr error-data)
- (format-message
- "Invalid regexp \\( in `python-shell-prompt-pdb-regexp'")))))
- (ert-deftest python-shell-prompt-validate-regexps-6 ()
- "Check `python-shell-prompt-output-regexp' is validated."
- (let* ((python-shell-prompt-output-regexp "\\(")
- (error-data (should-error (python-shell-prompt-validate-regexps)
- :type 'user-error)))
- (should
- (string= (cadr error-data)
- (format-message
- "Invalid regexp \\( in `python-shell-prompt-output-regexp'")))))
- (ert-deftest python-shell-prompt-validate-regexps-7 ()
- "Check default regexps are valid."
- ;; should not signal error
- (python-shell-prompt-validate-regexps))
- (ert-deftest python-shell-prompt-set-calculated-regexps-1 ()
- "Check regexps are validated."
- (let* ((python-shell-prompt-output-regexp '("\\("))
- (python-shell--prompt-calculated-input-regexp nil)
- (python-shell--prompt-calculated-output-regexp nil)
- (python-shell-prompt-detect-enabled nil)
- (error-data (should-error (python-shell-prompt-set-calculated-regexps)
- :type 'user-error)))
- (should
- (string= (cadr error-data)
- (format-message
- "Invalid regexp \\( in `python-shell-prompt-output-regexp'")))))
- (ert-deftest python-shell-prompt-set-calculated-regexps-2 ()
- "Check `python-shell-prompt-input-regexps' are set."
- (let* ((python-shell-prompt-input-regexps '("my" "prompt"))
- (python-shell-prompt-output-regexps '(""))
- (python-shell-prompt-regexp "")
- (python-shell-prompt-block-regexp "")
- (python-shell-prompt-pdb-regexp "")
- (python-shell-prompt-output-regexp "")
- (python-shell--prompt-calculated-input-regexp nil)
- (python-shell--prompt-calculated-output-regexp nil)
- (python-shell-prompt-detect-enabled nil))
- (python-shell-prompt-set-calculated-regexps)
- (should (string= python-shell--prompt-calculated-input-regexp
- "^\\(prompt\\|my\\|\\)"))))
- (ert-deftest python-shell-prompt-set-calculated-regexps-3 ()
- "Check `python-shell-prompt-output-regexps' are set."
- (let* ((python-shell-prompt-input-regexps '(""))
- (python-shell-prompt-output-regexps '("my" "prompt"))
- (python-shell-prompt-regexp "")
- (python-shell-prompt-block-regexp "")
- (python-shell-prompt-pdb-regexp "")
- (python-shell-prompt-output-regexp "")
- (python-shell--prompt-calculated-input-regexp nil)
- (python-shell--prompt-calculated-output-regexp nil)
- (python-shell-prompt-detect-enabled nil))
- (python-shell-prompt-set-calculated-regexps)
- (should (string= python-shell--prompt-calculated-output-regexp
- "^\\(prompt\\|my\\|\\)"))))
- (ert-deftest python-shell-prompt-set-calculated-regexps-4 ()
- "Check user defined prompts are set."
- (let* ((python-shell-prompt-input-regexps '(""))
- (python-shell-prompt-output-regexps '(""))
- (python-shell-prompt-regexp "prompt")
- (python-shell-prompt-block-regexp "block")
- (python-shell-prompt-pdb-regexp "pdb")
- (python-shell-prompt-output-regexp "output")
- (python-shell--prompt-calculated-input-regexp nil)
- (python-shell--prompt-calculated-output-regexp nil)
- (python-shell-prompt-detect-enabled nil))
- (python-shell-prompt-set-calculated-regexps)
- (should (string= python-shell--prompt-calculated-input-regexp
- "^\\(prompt\\|block\\|pdb\\|\\)"))
- (should (string= python-shell--prompt-calculated-output-regexp
- "^\\(output\\|\\)"))))
- (ert-deftest python-shell-prompt-set-calculated-regexps-5 ()
- "Check order of regexps (larger first)."
- (let* ((python-shell-prompt-input-regexps '("extralargeinputprompt" "sml"))
- (python-shell-prompt-output-regexps '("extralargeoutputprompt" "sml"))
- (python-shell-prompt-regexp "in")
- (python-shell-prompt-block-regexp "block")
- (python-shell-prompt-pdb-regexp "pdf")
- (python-shell-prompt-output-regexp "output")
- (python-shell--prompt-calculated-input-regexp nil)
- (python-shell--prompt-calculated-output-regexp nil)
- (python-shell-prompt-detect-enabled nil))
- (python-shell-prompt-set-calculated-regexps)
- (should (string= python-shell--prompt-calculated-input-regexp
- "^\\(extralargeinputprompt\\|block\\|pdf\\|sml\\|in\\)"))
- (should (string= python-shell--prompt-calculated-output-regexp
- "^\\(extralargeoutputprompt\\|output\\|sml\\)"))))
- (ert-deftest python-shell-prompt-set-calculated-regexps-6 ()
- "Check detected prompts are included `regexp-quote'd."
- (skip-unless (executable-find python-tests-shell-interpreter))
- (let* ((python-shell-prompt-input-regexps '(""))
- (python-shell-prompt-output-regexps '(""))
- (python-shell-prompt-regexp "")
- (python-shell-prompt-block-regexp "")
- (python-shell-prompt-pdb-regexp "")
- (python-shell-prompt-output-regexp "")
- (python-shell--prompt-calculated-input-regexp nil)
- (python-shell--prompt-calculated-output-regexp nil)
- (python-shell-prompt-detect-enabled t)
- (process-environment process-environment)
- (startup-code (concat "import sys\n"
- "sys.ps1 = 'p.> '\n"
- "sys.ps2 = '..> '\n"
- "sys.ps3 = 'o.t '\n"))
- (startup-file (python-shell--save-temp-file startup-code)))
- (unwind-protect
- (progn
- (setenv "PYTHONSTARTUP" startup-file)
- (python-shell-prompt-set-calculated-regexps)
- (should (string= python-shell--prompt-calculated-input-regexp
- "^\\(\\.\\.> \\|p\\.> \\|\\)"))
- (should (string= python-shell--prompt-calculated-output-regexp
- "^\\(o\\.t \\|\\)")))
- (ignore-errors (delete-file startup-file)))))
- (ert-deftest python-shell-buffer-substring-1 ()
- "Selecting a substring of the whole buffer must match its contents."
- (python-tests-with-temp-buffer
- "
- class Foo(models.Model):
- pass
- class Bar(models.Model):
- pass
- "
- (should (string= (buffer-string)
- (python-shell-buffer-substring (point-min) (point-max))))))
- (ert-deftest python-shell-buffer-substring-2 ()
- "Main block should be removed if NOMAIN is non-nil."
- (python-tests-with-temp-buffer
- "
- class Foo(models.Model):
- pass
- class Bar(models.Model):
- pass
- if __name__ == \"__main__\":
- foo = Foo()
- print (foo)
- "
- (should (string= (python-shell-buffer-substring (point-min) (point-max) t)
- "
- class Foo(models.Model):
- pass
- class Bar(models.Model):
- pass
- "))))
- (ert-deftest python-shell-buffer-substring-3 ()
- "Main block should be removed if NOMAIN is non-nil."
- (python-tests-with-temp-buffer
- "
- class Foo(models.Model):
- pass
- if __name__ == \"__main__\":
- foo = Foo()
- print (foo)
- class Bar(models.Model):
- pass
- "
- (should (string= (python-shell-buffer-substring (point-min) (point-max) t)
- "
- class Foo(models.Model):
- pass
- class Bar(models.Model):
- pass
- "))))
- (ert-deftest python-shell-buffer-substring-4 ()
- "Coding cookie should be added for substrings."
- (python-tests-with-temp-buffer
- "# coding: latin-1
- class Foo(models.Model):
- pass
- if __name__ == \"__main__\":
- foo = Foo()
- print (foo)
- class Bar(models.Model):
- pass
- "
- (should (string= (python-shell-buffer-substring
- (python-tests-look-at "class Foo(models.Model):")
- (progn (python-nav-forward-sexp) (point)))
- "# -*- coding: latin-1 -*-
- class Foo(models.Model):
- pass"))))
- (ert-deftest python-shell-buffer-substring-5 ()
- "The proper amount of blank lines is added for a substring."
- (python-tests-with-temp-buffer
- "# coding: latin-1
- class Foo(models.Model):
- pass
- if __name__ == \"__main__\":
- foo = Foo()
- print (foo)
- class Bar(models.Model):
- pass
- "
- (should (string= (python-shell-buffer-substring
- (python-tests-look-at "class Bar(models.Model):")
- (progn (python-nav-forward-sexp) (point)))
- "# -*- coding: latin-1 -*-
- class Bar(models.Model):
- pass"))))
- (ert-deftest python-shell-buffer-substring-6 ()
- "Handle substring with coding cookie in the second line."
- (python-tests-with-temp-buffer
- "
- # coding: latin-1
- class Foo(models.Model):
- pass
- if __name__ == \"__main__\":
- foo = Foo()
- print (foo)
- class Bar(models.Model):
- pass
- "
- (should (string= (python-shell-buffer-substring
- (python-tests-look-at "# coding: latin-1")
- (python-tests-look-at "if __name__ == \"__main__\":"))
- "# -*- coding: latin-1 -*-
- class Foo(models.Model):
- pass
- "))))
- (ert-deftest python-shell-buffer-substring-7 ()
- "Ensure first coding cookie gets precedence."
- (python-tests-with-temp-buffer
- "# coding: utf-8
- # coding: latin-1
- class Foo(models.Model):
- pass
- if __name__ == \"__main__\":
- foo = Foo()
- print (foo)
- class Bar(models.Model):
- pass
- "
- (should (string= (python-shell-buffer-substring
- (python-tests-look-at "# coding: latin-1")
- (python-tests-look-at "if __name__ == \"__main__\":"))
- "# -*- coding: utf-8 -*-
- class Foo(models.Model):
- pass
- "))))
- (ert-deftest python-shell-buffer-substring-8 ()
- "Ensure first coding cookie gets precedence when sending whole buffer."
- (python-tests-with-temp-buffer
- "# coding: utf-8
- # coding: latin-1
- class Foo(models.Model):
- pass
- "
- (should (string= (python-shell-buffer-substring (point-min) (point-max))
- "# coding: utf-8
- class Foo(models.Model):
- pass
- "))))
- (ert-deftest python-shell-buffer-substring-9 ()
- "Check substring starting from `point-min'."
- (python-tests-with-temp-buffer
- "# coding: utf-8
- class Foo(models.Model):
- pass
- class Bar(models.Model):
- pass
- "
- (should (string= (python-shell-buffer-substring
- (point-min)
- (python-tests-look-at "class Bar(models.Model):"))
- "# coding: utf-8
- class Foo(models.Model):
- pass
- "))))
- (ert-deftest python-shell-buffer-substring-10 ()
- "Check substring from partial block."
- (python-tests-with-temp-buffer
- "
- def foo():
- print ('a')
- "
- (should (string= (python-shell-buffer-substring
- (python-tests-look-at "print ('a')")
- (point-max))
- "if True:
- print ('a')
- "))))
- (ert-deftest python-shell-buffer-substring-11 ()
- "Check substring from partial block and point within indentation."
- (python-tests-with-temp-buffer
- "
- def foo():
- print ('a')
- "
- (should (string= (python-shell-buffer-substring
- (progn
- (python-tests-look-at "print ('a')")
- (backward-char 1)
- (point))
- (point-max))
- "if True:
- print ('a')
- "))))
- (ert-deftest python-shell-buffer-substring-12 ()
- "Check substring from partial block and point in whitespace."
- (python-tests-with-temp-buffer
- "
- def foo():
- # Whitespace
- print ('a')
- "
- (should (string= (python-shell-buffer-substring
- (python-tests-look-at "# Whitespace")
- (point-max))
- "if True:
- # Whitespace
- print ('a')
- "))))
- ;;; Shell completion
- (ert-deftest python-shell-completion-native-interpreter-disabled-p-1 ()
- (let* ((python-shell-completion-native-disabled-interpreters (list "pypy"))
- (python-shell-interpreter "/some/path/to/bin/pypy"))
- (should (python-shell-completion-native-interpreter-disabled-p))))
- ;;; PDB Track integration
- ;;; Symbol completion
- ;;; Fill paragraph
- ;;; Skeletons
- ;;; FFAP
- ;;; Code check
- ;;; Eldoc
- (ert-deftest python-eldoc--get-symbol-at-point-1 ()
- "Test paren handling."
- (python-tests-with-temp-buffer
- "
- map(xx
- map(codecs.open('somefile'
- "
- (python-tests-look-at "ap(xx")
- (should (string= (python-eldoc--get-symbol-at-point) "map"))
- (goto-char (line-end-position))
- (should (string= (python-eldoc--get-symbol-at-point) "map"))
- (python-tests-look-at "('somefile'")
- (should (string= (python-eldoc--get-symbol-at-point) "map"))
- (goto-char (line-end-position))
- (should (string= (python-eldoc--get-symbol-at-point) "codecs.open"))))
- (ert-deftest python-eldoc--get-symbol-at-point-2 ()
- "Ensure self is replaced with the class name."
- (python-tests-with-temp-buffer
- "
- class TheClass:
- def some_method(self, n):
- return n
- def other(self):
- return self.some_method(1234)
- "
- (python-tests-look-at "self.some_method")
- (should (string= (python-eldoc--get-symbol-at-point)
- "TheClass.some_method"))
- (python-tests-look-at "1234)")
- (should (string= (python-eldoc--get-symbol-at-point)
- "TheClass.some_method"))))
- (ert-deftest python-eldoc--get-symbol-at-point-3 ()
- "Ensure symbol is found when point is at end of buffer."
- (python-tests-with-temp-buffer
- "
- some_symbol
- "
- (goto-char (point-max))
- (should (string= (python-eldoc--get-symbol-at-point)
- "some_symbol"))))
- (ert-deftest python-eldoc--get-symbol-at-point-4 ()
- "Ensure symbol is found when point is at whitespace."
- (python-tests-with-temp-buffer
- "
- some_symbol some_other_symbol
- "
- (python-tests-look-at " some_other_symbol")
- (should (string= (python-eldoc--get-symbol-at-point)
- "some_symbol"))))
- ;;; Imenu
- (ert-deftest python-imenu-create-index-1 ()
- (python-tests-with-temp-buffer
- "
- class Foo(models.Model):
- pass
- class Bar(models.Model):
- pass
- def decorator(arg1, arg2, arg3):
- '''print decorated function call data to stdout.
- Usage:
- @decorator('arg1', 'arg2')
- def func(a, b, c=True):
- pass
- '''
- def wrap(f):
- print ('wrap')
- def wrapped_f(*args):
- print ('wrapped_f')
- print ('Decorator arguments:', arg1, arg2, arg3)
- f(*args)
- print ('called f(*args)')
- return wrapped_f
- return wrap
- class Baz(object):
- def a(self):
- pass
- def b(self):
- pass
- class Frob(object):
- def c(self):
- pass
- "
- (goto-char (point-max))
- (should (equal
- (list
- (cons "Foo (class)" (copy-marker 2))
- (cons "Bar (class)" (copy-marker 38))
- (list
- "decorator (def)"
- (cons "*function definition*" (copy-marker 74))
- (list
- "wrap (def)"
- (cons "*function definition*" (copy-marker 254))
- (cons "wrapped_f (def)" (copy-marker 294))))
- (list
- "Baz (class)"
- (cons "*class definition*" (copy-marker 519))
- (cons "a (def)" (copy-marker 539))
- (cons "b (def)" (copy-marker 570))
- (list
- "Frob (class)"
- (cons "*class definition*" (copy-marker 601))
- (cons "c (def)" (copy-marker 626)))))
- (python-imenu-create-index)))))
- (ert-deftest python-imenu-create-index-2 ()
- (python-tests-with-temp-buffer
- "
- class Foo(object):
- def foo(self):
- def foo1():
- pass
- def foobar(self):
- pass
- "
- (goto-char (point-max))
- (should (equal
- (list
- (list
- "Foo (class)"
- (cons "*class definition*" (copy-marker 2))
- (list
- "foo (def)"
- (cons "*function definition*" (copy-marker 21))
- (cons "foo1 (def)" (copy-marker 40)))
- (cons "foobar (def)" (copy-marker 78))))
- (python-imenu-create-index)))))
- (ert-deftest python-imenu-create-index-3 ()
- (python-tests-with-temp-buffer
- "
- class Foo(object):
- def foo(self):
- def foo1():
- pass
- def foo2():
- pass
- "
- (goto-char (point-max))
- (should (equal
- (list
- (list
- "Foo (class)"
- (cons "*class definition*" (copy-marker 2))
- (list
- "foo (def)"
- (cons "*function definition*" (copy-marker 21))
- (cons "foo1 (def)" (copy-marker 40))
- (cons "foo2 (def)" (copy-marker 77)))))
- (python-imenu-create-index)))))
- (ert-deftest python-imenu-create-index-4 ()
- (python-tests-with-temp-buffer
- "
- class Foo(object):
- class Bar(object):
- def __init__(self):
- pass
- def __str__(self):
- pass
- def __init__(self):
- pass
- "
- (goto-char (point-max))
- (should (equal
- (list
- (list
- "Foo (class)"
- (cons "*class definition*" (copy-marker 2))
- (list
- "Bar (class)"
- (cons "*class definition*" (copy-marker 21))
- (cons "__init__ (def)" (copy-marker 44))
- (cons "__str__ (def)" (copy-marker 90)))
- (cons "__init__ (def)" (copy-marker 135))))
- (python-imenu-create-index)))))
- (ert-deftest python-imenu-create-flat-index-1 ()
- (python-tests-with-temp-buffer
- "
- class Foo(models.Model):
- pass
- class Bar(models.Model):
- pass
- def decorator(arg1, arg2, arg3):
- '''print decorated function call data to stdout.
- Usage:
- @decorator('arg1', 'arg2')
- def func(a, b, c=True):
- pass
- '''
- def wrap(f):
- print ('wrap')
- def wrapped_f(*args):
- print ('wrapped_f')
- print ('Decorator arguments:', arg1, arg2, arg3)
- f(*args)
- print ('called f(*args)')
- return wrapped_f
- return wrap
- class Baz(object):
- def a(self):
- pass
- def b(self):
- pass
- class Frob(object):
- def c(self):
- pass
- "
- (goto-char (point-max))
- (should (equal
- (list (cons "Foo" (copy-marker 2))
- (cons "Bar" (copy-marker 38))
- (cons "decorator" (copy-marker 74))
- (cons "decorator.wrap" (copy-marker 254))
- (cons "decorator.wrap.wrapped_f" (copy-marker 294))
- (cons "Baz" (copy-marker 519))
- (cons "Baz.a" (copy-marker 539))
- (cons "Baz.b" (copy-marker 570))
- (cons "Baz.Frob" (copy-marker 601))
- (cons "Baz.Frob.c" (copy-marker 626)))
- (python-imenu-create-flat-index)))))
- (ert-deftest python-imenu-create-flat-index-2 ()
- (python-tests-with-temp-buffer
- "
- class Foo(object):
- class Bar(object):
- def __init__(self):
- pass
- def __str__(self):
- pass
- def __init__(self):
- pass
- "
- (goto-char (point-max))
- (should (equal
- (list
- (cons "Foo" (copy-marker 2))
- (cons "Foo.Bar" (copy-marker 21))
- (cons "Foo.Bar.__init__" (copy-marker 44))
- (cons "Foo.Bar.__str__" (copy-marker 90))
- (cons "Foo.__init__" (copy-marker 135)))
- (python-imenu-create-flat-index)))))
- ;;; Misc helpers
- (ert-deftest python-info-current-defun-1 ()
- (python-tests-with-temp-buffer
- "
- def foo(a, b):
- "
- (forward-line 1)
- (should (string= "foo" (python-info-current-defun)))
- (should (string= "def foo" (python-info-current-defun t)))
- (forward-line 1)
- (should (not (python-info-current-defun)))
- (indent-for-tab-command)
- (should (string= "foo" (python-info-current-defun)))
- (should (string= "def foo" (python-info-current-defun t)))))
- (ert-deftest python-info-current-defun-2 ()
- (python-tests-with-temp-buffer
- "
- class C(object):
- def m(self):
- if True:
- return [i for i in range(3)]
- else:
- return []
- def b():
- do_b()
- def a():
- do_a()
- def c(self):
- do_c()
- "
- (forward-line 1)
- (should (string= "C" (python-info-current-defun)))
- (should (string= "class C" (python-info-current-defun t)))
- (python-tests-look-at "return [i for ")
- (should (string= "C.m" (python-info-current-defun)))
- (should (string= "def C.m" (python-info-current-defun t)))
- (python-tests-look-at "def b():")
- (should (string= "C.m.b" (python-info-current-defun)))
- (should (string= "def C.m.b" (python-info-current-defun t)))
- (forward-line 2)
- (indent-for-tab-command)
- (python-indent-dedent-line-backspace 1)
- (should (string= "C.m" (python-info-current-defun)))
- (should (string= "def C.m" (python-info-current-defun t)))
- (python-tests-look-at "def c(self):")
- (forward-line -1)
- (indent-for-tab-command)
- (should (string= "C.m.a" (python-info-current-defun)))
- (should (string= "def C.m.a" (python-info-current-defun t)))
- (python-indent-dedent-line-backspace 1)
- (should (string= "C.m" (python-info-current-defun)))
- (should (string= "def C.m" (python-info-current-defun t)))
- (python-indent-dedent-line-backspace 1)
- (should (string= "C" (python-info-current-defun)))
- (should (string= "class C" (python-info-current-defun t)))
- (python-tests-look-at "def c(self):")
- (should (string= "C.c" (python-info-current-defun)))
- (should (string= "def C.c" (python-info-current-defun t)))
- (python-tests-look-at "do_c()")
- (should (string= "C.c" (python-info-current-defun)))
- (should (string= "def C.c" (python-info-current-defun t)))))
- (ert-deftest python-info-current-defun-3 ()
- (python-tests-with-temp-buffer
- "
- def decoratorFunctionWithArguments(arg1, arg2, arg3):
- '''print decorated function call data to stdout.
- Usage:
- @decoratorFunctionWithArguments('arg1', 'arg2')
- def func(a, b, c=True):
- pass
- '''
- def wwrap(f):
- print 'Inside wwrap()'
- def wrapped_f(*args):
- print 'Inside wrapped_f()'
- print 'Decorator arguments:', arg1, arg2, arg3
- f(*args)
- print 'After f(*args)'
- return wrapped_f
- return wwrap
- "
- (python-tests-look-at "def wwrap(f):")
- (forward-line -1)
- (should (not (python-info-current-defun)))
- (indent-for-tab-command 1)
- (should (string= (python-info-current-defun)
- "decoratorFunctionWithArguments"))
- (should (string= (python-info-current-defun t)
- "def decoratorFunctionWithArguments"))
- (python-tests-look-at "def wrapped_f(*args):")
- (should (string= (python-info-current-defun)
- "decoratorFunctionWithArguments.wwrap.wrapped_f"))
- (should (string= (python-info-current-defun t)
- "def decoratorFunctionWithArguments.wwrap.wrapped_f"))
- (python-tests-look-at "return wrapped_f")
- (should (string= (python-info-current-defun)
- "decoratorFunctionWithArguments.wwrap"))
- (should (string= (python-info-current-defun t)
- "def decoratorFunctionWithArguments.wwrap"))
- (end-of-line 1)
- (python-tests-look-at "return wwrap")
- (should (string= (python-info-current-defun)
- "decoratorFunctionWithArguments"))
- (should (string= (python-info-current-defun t)
- "def decoratorFunctionWithArguments"))))
- (ert-deftest python-info-current-symbol-1 ()
- (python-tests-with-temp-buffer
- "
- class C(object):
- def m(self):
- self.c()
- def c(self):
- print ('a')
- "
- (python-tests-look-at "self.c()")
- (should (string= "self.c" (python-info-current-symbol)))
- (should (string= "C.c" (python-info-current-symbol t)))))
- (ert-deftest python-info-current-symbol-2 ()
- (python-tests-with-temp-buffer
- "
- class C(object):
- class M(object):
- def a(self):
- self.c()
- def c(self):
- pass
- "
- (python-tests-look-at "self.c()")
- (should (string= "self.c" (python-info-current-symbol)))
- (should (string= "C.M.c" (python-info-current-symbol t)))))
- (ert-deftest python-info-current-symbol-3 ()
- "Keywords should not be considered symbols."
- :expected-result :failed
- (python-tests-with-temp-buffer
- "
- class C(object):
- pass
- "
- ;; FIXME: keywords are not symbols.
- (python-tests-look-at "class C")
- (should (not (python-info-current-symbol)))
- (should (not (python-info-current-symbol t)))
- (python-tests-look-at "C(object)")
- (should (string= "C" (python-info-current-symbol)))
- (should (string= "class C" (python-info-current-symbol t)))))
- (ert-deftest python-info-statement-starts-block-p-1 ()
- (python-tests-with-temp-buffer
- "
- def long_function_name(
- var_one, var_two, var_three,
- var_four):
- print (var_one)
- "
- (python-tests-look-at "def long_function_name")
- (should (python-info-statement-starts-block-p))
- (python-tests-look-at "print (var_one)")
- (python-util-forward-comment -1)
- (should (python-info-statement-starts-block-p))))
- (ert-deftest python-info-statement-starts-block-p-2 ()
- (python-tests-with-temp-buffer
- "
- if width == 0 and height == 0 and \\\\
- color == 'red' and emphasis == 'strong' or \\\\
- highlight > 100:
- raise ValueError('sorry, you lose')
- "
- (python-tests-look-at "if width == 0 and")
- (should (python-info-statement-starts-block-p))
- (python-tests-look-at "raise ValueError(")
- (python-util-forward-comment -1)
- (should (python-info-statement-starts-block-p))))
- (ert-deftest python-info-statement-ends-block-p-1 ()
- (python-tests-with-temp-buffer
- "
- def long_function_name(
- var_one, var_two, var_three,
- var_four):
- print (var_one)
- "
- (python-tests-look-at "print (var_one)")
- (should (python-info-statement-ends-block-p))))
- (ert-deftest python-info-statement-ends-block-p-2 ()
- (python-tests-with-temp-buffer
- "
- if width == 0 and height == 0 and \\\\
- color == 'red' and emphasis == 'strong' or \\\\
- highlight > 100:
- raise ValueError(
- 'sorry, you lose'
- )
- "
- (python-tests-look-at "raise ValueError(")
- (should (python-info-statement-ends-block-p))))
- (ert-deftest python-info-beginning-of-statement-p-1 ()
- (python-tests-with-temp-buffer
- "
- def long_function_name(
- var_one, var_two, var_three,
- var_four):
- print (var_one)
- "
- (python-tests-look-at "def long_function_name")
- (should (python-info-beginning-of-statement-p))
- (forward-char 10)
- (should (not (python-info-beginning-of-statement-p)))
- (python-tests-look-at "print (var_one)")
- (should (python-info-beginning-of-statement-p))
- (goto-char (line-beginning-position))
- (should (not (python-info-beginning-of-statement-p)))))
- (ert-deftest python-info-beginning-of-statement-p-2 ()
- (python-tests-with-temp-buffer
- "
- if width == 0 and height == 0 and \\\\
- color == 'red' and emphasis == 'strong' or \\\\
- highlight > 100:
- raise ValueError(
- 'sorry, you lose'
- )
- "
- (python-tests-look-at "if width == 0 and")
- (should (python-info-beginning-of-statement-p))
- (forward-char 10)
- (should (not (python-info-beginning-of-statement-p)))
- (python-tests-look-at "raise ValueError(")
- (should (python-info-beginning-of-statement-p))
- (goto-char (line-beginning-position))
- (should (not (python-info-beginning-of-statement-p)))))
- (ert-deftest python-info-end-of-statement-p-1 ()
- (python-tests-with-temp-buffer
- "
- def long_function_name(
- var_one, var_two, var_three,
- var_four):
- print (var_one)
- "
- (python-tests-look-at "def long_function_name")
- (should (not (python-info-end-of-statement-p)))
- (end-of-line)
- (should (not (python-info-end-of-statement-p)))
- (python-tests-look-at "print (var_one)")
- (python-util-forward-comment -1)
- (should (python-info-end-of-statement-p))
- (python-tests-look-at "print (var_one)")
- (should (not (python-info-end-of-statement-p)))
- (end-of-line)
- (should (python-info-end-of-statement-p))))
- (ert-deftest python-info-end-of-statement-p-2 ()
- (python-tests-with-temp-buffer
- "
- if width == 0 and height == 0 and \\\\
- color == 'red' and emphasis == 'strong' or \\\\
- highlight > 100:
- raise ValueError(
- 'sorry, you lose'
- )
- "
- (python-tests-look-at "if width == 0 and")
- (should (not (python-info-end-of-statement-p)))
- (end-of-line)
- (should (not (python-info-end-of-statement-p)))
- (python-tests-look-at "raise ValueError(")
- (python-util-forward-comment -1)
- (should (python-info-end-of-statement-p))
- (python-tests-look-at "raise ValueError(")
- (should (not (python-info-end-of-statement-p)))
- (end-of-line)
- (should (not (python-info-end-of-statement-p)))
- (goto-char (point-max))
- (python-util-forward-comment -1)
- (should (python-info-end-of-statement-p))))
- (ert-deftest python-info-beginning-of-block-p-1 ()
- (python-tests-with-temp-buffer
- "
- def long_function_name(
- var_one, var_two, var_three,
- var_four):
- print (var_one)
- "
- (python-tests-look-at "def long_function_name")
- (should (python-info-beginning-of-block-p))
- (python-tests-look-at "var_one, var_two, var_three,")
- (should (not (python-info-beginning-of-block-p)))
- (python-tests-look-at "print (var_one)")
- (should (not (python-info-beginning-of-block-p)))))
- (ert-deftest python-info-beginning-of-block-p-2 ()
- (python-tests-with-temp-buffer
- "
- if width == 0 and height == 0 and \\\\
- color == 'red' and emphasis == 'strong' or \\\\
- highlight > 100:
- raise ValueError(
- 'sorry, you lose'
- )
- "
- (python-tests-look-at "if width == 0 and")
- (should (python-info-beginning-of-block-p))
- (python-tests-look-at "color == 'red' and emphasis")
- (should (not (python-info-beginning-of-block-p)))
- (python-tests-look-at "raise ValueError(")
- (should (not (python-info-beginning-of-block-p)))))
- (ert-deftest python-info-end-of-block-p-1 ()
- (python-tests-with-temp-buffer
- "
- def long_function_name(
- var_one, var_two, var_three,
- var_four):
- print (var_one)
- "
- (python-tests-look-at "def long_function_name")
- (should (not (python-info-end-of-block-p)))
- (python-tests-look-at "var_one, var_two, var_three,")
- (should (not (python-info-end-of-block-p)))
- (python-tests-look-at "var_four):")
- (end-of-line)
- (should (not (python-info-end-of-block-p)))
- (python-tests-look-at "print (var_one)")
- (should (not (python-info-end-of-block-p)))
- (end-of-line 1)
- (should (python-info-end-of-block-p))))
- (ert-deftest python-info-end-of-block-p-2 ()
- (python-tests-with-temp-buffer
- "
- if width == 0 and height == 0 and \\\\
- color == 'red' and emphasis == 'strong' or \\\\
- highlight > 100:
- raise ValueError(
- 'sorry, you lose'
- )
- "
- (python-tests-look-at "if width == 0 and")
- (should (not (python-info-end-of-block-p)))
- (python-tests-look-at "color == 'red' and emphasis == 'strong' or")
- (should (not (python-info-end-of-block-p)))
- (python-tests-look-at "highlight > 100:")
- (end-of-line)
- (should (not (python-info-end-of-block-p)))
- (python-tests-look-at "raise ValueError(")
- (should (not (python-info-end-of-block-p)))
- (end-of-line 1)
- (should (not (python-info-end-of-block-p)))
- (goto-char (point-max))
- (python-util-forward-comment -1)
- (should (python-info-end-of-block-p))))
- (ert-deftest python-info-dedenter-opening-block-position-1 ()
- (python-tests-with-temp-buffer
- "
- if request.user.is_authenticated():
- try:
- profile = request.user.get_profile()
- except Profile.DoesNotExist:
- profile = Profile.objects.create(user=request.user)
- else:
- if profile.stats:
- profile.recalculate_stats()
- else:
- profile.clear_stats()
- finally:
- profile.views += 1
- profile.save()
- "
- (python-tests-look-at "try:")
- (should (not (python-info-dedenter-opening-block-position)))
- (python-tests-look-at "except Profile.DoesNotExist:")
- (should (= (python-tests-look-at "try:" -1 t)
- (python-info-dedenter-opening-block-position)))
- (python-tests-look-at "else:")
- (should (= (python-tests-look-at "except Profile.DoesNotExist:" -1 t)
- (python-info-dedenter-opening-block-position)))
- (python-tests-look-at "if profile.stats:")
- (should (not (python-info-dedenter-opening-block-position)))
- (python-tests-look-at "else:")
- (should (= (python-tests-look-at "if profile.stats:" -1 t)
- (python-info-dedenter-opening-block-position)))
- (python-tests-look-at "finally:")
- (should (= (python-tests-look-at "else:" -2 t)
- (python-info-dedenter-opening-block-position)))))
- (ert-deftest python-info-dedenter-opening-block-position-2 ()
- (python-tests-with-temp-buffer
- "
- if request.user.is_authenticated():
- profile = Profile.objects.get_or_create(user=request.user)
- if profile.stats:
- profile.recalculate_stats()
- data = {
- 'else': 'do it'
- }
- 'else'
- "
- (python-tests-look-at "'else': 'do it'")
- (should (not (python-info-dedenter-opening-block-position)))
- (python-tests-look-at "'else'")
- (should (not (python-info-dedenter-opening-block-position)))))
- (ert-deftest python-info-dedenter-opening-block-position-3 ()
- (python-tests-with-temp-buffer
- "
- if save:
- try:
- write_to_disk(data)
- except IOError:
- msg = 'Error saving to disk'
- message(msg)
- logger.exception(msg)
- except Exception:
- if hide_details:
- logger.exception('Unhandled exception')
- else
- finally:
- data.free()
- "
- (python-tests-look-at "try:")
- (should (not (python-info-dedenter-opening-block-position)))
- (python-tests-look-at "except IOError:")
- (should (= (python-tests-look-at "try:" -1 t)
- (python-info-dedenter-opening-block-position)))
- (python-tests-look-at "except Exception:")
- (should (= (python-tests-look-at "except IOError:" -1 t)
- (python-info-dedenter-opening-block-position)))
- (python-tests-look-at "if hide_details:")
- (should (not (python-info-dedenter-opening-block-position)))
- ;; check indentation modifies the detected opening block
- (python-tests-look-at "else")
- (should (= (python-tests-look-at "if hide_details:" -1 t)
- (python-info-dedenter-opening-block-position)))
- (indent-line-to 8)
- (should (= (python-tests-look-at "if hide_details:" -1 t)
- (python-info-dedenter-opening-block-position)))
- (indent-line-to 4)
- (should (= (python-tests-look-at "except Exception:" -1 t)
- (python-info-dedenter-opening-block-position)))
- (indent-line-to 0)
- (should (= (python-tests-look-at "if save:" -1 t)
- (python-info-dedenter-opening-block-position)))))
- (ert-deftest python-info-dedenter-opening-block-positions-1 ()
- (python-tests-with-temp-buffer
- "
- if save:
- try:
- write_to_disk(data)
- except IOError:
- msg = 'Error saving to disk'
- message(msg)
- logger.exception(msg)
- except Exception:
- if hide_details:
- logger.exception('Unhandled exception')
- else
- finally:
- data.free()
- "
- (python-tests-look-at "try:")
- (should (not (python-info-dedenter-opening-block-positions)))
- (python-tests-look-at "except IOError:")
- (should
- (equal (list
- (python-tests-look-at "try:" -1 t))
- (python-info-dedenter-opening-block-positions)))
- (python-tests-look-at "except Exception:")
- (should
- (equal (list
- (python-tests-look-at "except IOError:" -1 t))
- (python-info-dedenter-opening-block-positions)))
- (python-tests-look-at "if hide_details:")
- (should (not (python-info-dedenter-opening-block-positions)))
- ;; check indentation does not modify the detected opening blocks
- (python-tests-look-at "else")
- (should
- (equal (list
- (python-tests-look-at "if hide_details:" -1 t)
- (python-tests-look-at "except Exception:" -1 t)
- (python-tests-look-at "if save:" -1 t))
- (python-info-dedenter-opening-block-positions)))
- (indent-line-to 8)
- (should
- (equal (list
- (python-tests-look-at "if hide_details:" -1 t)
- (python-tests-look-at "except Exception:" -1 t)
- (python-tests-look-at "if save:" -1 t))
- (python-info-dedenter-opening-block-positions)))
- (indent-line-to 4)
- (should
- (equal (list
- (python-tests-look-at "if hide_details:" -1 t)
- (python-tests-look-at "except Exception:" -1 t)
- (python-tests-look-at "if save:" -1 t))
- (python-info-dedenter-opening-block-positions)))
- (indent-line-to 0)
- (should
- (equal (list
- (python-tests-look-at "if hide_details:" -1 t)
- (python-tests-look-at "except Exception:" -1 t)
- (python-tests-look-at "if save:" -1 t))
- (python-info-dedenter-opening-block-positions)))))
- (ert-deftest python-info-dedenter-opening-block-positions-2 ()
- "Test detection of opening blocks for elif."
- (python-tests-with-temp-buffer
- "
- if var:
- if var2:
- something()
- elif var3:
- something_else()
- elif
- "
- (python-tests-look-at "elif var3:")
- (should
- (equal (list
- (python-tests-look-at "if var2:" -1 t)
- (python-tests-look-at "if var:" -1 t))
- (python-info-dedenter-opening-block-positions)))
- (python-tests-look-at "elif\n")
- (should
- (equal (list
- (python-tests-look-at "elif var3:" -1 t)
- (python-tests-look-at "if var:" -1 t))
- (python-info-dedenter-opening-block-positions)))))
- (ert-deftest python-info-dedenter-opening-block-positions-3 ()
- "Test detection of opening blocks for else."
- (python-tests-with-temp-buffer
- "
- try:
- something()
- except:
- if var:
- if var2:
- something()
- elif var3:
- something_else()
- else
- if var4:
- while var5:
- var4.pop()
- else
- for value in var6:
- if value > 0:
- print value
- else
- "
- (python-tests-look-at "else\n")
- (should
- (equal (list
- (python-tests-look-at "elif var3:" -1 t)
- (python-tests-look-at "if var:" -1 t)
- (python-tests-look-at "except:" -1 t))
- (python-info-dedenter-opening-block-positions)))
- (python-tests-look-at "else\n")
- (should
- (equal (list
- (python-tests-look-at "while var5:" -1 t)
- (python-tests-look-at "if var4:" -1 t))
- (python-info-dedenter-opening-block-positions)))
- (python-tests-look-at "else\n")
- (should
- (equal (list
- (python-tests-look-at "if value > 0:" -1 t)
- (python-tests-look-at "for value in var6:" -1 t)
- (python-tests-look-at "if var4:" -1 t))
- (python-info-dedenter-opening-block-positions)))))
- (ert-deftest python-info-dedenter-opening-block-positions-4 ()
- "Test detection of opening blocks for except."
- (python-tests-with-temp-buffer
- "
- try:
- something()
- except ValueError:
- something_else()
- except
- "
- (python-tests-look-at "except ValueError:")
- (should
- (equal (list (python-tests-look-at "try:" -1 t))
- (python-info-dedenter-opening-block-positions)))
- (python-tests-look-at "except\n")
- (should
- (equal (list (python-tests-look-at "except ValueError:" -1 t))
- (python-info-dedenter-opening-block-positions)))))
- (ert-deftest python-info-dedenter-opening-block-positions-5 ()
- "Test detection of opening blocks for finally."
- (python-tests-with-temp-buffer
- "
- try:
- something()
- finally
- try:
- something_else()
- except:
- logger.exception('something went wrong')
- finally
- try:
- something_else_else()
- except Exception:
- logger.exception('something else went wrong')
- else:
- print ('all good')
- finally
- "
- (python-tests-look-at "finally\n")
- (should
- (equal (list (python-tests-look-at "try:" -1 t))
- (python-info-dedenter-opening-block-positions)))
- (python-tests-look-at "finally\n")
- (should
- (equal (list (python-tests-look-at "except:" -1 t))
- (python-info-dedenter-opening-block-positions)))
- (python-tests-look-at "finally\n")
- (should
- (equal (list (python-tests-look-at "else:" -1 t))
- (python-info-dedenter-opening-block-positions)))))
- (ert-deftest python-info-dedenter-opening-block-message-1 ()
- "Test dedenters inside strings are ignored."
- (python-tests-with-temp-buffer
- "'''
- try:
- something()
- except:
- logger.exception('something went wrong')
- '''
- "
- (python-tests-look-at "except\n")
- (should (not (python-info-dedenter-opening-block-message)))))
- (ert-deftest python-info-dedenter-opening-block-message-2 ()
- "Test except keyword."
- (python-tests-with-temp-buffer
- "
- try:
- something()
- except:
- logger.exception('something went wrong')
- "
- (python-tests-look-at "except:")
- (should (string=
- "Closes try:"
- (substring-no-properties
- (python-info-dedenter-opening-block-message))))
- (end-of-line)
- (should (string=
- "Closes try:"
- (substring-no-properties
- (python-info-dedenter-opening-block-message))))))
- (ert-deftest python-info-dedenter-opening-block-message-3 ()
- "Test else keyword."
- (python-tests-with-temp-buffer
- "
- try:
- something()
- except:
- logger.exception('something went wrong')
- else:
- logger.debug('all good')
- "
- (python-tests-look-at "else:")
- (should (string=
- "Closes except:"
- (substring-no-properties
- (python-info-dedenter-opening-block-message))))
- (end-of-line)
- (should (string=
- "Closes except:"
- (substring-no-properties
- (python-info-dedenter-opening-block-message))))))
- (ert-deftest python-info-dedenter-opening-block-message-4 ()
- "Test finally keyword."
- (python-tests-with-temp-buffer
- "
- try:
- something()
- except:
- logger.exception('something went wrong')
- else:
- logger.debug('all good')
- finally:
- clean()
- "
- (python-tests-look-at "finally:")
- (should (string=
- "Closes else:"
- (substring-no-properties
- (python-info-dedenter-opening-block-message))))
- (end-of-line)
- (should (string=
- "Closes else:"
- (substring-no-properties
- (python-info-dedenter-opening-block-message))))))
- (ert-deftest python-info-dedenter-opening-block-message-5 ()
- "Test elif keyword."
- (python-tests-with-temp-buffer
- "
- if a:
- something()
- elif b:
- "
- (python-tests-look-at "elif b:")
- (should (string=
- "Closes if a:"
- (substring-no-properties
- (python-info-dedenter-opening-block-message))))
- (end-of-line)
- (should (string=
- "Closes if a:"
- (substring-no-properties
- (python-info-dedenter-opening-block-message))))))
- (ert-deftest python-info-dedenter-statement-p-1 ()
- "Test dedenters inside strings are ignored."
- (python-tests-with-temp-buffer
- "'''
- try:
- something()
- except:
- logger.exception('something went wrong')
- '''
- "
- (python-tests-look-at "except\n")
- (should (not (python-info-dedenter-statement-p)))))
- (ert-deftest python-info-dedenter-statement-p-2 ()
- "Test except keyword."
- (python-tests-with-temp-buffer
- "
- try:
- something()
- except:
- logger.exception('something went wrong')
- "
- (python-tests-look-at "except:")
- (should (= (point) (python-info-dedenter-statement-p)))
- (end-of-line)
- (should (= (save-excursion
- (back-to-indentation)
- (point))
- (python-info-dedenter-statement-p)))))
- (ert-deftest python-info-dedenter-statement-p-3 ()
- "Test else keyword."
- (python-tests-with-temp-buffer
- "
- try:
- something()
- except:
- logger.exception('something went wrong')
- else:
- logger.debug('all good')
- "
- (python-tests-look-at "else:")
- (should (= (point) (python-info-dedenter-statement-p)))
- (end-of-line)
- (should (= (save-excursion
- (back-to-indentation)
- (point))
- (python-info-dedenter-statement-p)))))
- (ert-deftest python-info-dedenter-statement-p-4 ()
- "Test finally keyword."
- (python-tests-with-temp-buffer
- "
- try:
- something()
- except:
- logger.exception('something went wrong')
- else:
- logger.debug('all good')
- finally:
- clean()
- "
- (python-tests-look-at "finally:")
- (should (= (point) (python-info-dedenter-statement-p)))
- (end-of-line)
- (should (= (save-excursion
- (back-to-indentation)
- (point))
- (python-info-dedenter-statement-p)))))
- (ert-deftest python-info-dedenter-statement-p-5 ()
- "Test elif keyword."
- (python-tests-with-temp-buffer
- "
- if a:
- something()
- elif b:
- "
- (python-tests-look-at "elif b:")
- (should (= (point) (python-info-dedenter-statement-p)))
- (end-of-line)
- (should (= (save-excursion
- (back-to-indentation)
- (point))
- (python-info-dedenter-statement-p)))))
- (ert-deftest python-info-line-ends-backslash-p-1 ()
- (python-tests-with-temp-buffer
- "
- objects = Thing.objects.all() \\\\
- .filter(
- type='toy',
- status='bought'
- ) \\\\
- .aggregate(
- Sum('amount')
- ) \\\\
- .values_list()
- "
- (should (python-info-line-ends-backslash-p 2)) ; .filter(...
- (should (python-info-line-ends-backslash-p 3))
- (should (python-info-line-ends-backslash-p 4))
- (should (python-info-line-ends-backslash-p 5))
- (should (python-info-line-ends-backslash-p 6)) ; ) \...
- (should (python-info-line-ends-backslash-p 7))
- (should (python-info-line-ends-backslash-p 8))
- (should (python-info-line-ends-backslash-p 9))
- (should (not (python-info-line-ends-backslash-p 10))))) ; .values_list()...
- (ert-deftest python-info-beginning-of-backslash-1 ()
- (python-tests-with-temp-buffer
- "
- objects = Thing.objects.all() \\\\
- .filter(
- type='toy',
- status='bought'
- ) \\\\
- .aggregate(
- Sum('amount')
- ) \\\\
- .values_list()
- "
- (let ((first 2)
- (second (python-tests-look-at ".filter("))
- (third (python-tests-look-at ".aggregate(")))
- (should (= first (python-info-beginning-of-backslash 2)))
- (should (= second (python-info-beginning-of-backslash 3)))
- (should (= second (python-info-beginning-of-backslash 4)))
- (should (= second (python-info-beginning-of-backslash 5)))
- (should (= second (python-info-beginning-of-backslash 6)))
- (should (= third (python-info-beginning-of-backslash 7)))
- (should (= third (python-info-beginning-of-backslash 8)))
- (should (= third (python-info-beginning-of-backslash 9)))
- (should (not (python-info-beginning-of-backslash 10))))))
- (ert-deftest python-info-continuation-line-p-1 ()
- (python-tests-with-temp-buffer
- "
- if width == 0 and height == 0 and \\\\
- color == 'red' and emphasis == 'strong' or \\\\
- highlight > 100:
- raise ValueError(
- 'sorry, you lose'
- )
- "
- (python-tests-look-at "if width == 0 and height == 0 and")
- (should (not (python-info-continuation-line-p)))
- (python-tests-look-at "color == 'red' and emphasis == 'strong' or")
- (should (python-info-continuation-line-p))
- (python-tests-look-at "highlight > 100:")
- (should (python-info-continuation-line-p))
- (python-tests-look-at "raise ValueError(")
- (should (not (python-info-continuation-line-p)))
- (python-tests-look-at "'sorry, you lose'")
- (should (python-info-continuation-line-p))
- (forward-line 1)
- (should (python-info-continuation-line-p))
- (python-tests-look-at ")")
- (should (python-info-continuation-line-p))
- (forward-line 1)
- (should (not (python-info-continuation-line-p)))))
- (ert-deftest python-info-block-continuation-line-p-1 ()
- (python-tests-with-temp-buffer
- "
- if width == 0 and height == 0 and \\\\
- color == 'red' and emphasis == 'strong' or \\\\
- highlight > 100:
- raise ValueError(
- 'sorry, you lose'
- )
- "
- (python-tests-look-at "if width == 0 and")
- (should (not (python-info-block-continuation-line-p)))
- (python-tests-look-at "color == 'red' and emphasis == 'strong' or")
- (should (= (python-info-block-continuation-line-p)
- (python-tests-look-at "if width == 0 and" -1 t)))
- (python-tests-look-at "highlight > 100:")
- (should (not (python-info-block-continuation-line-p)))))
- (ert-deftest python-info-block-continuation-line-p-2 ()
- (python-tests-with-temp-buffer
- "
- def foo(a,
- b,
- c):
- pass
- "
- (python-tests-look-at "def foo(a,")
- (should (not (python-info-block-continuation-line-p)))
- (python-tests-look-at "b,")
- (should (= (python-info-block-continuation-line-p)
- (python-tests-look-at "def foo(a," -1 t)))
- (python-tests-look-at "c):")
- (should (not (python-info-block-continuation-line-p)))))
- (ert-deftest python-info-assignment-statement-p-1 ()
- (python-tests-with-temp-buffer
- "
- data = foo(), bar() \\\\
- baz(), 4 \\\\
- 5, 6
- "
- (python-tests-look-at "data = foo(), bar()")
- (should (python-info-assignment-statement-p))
- (should (python-info-assignment-statement-p t))
- (python-tests-look-at "baz(), 4")
- (should (python-info-assignment-statement-p))
- (should (not (python-info-assignment-statement-p t)))
- (python-tests-look-at "5, 6")
- (should (python-info-assignment-statement-p))
- (should (not (python-info-assignment-statement-p t)))))
- (ert-deftest python-info-assignment-statement-p-2 ()
- (python-tests-with-temp-buffer
- "
- data = (foo(), bar()
- baz(), 4
- 5, 6)
- "
- (python-tests-look-at "data = (foo(), bar()")
- (should (python-info-assignment-statement-p))
- (should (python-info-assignment-statement-p t))
- (python-tests-look-at "baz(), 4")
- (should (python-info-assignment-statement-p))
- (should (not (python-info-assignment-statement-p t)))
- (python-tests-look-at "5, 6)")
- (should (python-info-assignment-statement-p))
- (should (not (python-info-assignment-statement-p t)))))
- (ert-deftest python-info-assignment-statement-p-3 ()
- (python-tests-with-temp-buffer
- "
- data '=' 42
- "
- (python-tests-look-at "data '=' 42")
- (should (not (python-info-assignment-statement-p)))
- (should (not (python-info-assignment-statement-p t)))))
- (ert-deftest python-info-assignment-continuation-line-p-1 ()
- (python-tests-with-temp-buffer
- "
- data = foo(), bar() \\\\
- baz(), 4 \\\\
- 5, 6
- "
- (python-tests-look-at "data = foo(), bar()")
- (should (not (python-info-assignment-continuation-line-p)))
- (python-tests-look-at "baz(), 4")
- (should (= (python-info-assignment-continuation-line-p)
- (python-tests-look-at "foo()," -1 t)))
- (python-tests-look-at "5, 6")
- (should (not (python-info-assignment-continuation-line-p)))))
- (ert-deftest python-info-assignment-continuation-line-p-2 ()
- (python-tests-with-temp-buffer
- "
- data = (foo(), bar()
- baz(), 4
- 5, 6)
- "
- (python-tests-look-at "data = (foo(), bar()")
- (should (not (python-info-assignment-continuation-line-p)))
- (python-tests-look-at "baz(), 4")
- (should (= (python-info-assignment-continuation-line-p)
- (python-tests-look-at "(foo()," -1 t)))
- (python-tests-look-at "5, 6)")
- (should (not (python-info-assignment-continuation-line-p)))))
- (ert-deftest python-info-looking-at-beginning-of-defun-1 ()
- (python-tests-with-temp-buffer
- "
- def decorat0r(deff):
- '''decorates stuff.
- @decorat0r
- def foo(arg):
- ...
- '''
- def wrap():
- deff()
- return wwrap
- "
- (python-tests-look-at "def decorat0r(deff):")
- (should (python-info-looking-at-beginning-of-defun))
- (python-tests-look-at "def foo(arg):")
- (should (not (python-info-looking-at-beginning-of-defun)))
- (python-tests-look-at "def wrap():")
- (should (python-info-looking-at-beginning-of-defun))
- (python-tests-look-at "deff()")
- (should (not (python-info-looking-at-beginning-of-defun)))))
- (ert-deftest python-info-current-line-comment-p-1 ()
- (python-tests-with-temp-buffer
- "
- # this is a comment
- foo = True # another comment
- '#this is a string'
- if foo:
- # more comments
- print ('bar') # print bar
- "
- (python-tests-look-at "# this is a comment")
- (should (python-info-current-line-comment-p))
- (python-tests-look-at "foo = True # another comment")
- (should (not (python-info-current-line-comment-p)))
- (python-tests-look-at "'#this is a string'")
- (should (not (python-info-current-line-comment-p)))
- (python-tests-look-at "# more comments")
- (should (python-info-current-line-comment-p))
- (python-tests-look-at "print ('bar') # print bar")
- (should (not (python-info-current-line-comment-p)))))
- (ert-deftest python-info-current-line-empty-p ()
- (python-tests-with-temp-buffer
- "
- # this is a comment
- foo = True # another comment
- "
- (should (python-info-current-line-empty-p))
- (python-tests-look-at "# this is a comment")
- (should (not (python-info-current-line-empty-p)))
- (forward-line 1)
- (should (python-info-current-line-empty-p))))
- (ert-deftest python-info-docstring-p-1 ()
- "Test module docstring detection."
- (python-tests-with-temp-buffer
- "# -*- coding: utf-8 -*-
- #!/usr/bin/python
- '''
- Module Docstring Django style.
- '''
- u'''Additional module docstring.'''
- '''Not a module docstring.'''
- "
- (python-tests-look-at "Module Docstring Django style.")
- (should (python-info-docstring-p))
- (python-tests-look-at "u'''Additional module docstring.'''")
- (should (python-info-docstring-p))
- (python-tests-look-at "'''Not a module docstring.'''")
- (should (not (python-info-docstring-p)))))
- (ert-deftest python-info-docstring-p-2 ()
- "Test variable docstring detection."
- (python-tests-with-temp-buffer
- "
- variable = 42
- U'''Variable docstring.'''
- '''Additional variable docstring.'''
- '''Not a variable docstring.'''
- "
- (python-tests-look-at "Variable docstring.")
- (should (python-info-docstring-p))
- (python-tests-look-at "u'''Additional variable docstring.'''")
- (should (python-info-docstring-p))
- (python-tests-look-at "'''Not a variable docstring.'''")
- (should (not (python-info-docstring-p)))))
- (ert-deftest python-info-docstring-p-3 ()
- "Test function docstring detection."
- (python-tests-with-temp-buffer
- "
- def func(a, b):
- r'''
- Function docstring.
- onetwo style.
- '''
- R'''Additional function docstring.'''
- '''Not a function docstring.'''
- return a + b
- "
- (python-tests-look-at "Function docstring.")
- (should (python-info-docstring-p))
- (python-tests-look-at "R'''Additional function docstring.'''")
- (should (python-info-docstring-p))
- (python-tests-look-at "'''Not a function docstring.'''")
- (should (not (python-info-docstring-p)))))
- (ert-deftest python-info-docstring-p-4 ()
- "Test class docstring detection."
- (python-tests-with-temp-buffer
- "
- class Class:
- ur'''
- Class docstring.
- symmetric style.
- '''
- uR'''
- Additional class docstring.
- '''
- '''Not a class docstring.'''
- pass
- "
- (python-tests-look-at "Class docstring.")
- (should (python-info-docstring-p))
- (python-tests-look-at "uR'''") ;; Additional class docstring
- (should (python-info-docstring-p))
- (python-tests-look-at "'''Not a class docstring.'''")
- (should (not (python-info-docstring-p)))))
- (ert-deftest python-info-docstring-p-5 ()
- "Test class attribute docstring detection."
- (python-tests-with-temp-buffer
- "
- class Class:
- attribute = 42
- Ur'''
- Class attribute docstring.
- pep-257 style.
- '''
- UR'''
- Additional class attribute docstring.
- '''
- '''Not a class attribute docstring.'''
- pass
- "
- (python-tests-look-at "Class attribute docstring.")
- (should (python-info-docstring-p))
- (python-tests-look-at "UR'''") ;; Additional class attr docstring
- (should (python-info-docstring-p))
- (python-tests-look-at "'''Not a class attribute docstring.'''")
- (should (not (python-info-docstring-p)))))
- (ert-deftest python-info-docstring-p-6 ()
- "Test class method docstring detection."
- (python-tests-with-temp-buffer
- "
- class Class:
- def __init__(self, a, b):
- self.a = a
- self.b = b
- def __call__(self):
- '''Method docstring.
- pep-257-nn style.
- '''
- '''Additional method docstring.'''
- '''Not a method docstring.'''
- return self.a + self.b
- "
- (python-tests-look-at "Method docstring.")
- (should (python-info-docstring-p))
- (python-tests-look-at "'''Additional method docstring.'''")
- (should (python-info-docstring-p))
- (python-tests-look-at "'''Not a method docstring.'''")
- (should (not (python-info-docstring-p)))))
- (ert-deftest python-info-encoding-from-cookie-1 ()
- "Should detect it on first line."
- (python-tests-with-temp-buffer
- "# coding=latin-1
- foo = True # another comment
- "
- (should (eq (python-info-encoding-from-cookie) 'latin-1))))
- (ert-deftest python-info-encoding-from-cookie-2 ()
- "Should detect it on second line."
- (python-tests-with-temp-buffer
- "
- # coding=latin-1
- foo = True # another comment
- "
- (should (eq (python-info-encoding-from-cookie) 'latin-1))))
- (ert-deftest python-info-encoding-from-cookie-3 ()
- "Should not be detected on third line (and following ones)."
- (python-tests-with-temp-buffer
- "
- # coding=latin-1
- foo = True # another comment
- "
- (should (not (python-info-encoding-from-cookie)))))
- (ert-deftest python-info-encoding-from-cookie-4 ()
- "Should detect Emacs style."
- (python-tests-with-temp-buffer
- "# -*- coding: latin-1 -*-
- foo = True # another comment"
- (should (eq (python-info-encoding-from-cookie) 'latin-1))))
- (ert-deftest python-info-encoding-from-cookie-5 ()
- "Should detect Vim style."
- (python-tests-with-temp-buffer
- "# vim: set fileencoding=latin-1 :
- foo = True # another comment"
- (should (eq (python-info-encoding-from-cookie) 'latin-1))))
- (ert-deftest python-info-encoding-from-cookie-6 ()
- "First cookie wins."
- (python-tests-with-temp-buffer
- "# -*- coding: iso-8859-1 -*-
- # vim: set fileencoding=latin-1 :
- foo = True # another comment"
- (should (eq (python-info-encoding-from-cookie) 'iso-8859-1))))
- (ert-deftest python-info-encoding-from-cookie-7 ()
- "First cookie wins."
- (python-tests-with-temp-buffer
- "# vim: set fileencoding=latin-1 :
- # -*- coding: iso-8859-1 -*-
- foo = True # another comment"
- (should (eq (python-info-encoding-from-cookie) 'latin-1))))
- (ert-deftest python-info-encoding-1 ()
- "Should return the detected encoding from cookie."
- (python-tests-with-temp-buffer
- "# vim: set fileencoding=latin-1 :
- foo = True # another comment"
- (should (eq (python-info-encoding) 'latin-1))))
- (ert-deftest python-info-encoding-2 ()
- "Should default to utf-8."
- (python-tests-with-temp-buffer
- "# No encoding for you
- foo = True # another comment"
- (should (eq (python-info-encoding) 'utf-8))))
- ;;; Utility functions
- (ert-deftest python-util-goto-line-1 ()
- (python-tests-with-temp-buffer
- (concat
- "# a comment
- # another comment
- def foo(a, b, c):
- pass" (make-string 20 ?\n))
- (python-util-goto-line 10)
- (should (= (line-number-at-pos) 10))
- (python-util-goto-line 20)
- (should (= (line-number-at-pos) 20))))
- (ert-deftest python-util-clone-local-variables-1 ()
- (let ((buffer (generate-new-buffer
- "python-util-clone-local-variables-1"))
- (varcons
- '((python-fill-docstring-style . django)
- (python-shell-interpreter . "python")
- (python-shell-interpreter-args . "manage.py shell")
- (python-shell-prompt-regexp . "In \\[[0-9]+\\]: ")
- (python-shell-prompt-output-regexp . "Out\\[[0-9]+\\]: ")
- (python-shell-extra-pythonpaths "/home/user/pylib/")
- (python-shell-completion-setup-code
- . "from IPython.core.completerlib import module_completion")
- (python-shell-completion-string-code
- . "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
- (python-shell-virtualenv-root
- . "/home/user/.virtualenvs/project"))))
- (with-current-buffer buffer
- (kill-all-local-variables)
- (dolist (ccons varcons)
- (set (make-local-variable (car ccons)) (cdr ccons))))
- (python-tests-with-temp-buffer
- ""
- (python-util-clone-local-variables buffer)
- (dolist (ccons varcons)
- (should
- (equal (symbol-value (car ccons)) (cdr ccons)))))
- (kill-buffer buffer)))
- (ert-deftest python-util-strip-string-1 ()
- (should (string= (python-util-strip-string "\t\r\n str") "str"))
- (should (string= (python-util-strip-string "str \n\r") "str"))
- (should (string= (python-util-strip-string "\t\r\n str \n\r ") "str"))
- (should
- (string= (python-util-strip-string "\n str \nin \tg \n\r") "str \nin \tg"))
- (should (string= (python-util-strip-string "\n \t \n\r ") ""))
- (should (string= (python-util-strip-string "") "")))
- (ert-deftest python-util-forward-comment-1 ()
- (python-tests-with-temp-buffer
- (concat
- "# a comment
- # another comment
- # bad indented comment
- # more comments" (make-string 9999 ?\n))
- (python-util-forward-comment 1)
- (should (= (point) (point-max)))
- (python-util-forward-comment -1)
- (should (= (point) (point-min)))))
- (ert-deftest python-util-valid-regexp-p-1 ()
- (should (python-util-valid-regexp-p ""))
- (should (python-util-valid-regexp-p python-shell-prompt-regexp))
- (should (not (python-util-valid-regexp-p "\\("))))
- ;;; Electricity
- (ert-deftest python-parens-electric-indent-1 ()
- (let ((eim electric-indent-mode))
- (unwind-protect
- (progn
- (python-tests-with-temp-buffer
- "
- from django.conf.urls import patterns, include, url
- from django.contrib import admin
- from myapp import views
- urlpatterns = patterns('',
- url(r'^$', views.index
- )
- "
- (electric-indent-mode 1)
- (python-tests-look-at "views.index")
- (end-of-line)
- ;; Inserting commas within the same line should leave
- ;; indentation unchanged.
- (python-tests-self-insert ",")
- (should (= (current-indentation) 4))
- ;; As well as any other input happening within the same
- ;; set of parens.
- (python-tests-self-insert " name='index')")
- (should (= (current-indentation) 4))
- ;; But a comma outside it, should trigger indentation.
- (python-tests-self-insert ",")
- (should (= (current-indentation) 23))
- ;; Newline indents to the first argument column
- (python-tests-self-insert "\n")
- (should (= (current-indentation) 23))
- ;; All this input must not change indentation
- (indent-line-to 4)
- (python-tests-self-insert "url(r'^/login$', views.login)")
- (should (= (current-indentation) 4))
- ;; But this comma does
- (python-tests-self-insert ",")
- (should (= (current-indentation) 23))))
- (or eim (electric-indent-mode -1)))))
- (ert-deftest python-triple-quote-pairing ()
- (let ((epm electric-pair-mode))
- (unwind-protect
- (progn
- (python-tests-with-temp-buffer
- "\"\"\n"
- (or epm (electric-pair-mode 1))
- (goto-char (1- (point-max)))
- (python-tests-self-insert ?\")
- (should (string= (buffer-string)
- "\"\"\"\"\"\"\n"))
- (should (= (point) 4)))
- (python-tests-with-temp-buffer
- "\n"
- (python-tests-self-insert (list ?\" ?\" ?\"))
- (should (string= (buffer-string)
- "\"\"\"\"\"\"\n"))
- (should (= (point) 4)))
- (python-tests-with-temp-buffer
- "\"\n\"\"\n"
- (goto-char (1- (point-max)))
- (python-tests-self-insert ?\")
- (should (= (point) (1- (point-max))))
- (should (string= (buffer-string)
- "\"\n\"\"\"\n"))))
- (or epm (electric-pair-mode -1)))))
- ;;; Hideshow support
- (ert-deftest python-hideshow-hide-levels-1 ()
- "Should hide all methods when called after class start."
- (let ((enabled hs-minor-mode))
- (unwind-protect
- (progn
- (python-tests-with-temp-buffer
- "
- class SomeClass:
- def __init__(self, arg, kwarg=1):
- self.arg = arg
- self.kwarg = kwarg
- def filter(self, nums):
- def fn(item):
- return item in [self.arg, self.kwarg]
- return filter(fn, nums)
- def __str__(self):
- return '%s-%s' % (self.arg, self.kwarg)
- "
- (hs-minor-mode 1)
- (python-tests-look-at "class SomeClass:")
- (forward-line)
- (hs-hide-level 1)
- (should
- (string=
- (python-tests-visible-string)
- "
- class SomeClass:
- def __init__(self, arg, kwarg=1):
- def filter(self, nums):
- def __str__(self):"))))
- (or enabled (hs-minor-mode -1)))))
- (ert-deftest python-hideshow-hide-levels-2 ()
- "Should hide nested methods and parens at end of defun."
- (let ((enabled hs-minor-mode))
- (unwind-protect
- (progn
- (python-tests-with-temp-buffer
- "
- class SomeClass:
- def __init__(self, arg, kwarg=1):
- self.arg = arg
- self.kwarg = kwarg
- def filter(self, nums):
- def fn(item):
- return item in [self.arg, self.kwarg]
- return filter(fn, nums)
- def __str__(self):
- return '%s-%s' % (self.arg, self.kwarg)
- "
- (hs-minor-mode 1)
- (python-tests-look-at "def fn(item):")
- (hs-hide-block)
- (should
- (string=
- (python-tests-visible-string)
- "
- class SomeClass:
- def __init__(self, arg, kwarg=1):
- self.arg = arg
- self.kwarg = kwarg
- def filter(self, nums):
- def fn(item):
- return filter(fn, nums)
- def __str__(self):
- return '%s-%s' % (self.arg, self.kwarg)
- "))))
- (or enabled (hs-minor-mode -1)))))
- (provide 'python-tests)
- ;; Local Variables:
- ;; indent-tabs-mode: nil
- ;; End:
- ;;; python-tests.el ends here
|