From 9d3d829c7b6e9f470abee236a02eb28075de22cd Mon Sep 17 00:00:00 2001 From: Jamie Bliss Date: Sat, 20 Jul 2019 17:10:47 -0400 Subject: [PATCH 1/2] Initial implementation. --- viztests/README.md | 6 ++++++ viztests/__main__.py | 24 ++++++++++++++++++++++++ viztests/angles.py | 31 +++++++++++++++++++++++++++++++ viztests/bullet.png | Bin 0 -> 2714 bytes viztests/player.png | Bin 0 -> 13348 bytes viztests/target.png | Bin 0 -> 19051 bytes 6 files changed, 61 insertions(+) create mode 100644 viztests/README.md create mode 100644 viztests/__main__.py create mode 100644 viztests/angles.py create mode 100755 viztests/bullet.png create mode 100755 viztests/player.png create mode 100644 viztests/target.png diff --git a/viztests/README.md b/viztests/README.md new file mode 100644 index 00000000..6512ea72 --- /dev/null +++ b/viztests/README.md @@ -0,0 +1,6 @@ +Visual Tests +============ + +This is a test suite of manual tests, meant to help with the difficulty of +thorough automated testing of graphical software. + diff --git a/viztests/__main__.py b/viztests/__main__.py new file mode 100644 index 00000000..ef3dad70 --- /dev/null +++ b/viztests/__main__.py @@ -0,0 +1,24 @@ +import ast +from pathlib import Path +import subprocess +import sys + + +def get_docstring(path): + tree = ast.parse(path.read_text(), path.name, mode='exec') + + return ast.get_docstring(tree) + + +for script in Path(__file__).resolve().parent.glob('*.py'): + if script.name.startswith('_'): + continue + ds = get_docstring(script) + print("=" * len(script.name)) + print(script.name) + print("=" * len(script.name)) + print("") + if ds is not None: + print(ds) + print("") + subprocess.run([sys.executable, str(script)], check=True) diff --git a/viztests/angles.py b/viztests/angles.py new file mode 100644 index 00000000..a8a21b6a --- /dev/null +++ b/viztests/angles.py @@ -0,0 +1,31 @@ +""" +Tests rotation vs Vector angles + +The center sprite should always face the orbiting sprite +""" +import ppb + +ROTATION_RATE = 90 + + +class CenterSprite(ppb.BaseSprite): + image = ppb.Image('player.png') + + def on_update(self, event, signal): + self.rotation += ROTATION_RATE * event.time_delta + + +class OrbitSprite(ppb.BaseSprite): + position = ppb.Vector(0, -2) + image = ppb.Image('target.png') + + def on_update(self, event, signal): + self.position = self.position.rotate(ROTATION_RATE * event.time_delta) + + +def setup(scene): + scene.add(CenterSprite()) + scene.add(OrbitSprite()) + + +ppb.run(setup) diff --git a/viztests/bullet.png b/viztests/bullet.png new file mode 100755 index 0000000000000000000000000000000000000000..b5a8a035a79334442049380376c014202c1227cd GIT binary patch literal 2714 zcmV;L3T5?)P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ck|ZY#{O1%t0+JAdfa1Y}AnI;=l_-{Ci0TxtnPt>l_>#Fc8Q-0)E1bzLpRbiU7}_bdE<(;pr$ z7+r!^uAh0`_6_~|I>6H1-{1BJ8@HcwJEDi$uNrNS)`tR`W(CPczg%mzBtg{ANY;I`f+s(qoIy*AsSo&$9QrcGpq{QaRk4dfCc(f?)@g za)xExhL7Ue&RuaAOf$gP1e+cA2vmuI?50GM8f{vq9W=1S#ET6r^I$oBMT{$tLrU_S zHXCS|0UWUmuqNo{$6DyjThDxh3TB=JOC~rYjQDVe&pQ9k{cyCmhb~bp53H~*_L#;p zoH_r76$qhyW2y(=bBCw6iBH4|7}NuE!3JCGmy53S8e4LB7T9S_AzrCLHg5-j2y-hI zgD6fEGl^2BXv{_g91HkqSUF4L4hBe-Cxs1e1esu5*yqL=qhrg;S2v^uM5tsjP=iDP zSt%*v$5KHIH5E-kRkNBFt=h8Wlr`sU*)^(}STeP2X2q(tA|(|qxmYRCvR1hYBus0r z7HX-rwuVU?TsMqvuxPDwm!7)z+^v^hdm9L!k%o>uY?M()n>=MA{b!yQW|?)iMGK*{ z($bZet+MKB8?m-!r>#40+hy0?9<1H0zGaQxG56Q3(aoAOmX4jhvW9N67Z>DmqRtr@ z<3wQGoB;$hJ7=*_O6<%zXR$JpLK&=)IysY^F))}Gv2J>B_sZN~@)k7x6mR?$bHSKrau0G>RvY6YF5v^5tZ%cg& z(BBtF6 zNWGw#6}GabuBeM?Lgc}ZEPvUGqQ`hpB^iLl*2_5HOvq^<=b)rHD{1M}5}e-3kxK)D1&1*Ja6*_r`4vw<94cV%|S~ALvPJTPYUWRA`&ad`Ik=E95DIB3Lz_f_T*7b2Vm=D`|PH`dSe1n0+70MQPCeKRnk zQVkuKHV;JN;R}ePjP@*K`J|Q(kSal3tZ+cUsw%Cn0I}yw^r4w>T&JbX8|z=amYY^6 z3P{|LrQBc)Sq+!2utKvy#%j>GjiTEwAQ9P+l4>I<7XQ{>-9CIWpbaF02g;P~$0vxG|9^am_==MB z@l+B1-ZA8djy59Z>*)31MdhL9sMoj;>IZW|969JOh+lYLXwQEBe6@^NT@WX1J3*zh zgN1|HbrdQq9`&FVP*N)nD^Ma}yq__Y7nS~idBX8;!X?qQVjmKG43g;cF?Ma!2BO_{ z-LSec`4#x`06zR1K>xtekAa_iQN^(d?e>wW)=$E7at0TzPtT-V22^1^7@p##hF8}}l24YJ`L;(K){{a7>y{D4^ z000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jU6_1Sbo!os?w&00Q1gL_t(|+U?rE zu2w}91@N`@nmIECi9kgI4bPw_e1ybz0KWhB!Siv%Z!JgssH%kkJ_m7+ zz!w0BgF0$}0I&dv{Ranl4PwRr#UTSM;Q;>?t_3O|J9m9Q4jbU%=F7t;)YPg;gYxNG)saH^;3N zz=Z?+2W>g^5>=ui7#J8)bn1<#)fG5l2yKm&SQQ~~tXh?A5Dsu^17~z5rL79FMu^GI z3w079|1aC~TC2RQp0v$yc}B8?Kr=*)0{ zvrB{kgGFU)VbM$EI(NB`TUb|HnCPGboHMe6U{JADpaO}GOb0kQ1sebcw6!p_FA+Mx z$%9M>a&O^fKS*Z>T!E7Z>D(%iWpCjU02&?OWc`sHs_+|PmgRZf}cnLfr$&Omm8*tYP3KoP;lgZ@eNkWc!_!ME#cj$HFJ-Vz+% z!q;fxmxE;P1KkSW UM#%BhqW}N^07*qoM6N<$g8xVfo&W#< literal 0 HcmV?d00001 diff --git a/viztests/player.png b/viztests/player.png new file mode 100755 index 0000000000000000000000000000000000000000..e168d251ed28a46a67ba486ae91ec134350e2ff4 GIT binary patch literal 13348 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 inxg=8DXGauuKx=bR%KbfZXEIe0000 Date: Sat, 20 Jul 2019 17:11:10 -0400 Subject: [PATCH 2/2] Note how to run the tests --- viztests/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/viztests/README.md b/viztests/README.md index 6512ea72..a781e9fe 100644 --- a/viztests/README.md +++ b/viztests/README.md @@ -4,3 +4,4 @@ Visual Tests This is a test suite of manual tests, meant to help with the difficulty of thorough automated testing of graphical software. +Run with `python -m viztests`