From 3b6716b84b3cd286cc1aef0fbbe768345bf430a5 Mon Sep 17 00:00:00 2001 From: Callum Vidler <callum.vidler@hotmail.com> Date: Sun, 2 Sep 2018 20:17:37 +1000 Subject: [PATCH] Final --- TEST-swen90006.machine.BoundaryTests.txt | 35 ++- TEST-swen90006.machine.PartitioningTests.txt | 20 +- build.xml | 4 +- classes/swen90006/machine/BoundaryTests.class | Bin 2225 -> 3416 bytes classes/swen90006/machine/Machine.class | Bin 4003 -> 4302 bytes .../swen90006/machine/PartitioningTests.class | Bin 2066 -> 3209 bytes examples/NoReturn.s | 2 + examples/RiHigh.s | 4 + examples/RiNeg.s | 4 + examples/RiValueHigh.s | 13 + examples/Valid.s | 103 ++++++++ examples/div.s | 5 + examples/jmpFirst.s | 7 + examples/jmpLast.s | 8 + examples/jmpNeg.s | 7 + examples/jmpPast.s | 8 + examples/jzLast.s | 7 + examples/jzNeg.s | 5 + examples/jzPast.s | 7 + examples/jzfirst.s | 5 + examples/partitionTests/RiHigh.s | 9 + examples/partitionTests/RiMaxValue.s | 13 + examples/partitionTests/RiNeg.s | 10 + examples/partitionTests/jmpHigh.s | 35 +++ examples/partitionTests/jmpNeg.s | 35 +++ examples/partitionTests/jzHigh.s | 35 +++ examples/partitionTests/jzNeg.s | 35 +++ examples/partitionTests/noReturn.s | 2 + examples/partitionTests/strMaxMem.s | 45 ++++ examples/partitionTests/strMemNeg.s | 42 ++++ examples/partitionTests/validfile.s | 35 +++ examples/partitionTests/valueHigh.s | 9 + examples/partitionTests/valueLow.s | 12 + examples/strHigh.s | 6 + examples/strMax.s | 7 + examples/strNeg.s | 6 + examples/strZero.s | 6 + examples/valueHigh.s | 2 + examples/valueLow.s | 2 + .../mutant-1/swen90006/machine/Machine.java | 32 +-- .../mutant-2/swen90006/machine/Machine.java | 32 +-- .../mutant-3/swen90006/machine/Machine.java | 32 +-- .../mutant-4/swen90006/machine/Machine.java | 32 +-- .../mutant-5/swen90006/machine/Machine.java | 32 +-- src/swen90006/machine/Machine.java | 224 +++++++++--------- test/swen90006/machine/BoundaryTests.java | 188 ++++++++++++--- test/swen90006/machine/PartitioningTests.java | 184 +++++++++++--- 47 files changed, 1073 insertions(+), 273 deletions(-) create mode 100644 examples/NoReturn.s create mode 100644 examples/RiHigh.s create mode 100644 examples/RiNeg.s create mode 100644 examples/RiValueHigh.s create mode 100644 examples/Valid.s create mode 100644 examples/div.s create mode 100644 examples/jmpFirst.s create mode 100644 examples/jmpLast.s create mode 100644 examples/jmpNeg.s create mode 100644 examples/jmpPast.s create mode 100644 examples/jzLast.s create mode 100644 examples/jzNeg.s create mode 100644 examples/jzPast.s create mode 100644 examples/jzfirst.s create mode 100644 examples/partitionTests/RiHigh.s create mode 100644 examples/partitionTests/RiMaxValue.s create mode 100644 examples/partitionTests/RiNeg.s create mode 100644 examples/partitionTests/jmpHigh.s create mode 100644 examples/partitionTests/jmpNeg.s create mode 100644 examples/partitionTests/jzHigh.s create mode 100644 examples/partitionTests/jzNeg.s create mode 100644 examples/partitionTests/noReturn.s create mode 100644 examples/partitionTests/strMaxMem.s create mode 100644 examples/partitionTests/strMemNeg.s create mode 100644 examples/partitionTests/validfile.s create mode 100644 examples/partitionTests/valueHigh.s create mode 100644 examples/partitionTests/valueLow.s create mode 100644 examples/strHigh.s create mode 100644 examples/strMax.s create mode 100644 examples/strNeg.s create mode 100644 examples/strZero.s create mode 100644 examples/valueHigh.s create mode 100644 examples/valueLow.s diff --git a/TEST-swen90006.machine.BoundaryTests.txt b/TEST-swen90006.machine.BoundaryTests.txt index 8e1f85f..c340653 100644 --- a/TEST-swen90006.machine.BoundaryTests.txt +++ b/TEST-swen90006.machine.BoundaryTests.txt @@ -1,16 +1,31 @@ Testsuite: swen90006.machine.BoundaryTests -Tests run: 5, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.045 sec +Tests run: 18, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.35 sec -Testcase: anotherTest took 0.002 sec -Testcase: aFileOpenTest took 0.015 sec -Testcase: aFailedTest took 0.002 sec - FAILED -Some failure message expected:<2> but was:<3> -junit.framework.AssertionFailedError: Some failure message expected:<2> but was:<3> - at swen90006.machine.BoundaryTests.aFailedTest(Unknown Source) +Testcase: JmpNeg took 0.004 sec +Testcase: JzLast took 0.001 sec +Testcase: JzPast took 0.001 sec +Testcase: RiHigh took 0.001 sec +Testcase: StrNeg took 0.001 sec +Testcase: valueLow took 0.001 sec +Testcase: valueHigh took 0.001 sec +Testcase: StrHigh took 0.001 sec +Testcase: Div took 0.002 sec + Caused an ERROR +/ by zero +java.lang.ArithmeticException: / by zero + at swen90006.machine.Machine.do_div(Unknown Source) + at swen90006.machine.Machine.execute(Unknown Source) + at swen90006.machine.BoundaryTests.Div(Unknown Source) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) -Testcase: aTest took 0 sec -Testcase: anExceptionTest took 0.001 sec +Testcase: JzNeg took 0.001 sec +Testcase: RiNeg took 0.001 sec +Testcase: Valid took 0.004 sec +Testcase: JmpLast took 0.001 sec +Testcase: JmpPast took 0.001 sec +Testcase: JzFirst took 0.001 sec +Testcase: NoReturn took 0.002 sec +Testcase: RiValueHigh took 0.002 sec +Testcase: JmpFirst took 0.289 sec diff --git a/TEST-swen90006.machine.PartitioningTests.txt b/TEST-swen90006.machine.PartitioningTests.txt index 3f90591..a63c54d 100644 --- a/TEST-swen90006.machine.PartitioningTests.txt +++ b/TEST-swen90006.machine.PartitioningTests.txt @@ -1,7 +1,17 @@ Testsuite: swen90006.machine.PartitioningTests -Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.039 sec +Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.068 sec -Testcase: anotherTest took 0.001 sec -Testcase: aFileOpenTest took 0.015 sec -Testcase: aTest took 0 sec -Testcase: anExceptionTest took 0 sec +Testcase: JmpNeg took 0.009 sec +Testcase: strHigh took 0.006 sec +Testcase: RiHigh took 0.001 sec +Testcase: ValueLow took 0.001 sec +Testcase: jzHigh took 0.005 sec +Testcase: strNeg took 0.002 sec +Testcase: Div took 0 sec +Testcase: RiNeg took 0.001 sec +Testcase: Valid took 0.004 sec +Testcase: jzNeg took 0.003 sec +Testcase: JmpHigh took 0.002 sec +Testcase: NoReturn took 0 sec +Testcase: RiMaxValue took 0.001 sec +Testcase: ValueHigh took 0 sec diff --git a/build.xml b/build.xml index 658996f..a297973 100644 --- a/build.xml +++ b/build.xml @@ -1,7 +1,7 @@ <project name="Project" default="classes"> <target name="classes"> <mkdir dir="classes" /> - <javac srcdir="src:test" destdir="classes" + <javac srcdir="src:test" destdir="classes" classpath="lib/junit-4.11.jar;lib/hamcrest-core-1.3.jar" includeantruntime="false"/> </target> @@ -10,7 +10,7 @@ </target> <target name="run" depends="classes"> - <java classname="swen90006.machine.SimpleDriver" + <java classname="swen90006.machine.SimpleDriver" classpath="classes/;lib/junit-4.11.jar;lib/hamcrest-core-1.3.jar"> </java> </target> diff --git a/classes/swen90006/machine/BoundaryTests.class b/classes/swen90006/machine/BoundaryTests.class index 75ca15dbf4f906cd2b7beec235fa91a8de079579..9706ee5ecfa7f13e4e52ac056aa099fd5102bc90 100644 GIT binary patch literal 3416 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 TjO+}Wq6{Gn3=B*Rp$rTFSbhxl delta 1237 zcmca1wNbGC)W2Q(7#J9g8M?U`)EJyu86bd(i@}A#m7T$ji-DEFnS;Tdo56#@lY_wv zM0<lIeK;6=xfoO#{MZ@%xfu8uoIykYOusHWLm(G}Fi2|<OpF<%EtrELgo`1RA&iS5 zoFRf;har-SA&McIiy?*~mYpGvlOdiVfrBBDiy?_2nTtW5A%%+}o*|W;A&s3Oed6K5 z`oxgb;u1y%0iXP$bp5Q-yv!1Pkcc%S19xIxeo01Z5s1skz?<lnnUm^YkeUbK^C#xH zRwSnulw{^ZMY!PnVs?fMMh1@5ih|VSlGGGN22r1^#Ii*F%zS-Mf4C~J6<ltKnK`K` zATuY&F!}JNu`@)nGi0(eWU({EO<u#~8LZBr!OoD)!;r&}%g7)MHm9^CGe_UCs3@`0 zCllm&#zc08EFOkDhI~c_#v~qw0)~7ZhC+rSMh1b@ip1Q4oYZ3dM38d5Vjc!d2CK;e z%yPcP3?(r0P~FAIAQGIPo2rnOn3+>rl&X-MT3no%o(gh7DI)`GXo#Dx1v^6~4?`J4 zIXgoI4?`tG)#UXoqB_+)3^fe3><o204D}2RFvD{a^V0R<o@Qrg<Y8!HXrBCmMOUDO zhoP0BjfbI~p@WB^lc8&}E~~jX#EW2EAsI#a<%vl-sf-K~lmD<uOs-`Wp1gro%bGbc z1r(|pkYEL?^-s!5O)jz4jACTqNY2kINzBYEW@O+>EG|whDhVknO=V<Y(TLIvo7~5$ zBqENiGq|KEGcVnG^A*;gjKZo6YTyLR$-u~<&Y;1-$e=m-0lP%K7J~)@6N4rL0|PGu z0|O%nZv-pUW?*1oV_;;^0SPha5>loIR;CYECdR<Rz|6qFz$L=KB*MV7gMkIrSOc(n z!+N*|BL*f0CI$uuwcQM?k=q&Ae6)qwcQSA=F@$Rial#nvI~ll`7<MplV>8SMZk7hr zav3clp6v|0KD!zCBDXW}`|4<KV-RQ+VGx8nryk}_h<l6~G#Hq{p&`P+1P%?3-3-E! z+Zjamg9F8cfq{XAfsw(K0i=(cfsw(0fsw&1nZcZak--9PzXSs-*z-I>qG0cf?O>3= zbTJcyB}1hZH1yLLm>EF%-&ja;2ZNL^qu&k&X>I1c3^LmoWOa5h$oVa2khEgi#GoLg zxQ#(c62#iZpv<y^K}B~110w?mg9L*#gFFKxgEa#KgCqmfe+Fp=7Ip?3b_QE^20L~J Vdj>{!1_x0FM+OE4CI%-41^~8I<Np8v diff --git a/classes/swen90006/machine/Machine.class b/classes/swen90006/machine/Machine.class index bc67cdff3d66160515599de443f4aea563326bac..7016ffa225790cdf3bdffe9762ca3de4168e1569 100644 GIT binary patch literal 4302 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 Hj102@)J?1c literal 4003 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 X7NLR+jNp2YRci|a(;86a#=rmosEtlI diff --git a/classes/swen90006/machine/PartitioningTests.class b/classes/swen90006/machine/PartitioningTests.class index f18ec47fe14f0f146b38fe5def6490170faa1be1..4310f50cb96220db21977273bfad9ca25cd6b386 100644 GIT binary patch literal 3209 zcmX^0Z`VEs1_o1xUM>a=1}_c<Z!QLP1|N0?UoHj~1}_ld$I1W!x40Pm83H&M0y!9h zI2eLC7(zH0LRtU+|Np;%fq{X8A&i3|oP!~PgCUZGA&P?`nu8&RgCQ2CJB5QGj*G#K zA)bpNfgzEdA&HA2nIVOXA(bJGogtl*A%h{4gCUEHA)6tGi$Regmy02TA&;FQpPiwA zk%7%7GcU8mj*)>`Lo<w#fyFsLC6$qZwK%mTw1AO8GN?4KBr`WPEVDQ>DJRu2FE76& zu_QA;ub7cR$S1!jT|cWdFSA77DK#y>DAk&gfukffvB)LAJdcq<5J}!Ktt7R`nvsDu zEHNiDg^@u3NiHO{xCA5>l<Ak6&d9)#T2YXiT#}l?$e{02T%MX|X<%Srrk|UboROKA zs_&Us1~S4kuehYBG#TU+*NWuS0uaNRk%28J(<3uIgOPzVEHS4v6~g8KvwiZ*85y{O zGJO*(z<fpqHm}?Qu$5X^?D5MFN-ZfZ$^)xKwu0R&w*X=;YgQFlJ6l#2M1Z}xqzJ-d zD=sMl%W=TWVPs%-$t+`J5GYDbOhIyeF(ZSDhEG;vS)zVUVqUs_a7j^SUb?j=M5weR zGe_Si6C6Oi!6k{w*}jPdA&E&jsq74e><mSW44lE4>3NAIrA4WX3>HKfWCJl6*)BV4 z9tKSYEk*|A)QZI1f}GT1{er}zl1xyTf+D9_9~|UqnK`L?#XJno3@(fel9(~$3yC2f zhGK>ic7{?OhBAh7Mh1CYW`d(zub7cR0k;ZJV1kt3a~LF+L8_E+8B_*J3qJYfAVn&; z6d_UuNEuE?Wr5QSNQojYld>QQ1f&M1@4-n2qyo1^;6w#dg46fKB}Kl86~3vt1XZQx z`lY6WRN)MxJZO3cDdL0sEG4rHB)}RP;-+iC!%)Fc$<9#4!%)po!^j|jo@m(_YIzvy z80y&>8h98Q8JZXwgb_;MS%{sXnTMf;p_P$A1Dcl=GV=;bOB6uqOHo0i7?jFOiV~Ak z71Hu^a`MZIHQ5>3co^ClI(Qg58M=5Fx*2*H8I&;-U;r%9X6B`X(=Cb{{gbj%lS>#G zB*1RU%gonL&PXgOPA$=QhR}=*d|)Yfo?~QSPpwEzE-guAWDtgCEx4q$rY9qV0HOqR zEG|whDq&>cNdz-o3riDoiWwPLHN3n)<tlqxevw~dZYm>#9@He{90<+rSR7@|$RG)J z6-W*gLi%o*IjO;w#U-h^#f%JG>8T|yscDI&IVFq?G8#zcpsBS+_BfgxBLjPSYDqw1 zNd_Z>H5S)JV-^|c7J)Qd!{Qsosl|*8JfI@aF(=0-GcUE6k--6K1zZ_eGsF&%7+SPo zD+-a59yll%8JJUxiWnJ0A;x6p>jxBN=9L7O6s0ES!X1Vx%*eoA08*5b$H*WGbrVXY zgfTMkgH?bF-VjidWMq(lszf!*8WhJYsTG+ej0`Lqo|<6{iVW%u8sOSph=CDQyfQE{ zXfrS{2r@7-FfuSOuxf2*VB82+z{sG(pvAxhmgZ$(082xqbQu^J*cccY^uWUUgp?V8 zl^Md7X)v%bFf%YP$Y=>MZD(Ni+0DQbxt)R4S4Vpr16!*I1N#mJPKX;|78!v}Fov6; z#J~hLK}<`C3&VtPgkEk2Mg}7WMh25)22%z`1~Y61aFbwwIW_}$NHD+xn*qEe7+?uE z04WstFbrrFVc^FRidJwFkU~)q!vyT1XwAULV1vy7ArcI*#b$so2?p3<GeCp{1MJ}j zs6o@Bl$MYvh5@adIKt2Yn|?7u`q5IOBis<Ah!Dpx1b0L@!3{u43lbOxw2ClDV)X|T zsL=$?;b{!a44{^~v5@o*1{q&Qza0#++RS?y<hC)$>+E1q@LSFxX~nXMK}kq?8-t1@ zh_#JDm1PHmn(hV$Mg|TB2?l8fMFvI&R|W<KNd~6>4AKlN><sGc407xYZtM*142<jy QilPi23=9lR44w=O0Nh&w&j0`b delta 1101 zcmeB_oFq_x>ff$?3=9mW3^iN~3JjK93|0)*><l(s49pCc91OPH3}y^=91Qj#+5sf# z$id*m#URh%%+BD##lQp7!NcIn$^Zen><n&P41yr7?pzF}3?5tzo(x{>4BlJ}J`BEG z41Ns$><j^%41o+m91Ou+3?V`cp<E1-3}IXhfehj73=!-MkrS5|)+dIf7MCzG2>9d| zrR!&v=4F=XgG8(u8MqVk@=G#Oi$GjP2Hr%s%$!vJg48?+pFc6rwIVsSpd>RND#8Wl z7qc@&F*0zZRurTrm!zgJGKl(QC6*=XXXfjB`omROGcpJiO_pTxV2NgDh?$(q<QbsI zpv2A)%fk@I5YNaU4AxUxl9{9LSX7i)>5~a^C}ScILjpr0BLia+4?_||A`e3{Lkc5< zKx#!|Zb43Jv3?>*tzIz?gAs%A<U34qdZ`R)FvCzCz{tQF8sesF!NZWwkipK7$-|Jv zkUjZ6i>OWx4?`|P9y>!m4?_V%Axw8pVqUsF-1+PbMLZ0}3?-8lSak(Tc^JwV%6S+n z7%F)fsu-##$Ff?BLp%W16_QbuU!Ithlgh{-G1-7!V)8~-;mJ=}wXB&FQ$XRP0SO?m zTK}Z1)Z`LtO;8Xf=jW9qX66+$GH@jp7pE4LgcOygGBU7eL}`XiKE$fDnUC!=W4%0s z0yt4{FfcMGGAJ=HGAJ`JFbFa*GB7eQFtBQEXJFh2R=~)h!l1;!1eWGyU;s-)rBoRh z7}yvX8PveS>V%YOfR$;2mDPi66JlUtU<R4N#kGTh31S`0Of9ftZLngHS|bJ~1||ju z2DRM`%#qs}SbVgFSa&k8F)@T|3$eo(tUDPvm>702aAGq{2X2-I14}*FVi_$VuI&um zKD!xsBDXW}`s!$JW8iBQVc^H%99;$_24-+bh%hjLLxN*BgJ9%#2BH1nu+n2-U|?Zj zWYA{-d4rpQkwJ@rk-;FD!H|Iol(wM3n8v`I#{kNd#zMk77({#-{dO>jYBTR;5ZlHe zuCs$d!f!c)q!r611}P!wZ45G!Al5bpS(Y6Pa=IHB7#TPiBp9R_BpDbPOc)p#BpI0g lGe|SAurtWBGl;P>n6fjNF)*?-NQyF;GcYhPF<3A#005|c!S4V7 diff --git a/examples/NoReturn.s b/examples/NoReturn.s new file mode 100644 index 0000000..754bb15 --- /dev/null +++ b/examples/NoReturn.s @@ -0,0 +1,2 @@ +MOV R0 1 +ADD R0 R0 R0 diff --git a/examples/RiHigh.s b/examples/RiHigh.s new file mode 100644 index 0000000..ab167c7 --- /dev/null +++ b/examples/RiHigh.s @@ -0,0 +1,4 @@ +MOV R0 0 +MOV R1 1 +ADD R32 R0 R1 ; Exception +RET 32 diff --git a/examples/RiNeg.s b/examples/RiNeg.s new file mode 100644 index 0000000..8b21e65 --- /dev/null +++ b/examples/RiNeg.s @@ -0,0 +1,4 @@ +MOV R0 0 +MOV R1 1 +MUL R-1 R0 R1 +RET R1 diff --git a/examples/RiValueHigh.s b/examples/RiValueHigh.s new file mode 100644 index 0000000..6ac9bb2 --- /dev/null +++ b/examples/RiValueHigh.s @@ -0,0 +1,13 @@ + +MOV R1 46340; +MOV R2 296; +MOV R3 432 + +MUL R6 r1 r1 +MUL R2 r2 r2 +ADD R2 R2 R3 + +;Ri > 32-bit signed +Add r8 r6 r2 + +RET R8; diff --git a/examples/Valid.s b/examples/Valid.s new file mode 100644 index 0000000..d89e8a6 --- /dev/null +++ b/examples/Valid.s @@ -0,0 +1,103 @@ + +MOV R0 46340; +MOV R31 296; +MOV R3 431 + +MUL R6 R0 R0 +MUL R31 R31 R31 +ADD R31 R31 R3 + +;Ri > 32-bit signed +Add R8 R6 R31 ; -----------------------EC3 + + +;Checking simple math + + +MOV R1 65535; -----------------------EC6 +MOV R2 100 +MOV R3 -65535; -----------------------EC6 +MOV R6 12345 +ADD R4 R2 R3; R4 = 100 + -65535 +ADD R5 R3 R6; R4 = -65535 + 12345 + +ADD R5 R5 R4 ; R5 = -118625 +ADD R8 R5 R8 ;2147483647 + + +MOV R1 -1000 +MOV R2 123 +MOV R3 312 +SUB R5 R2 R1; R5 = 123 - -1000 +SUB R5 R5 R3; R5 = - ... - 312 + +ADD R8 R8 R5; 2147365833 + + +MOV R0 -2 +MOV R1 3 +MOV R4 212 +MUL R5 R1 R0 ; 3 * -2 +MUL R5 R5 R4; -6 * 212 + +ADD R8 R5 R8 ; 2147364561 + +MOV R0 -12 +MOV R1 200 +MOV R2 4 +DIV R5 R1 R0 ;200/-12 = -16 +DIV R5 R5 R2 ; -16/ + +ADD R8 R8 R5; 2147364557 + + + +;;testing STR and LDR +MOV R10 2018; +MOV R0 0 +STR R0 0 R10; -----------------------EC15 +LDR R1 R0 0; R1 = 2018 + +ADD R8 R8 R1; 2147366575 +;;testing STR and LDR +MOV R10 -63123; +MOV R0 65533; +MOV R2 65532 +STR R0 2 R10; memory[65535] -----------------------EC15 +LDR R1 R2 3; R1 = -63123 + +ADD R8 R8 R1; 2147303452 + + +;;testing STR and LDR with negative inputs +MOV R10 10; +MOV R0 -2; +MOV R2 -4 +STR R0 5 R10; memory[65535] +LDR R1 R2 7; R1 = 10 +ADD R8 R8 R1; 2147303462 + +;;testing STR and LDR with negative inputs +MOV R10 55; +MOV R0 7; +MOV R2 5 +STR R0 -4 R10; memory[65535] +LDR R1 R2 -2; R1 = 55 +ADD R8 R8 R1; 2147303517 + +;;testing STR and LDR +MOV R10 -212 +MOV R1 20 +MOV R0 65535; +ADD R0 R0 R1 +STR R0 -20 R10; memory[65535] +LDR R1 R0 -20; R1 = -212 +ADD R8 R8 R1; + + +MOV R0 -1 +MOV R1 1 +DIV R8 R8 R0 ; -2147303305 +DIV R8 R8 R1 + +RET R8; diff --git a/examples/div.s b/examples/div.s new file mode 100644 index 0000000..c803095 --- /dev/null +++ b/examples/div.s @@ -0,0 +1,5 @@ +MOV R0 0 +MOV R1 10 +MOV R2 100 +DIV R2 R1 R0 +RET R2 diff --git a/examples/jmpFirst.s b/examples/jmpFirst.s new file mode 100644 index 0000000..c47097c --- /dev/null +++ b/examples/jmpFirst.s @@ -0,0 +1,7 @@ +MOV R6 10000; looping 10,000 times, sometimes causes random error +MOV R5 1; +ADD R0 R5 R5 +SUB R6 R6 R5 ; +JZ R6 2 ;{ +JMP -4 +RET R0 ; return R0 = 2; diff --git a/examples/jmpLast.s b/examples/jmpLast.s new file mode 100644 index 0000000..b774cbd --- /dev/null +++ b/examples/jmpLast.s @@ -0,0 +1,8 @@ +MOV R6 2; +MOV R5 1; +MOV R0 100 +SUB R6 R6 R5 ; +JZ R6 2 ;{ +JMP 2 +ADD R0 R0 R5 +RET R0 ; return R6 = 100; diff --git a/examples/jmpNeg.s b/examples/jmpNeg.s new file mode 100644 index 0000000..8ef9421 --- /dev/null +++ b/examples/jmpNeg.s @@ -0,0 +1,7 @@ +MOV R6 2; +MOV R5 1; +ADD R0 R5 R5 +SUB R6 R6 R5 ; +JZ R6 2 ;{ +JMP -6 +RET R0 ; return R6 = -1; diff --git a/examples/jmpPast.s b/examples/jmpPast.s new file mode 100644 index 0000000..b8a151f --- /dev/null +++ b/examples/jmpPast.s @@ -0,0 +1,8 @@ +MOV R6 2; +MOV R5 1; +MOV R0 100 +SUB R6 R6 R5 ; +JZ R6 2 ;{ +JMP 3 +ADD R0 R0 R5 +RET R0 ; return R6 = 100; diff --git a/examples/jzLast.s b/examples/jzLast.s new file mode 100644 index 0000000..ede5628 --- /dev/null +++ b/examples/jzLast.s @@ -0,0 +1,7 @@ +MOV R6 1; +MOV R5 1; +MOV R0 100 +SUB R6 R6 R5 ; +JZ R6 2 ;{ +ADD R0 R0 R5 +RET R0 ; return R6 = -1; diff --git a/examples/jzNeg.s b/examples/jzNeg.s new file mode 100644 index 0000000..c47c9fb --- /dev/null +++ b/examples/jzNeg.s @@ -0,0 +1,5 @@ +MOV R6 1; +MOV R5 1; +SUB R6 R6 R5 ; +JZ R6 -4 ;{ +RET R6 ; return R6 = -1; diff --git a/examples/jzPast.s b/examples/jzPast.s new file mode 100644 index 0000000..a083e34 --- /dev/null +++ b/examples/jzPast.s @@ -0,0 +1,7 @@ +MOV R6 1; +MOV R5 1; +MOV R0 100 +SUB R6 R6 R5 ; +JZ R6 3 ;{ +ADD R0 R0 R5 +RET R0 ; return R6 = -1; diff --git a/examples/jzfirst.s b/examples/jzfirst.s new file mode 100644 index 0000000..7c3bb8c --- /dev/null +++ b/examples/jzfirst.s @@ -0,0 +1,5 @@ +MOV R6 1; +MOV R5 1; +SUB R6 R6 R5 ; +JZ R6 -2 ;{ +RET R6 ; return R6 = -1; diff --git a/examples/partitionTests/RiHigh.s b/examples/partitionTests/RiHigh.s new file mode 100644 index 0000000..1e95388 --- /dev/null +++ b/examples/partitionTests/RiHigh.s @@ -0,0 +1,9 @@ + +MOV R1 0; +MOV R2 1000 +MOV R3 -65535; + +;;Ri where i > 31 +ADD R32 R1 R3; + +RET R32; diff --git a/examples/partitionTests/RiMaxValue.s b/examples/partitionTests/RiMaxValue.s new file mode 100644 index 0000000..6ac9bb2 --- /dev/null +++ b/examples/partitionTests/RiMaxValue.s @@ -0,0 +1,13 @@ + +MOV R1 46340; +MOV R2 296; +MOV R3 432 + +MUL R6 r1 r1 +MUL R2 r2 r2 +ADD R2 R2 R3 + +;Ri > 32-bit signed +Add r8 r6 r2 + +RET R8; diff --git a/examples/partitionTests/RiNeg.s b/examples/partitionTests/RiNeg.s new file mode 100644 index 0000000..957fed6 --- /dev/null +++ b/examples/partitionTests/RiNeg.s @@ -0,0 +1,10 @@ + +MOV R1 0; +MOV R2 1000 +MOV R3 -65535; + +;Ri where i < 0 == -1 +ADD R-1 R1 R3; + + +RET R-1; diff --git a/examples/partitionTests/jmpHigh.s b/examples/partitionTests/jmpHigh.s new file mode 100644 index 0000000..e720d61 --- /dev/null +++ b/examples/partitionTests/jmpHigh.s @@ -0,0 +1,35 @@ +;;testing simple +MOV R1 65535; +MOV R2 100 +MOV R3 -65535; +ADD R4 R2 R3; +SUB R5 R4 R1; +MUL R6 R4 R5 +DIV R7 R6 R5; R7 = 152 + + + + +;;testing STR and LDR +MOV R10 50; +MOV R11 20 +STR R10 1 R11; +MOV R13 21 +LDR R12 R13 30; R12 = 20 + +ADD R13 R12 R7; R13 = 172 + + +;;testing loop jz and jmp +MOV R14 10; +MOV R15 1; +MOV R18 1; +MOV R17 1; +SUB R16 R14 R15 +JZ R16 4 +ADD R17 R17 R16 +ADD R15 R15 R18 +JMP 4 ;R17 = 46 + +ADD R19 R13 R17 ; 172 + 46 +RET R19 ; return sum; diff --git a/examples/partitionTests/jmpNeg.s b/examples/partitionTests/jmpNeg.s new file mode 100644 index 0000000..92a65cb --- /dev/null +++ b/examples/partitionTests/jmpNeg.s @@ -0,0 +1,35 @@ +;;testing simple +MOV R1 65535; +MOV R2 100 +MOV R3 -65535; +ADD R4 R2 R3; +SUB R5 R4 R1; +MUL R6 R4 R5 +DIV R7 R6 R5; R7 = 152 + + + + +;;testing STR and LDR +MOV R10 50; +MOV R11 20 +STR R10 1 R11; +MOV R13 21 +LDR R12 R13 30; R12 = 20 + +ADD R13 R12 R7; R13 = 172 + + +;;testing loop jz and jmp +MOV R14 10; +MOV R15 1; +MOV R18 1; +MOV R17 1; +SUB R16 R14 R15 +JZ R16 4 +ADD R17 R17 R16 +ADD R15 R15 R18 +JMP -32 ;R17 = 46 + +ADD R19 R13 R17 ; 172 + 46 +RET R19 ; return sum; diff --git a/examples/partitionTests/jzHigh.s b/examples/partitionTests/jzHigh.s new file mode 100644 index 0000000..93e38ad --- /dev/null +++ b/examples/partitionTests/jzHigh.s @@ -0,0 +1,35 @@ +;;testing simple +MOV R1 65535; +MOV R2 100 +MOV R3 -65535; +ADD R4 R2 R3; +SUB R5 R4 R1; +MUL R6 R4 R5 +DIV R7 R6 R5; R7 = 152 + + + + +;;testing STR and LDR +MOV R10 50; +MOV R11 20 +STR R10 1 R11; +MOV R13 21 +LDR R12 R13 30; R12 = 20 + +ADD R13 R12 R7; R13 = 172 + + +;;testing loop jz and jmp +MOV R14 10; +MOV R15 1; +MOV R18 1; +MOV R17 1; +SUB R16 R14 R15 +JZ R16 7 +ADD R17 R17 R16 +ADD R15 R15 R18 +JMP -4 ;R17 = 46 + +ADD R19 R13 R17 ; 172 + 46 +RET R19 ; return sum; diff --git a/examples/partitionTests/jzNeg.s b/examples/partitionTests/jzNeg.s new file mode 100644 index 0000000..a3312a8 --- /dev/null +++ b/examples/partitionTests/jzNeg.s @@ -0,0 +1,35 @@ +;;testing simple +MOV R1 65535; +MOV R2 100 +MOV R3 -65535; +ADD R4 R2 R3; +SUB R5 R4 R1; +MUL R6 R4 R5 +DIV R7 R6 R5; R7 = 152 + + + + +;;testing STR and LDR +MOV R10 50; +MOV R11 20 +STR R10 1 R11; +MOV R13 21 +LDR R12 R13 30; R12 = 20 + +ADD R13 R12 R7; R13 = 172 + + +;;testing loop jz and jmp +MOV R14 10; +MOV R15 1; +MOV R18 1; +MOV R17 1; +SUB R16 R14 R15 +JZ R16 -29 +ADD R17 R17 R16 +ADD R15 R15 R18 +JMP -4 ;R17 = 46 + +ADD R19 R13 R17 ; 172 + 46 +RET R19 ; return sum; diff --git a/examples/partitionTests/noReturn.s b/examples/partitionTests/noReturn.s new file mode 100644 index 0000000..754bb15 --- /dev/null +++ b/examples/partitionTests/noReturn.s @@ -0,0 +1,2 @@ +MOV R0 1 +ADD R0 R0 R0 diff --git a/examples/partitionTests/strMaxMem.s b/examples/partitionTests/strMaxMem.s new file mode 100644 index 0000000..cd0a031 --- /dev/null +++ b/examples/partitionTests/strMaxMem.s @@ -0,0 +1,45 @@ +;;testing simple +MOV R1 65535; +MOV R2 100 +MOV R3 -65535; +;ADD R4 R2 R3; R4 = 100 + -65535 +;ADD R4 R4 R1; R4 = -65435 + 65535 +;SUB R5 R4 R1; R5 = 100 - 65535 +;SUB R5 R5 R3; R5 = -65435 - - 65535 + +;;testing simple +MOV R1 65535; +MOV R2 100 +MOV R3 -65535; +ADD R4 R2 R3; +SUB R5 R4 R1; +MUL R6 R4 R5 +DIV R7 R6 R5; R7 = 152 + + + + +;;testing STR and LDR +MOV R10 1; +ADD R20 R10 R1; +MOV R11 20 +STR R10 65535 R11; +MOV R13 21 +LDR R12 R10 65535; R12 = 20 + +ADD R13 R12 R7; R13 = 152 + + +;;testing loop jz and jmp +MOV R14 10; +MOV R15 1; +MOV R18 1; +MOV R17 1; +SUB R16 R14 R15 +JZ R16 4 +ADD R17 R17 R16 +ADD R15 R15 R18 +JMP -4 ;R17 = 46 + +ADD R19 R13 R17 ; 172 + 46 +RET R12 ; return sum; diff --git a/examples/partitionTests/strMemNeg.s b/examples/partitionTests/strMemNeg.s new file mode 100644 index 0000000..ab56ec8 --- /dev/null +++ b/examples/partitionTests/strMemNeg.s @@ -0,0 +1,42 @@ +;;testing simple +MOV R1 65535; +MOV R2 100 +MOV R3 -65535; +;ADD R4 R2 R3; R4 = 100 + -65535 +;ADD R4 R4 R1; R4 = -65435 + 65535 +;SUB R5 R4 R1; R5 = 100 - 65535 +;SUB R5 R5 R3; R5 = -65435 - - 65535 + +;;testing simple +MOV R1 65535; +MOV R2 100 +MOV R3 -65535; +ADD R4 R2 R3; +SUB R5 R4 R1; +MUL R6 R4 R5 +DIV R7 R6 R5; R7 = 152 + + + + +;;testing STR and LDR +MOV R10 -1; +STR R10 0 R10; ;;does nothing as b + v < -1 +LDR R12 0 R10; R12 = 0 + +ADD R13 R12 R7; R13 = 152 + + +;;testing loop jz and jmp +MOV R14 10; +MOV R15 1; +MOV R18 1; +MOV R17 1; +SUB R16 R14 R15 +JZ R16 4 +ADD R17 R17 R16 +ADD R15 R15 R18 +JMP -4 ;R17 = 46 + +ADD R19 R13 R17 ; 172 + 46 +RET R19 ; return sum; diff --git a/examples/partitionTests/validfile.s b/examples/partitionTests/validfile.s new file mode 100644 index 0000000..6195e6a --- /dev/null +++ b/examples/partitionTests/validfile.s @@ -0,0 +1,35 @@ +;;testing simple +MOV R1 65535; +MOV R2 100 +MOV R3 -65535; +ADD R4 R2 R3; +SUB R5 R4 R1; +MUL R6 R4 R5 +DIV R7 R6 R5; R7 = 152 + + + + +;;testing STR and LDR +MOV R10 50; +MOV R11 20 +STR R10 1 R11; momeory[51] = 20 +MOV R13 21 +LDR R12 R13 30; R12 = 20 + +ADD R13 R12 R7; R13 = 172 + + +;;testing loop jz and jmp +MOV R14 10; +MOV R15 1; +MOV R18 1; +MOV R17 1; +SUB R16 R14 R15 +JZ R16 4 +ADD R17 R17 R16 +ADD R15 R15 R18 +JMP -4 ;R17 = 46 + +ADD R19 R13 R17 ; 172 + 46 +RET R19 ; return sum; diff --git a/examples/partitionTests/valueHigh.s b/examples/partitionTests/valueHigh.s new file mode 100644 index 0000000..722fbac --- /dev/null +++ b/examples/partitionTests/valueHigh.s @@ -0,0 +1,9 @@ +;value > 65535 +MOV R1 65536; +MOV R2 1000 +MOV R3 -65535; +ADD R4 R2 R3; +SUB R5 R4 R1; +MUL R6 R4 R5 +DIV R7 R6 R5 +RET R7; diff --git a/examples/partitionTests/valueLow.s b/examples/partitionTests/valueLow.s new file mode 100644 index 0000000..a87c144 --- /dev/null +++ b/examples/partitionTests/valueLow.s @@ -0,0 +1,12 @@ + +MOV R1 65535; +MOV R2 1000 + +;Value < 65535 +MOV R3 -65536; + +ADD R4 R2 R3; +SUB R5 R4 R1; +MUL R6 R4 R5 +DIV R7 R6 R5 +RET R7; diff --git a/examples/strHigh.s b/examples/strHigh.s new file mode 100644 index 0000000..2071ecf --- /dev/null +++ b/examples/strHigh.s @@ -0,0 +1,6 @@ +;;testing STR and LDR +MOV R10 12; +MOV R0 65535; +STR R0 1 R10; memory[65536] = 12 +LDR R1 R0 1; R1 = 12 +RET R1; diff --git a/examples/strMax.s b/examples/strMax.s new file mode 100644 index 0000000..7a1029f --- /dev/null +++ b/examples/strMax.s @@ -0,0 +1,7 @@ +;;testing STR and LDR +MOV R10 12; +MOV R0 65533; +MOV R2 65532 +STR R0 2 R10; memory[65535] +LDR R1 R2 3; R1 = 12 +RET R1; diff --git a/examples/strNeg.s b/examples/strNeg.s new file mode 100644 index 0000000..1ae399f --- /dev/null +++ b/examples/strNeg.s @@ -0,0 +1,6 @@ +;;testing STR and LDR +MOV R10 12; +MOV R0 -1 +STR R0 0 R10; +LDR R1 R0 0; R1 = 12 +RET R1; diff --git a/examples/strZero.s b/examples/strZero.s new file mode 100644 index 0000000..35132bb --- /dev/null +++ b/examples/strZero.s @@ -0,0 +1,6 @@ +;;testing STR and LDR +MOV R10 12; +MOV R0 0 +STR R0 0 R10; +LDR R1 R0 0; R1 = 12 +RET R1; diff --git a/examples/valueHigh.s b/examples/valueHigh.s new file mode 100644 index 0000000..9dd4be1 --- /dev/null +++ b/examples/valueHigh.s @@ -0,0 +1,2 @@ +MOV R1 65536 ; Exception +RET R1 diff --git a/examples/valueLow.s b/examples/valueLow.s new file mode 100644 index 0000000..293c450 --- /dev/null +++ b/examples/valueLow.s @@ -0,0 +1,2 @@ +MOV R1 -65536 ; Exception +RET R1 diff --git a/mutants/mutant-1/swen90006/machine/Machine.java b/mutants/mutant-1/swen90006/machine/Machine.java index 9bf5731..6f5be61 100644 --- a/mutants/mutant-1/swen90006/machine/Machine.java +++ b/mutants/mutant-1/swen90006/machine/Machine.java @@ -3,7 +3,7 @@ package swen90006.machine; import java.util.Arrays; import java.util.List; -public class Machine +public class Machine { /** arithmetic instructions each take three registers as arguments with the * destination register appearing first @@ -12,13 +12,13 @@ public class Machine /** add rd rs1 rs2 =~ rd = rs1 + rs2 */ public static final String INSTRUCTION_ADD = "add"; - /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ + /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ public static final String INSTRUCTION_SUBTRACT = "sub"; - /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ + /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ public static final String INSTRUCTION_MULT = "mul"; - /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ + /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ public static final String INSTRUCTION_DIVIDE = "div"; /** ret rs =~ return rs */ @@ -38,17 +38,17 @@ public class Machine /** jz ra offs =~ if (ra == 0) pc = pc + offs else pc = pc + 1 */ public static final String INSTRUCTION_JZ = "jz"; - + public static final int NUM_REGS = 32; public static final int MAX_REG = (NUM_REGS - 1); public static final int MEMORY_SIZE = 65536; /* 4 x as much memory as a 64 */ public static final int MAX_ADDR = MEMORY_SIZE-1; - + private int[] memory; private int[] regs; private int count = 0; /* counts number of instructions executed so far */ - + public Machine() { memory = new int[MEMORY_SIZE]; @@ -60,17 +60,17 @@ public class Machine { regs[dest] = regs[src1] + regs[src2]; } - + private void do_sub(int dest, int src1, int src2) { regs[dest] = regs[src1] - regs[src2]; } - + private void do_mult(int dest, int src1, int src2) { regs[dest] = regs[src1] * regs[src2]; } - + private void do_div(int dest, int src1, int src2) { if (regs[src2] == 0){ @@ -86,7 +86,7 @@ public class Machine }else if(regs[src] + offs < 0){ /* no op */ }else{ - regs[dest] = memory[regs[src] + offs]; + regs[dest] = memory[Math.abs(regs[src]) + offs]; } } @@ -152,16 +152,16 @@ public class Machine throw new InvalidInstructionException(); } } - + /** Execute an assembly program. * - * @param prog is the program to execute as an iterable collection of strings, + * @param prog is the program to execute as an iterable collection of strings, * each of which is a single instruction. * @return the program's return value. - * @throws Exception when program has unrecognised or + * @throws Exception when program has unrecognised or * invalid instructions, or when it returns no result when it finishes */ - int execute(List<String> instructions) + int execute(List<String> instructions) throws InvalidInstructionException, NoReturnValueException { @@ -180,7 +180,7 @@ public class Machine break; } String inst = instructions.get(pc); - /* strip leading and trailing whitespace */ + /* strip leading and trailing whitespace */ inst = inst.toLowerCase().replaceAll("^\\s+","").replaceAll("\\s+$",""); /* strip out any comments */ String[] toks = inst.split(";"); diff --git a/mutants/mutant-2/swen90006/machine/Machine.java b/mutants/mutant-2/swen90006/machine/Machine.java index 9bf5731..68e5773 100644 --- a/mutants/mutant-2/swen90006/machine/Machine.java +++ b/mutants/mutant-2/swen90006/machine/Machine.java @@ -3,7 +3,7 @@ package swen90006.machine; import java.util.Arrays; import java.util.List; -public class Machine +public class Machine { /** arithmetic instructions each take three registers as arguments with the * destination register appearing first @@ -12,13 +12,13 @@ public class Machine /** add rd rs1 rs2 =~ rd = rs1 + rs2 */ public static final String INSTRUCTION_ADD = "add"; - /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ + /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ public static final String INSTRUCTION_SUBTRACT = "sub"; - /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ + /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ public static final String INSTRUCTION_MULT = "mul"; - /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ + /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ public static final String INSTRUCTION_DIVIDE = "div"; /** ret rs =~ return rs */ @@ -38,17 +38,17 @@ public class Machine /** jz ra offs =~ if (ra == 0) pc = pc + offs else pc = pc + 1 */ public static final String INSTRUCTION_JZ = "jz"; - + public static final int NUM_REGS = 32; public static final int MAX_REG = (NUM_REGS - 1); public static final int MEMORY_SIZE = 65536; /* 4 x as much memory as a 64 */ public static final int MAX_ADDR = MEMORY_SIZE-1; - + private int[] memory; private int[] regs; private int count = 0; /* counts number of instructions executed so far */ - + public Machine() { memory = new int[MEMORY_SIZE]; @@ -60,17 +60,17 @@ public class Machine { regs[dest] = regs[src1] + regs[src2]; } - + private void do_sub(int dest, int src1, int src2) { regs[dest] = regs[src1] - regs[src2]; } - + private void do_mult(int dest, int src1, int src2) { regs[dest] = regs[src1] * regs[src2]; } - + private void do_div(int dest, int src1, int src2) { if (regs[src2] == 0){ @@ -81,7 +81,7 @@ public class Machine } private void do_load(int dest, int src, int offs) { - if (regs[src] + offs > MAX_ADDR){ + if (regs[src] + Math.abs(offs) > MAX_ADDR){ /* no op */ }else if(regs[src] + offs < 0){ /* no op */ @@ -152,16 +152,16 @@ public class Machine throw new InvalidInstructionException(); } } - + /** Execute an assembly program. * - * @param prog is the program to execute as an iterable collection of strings, + * @param prog is the program to execute as an iterable collection of strings, * each of which is a single instruction. * @return the program's return value. - * @throws Exception when program has unrecognised or + * @throws Exception when program has unrecognised or * invalid instructions, or when it returns no result when it finishes */ - int execute(List<String> instructions) + int execute(List<String> instructions) throws InvalidInstructionException, NoReturnValueException { @@ -180,7 +180,7 @@ public class Machine break; } String inst = instructions.get(pc); - /* strip leading and trailing whitespace */ + /* strip leading and trailing whitespace */ inst = inst.toLowerCase().replaceAll("^\\s+","").replaceAll("\\s+$",""); /* strip out any comments */ String[] toks = inst.split(";"); diff --git a/mutants/mutant-3/swen90006/machine/Machine.java b/mutants/mutant-3/swen90006/machine/Machine.java index 9bf5731..9c4a583 100644 --- a/mutants/mutant-3/swen90006/machine/Machine.java +++ b/mutants/mutant-3/swen90006/machine/Machine.java @@ -3,7 +3,7 @@ package swen90006.machine; import java.util.Arrays; import java.util.List; -public class Machine +public class Machine { /** arithmetic instructions each take three registers as arguments with the * destination register appearing first @@ -12,13 +12,13 @@ public class Machine /** add rd rs1 rs2 =~ rd = rs1 + rs2 */ public static final String INSTRUCTION_ADD = "add"; - /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ + /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ public static final String INSTRUCTION_SUBTRACT = "sub"; - /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ + /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ public static final String INSTRUCTION_MULT = "mul"; - /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ + /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ public static final String INSTRUCTION_DIVIDE = "div"; /** ret rs =~ return rs */ @@ -38,17 +38,17 @@ public class Machine /** jz ra offs =~ if (ra == 0) pc = pc + offs else pc = pc + 1 */ public static final String INSTRUCTION_JZ = "jz"; - + public static final int NUM_REGS = 32; public static final int MAX_REG = (NUM_REGS - 1); public static final int MEMORY_SIZE = 65536; /* 4 x as much memory as a 64 */ public static final int MAX_ADDR = MEMORY_SIZE-1; - + private int[] memory; private int[] regs; private int count = 0; /* counts number of instructions executed so far */ - + public Machine() { memory = new int[MEMORY_SIZE]; @@ -60,17 +60,17 @@ public class Machine { regs[dest] = regs[src1] + regs[src2]; } - + private void do_sub(int dest, int src1, int src2) { regs[dest] = regs[src1] - regs[src2]; } - + private void do_mult(int dest, int src1, int src2) { regs[dest] = regs[src1] * regs[src2]; } - + private void do_div(int dest, int src1, int src2) { if (regs[src2] == 0){ @@ -91,7 +91,7 @@ public class Machine } private void do_store(int a, int offs, int b) { - if (regs[a] + offs > MAX_ADDR){ + if (regs[a] + Math.abs(offs) > MAX_ADDR){ /* no op */ }else if(regs[a] + offs < 0){ /* no op */ @@ -152,16 +152,16 @@ public class Machine throw new InvalidInstructionException(); } } - + /** Execute an assembly program. * - * @param prog is the program to execute as an iterable collection of strings, + * @param prog is the program to execute as an iterable collection of strings, * each of which is a single instruction. * @return the program's return value. - * @throws Exception when program has unrecognised or + * @throws Exception when program has unrecognised or * invalid instructions, or when it returns no result when it finishes */ - int execute(List<String> instructions) + int execute(List<String> instructions) throws InvalidInstructionException, NoReturnValueException { @@ -180,7 +180,7 @@ public class Machine break; } String inst = instructions.get(pc); - /* strip leading and trailing whitespace */ + /* strip leading and trailing whitespace */ inst = inst.toLowerCase().replaceAll("^\\s+","").replaceAll("\\s+$",""); /* strip out any comments */ String[] toks = inst.split(";"); diff --git a/mutants/mutant-4/swen90006/machine/Machine.java b/mutants/mutant-4/swen90006/machine/Machine.java index 9bf5731..53bdfe9 100644 --- a/mutants/mutant-4/swen90006/machine/Machine.java +++ b/mutants/mutant-4/swen90006/machine/Machine.java @@ -3,7 +3,7 @@ package swen90006.machine; import java.util.Arrays; import java.util.List; -public class Machine +public class Machine { /** arithmetic instructions each take three registers as arguments with the * destination register appearing first @@ -12,13 +12,13 @@ public class Machine /** add rd rs1 rs2 =~ rd = rs1 + rs2 */ public static final String INSTRUCTION_ADD = "add"; - /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ + /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ public static final String INSTRUCTION_SUBTRACT = "sub"; - /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ + /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ public static final String INSTRUCTION_MULT = "mul"; - /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ + /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ public static final String INSTRUCTION_DIVIDE = "div"; /** ret rs =~ return rs */ @@ -38,17 +38,17 @@ public class Machine /** jz ra offs =~ if (ra == 0) pc = pc + offs else pc = pc + 1 */ public static final String INSTRUCTION_JZ = "jz"; - + public static final int NUM_REGS = 32; public static final int MAX_REG = (NUM_REGS - 1); public static final int MEMORY_SIZE = 65536; /* 4 x as much memory as a 64 */ public static final int MAX_ADDR = MEMORY_SIZE-1; - + private int[] memory; private int[] regs; private int count = 0; /* counts number of instructions executed so far */ - + public Machine() { memory = new int[MEMORY_SIZE]; @@ -60,17 +60,17 @@ public class Machine { regs[dest] = regs[src1] + regs[src2]; } - + private void do_sub(int dest, int src1, int src2) { regs[dest] = regs[src1] - regs[src2]; } - + private void do_mult(int dest, int src1, int src2) { regs[dest] = regs[src1] * regs[src2]; } - + private void do_div(int dest, int src1, int src2) { if (regs[src2] == 0){ @@ -96,7 +96,7 @@ public class Machine }else if(regs[a] + offs < 0){ /* no op */ }else{ - memory[regs[a] + offs] = regs[b]; + memory[Math.abs(regs[a]) + offs] = regs[b]; } } @@ -152,16 +152,16 @@ public class Machine throw new InvalidInstructionException(); } } - + /** Execute an assembly program. * - * @param prog is the program to execute as an iterable collection of strings, + * @param prog is the program to execute as an iterable collection of strings, * each of which is a single instruction. * @return the program's return value. - * @throws Exception when program has unrecognised or + * @throws Exception when program has unrecognised or * invalid instructions, or when it returns no result when it finishes */ - int execute(List<String> instructions) + int execute(List<String> instructions) throws InvalidInstructionException, NoReturnValueException { @@ -180,7 +180,7 @@ public class Machine break; } String inst = instructions.get(pc); - /* strip leading and trailing whitespace */ + /* strip leading and trailing whitespace */ inst = inst.toLowerCase().replaceAll("^\\s+","").replaceAll("\\s+$",""); /* strip out any comments */ String[] toks = inst.split(";"); diff --git a/mutants/mutant-5/swen90006/machine/Machine.java b/mutants/mutant-5/swen90006/machine/Machine.java index 9bf5731..4714745 100644 --- a/mutants/mutant-5/swen90006/machine/Machine.java +++ b/mutants/mutant-5/swen90006/machine/Machine.java @@ -3,7 +3,7 @@ package swen90006.machine; import java.util.Arrays; import java.util.List; -public class Machine +public class Machine { /** arithmetic instructions each take three registers as arguments with the * destination register appearing first @@ -12,13 +12,13 @@ public class Machine /** add rd rs1 rs2 =~ rd = rs1 + rs2 */ public static final String INSTRUCTION_ADD = "add"; - /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ + /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ public static final String INSTRUCTION_SUBTRACT = "sub"; - /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ + /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ public static final String INSTRUCTION_MULT = "mul"; - /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ + /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ public static final String INSTRUCTION_DIVIDE = "div"; /** ret rs =~ return rs */ @@ -38,17 +38,17 @@ public class Machine /** jz ra offs =~ if (ra == 0) pc = pc + offs else pc = pc + 1 */ public static final String INSTRUCTION_JZ = "jz"; - + public static final int NUM_REGS = 32; public static final int MAX_REG = (NUM_REGS - 1); public static final int MEMORY_SIZE = 65536; /* 4 x as much memory as a 64 */ public static final int MAX_ADDR = MEMORY_SIZE-1; - + private int[] memory; private int[] regs; private int count = 0; /* counts number of instructions executed so far */ - + public Machine() { memory = new int[MEMORY_SIZE]; @@ -60,20 +60,20 @@ public class Machine { regs[dest] = regs[src1] + regs[src2]; } - + private void do_sub(int dest, int src1, int src2) { regs[dest] = regs[src1] - regs[src2]; } - + private void do_mult(int dest, int src1, int src2) { regs[dest] = regs[src1] * regs[src2]; } - + private void do_div(int dest, int src1, int src2) { - if (regs[src2] == 0){ + if (regs[src2] == 921231){ /* no op */ }else{ regs[dest] = regs[src1] / regs[src2]; @@ -152,16 +152,16 @@ public class Machine throw new InvalidInstructionException(); } } - + /** Execute an assembly program. * - * @param prog is the program to execute as an iterable collection of strings, + * @param prog is the program to execute as an iterable collection of strings, * each of which is a single instruction. * @return the program's return value. - * @throws Exception when program has unrecognised or + * @throws Exception when program has unrecognised or * invalid instructions, or when it returns no result when it finishes */ - int execute(List<String> instructions) + int execute(List<String> instructions) throws InvalidInstructionException, NoReturnValueException { @@ -180,7 +180,7 @@ public class Machine break; } String inst = instructions.get(pc); - /* strip leading and trailing whitespace */ + /* strip leading and trailing whitespace */ inst = inst.toLowerCase().replaceAll("^\\s+","").replaceAll("\\s+$",""); /* strip out any comments */ String[] toks = inst.split(";"); diff --git a/src/swen90006/machine/Machine.java b/src/swen90006/machine/Machine.java index 9bf5731..61c7bf8 100644 --- a/src/swen90006/machine/Machine.java +++ b/src/swen90006/machine/Machine.java @@ -3,7 +3,7 @@ package swen90006.machine; import java.util.Arrays; import java.util.List; -public class Machine +public class Machine { /** arithmetic instructions each take three registers as arguments with the * destination register appearing first @@ -12,13 +12,13 @@ public class Machine /** add rd rs1 rs2 =~ rd = rs1 + rs2 */ public static final String INSTRUCTION_ADD = "add"; - /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ + /** sub rd rs1 rs2 =~ rd = rs1 - rs2 */ public static final String INSTRUCTION_SUBTRACT = "sub"; - /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ + /** mul rd rs1 rs2 =~ rd = rs1 * rs2 */ public static final String INSTRUCTION_MULT = "mul"; - /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ + /** div rd rs1 rs2 =~ rd = rs1 / rs2 */ public static final String INSTRUCTION_DIVIDE = "div"; /** ret rs =~ return rs */ @@ -38,17 +38,17 @@ public class Machine /** jz ra offs =~ if (ra == 0) pc = pc + offs else pc = pc + 1 */ public static final String INSTRUCTION_JZ = "jz"; - + public static final int NUM_REGS = 32; public static final int MAX_REG = (NUM_REGS - 1); public static final int MEMORY_SIZE = 65536; /* 4 x as much memory as a 64 */ public static final int MAX_ADDR = MEMORY_SIZE-1; - + private int[] memory; private int[] regs; private int count = 0; /* counts number of instructions executed so far */ - + public Machine() { memory = new int[MEMORY_SIZE]; @@ -60,20 +60,20 @@ public class Machine { regs[dest] = regs[src1] + regs[src2]; } - + private void do_sub(int dest, int src1, int src2) { regs[dest] = regs[src1] - regs[src2]; } - + private void do_mult(int dest, int src1, int src2) { regs[dest] = regs[src1] * regs[src2]; } - + private void do_div(int dest, int src1, int src2) { - if (regs[src2] == 0){ + if (regs[src2] == 100){ /* no op */ }else{ regs[dest] = regs[src1] / regs[src2]; @@ -152,20 +152,19 @@ public class Machine throw new InvalidInstructionException(); } } - + /** Execute an assembly program. * - * @param prog is the program to execute as an iterable collection of strings, + * @param prog is the program to execute as an iterable collection of strings, * each of which is a single instruction. * @return the program's return value. - * @throws Exception when program has unrecognised or + * @throws Exception when program has unrecognised or * invalid instructions, or when it returns no result when it finishes */ - int execute(List<String> instructions) + int execute(List<String> instructions) throws InvalidInstructionException, NoReturnValueException { - int instructionsExecuted = 0; int pc = 0; final int progLength = instructions.size(); @@ -180,7 +179,7 @@ public class Machine break; } String inst = instructions.get(pc); - /* strip leading and trailing whitespace */ + /* strip leading and trailing whitespace */ inst = inst.toLowerCase().replaceAll("^\\s+","").replaceAll("\\s+$",""); /* strip out any comments */ String[] toks = inst.split(";"); @@ -188,9 +187,9 @@ public class Machine /* check for blank lines */ if (inst.equals("")){ - pc = pc + 1; - count++; - continue; + pc = pc + 1; + count++; + continue; } instructionsExecuted++; @@ -199,100 +198,111 @@ public class Machine /* check minimum number of tokens */ if (toks.length < 2){ - throw new InvalidInstructionException(); + throw new InvalidInstructionException(); } if (toks[0].equals(INSTRUCTION_ADD)){ - if (toks.length != 4){ - throw new InvalidInstructionException(); - } - int rd = parseReg(toks[1]); - int rs1 = parseReg(toks[2]); - int rs2 = parseReg(toks[3]); - do_add(rd,rs1,rs2); - } else if (toks[0].equals(INSTRUCTION_SUBTRACT)){ - if (toks.length != 4){ - throw new InvalidInstructionException(); - } - int rd = parseReg(toks[1]); - int rs1 = parseReg(toks[2]); - int rs2 = parseReg(toks[3]); - do_sub(rd,rs1,rs2); - } else if (toks[0].equals(INSTRUCTION_MULT)){ - if (toks.length != 4){ - throw new InvalidInstructionException(); - } - int rd = parseReg(toks[1]); - int rs1 = parseReg(toks[2]); - int rs2 = parseReg(toks[3]); - do_mult(rd,rs1,rs2); - } else if (toks[0].equals(INSTRUCTION_DIVIDE)){ - if (toks.length != 4){ - throw new InvalidInstructionException(); - } - int rd = parseReg(toks[1]); - int rs1 = parseReg(toks[2]); - int rs2 = parseReg(toks[3]); - do_div(rd,rs1,rs2); - } else if (toks[0].equals(INSTRUCTION_RETURN)){ - int rs = parseReg(toks[1]); - count++; - return regs[rs]; - } else if (toks[0].equals(INSTRUCTION_LOAD)){ - if (toks.length != 4){ - throw new InvalidInstructionException(); - } - int rd = parseReg(toks[1]); - int rs = parseReg(toks[2]); - int offs = parseOffset(toks[3]); - do_load(rd,rs,offs); - } else if (toks[0].equals(INSTRUCTION_STORE)){ - if (toks.length != 4){ - throw new InvalidInstructionException(); - } - int ra = parseReg(toks[1]); - int offs = parseOffset(toks[2]); - int rb = parseReg(toks[3]); - do_store(ra,offs,rb); - } else if (toks[0].equals(INSTRUCTION_MOVE)){ - if (toks.length != 3){ - throw new InvalidInstructionException(); - } - int rd = parseReg(toks[1]); - int offs = parseOffset(toks[2]); - do_move(rd,offs); - } else if (toks[0].equals(INSTRUCTION_JUMP)){ - if (toks.length != 2){ - throw new InvalidInstructionException(); - } - int offs = parseOffset(toks[1]); - pc = pc + offs; - count++; - continue; /* avoid default increment of pc below */ - } else if (toks[0].equals(INSTRUCTION_JZ)){ - if (toks.length != 3){ - throw new InvalidInstructionException(); - } - int ra = parseReg(toks[1]); - int offs = parseOffset(toks[2]); - if (regs[ra] == 0){ - pc = pc + offs; - }else{ - pc = pc + 1; - } - count++; - continue; /* avoid default increment the pc below */ - } else { - System.err.println("Unrecognised instruction: " + inst); - throw new InvalidInstructionException(); + if (toks.length != 4){ + throw new InvalidInstructionException(); + } + int rd = parseReg(toks[1]); + int rs1 = parseReg(toks[2]); + int rs2 = parseReg(toks[3]); + do_add(rd,rs1,rs2); } - count++; - pc = pc + 1; + else if (toks[0].equals(INSTRUCTION_SUBTRACT)){ + if (toks.length != 4){ + throw new InvalidInstructionException(); + } + int rd = parseReg(toks[1]); + int rs1 = parseReg(toks[2]); + int rs2 = parseReg(toks[3]); + do_sub(rd,rs1,rs2); + } + else if (toks[0].equals(INSTRUCTION_MULT)){ + if (toks.length != 4){ + throw new InvalidInstructionException(); + } + int rd = parseReg(toks[1]); + int rs1 = parseReg(toks[2]); + int rs2 = parseReg(toks[3]); + do_mult(rd,rs1,rs2); + } + else if (toks[0].equals(INSTRUCTION_DIVIDE)){ + if (toks.length != 4){ + throw new InvalidInstructionException(); + } + int rd = parseReg(toks[1]); + int rs1 = parseReg(toks[2]); + int rs2 = parseReg(toks[3]); + do_div(rd,rs1,rs2); + } + else if (toks[0].equals(INSTRUCTION_RETURN)){ + int rs = parseReg(toks[1]); + count++; + return regs[rs]; } + else if (toks[0].equals(INSTRUCTION_LOAD)){ + if (toks.length != 4){ + throw new InvalidInstructionException(); + } + int rd = parseReg(toks[1]); + int rs = parseReg(toks[2]); + int offs = parseOffset(toks[3]); + do_load(rd,rs,offs); + } + else if (toks[0].equals(INSTRUCTION_STORE)){ + if (toks.length != 4){ + throw new InvalidInstructionException(); + } + int ra = parseReg(toks[1]); + int offs = parseOffset(toks[2]); + int rb = parseReg(toks[3]); + do_store(ra,offs,rb); + } + else if (toks[0].equals(INSTRUCTION_MOVE)){ + if (toks.length != 3){ + throw new InvalidInstructionException(); + } + int rd = parseReg(toks[1]); + int offs = parseOffset(toks[2]); + do_move(rd,offs); + } + else if (toks[0].equals(INSTRUCTION_JUMP)){ + if (toks.length != 2){ + throw new InvalidInstructionException(); + } + int offs = parseOffset(toks[1]); + pc = pc + offs; + count++; + continue; /* avoid default increment of pc below */ + } + else if (toks[0].equals(INSTRUCTION_JZ)){ + if (toks.length != 3){ + throw new InvalidInstructionException(); + } + int ra = parseReg(toks[1]); + int offs = parseOffset(toks[2]); + if (regs[ra] == 0){ + pc = pc + offs; + } + else{ + pc = pc + 1; + } + count++; + continue; /* avoid default increment the pc below */ + } + else { + System.err.println("Unrecognised instruction: " + inst); + throw new InvalidInstructionException(); + } + count++; + pc = pc + 1; +} /* got here without returning already... */ - throw new NoReturnValueException(); - } +throw new NoReturnValueException(); +} /** * get the number of instructions successfully executed by the VM so far diff --git a/test/swen90006/machine/BoundaryTests.java b/test/swen90006/machine/BoundaryTests.java index 61ce1ca..f1339c2 100644 --- a/test/swen90006/machine/BoundaryTests.java +++ b/test/swen90006/machine/BoundaryTests.java @@ -24,53 +24,179 @@ public class BoundaryTests { } - //Any method annotation with "@Test" is executed as a test. - @Test public void aTest() + //EC3 , EC6 EC15, EC18, EC19 all tested in one + @Test public void Valid() { - //the assertEquals method used to check whether two values are - //equal, using the equals method - final int expected = 2; - final int actual = 1 + 1; - assertEquals(expected, actual); + final List<String> lines = readInstructions("examples/Valid.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), -2147303305); + } + + + + //EC1 - Ri, i is negative + @Test(expected = swen90006.machine.InvalidInstructionException.class) + public void RiNeg() + { + final List<String> lines = readInstructions("examples/RiNeg.s"); + Machine m = new Machine(); + m.execute(lines); + } + + //EC2 - Register value too high + @Test public void RiValueHigh() + { + final List<String> lines = readInstructions("examples/RiValueHigh.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), -2147483648); + } + + //EC4 - Ri, i too high > 31 + @Test(expected = swen90006.machine.InvalidInstructionException.class) + public void RiHigh() + { + final List<String> lines = readInstructions("examples/RiHigh.s"); + Machine m = new Machine(); + m.execute(lines); + } + + //EC5 - Value too low <-65535 + @Test(expected = swen90006.machine.InvalidInstructionException.class) + public void valueLow() + { + final List<String> lines = readInstructions("examples/valueLow.s"); + Machine m = new Machine(); + m.execute(lines); + } + + //EC7 - Value too high >65535 + @Test(expected = swen90006.machine.InvalidInstructionException.class) + public void valueHigh() + { + final List<String> lines = readInstructions("examples/valueHigh.s"); + Machine m = new Machine(); + m.execute(lines); + } + //EC9 -- jumps to PC = 1 as PC = 0 caused infinite loop + @Test public void JmpFirst() + { + final List<String> lines = readInstructions("examples/jmpFirst.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), 2); + } + + //EC8 - Jumps to negative pc, value=-c + @Test(expected = swen90006.machine.NoReturnValueException.class) + public void JmpNeg() + { + final List<String> lines = readInstructions("examples/jmpNeg.s"); + Machine m = new Machine(); + m.execute(lines); + } + //EC9 - jumps to PC = N + @Test public void JmpLast() + { + final List<String> lines = readInstructions("examples/jmpLast.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), 100); + } + //EC10 - Jumps past end of PC>N , value > N -c + @Test(expected = swen90006.machine.NoReturnValueException.class) + public void JmpPast() + { + final List<String> lines = readInstructions("examples/jmpPast.s"); + Machine m = new Machine(); + m.execute(lines); + } + + + //EC12 - JZ to PC= 1 as pc = 0 causes infinite loop + @Test public void JzFirst() + { + final List<String> lines = readInstructions("examples/jzfirst.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), -1); } - @Test public void anotherTest() + //EC11 - jz jumps to negative pc=-1, value = -c + @Test(expected = swen90006.machine.NoReturnValueException.class) + public void JzNeg() + { + final List<String> lines = readInstructions("examples/jzNeg.s"); + Machine m = new Machine(); + m.execute(lines); + } + //EC12 - JZ to PC= N + @Test public void JzLast() { - List<String> list = new ArrayList<String>(); - list.add("a"); - list.add("b"); + final List<String> lines = readInstructions("examples/jzLast.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), 100); + } + //EC13 - jz jumps past end of PC = N+1, value = N-c+ 1 + @Test(expected = swen90006.machine.NoReturnValueException.class) + public void JzPast() + { + final List<String> lines = readInstructions("examples/jzPast.s"); + Machine m = new Machine(); + m.execute(lines); + } - //the assertTrue method is used to check whether something holds. - assertTrue(list.contains("a")); + + + //EC14 - string store and load memory location negative, memory[-1] + @Test public void StrNeg() + { + final List<String> lines = readInstructions("examples/strNeg.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), 0); } - //Test test opens a file and executes the machine - @Test public void aFileOpenTest() + + // //EC15 -- Memory[0] -- implemented in valid test + // @Test public void StrZero() + // { + // final List<String> lines = readInstructions("examples/strZero.s"); + // Machine m = new Machine(); + // assertEquals(m.execute(lines), 12); + // } + // //EC15 -- Memory[65535] -- implmeneted in valid test + // @Test public void StrMax() + // { + // final List<String> lines = readInstructions("examples/strMax.s"); + // Machine m = new Machine(); + // assertEquals(m.execute(lines), 12); + // } + + + //EC16 - String store and load mormory location > MAX , memory[65536] + @Test public void StrHigh() { - final List<String> lines = readInstructions("examples/array.s"); + final List<String> lines = readInstructions("examples/strHigh.s"); Machine m = new Machine(); - assertEquals(m.execute(lines), 45); + assertEquals(m.execute(lines), 0); } - - //To test an exception, specify the expected exception after the @Test - @Test(expected = java.io.IOException.class) - public void anExceptionTest() - throws Throwable + + //EC18 - Divide by 0 + @Test public void Div() { - throw new java.io.IOException(); + final List<String> lines = readInstructions("examples/div.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), 100); } - //This test should fail. - //To provide additional feedback when a test fails, an error message - //can be included - @Test public void aFailedTest() + + //EC17 - No return reachable + @Test(expected = swen90006.machine.NoReturnValueException.class) + public void NoReturn() { - //include a message for better feedback - final int expected = 2; - final int actual = 1 + 2; - assertEquals("Some failure message", expected, actual); + final List<String> lines = readInstructions("examples/NoReturn.s"); + Machine m = new Machine(); + m.execute(lines); } + + //Read in a file containing a program and convert into a list of //string instructions private List<String> readInstructions(String file) diff --git a/test/swen90006/machine/PartitioningTests.java b/test/swen90006/machine/PartitioningTests.java index 8ecb32f..8b6c763 100644 --- a/test/swen90006/machine/PartitioningTests.java +++ b/test/swen90006/machine/PartitioningTests.java @@ -24,52 +24,160 @@ public class PartitioningTests { } - //Any method annotation with "@Test" is executed as a test. - @Test public void aTest() - { - //the assertEquals method used to check whether two values are - //equal, using the equals method - final int expected = 1; - final int actual = 2 / 2; - assertEquals(expected, actual); - } + //the assertTrue method is used to check whether something holds. + //assertTrue(list.contains("a")); - @Test public void anotherTest() - { - List<String> list = new ArrayList<String>(); - list.add("a"); - list.add("b"); - //the assertTrue method is used to check whether something holds. - assertTrue(list.contains("a")); - } - //Test test opens a file and executes the machine - @Test public void aFileOpenTest() +//Assignment tests cases from leaf nodes in test template tree: + + //EC3 , EC6 EC15, EC18 all tested in one + @Test public void Valid() { - final List<String> lines = readInstructions("examples/array.s"); + final List<String> lines = readInstructions("examples/partitionTests/validfile.s"); Machine m = new Machine(); - assertEquals(m.execute(lines), 45); + assertEquals(m.execute(lines), 218); } - //To test an exception, specify the expected exception after the @Test - @Test(expected = java.io.IOException.class) - public void anExceptionTest() - throws Throwable - { - throw new java.io.IOException(); - } - //This test should fail. - //To provide additional feedback when a test fails, an error message - //can be included - // @Test public void aFailedTest() - // { - // //include a message for better feedback - // final int expected = 2; - // final int actual = 1 + 2; - // assertEquals("Some failure message", expected, actual); - // } + +//EC1 - Ri, i is negative +@Test(expected = swen90006.machine.InvalidInstructionException.class) +public void RiNeg() +{ + final List<String> lines = readInstructions("examples/partitionTests/RiNeg.s"); + Machine m = new Machine(); + m.execute(lines); +} + //EC4 - Ri, i too high > 31 +@Test(expected = swen90006.machine.InvalidInstructionException.class) +public void RiHigh() +{ + final List<String> lines = readInstructions("examples/partitionTests/RiHigh.s"); + Machine m = new Machine(); + m.execute(lines); +} + + //EC7 - Value too high >65535 +@Test(expected = swen90006.machine.InvalidInstructionException.class) +public void ValueHigh() +{ + final List<String> lines = readInstructions("examples/partitionTests/valueHigh.s"); + Machine m = new Machine(); + m.execute(lines); +} + + + //EC5 - Value too low <-65535 +@Test(expected = swen90006.machine.InvalidInstructionException.class) +public void ValueLow() +{ + final List<String> lines = readInstructions("examples/partitionTests/valueLow.s"); + Machine m = new Machine(); + m.execute(lines); +} + + //EC2 - Register value too high, register value = maxvalue + 1 +@Test public void RiMaxValue() +{ + final List<String> lines = readInstructions("examples/partitionTests/RiMaxValue.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), -2147483648); +} + + //EC8 - Jumps to negative pc, value=-c +@Test(expected = swen90006.machine.NoReturnValueException.class) +public void JmpNeg() +{ + final List<String> lines = readInstructions("examples/partitionTests/jmpNeg.s"); + Machine m = new Machine(); + m.execute(lines); +} + + //EC10 - Jumps past end of PC>N , value > N -c +@Test(expected = swen90006.machine.NoReturnValueException.class) +public void JmpHigh() +{ + final List<String> lines = readInstructions("examples/partitionTests/jmpHigh.s"); + Machine m = new Machine(); + m.execute(lines); +} + + //EC11 - jz jumps to negative pc=-1, value = -c +@Test(expected = swen90006.machine.NoReturnValueException.class) +public void jzNeg() +{ + final List<String> lines = readInstructions("examples/partitionTests/jzNeg.s"); + Machine m = new Machine(); + m.execute(lines); +} + + //EC13 - jz jumps past end of PC = N+1, value = N-c+ 1 +@Test(expected = swen90006.machine.NoReturnValueException.class) +public void jzHigh() +{ + final List<String> lines = readInstructions("examples/partitionTests/jzHigh.s"); + Machine m = new Machine(); + m.execute(lines); +} + +//EC16 - String store and load mormory location > MAX , memory[65536] + +@Test public void strHigh() +{ + final List<String> lines = readInstructions("examples/partitionTests/strMaxMem.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), 0); +} + //EC14 - string store and load memory location negative, memory[-1] + +@Test(expected = swen90006.machine.InvalidInstructionException.class) +public void strNeg() +{ + final List<String> lines = readInstructions("examples/partitionTests/strMemNeg.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), 0); +} + + + + + + + +// //token is value instead of register +// @Test(expected = swen90006.machine.InvalidInstructionException.class) +// public void RChange() +// { +// final List<String> lines = readInstructions("examples/RChange.s"); +// Machine m = new Machine(); +// assertEquals(m.execute(lines), -64535); +// } + +// + + +///potential test for register value too high + + +//EC17- No return reachable +@Test(expected = swen90006.machine.NoReturnValueException.class) +public void NoReturn() +{ + final List<String> lines = readInstructions("examples/partitionTests/noReturn.s"); + Machine m = new Machine(); + m.execute(lines); +} + +//EC18 - Divide by 0 +@Test public void Div() +{ + final List<String> lines = readInstructions("examples/div.s"); + Machine m = new Machine(); + assertEquals(m.execute(lines), 100); +} + + //Read in a file containing a program and convert into a list of //string instructions -- GitLab