From 23afae69adaf5e0b1885a765bd80de3b95b3b616 Mon Sep 17 00:00:00 2001 From: Frick Date: Thu, 15 Jan 2026 04:05:32 +0000 Subject: [PATCH] Add API verification test suite and documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tests/docs/: - API_FINDINGS.md: Comprehensive migration guide from deprecated to modern API - test_*.py: 9 executable tests verifying actual runtime behavior - screenshots/: Visual verification of working examples tests/conftest.py: - Add 'docs' and 'demo' to pytest collection paths Key findings documented: - Entity uses grid_pos= not pos= - Scene API: Scene() + activate() replaces createScene/setScene - scene.children replaces sceneUI() - scene.on_key replaces keypressScene() - mcrfpy.current_scene (property) replaces currentScene() (function) - Timer callback signature: (timer, runtime) - Opacity animation does NOT work on Frame (documented bug) 🤖 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude --- tests/conftest.py | 4 +- tests/docs/API_FINDINGS.md | 129 ++++++++++++++++++ tests/docs/screenshots/features_animation.png | Bin 0 -> 31736 bytes tests/docs/screenshots/features_scenes.png | Bin 0 -> 31707 bytes .../docs/screenshots/quickstart_entities.png | Bin 0 -> 32512 bytes .../docs/screenshots/quickstart_main_menu.png | Bin 0 -> 45815 bytes .../screenshots/quickstart_simple_scene.png | Bin 0 -> 31723 bytes tests/docs/screenshots/quickstart_sprites.png | Bin 0 -> 31978 bytes tests/docs/test_current_scene.py | 18 +++ tests/docs/test_defaults.py | 30 ++++ tests/docs/test_entity_api.py | 30 ++++ tests/docs/test_features_animation.py | 86 ++++++++++++ tests/docs/test_features_scenes.py | 84 ++++++++++++ tests/docs/test_quickstart_entities.py | 70 ++++++++++ tests/docs/test_quickstart_main_menu.py | 74 ++++++++++ tests/docs/test_quickstart_simple_scene.py | 48 +++++++ tests/docs/test_quickstart_sprites.py | 49 +++++++ 17 files changed, 620 insertions(+), 2 deletions(-) create mode 100644 tests/docs/API_FINDINGS.md create mode 100644 tests/docs/screenshots/features_animation.png create mode 100644 tests/docs/screenshots/features_scenes.png create mode 100644 tests/docs/screenshots/quickstart_entities.png create mode 100644 tests/docs/screenshots/quickstart_main_menu.png create mode 100644 tests/docs/screenshots/quickstart_simple_scene.png create mode 100644 tests/docs/screenshots/quickstart_sprites.png create mode 100644 tests/docs/test_current_scene.py create mode 100644 tests/docs/test_defaults.py create mode 100644 tests/docs/test_entity_api.py create mode 100644 tests/docs/test_features_animation.py create mode 100644 tests/docs/test_features_scenes.py create mode 100644 tests/docs/test_quickstart_entities.py create mode 100644 tests/docs/test_quickstart_main_menu.py create mode 100644 tests/docs/test_quickstart_simple_scene.py create mode 100644 tests/docs/test_quickstart_sprites.py diff --git a/tests/conftest.py b/tests/conftest.py index aeac22c..981e78f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -111,7 +111,7 @@ def pytest_collect_file(parent, file_path): except ValueError: return None - if rel_path.parts and rel_path.parts[0] in ('unit', 'integration', 'regression'): + if rel_path.parts and rel_path.parts[0] in ('unit', 'integration', 'regression', 'docs', 'demo'): if file_path.suffix == '.py' and file_path.name not in ('__init__.py', 'conftest.py'): return McRFTestFile.from_parent(parent, path=file_path) return None @@ -121,7 +121,7 @@ def pytest_ignore_collect(collection_path, config): """Prevent pytest from trying to import test scripts as Python modules.""" try: rel_path = collection_path.relative_to(TESTS_DIR) - if rel_path.parts and rel_path.parts[0] in ('unit', 'integration', 'regression'): + if rel_path.parts and rel_path.parts[0] in ('unit', 'integration', 'regression', 'docs', 'demo'): # Let our custom collector handle these, don't import them return False # Don't ignore - we'll collect them our way except ValueError: diff --git a/tests/docs/API_FINDINGS.md b/tests/docs/API_FINDINGS.md new file mode 100644 index 0000000..b4cce5f --- /dev/null +++ b/tests/docs/API_FINDINGS.md @@ -0,0 +1,129 @@ +# McRogueFace API Test Findings +*Generated by Frack, January 14, 2026* + +## Summary + +Tested code snippets from docs site against actual runtime API. +Tests created in `/tests/docs/` with screenshots in `/tests/docs/screenshots/`. + +--- + +## Entity Constructor + +**Correct:** +```python +entity = mcrfpy.Entity(grid_pos=(10, 7), texture=texture, sprite_index=84) +``` + +**Wrong:** +```python +entity = mcrfpy.Entity(pos=(10, 7), ...) # FAILS - no 'pos' kwarg +entity = mcrfpy.Entity(grid_x=10, grid_y=7, ...) # FAILS - no separate kwargs +``` + +--- + +## Scene API + +**Modern (WORKS):** +```python +scene = mcrfpy.Scene("name") +scene.children.append(frame) +scene.on_key = handler +scene.activate() +``` + +**Deprecated → Modern:** +```python +# OLD → NEW +mcrfpy.createScene("name") → scene = mcrfpy.Scene("name") +mcrfpy.sceneUI("name") → scene.children +mcrfpy.setScene("name") → scene.activate() +mcrfpy.keypressScene(fn) → scene.on_key = fn +mcrfpy.currentScene() → mcrfpy.current_scene # property, not function! +``` + +--- + +## Grid.at() Signature + +Both work: +```python +point = grid.at((x, y)) # Tuple - documented +point = grid.at(x, y) # Separate args - also works! +``` + +--- + +## Animation System + +**Works:** +- `x`, `y`, `w`, `h` properties animate correctly +- Callbacks fire as expected +- Multiple simultaneous animations work +- Easing functions work + +**Does NOT work:** +- `opacity` - property exists, can set directly, but animation ignores it + +--- + +## Timer API + +**Modern:** +```python +timer = mcrfpy.Timer("name", callback, seconds) +# Callback signature: def callback(timer, runtime): +``` + +**Deprecated:** +```python +mcrfpy.setTimer("name", callback, milliseconds) # Wrong signature too +``` + +--- + +## Color API + +Always use `mcrfpy.Color()`: +```python +frame.fill_color = mcrfpy.Color(255, 0, 0) # CORRECT +frame.fill_color = mcrfpy.Color(255, 0, 0, 128) # With alpha +``` + +Tuples no longer work: +```python +frame.fill_color = (255, 0, 0) # FAILS +``` + +--- + +## Available Globals + +**All exist:** +- `mcrfpy.default_texture` - Texture for kenney_tinydungeon.png +- `mcrfpy.default_font` - Font for JetBrains Mono +- `mcrfpy.default_fov` - (default FOV settings) + +--- + +## Files Requiring Updates + +1. `quickstart.md` - All 4 code blocks use deprecated API +2. `features/scenes.md` - "Procedural API" section entirely deprecated +3. `features/animation.md` - opacity examples don't work +4. Any file using `setTimer`, `createScene`, `sceneUI`, `setScene`, `keypressScene` + +--- + +## Test Files Created + +| Test | Status | Notes | +|------|--------|-------| +| test_quickstart_simple_scene.py | PASS | | +| test_quickstart_main_menu.py | PASS | | +| test_quickstart_entities.py | PASS | Uses grid_pos= | +| test_quickstart_sprites.py | PASS | | +| test_features_animation.py | PASS | opacity test skipped | +| test_features_scenes.py | PASS | Documents deprecated API | +| test_entity_api.py | INFO | Verifies grid_pos= works | diff --git a/tests/docs/screenshots/features_animation.png b/tests/docs/screenshots/features_animation.png new file mode 100644 index 0000000000000000000000000000000000000000..4280a2c6563dc2c88b967b8c76b80793057a574d GIT binary patch literal 31736 zcmeI5PiPZC6viiMtV?K0JQPB-jY06zOOPC-h^=khTChb_)Qhsx9_mFbcUc#=Y-clXe(!tV zyln5C7#WO&<6%NbWawDtBq1Ss+Cr38`p^7)M}&}TZ-z2QPETGK9n-Yc&#ACFpru2# zLq4nMXO?bt|A`H*l*bi4U#uS5-bS_f^y5-A7MWrn781ci3n{$3ZoO~qH(1X46uq73 z`&ZcaqgOjgY`CS6OvQuj!@FciJxlc2Mb|q9lBph&n)x(X|M-@{RWF2Y7r&F@_<@Am zWABO@kNr{LV~ZbTDUd6rT|Y+pA@AwevO9|7Jzd-4vHhHzEYZ@D+B$MPYr7kboe!jD z?l)OTN|+nqf{k7YOxsD+vY9FzL!4f?qD+-KNMU)BJwkewJ2{A_q=b+ZKS-dwFteb=tpeqqha^z$c}N1~>@rMzNK%yReZ6am>1Fo%GOjLk1`FLp zJ+*2z3~W_kZlji8VwdssYLM2Sv~YU*;GY3ud%wIbJpO4KQk`e|FQ?W2F)mfts5r2>xgyCE%dkDC&H)y%%rsA^#<<1tjgnY9J zl)u*1#R^r(v*>DXyvJmEraw24o^4ngTY8hP14gg;i{0!dhsczK z{xT_@6P17$`8@zM!Fk?sgnnlBVidn_(9hhkiCW)&fF?MvLsCM%X8dp$Q$q%n zV6ebov6C$P8H`(9h?hV>IZzIi1LeYBv<_7cRc@mT#Ah%+(=4__`M>2E$+ReXz7z@<^ literal 0 HcmV?d00001 diff --git a/tests/docs/screenshots/features_scenes.png b/tests/docs/screenshots/features_scenes.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8ee9231122396786426da084aed9c263178f0a GIT binary patch literal 31707 zcmeI5F>6y%6vt0rLwp2Mvj`zjusFKBA%lntwlSK)BGOfPXotF25L{A`fDp0Zq@w`` zhkk%enRJxkCvcH&>ZX%k3V}c$_nqP16O6y*weTR^mvip#{?Gs1`|{$>_RV^&RTGhV z?^froNX7lTDrwdI8IRA^MV`Lvb*}F`x&LrC&wqW+YTd28UGZNAkJIes$M1XTa4_*- zew;m+uJorn*ILPFBlBD?oUe4xNcZ(`|L3{8YchO)Fl{vJC6}*_WOPxwUw)Q;V!zQ` zm*(wn{t>#n$!5MUdHc<)vd2!-lgHi-_}JkGc`TE?R_WL1zUj4%Y@Fon_2qc%MaJf` zWN)kfxpi`Pu$2yvTuOfW&r&i%Y`}$wx>1-mT9whG(lx~8`K9NR<63{Zf5kt-R-#`V z!c#IrN`@aKDEEUhLIQzuzpjcfZ$P;pl;PzmC@-mSK)H2Ff^zee1m))H0+gGp3s4Tq z3rx!JGcm#nw#Y%E%B|-Os@z-xVX&A>APg3B2?WYP`O-@uP!7rqwj!X)%|%rNUnzVM zuO1|-+&qCmIVcC^vn^a~cq`eA2+GZIp*AK#xp{0bSTI-$c5tgH`A<|#sB%$_lU7b=qRP#2pll3=9_Q*no0SPTO<#5+YuwRbX$< zBMFq7<3hd729%q}27?8I1%m~H1%t(hUiAv5R~PCc9)ksgW$9aM`gw!FGGEP{7B6aC zsF{W;_bm+$PN3X6CH1&a$A%p&=F2Q7x1Kkk9F*ggh$rex!$_pAV;fs+7%1=E= zyzmhz+V7RlfA*7pfdpjw(l$qso1Uxg)3xwerI&H&=e@*r3YIV}mM3m7~fz g?HT&CXPU0a)qB-HhYvn9-H&!l@5XlLXfuEI7eRCD&Hw-a literal 0 HcmV?d00001 diff --git a/tests/docs/screenshots/quickstart_entities.png b/tests/docs/screenshots/quickstart_entities.png new file mode 100644 index 0000000000000000000000000000000000000000..da85c3421266e9f21f77789a52478442195fe488 GIT binary patch literal 32512 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 A{Qv*} literal 0 HcmV?d00001 diff --git a/tests/docs/screenshots/quickstart_main_menu.png b/tests/docs/screenshots/quickstart_main_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb58d6d19ddd1b7f67667fe1eddb6fd7fc78849 GIT binary patch literal 45815 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

