+ ni:Rt^RIt^RIt^RIt^RIt^RIHt^RIHt^RIH t H t H t H t H t ^RIt^RIt^RIt^RIt^RIHtHtHt]P,P/^]!]!]4P444^RIHtHt^RIHtH t ^RI!H"t"H#t#H$t$H%t%H&t&]!R R R 7R R lt'!R R4t(!RR4t)RRlt*RRlt+Rt,]-R8Xd]P\!],!44R#R#)zf Interactive test runner for fortsh. Runs both YAML-based test specifications and pytest test files. N)Path)datetime)ListDictAnyTupleOptional)initForeStyle) FortshPTYFortshTestSession)KEYSget_key) OutputMatcher match_exactmatch_contains match_regex MatchResultF)stripconvertc0V^8dQhR\R\/#)textreturnstr)formats"u/Users/matthewwolffe/Documents/GithubOrgs/FortranGoingOnForty/fortsh-interactive-tests/tests/interactive/run_tests.py __annotate__r$s##c\P!RRV4p\P!RRV4p\P!RRV4pV#)z0Remove ANSI and OSC control sequences from text.z\x1b\].*?(?:\x07|\x1b\\)z)\x1b\[[\x30-\x3f]*[\x20-\x2f]*[\x40-\x7e]z \x1b[^\[\]].?)resub)rs&rstrip_control_sequencesr%$sB 66-r4 8D 66>D ID 66"B -D Kr c:a]tRt^/toRtRV3RlRlltRtVtR#) TestResultzResult of a single test.c2<V^8dQhRS[RS[RS[RS[/#)rnamepassederrorduration)rboolfloat)r __classdict__s"rrTestResult.__annotate__2s)!!S!$!s!5!r c6WnW nW0nW@nR#N)r)r*r+r,)selfr)r*r+r,s&&&&&r__init__TestResult.__init__2s    r )r,r+r)r*N)r"g)__name__ __module__ __qualname____firstlineno____doc__r4__static_attributes____classdictcell__r/s@rr'r'/s"!!!r r'ca]tRt^9toRtRV3RlRlltRV3RlRlltV3RlRltV3R lR ltV3R lR lt V3R lRlt V3RlRlt Rt Vt R#)YAMLTestRunnerz Runs tests defined in YAML specification files. Uses session reuse to avoid PTY exhaustion - reuses the same fortsh session across multiple tests, resetting state between them. c,<V^8dQhRS[RS[RS[/#)r fortsh_pathverbosetests_per_session)rr-int)rr/s"rrYAMLTestRunner.__annotate__As#C$SVr cTWnW n.VnW0nRVn^VnR#r2)rArBresultsrC_current_session _test_count)r3rArBrCs&&&&rr4YAMLTestRunner.__init__As*& )+ !259r Nc2<V^8dQhRS[RS[RS[RS[/#)renvrc_filefreshr)dictrr-r )rr/s"rrrEIs+%%%%%%c%%PT%%aj%%r c bT;'gZVPRJ;'gDVPP'*;'g!VPVP,^8HpV'dVPeGVPP 4\ P !4\P!R4\VPT;'g/R7VnVPPVR7VP#VP4VP# L;i)z Get a fortsh session, reusing existing one if possible. Args: env: Environment variables for the session rc_file: RC file path fresh: If True, always create a new session Returns: FortshPTY session Ng?rArLrM) rH is_runningrIrCstopgccollecttimesleepr rAstart_reset_session)r3rLrMrN needs_news&&&& r _get_sessionYAMLTestRunner._get_sessionIs   ; ;  ! !T ) ; ;%%00 0 ; ;   t55 5 :  $$0))..0  3$- ,,II2%D !  ! ! ' ' ' 8 $$$    !$$$s ;D**D.c<V^8dQhRR/#rrN)rr/s"rrrEpsr c <VPeVPP'gR#VPPR4VPPR4\P!R4VPP 4R# R#;i)z"Reset session state between tests.NzC-czC-ug?)rHrSsend_keyrWrX clear_bufferr3s&rrZYAMLTestRunner._reset_sessionpsv  (0E0E0P0P0P    ! ! * *5 1  ! ! * *5 1 JJsO  ! ! . . 0  s A&BBc<V^8dQhRR/#r_r`)rr/s"rrrEs$r c VPe:VPP4RTn\P!4R#R# L$;i)zClean up the current session.N)rHrTrUrVrds&r_cleanup_sessionYAMLTestRunner._cleanup_sessionsG  , %%**,%)D ! JJL - s A Ac6<V^8dQhRS[RS[S[,/#)r spec_pathr)rrr')rr/s"rrrEs tZ0@r c  b\V4;_uu_4p\P!V4pRRR4XPR/4PRVP4p\ R\ P RV R\P 24.pVPR.4FpVPV4pVPV4V;P^, un \P!R4VP'd=\ R \ P R \P R VP" 24K\%VP&4p\ R \ P( R \P R VP" R V 24K V# +'giEL{;i)z Run all tests in a YAML spec file. Args: spec_path: Path to the YAML specification file Returns: List of TestResult objects Nmetadatacategory z=== z ===testsg333333?z u✓ u✗z: )openyaml safe_loadgetstemprintr CYANr RESET_ALLrun_testappendrIrWrXr*GREENr)r%r+RED) r3rkfspecrnrGtestresult error_msgs && r run_spec_fileYAMLTestRunner.run_spec_files9)__>>!$D88J+// INNK 499+T(4/@ABHHWb)D]]4(F NN6 "    !  JJsO}}}4::,c%//):!FKK=IJ3FLLA 488*C'8&++b TU*+__s F F. c<<V^8dQhRS[S[S[3,RS[/#)rrr)rrrr')rr/s"rrrEs'[=[=T#s(^[= [=r c  VPRR4p\P!4pVPR/4pVPRR4pVPRR4p\VPVR7pVP VR 7VPR .4FpVP Wx4K R V9dkVR ,p VP V 4\P!4V, p \VR R V 4VP4\P!4#RV9dVP%4p \V 4p VR,pW9dT\P!4V, p \VRRV R2V 4VP4\P!4#\P!4V, p \VR R V 4VP4\P!4#\P!4V, p \VR R V 4VP4\P!4# \Pd\P!4T, p TP4p \T 4p \T 4R8dT R,R,p \TRRT RT R2T 4uTP4\P!4#\ dfp \P!4T, p \TRR\#T 4 2T 4uRp ? TP4\P!4#Rp ? ii;i TP4\P!4i;i \Pd8p \P!4T, p \TRRT 2T 4uRp ? #Rp ? i\P&d8p \P!4T, p \TRRT 2T 4uRp ? #Rp ? i\ d>p \P!4T, p \TR\#T 4T 4uRp ? #Rp ? ii;i)zh Run a single test from a spec. Args: test: Test specification dictionary Returns: TestResult r)z Unnamed testrLrM /dev/null fresh_sessionFrQrRsteps expect_outputTr"i,:Ni,Nz...z Expected 'z' not found. Got: ''zError: N expect_notzFound unwanted output: 'z Timeout: zUnexpected EOF: )rurWr rArY _execute_stepexpectr'rTrUrVpexpectTIMEOUTget_clean_outputr%len Exceptionrwait_for_promptEOF)r3rr) start_timerLrMrfortshstepexpectedr, raw_outputoutputeunwanteds&& rrzYAMLTestRunner.run_testssxx/YY[ hhub!((9k2%8 I = ,,F LLL )7  HHWb1D&&v42#d*#O4H h/#'99;#;)$b(CR  +"T)#335F4V !8!Dv;,%+D\E%9F) %( 2EfXQO$ @  9%#'99;#;) %%c!fX.$ 2  96   Fyy{Z/HdEYqc?HE E{{ Myy{Z/HdE-=aS+A8L L =yy{Z/HdE3q68< < =s)N :M :I>%N $AM %N ()M %N 7)M %N BMM %N .M7M85M-M.M 2%N MM 'NN Q&,O Q&Q&(Q&),PQ& Q&(Q&)2Q!Q&!Q&c@<V^8dQhRS[RS[S[S[3,RR/#)rrrrN)r rrr)rr/s"rrrEs*11I1T#s(^11r c xRV9dVPVR,4R #RV9dVPVR,4R #RV9dVPVR,4R #RV9d$VR,FpVPV4K R #RV9d \P!VR,4R #RV9dVP 4R #RV9dVP VR,4R #RV9dFVR,PR ^4pVR,PR ^P4pVPWE4R #R #) zExecute a single test step.send send_linerb send_keyswaitrrresizerowscolsN) rrrbrWrXrrruset_terminal_size)r3rrkeyrrs&&& rrYAMLTestRunner._execute_steps T> KKV % D   T+. / 4  OOD, - D K(($) t^ JJtF| $ $ &  " " $   MM$x. )  >%%fb1D>%%fb1D  $ $T 0r )rHrIrArGrCrB)F)NrF)r6r7r8r9r:r4r\rZrhrrzrr;r<r=s@rr?r?9sU%%%%N B[=[=z11r r?c$V^8dQhR\/#)rrr)rs"rrrsCr c>.ROp\PPR4pV'dVP^V4VFYp\PP V4'gK*\P !V\P4'gKWVu# R#)zFind the fortsh binary. ./bin/fortshFORTSH)rz ../bin/fortshz../../bin/fortshz../fortsh/bin/fortsh)osenvironruinsertpathisfileaccessX_OK) candidatesenv_pathrs rfind_fortsh_binaryrskJzz~~h'H!X& 77>>$  BIIdBGG$<$<K r cJV^8dQhR\\,R\RR/#)rrG output_pathrN)rr'r)rs"rrr6s+!F!Fd:&6!FT!Fd!Fr c ,\RV44p\V4V, p\RV44p\VR4;_uu_4pVPR4VPR\P !4P R4 R24VPR4VPR \V4 R 24VPR V R 24VPR V R 24VPR VR R24V^8dmVPR4VFUpVP'dKVPRVP R24VPRVP R24KW VPR4VPR4VPR4VFIpVP'dRMRpVPRVP RV RVPR R24KK RRR4R# +'giR#;i)z Generate a markdown report of test results. Args: results: List of test results output_path: Path to write the report c3L"TFqP'gK^xK R#5iNr*.0rs& r +generate_markdown_report..>0GqxxG$ $c38"TFqPxK R#5ir2)r,rs& rrr@s1AZZswz# Interactive Test Results z **Date:** z%Y-%m-%d %H:%M:%Sz z ## Summary z - **Total:** roz- **Passed:** z- **Failed:** z- **Duration:** z.2fzs z## Failed Tests z### z **Error:** z## All Tests z| Test | Status | Duration | z|------|--------|----------| u✓ Passu✗ Failz| z | z.3fzs | N) sumrrrwriternowstrftimer*r)r+r,)rGrr*failed total_timer~rstatuss&& rgenerate_markdown_reportr6s0G0 0F \F "F111J k3  1 01 *X\\^445HIJ$OP ." -G ~R01 .+, .+, ":c"2%89 A: GG) *xxxGGd166($/0GGk!''$78 "# 01 01A#$888ZF GGbF83qzz#.>eD E'   s C$H4CH H c \P!RR7pVPRRRRR7VPRRRR R7VPR R R R 7VPRRR RR 7VPRRRRR7VP4pVP;'g \ 4p\ PPV4'g<\\P RV \P 24\R4^#\\P R\P 24\\P R\P 24\\P R\P 24\RV 24VP'dS^RIp\!\"4P$pTP'\)V4VP*'dR.4#R.4#\-W!P*R7p\!\"4P$R, pVP.'d\!VP.4pVP14'gWAP., pVP14'g;\\P RVP. \P 24^#VP3V4pMC.p\5VP7R44F#pVP9VP3V44K% \;RV44p \=V4V , p \R R( 24\\P R!\P 24\R( R 24\R"\=V4 24\\P> R#V \P 24V ^8d0\\P R$V \P 24M\R$V 24V ^8Xd/\R \P> R%\P 24M-\R \P R&\P 24VP@'d/\!VP@4p \CW{4\R'V 24V ^8Xd^#^#))z Run interactive tests for fortsh) descriptionz--fortshz-fNzPath to fortsh binary)defaulthelpz--specz-szRun specific YAML spec filez--pytest store_truez&Run pytest tests instead of YAML specs)actionrz --verbosez-vzVerbose outputz--reportz-rz Generate markdown report at pathz"Error: fortsh binary not found at z0Build fortsh first or specify path with --fortshu╔══════════════════════════════════════════════════════════════╗uC║ fortsh Interactive Test Suite ║u╚══════════════════════════════════════════════════════════════╝z fortsh binary: z-q)rB test_specszError: Spec file not found: z*.yamlc3L"TFqP'gK^xK R#5irrrs& rrmain..rrroz Test SummaryzTotal tests run: zPassed: zFailed: u✓ ALL TESTS PASSED!u✗ SOME TESTS FAILEDz Report written to: z2==================================================)"argparseArgumentParser add_argument parse_argsrrrrrrwr r}r ryrxpytestr__file__parentmainrrBr?rexistsrsortedglobextendrrr|reportr) parserargsrArtest_dirrunnerrkrG spec_filer*r report_paths rrrZs   $ $6F D $  $ *   5  T   D /    D++55!3!5K 77>>+ & &  <[M%//IZ[\ @A TYYKXY^YhYhXi jk TYYKZ[`[j[jZk lm TYYKXY^YhYhXi jk k] +, {{{>(({{CM4<<<4JKKTJKKK >FH~$$|3H yyyO !! 99,I!! TXXJ:499+eooEVW X&&y1 h 78I NN6// : ;90G0 0F \F "F Bvh- TYYK|EOO#4 56 VHB- c'l^ ,- TZZL)&%//1B CD z  +F8EOO3DEF !&*+ { 4::,3EOO3DEF 488*1%//1BCD {{{4;;'  6 %k]34! 1""r __main__)/r:sysrrrWpathlibrrtypingrrrrrrUr#rsrcoloramar r r rrrrr fortsh_ptyr r utils.keysrrutils.matchersrrrrrr%r'r?rrrr6exitr`r rrs   33 &&3tH~,,-.3$ 5% !!c1c1L.!FH_#D zHHTVr