$B>IWR 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 literal 0 HcmV?d00001 diff --git a/tests/docs/screenshots/quickstart_simple_scene.png b/tests/docs/screenshots/quickstart_simple_scene.png new file mode 100644 index 0000000000000000000000000000000000000000..e90b37d299a36a542215d0d435d59da7f056fdba GIT binary patch literal 31723 zcmeI5PiPZC6o;qVP}e|e5QGpCH0Y^ba)=-z{%K=02dii=BFLge>b;^MNGcK$QhM;D z*9DI~c+4p$1uqf=J@+Ev^(f4Y~; zeE-)&GYc;|y>z2{;*_T6`>i(be*2x(Q=PSZWH^KN%$Le-$Ey^R>Hd8&MhqYFj4HpG z)6en#-R6?p+7711hY6n=hRsfL{{FYvN-Q@1tnwd3=CWX%pMKt_KEf=uKNDlf zU`akCs$6>BpvuK15C)651j1kumq4H#lux|`0_C85L`ejyTwGMe;49f*#2Y^(s$6^k zfpSm|$_FJ}Q&)IryGjC-i{rxBm;~kGvB6-$U>Q+KZcNF2v0_4%qsm8}8c1-V7{j~) z<)9pt4-QsPSFStp73fSwsfBkavEl0dmQ zE{w};K)HBqFjz2HFjz2HFj#cxHO^q>>cV&tkHLb$GWA<)=JN)FCA^v$7B9xQFlHL6 zT$dUGIDvBMA!&{aexH)ot_%h1sG zC7EP64Tp&s1Fej+JpPV&Y`}#jT$si8U2q)&YeTk43`=DdmFR$h*AWLYS)4juZh)q!SqOt|ZYb?4 zH8TbF!ynlq`bP~)qWCkYIJ0IXxREJT3}G=Qn;6sSoNQwoTju85LPNb??;hh_EAsqP zTCO?Xd!P6HJm2Tbd++V8C^u`8(vk=vn$p!J4-vx9x3NSWPk;3GrfLXj`lz&|Xx;XW z)ioS9IcQ8`i#Zb`{^Dp<8(aJTu&A95xA@EWe48i6>RGokP31BeMP9P>44XjM{a3`# zM~|iuXQ$1h)oCPNPH9!H+X*{-PV$UatuBM;%6<`VAw8;E#WfJlbf8`8vejz;W!K1f z*;XxQ7->&WPj@9&3B`wLaknonV8?dO9MrYAy-8Nj&-aS-yZ@Tuoe%D+d}2HpFFuO= zM;*m#XE*Kqum9tnKMO|4oShg^i;XLmxN0S7Nyqu!FZyR!D z&D&DewCU~~J*4`0LCs~$^2Oq{;|YUXJ#oFcYM0e+uQt73p;grnYe-GP`NBR+cZO8ksI0M;pPRoShWz$Q*5J3pM-si4d?i%Que@?= zH9b=*6{t^5SA>rBQ>B(?rWIk{(J4G}3&}Uw!!xyk>M-J7=v+#THlfN+=SNcsef{&mKJ)ar`@D2%x}5sHCSDX zns{G%msa2O_qAL9-u>>$H_jgI-}A+dg`;u$yd~vDc?tcQ-@GT@w=M%orj7#1?~EI= zHPL~{-CFc)g}LLqwu0kVj9a*l=FuYiC(G98%6^wRk(*xNNwQS+bmR5CUlk^=Fkd(( zKBI=Hg|mXNl|nuW8PV$Qi{(t40?A`M$v@_@ckntR^kbnvBug(yhQw#h#7bQiwU+t} zz8U509FsgF4YE(u9yd!lT?{STXuXju!3&M;Ch9fOTJRWu4E&4Bj%FjN5jQMh?D@w` z9ksbAVNP!ky-r@&f}#WuMkB!gC)daXD zg1~t%X?0J;7!S4~F2YQ6aBL9eVR~?ymI~w>M7cO9<Wa-RC;e+1(K92-QrxaL(r zo+8Q-J-+D(BT9{*Ur!Fz}FsD?e}}(O^M?1q~Mbx2NxZ7r-hB zaOr@m99220a#ZDVFM&c;j;b70d0+__E=ClvH-kN2c*TTXd2qjliWji*16Q+%azr_z z98oU&;&((jqFg{1$e+RB>H_S?f*XkjOQ=Q(9`*{v2EB6h%F!!FuN=K{G4z5n7`RYG zlt;W!R3J8}%7f)e=nRs7-bB}6F{=KYY&LaD-p*)Z9NVUL3^)}?En#m$_(xip8))T^4elBvJ{jlkt}(# zTi;oM3veTGFUK%KWjgeT@`$SoM0v!ABp4Uq*q|zp_`E@sM||F(Do0f=@Ei*;B^6K? zi1J7eNq7+tjt!z5Q7-T-omqhka3j%RL4ySimcUK$_}n7_Ar+j;;b|6Cd2qjl)}ivt zQ$#tU98r!am;E7!h;l@^fG&_fgTd7WxQGWg620