From c85d55ce7d6c449d8565d9580e723d60bfbabd5b Mon Sep 17 00:00:00 2001 From: KevinSchoenmayer Date: Sun, 4 Jan 2026 16:09:48 +0100 Subject: [PATCH] Almost full implementation of Scanner UI. Two tests not passing, but safety commit --- .../executionHistory/executionHistory.bin | Bin 86514 -> 86514 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.14/fileHashes/fileHashes.bin | Bin 23697 -> 23697 bytes .gradle/8.14/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.14/fileHashes/resourceHashesCache.bin | Bin 20197 -> 20469 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/file-system.probe | Bin 8 -> 8 bytes .../hhn/temp/project/AssignmentManager.class | Bin 3682 -> 3893 bytes build/jacoco/test.exec | Bin 53760 -> 53918 bytes build/reports/problems/problems-report.html | 2 +- .../hhn.temp.project.BadCasesTest.html | 26 +- .../hhn.temp.project.GoodCasesTest.html | 65 ++++- build/reports/tests/test/index.html | 14 +- .../tests/test/packages/hhn.temp.project.html | 12 +- .../TEST-hhn.temp.project.BadCasesTest.xml | 17 +- .../TEST-hhn.temp.project.GoodCasesTest.xml | 56 ++++- build/test-results/test/binary/results.bin | Bin 8203 -> 8203 bytes .../compileJava/previous-compilation-data.bin | Bin 916 -> 843 bytes .../stash-dir/GoodCasesTest.class.uniqueId0 | Bin 4430 -> 10116 bytes .../previous-compilation-data.bin | Bin 2048 -> 2054 bytes .../hhn/temp/project/AssignmentManager.java | 10 +- .../java/hhn/temp/project/UserCommands.java | 234 +++++++++++++++++- 22 files changed, 368 insertions(+), 68 deletions(-) diff --git a/.gradle/8.14/executionHistory/executionHistory.bin b/.gradle/8.14/executionHistory/executionHistory.bin index 712f219db236177ca3204b87ba894ed38e156a8d..6a5210f037d6500250ad678bf2d6d60db19c775b 100644 GIT binary patch delta 1733 zcmc&!X;4#F7|n$Q0}8$Xp#e%r#1SNbjKP3KtW+G!lr&&129XE`)CdVn0Kuhz78Gc3 zxrApcQg#F-EJ1>zgSB8~M+KK?Fo58KR5le`)V_rNl8%4->z#YTB=0Wgn} zR|UrD$#pnC=pqq?x%NjDe2OrmY1u6nP9;CSsYutDc-^&UvaZ=u{}ny^QKb$U6hV3_ z74rRyNivzCfhAjMri{LA&v+JbIu90PT9}Gs_{ddVVsTdcg5<{i18!{xXG&p8oE;Qx z386e|`mNir=T7Ctne(rLyYGUts``!w<^?KzvW1GDzz$HK>x>_GnAQP3xQ_T?4G?je z_-PF&;jY5hJitId*Oqk$V;YzzhyZ>s4vSeIDHMi?Ld8z}h!C+Dhup5!9cbq*y{>-e zvciw|ux4!T9S`UpK-*k_c{DJ4@VYo8=D>&C&fz|fn?XNFk1n&T#;AC2r}QkDL}DDc zrtwks-9(JKkBi*qGTT#J;6FOO{tL;=c4^v^C< z(p2toql}l9^r4FMeocGrdUDsmS5}@@veTa!*60vAERK6oXLswhgvbgmOUEN0Q`%tx z5*oD%@Q}sot4^k#`8O0M<5R1HHXe}sC655qb2SK;3l5h81mu)ny`oCJX*jDA1Dj?C zxpiu^-u$}rGx7Swa|4<>4>6#1ydCV#MixvDY9e|MdGXfJK#JhsU}s2`df-!rFtA<9 zH24t%4a~bnARDUV$)=u1a=h->jm9^pRmB{0^D-+RtnZMwNSgt*EACz2mfp}7&d=r3 zk{jf{cI>8snTFs24rkRUSLb*i{>tG~!Q{7)TE#&@oxwY=Ki4acLT;KNA5*yVuqKd< zCR+eo7(P^r*k6{}=PN5)_eghBT6nPvNPqlc9w~Po<`PJPL+srCYsODV`t>SgA*ZDX zPK+&)H$Jyrs8BONCjppizSnf;LjQPwp$?>Oi2S?mxLQma;3q-ytkT=t{H)2k#Vt6aj{N21R^IvXaWuyr)_tA zx-n4a6d~hnF+UUct5#V7z)vw@;<$)du||qR`bpF!WR7#!m8k#Z+5;!YmcyiS1Qq)LrbTMPnB;KH2^Tr*uiY!x2N4EmG{xkV z=;GnTBn73}0s^Y?0nrv27QQrxdH$=18K+m){ z+UJISC*RJZWIX-814Gz|3DL7`z%;F?Wv~b5u5IM&CN?TU@%?>FV1it z;^i3|q_Hb=92+ic%~f7l2SSC8_xt^hxfDiOo@bXx9|ovx36I`m3ke4*XauzuRj8Lz zhV#z+{>CG}@s@fDQhX8$YPBBF29Bud|H>8(&{1;^psXG08p&K{5@mV0o3;08>n|7Q zwAnQ5y-ob$t2#CpvM|av&HZ)ZnzZ4zKU5{g0W=XB$pMM~>li`VW^}?A zkWqIwFtkn(Mqq!za+6w}tuug2uKkWDAj(U%?Y}etRp_`cplar0t`#naj(3z_#AY?w zcqB{67X~##^tmr^wIJbfQ|~(We!ELTzPE1262hEC;Zkr`V_}BM{D2AbfeVsCuxT^R u)uBu7Jq~Z16E!(tIdM+p2+H;SKX3~4zNr%$hH$dw^Bf+4e_DIE#Zs(K8+tqjLT-$TsB|pznv>`6C1@K`|jxJ;d zRH&76dA9ytcU3;z*tDP*W-(d@C$lLUoJ1yS*L_mp{2Z5p z$}W?G8+PgY4@eikAS4;|aj=irZ2SerH7S#YjWYuTlIrxha+%IDkfT@pMJ?M;U8m;k5jz~=Njth@i zREmTSqEnQ3tG9xIj`Y##cHaY_4Z!XjR!V;}aqFxVvgqqV#+A+e9Zqzf$j)cw0Y1*i zNsw2gF%Ylr97~OxzK8Bkd14bnVg&T@_XR@=NDr5AY5;CTMkK-N5*wwLM9@HOL_sCy zVg-y~RtZ^YQi|osgVWG@RvTU`AtTcg{=E`&r0-O27rs#P6TtJavstctzoedNpj-6* zuFSS5mBjK)SJrbr1^pC~sfIPdnpg$}7y}Yy4Q+=8!xw=EZap%I5K}$*$^dT~GhQmv zwE%bIWVL^lDCZ7^a~h%)3lL4hF581|(N6~$`ehstVKlH0fU$o_t+U4Zqr^siu@Uw6 z5BV1k9`~ECo4XGhBnm5jB>bmEtfE!dXOze5bJn##>Q>JZd~Ol6&Poum*Mmy%+2lh; zPO9kC2B4zw?`Da5+(5+=nEnivPrPuK!r=*tYE2=`Ja&(3yA+EhEn(xgqF&y}s|8vxjEukwy#{0&|!lP{r)M09C7_ z!<2_s9(zg^vi!Mgt8>QcBpos;uuLy-l=4-!Q>I6Yc%toXbFW|-@758KWVclZRAC9; zU?q&+uS|(bVzXq>S~$H2*%AaiTrWE|cg8X$Ol+Swpi)8)rpe6b)rz;YA*$jLWAS2* zb}FdAe((c&){FT;YPGlORgGdi&psGSKXIXLk=0~J+@VwUNq~0#j|Q`4fuskhNh{p- z+&JtEx2F`R&XGX@Cn=3Zyc)^xf?VHnUjK@yyuk6F60@NEEq#kI@{{ zX?#S!O3Sm_{cRB_jE)VDNVQz-PH`H4cixoljjnxR_E2M>KzjP(Z9vof>+%$bkd%X< zr8I1*XNPYeTA)FT37E7eSpUImWUb+!S(j!Hs=(0Wo2eyBn*rVpV1 z-}Zy^rG8*Jw#gTeDT&+}8@53GVb_Xz7UK##YFIioA|)V{ayEJc&6TMVYjyMgj4Suh wPEiTO8~a}$GL#T8p)a6m3~l0M_rMdnTia8H2hDH38ClmBMJ^RZgp$QBOjI%pC+b%JH0nhBo{oZOUooW5& zChzptgD_ruZ%}x-|KNGv3)j}}{ITY1!ujirU~RqYRzS4zn@-;Cqt4v8E^+cxAAKO5 zI$7KoNUz;E*%L&s3!7XG=C7K()>lel()4%d%<4bSnZVceURv?-Du`k0IU$BIdryAu z3wFcB$%1}hH(Z(Q?5EG%yJ7X_Qom@%`reJ25T)uZKw8fjNPq+sL0I5i>EEm2S5l7p z&s_PX_k`$Gh~XQ(fs#PL!3HGIboj9Q^xsloblH{bIw@jmLM}wdo_Sym4D3$mI(!rb zJ}AVSzi^Lcn!(!jb4hYHPz5j)d-u$TXkh^Q2;GuiCwx-(~PPZk`ZVoA26bx;vmc_5f7^?PE}ioopGXR^QpUKOSNRXAPzq*OIoS zb)Rm(yN7vs=0z@EZm=1R`x78KSn@G-Je@c9@ORq6v!%inMI_nrw!p>RtilF_sPbv!=ztXoaEKzh%4v+@@wXYGVpGFdxF zD(Lb`;Z00YKNurKHwDLKa%_f5E`zv$6^om1n+PXrPg;Aciaz-0xm54ZfEcz46u3a3s4#hcq&jo& zx{s4jMuIX*$>iUWQVN$hF+V&Vr*iDUUlaYnxH}smn%2FAXp-AH*)$5AK`u>>j{;|q z%abQY0kv-|nS2;bmrwo*rW+@#N9&t5ZUp5MAYcy%5@;#uN}t4HMRnoU#*|woqbn7En hI8A;JloVuP`26>5xnFv(=naP?C0LSPHd!&I001{0Z6*K! delta 1112 zcmbQZlX2os#tr%23Ujwlsav;aSK7)`by5NrKc_G-FwQoX-m1+220Xfx`@PjzfC9Rc zcY5oA78|dxGi8$<<&waq?PUDTO8S8Le0MF!Fh^a_paas%RF}u$K_Sn5RsB?hAH< z!DK-{up5jgJNp5R^NreE>KDyuo9KH7qEx*FNb4B`2~8kY1Yv>C%0iNAQQ@Br5C6E@ zq~=@c`gog_k0_E0=VaPjdg;1W_LC2~p0# z2&B<0u;i8N=yF|kOyRoVB){fOU!gj@C(jO$sy}{QbD_YpNjHtx=Y-7CSp#$*D4e2R zL5#ZuqR@;}Yqo22+jscQf$w{6ujE;H3Tj+GLmSQCJ$wapo@-qZdDw+yD^RiEWHcSVz^JfVRBn+_UdOm^S`xSSakf6FC7^f$0!g5y z=z+0%p21-)4|Da+OI|H}!QYhyvt+V%kW^67tZzoSD}}F|7XOQb6_uHi=d+wNBxhJkZh-V2@M=C@I|Mtz(gJ!US61mP~<48R_AVVJ_#oUQ$*l{-Z z+1AAmf5+9fm!AH;-V*8?U5E~*hRO3IL0O<~^2tb0(w{i_cchd;ypeu#a^b%W-z>q~ zSts4jKwRLJ4b?PnvS}1JsT)p?j{+xkqsbGaKuJAy@?kKYIr%G?E}X0$t#6v>TME(1 z9**h2O_RUIvv@`^x;d@0-E%T88S2~q$=%UX5{Y${41YT|9rirH!hiUwIxvDk2{XEX z@?M~%T<7onMQ+mNeBqmS-G5iF43$io{2nOz*uJ>=*5ny-UdPIxJkmb#11gz1Suv&n E0Nw~gegFUf diff --git a/.gradle/8.14/fileHashes/fileHashes.lock b/.gradle/8.14/fileHashes/fileHashes.lock index 44e7aed26f219619b2b6e96dddfd4c9b1955fb55..e12de6f69ddb42cd9c11353f262e6c8b37751f13 100644 GIT binary patch literal 17 VcmZQJ+4?|x>8n?D3}C?Y2mn0L1=9ck literal 17 VcmZQJ+4?|x>8n?D3}C>N4*)z}1z-RG diff --git a/.gradle/8.14/fileHashes/resourceHashesCache.bin b/.gradle/8.14/fileHashes/resourceHashesCache.bin index 216adf20e25cffaee96684d755b76b3ec6b92205..8dcf4d23d7b7688bbcf86aea5fd00415c2e2c356 100644 GIT binary patch delta 434 zcmaDlm+|X-#tkMCj8>CPB~}PbPm|Bvce1ZcfI#|}NU`@jztlqoH%^`^6UD^ZxKZ(k z_(p>nLYo~umasV(17#(FSP+B-X7sM|o7uZP_;FQ6i+@eXS)iaCs*2znqF2mc#oNEG zIFNIXLCtY;wy#P31gm5R2c}plt1jW)B71ywF}39^nxoaRJy{~RYronhGlsjEDmadr zU--1;h&1O{#VPmKGKpfU;D2yHPsDM-iS5E4K3m4R*T7ZC0$C9EGfrD}VDH`5i@bmC M7Beaz(E%v|09*fs1poj5 delta 57 zcmV-90LK6Ip8@5a0kAX}0Wy;{7^t)L7$5e>lU*HB0tCUa PA@~=uFjy0_K}e(qhY=OG diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index dada411811165a0b44dc331ceb9a9376d00d421e..56923cab9eb48bce689ba3dfcf8275a84bd14921 100644 GIT binary patch literal 17 VcmZQBa#cSO`uvX|0~j!t0st_I1Ze;O literal 17 VcmZQBa#cSO`uvX|0~j!B0st^R1RVeX diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index a629a9b1f6bff05ace3c3b9aea1dd8e62500cc1a..92155b572c9d2c19c32d017d41b103082afd26cb 100644 GIT binary patch literal 8 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 diff --git a/build/jacoco/test.exec b/build/jacoco/test.exec index 9be5ca1417bb8cfd562e8eb19cd0c5b32f96e333..c914d07214e56104b34d517c30f5969bcdfa7bea 100644 GIT binary patch delta 451 zcmV;!0X+VIqywI%1CSROH#9UiI5J{p0004-iH)+N0004-iH*E6u`j>`3LB*HRt<_b zQvgGg0i+j`P8A`Ob_EfW?*v7&hXrQ?0Xwtr2!;#7l2D2ktuM`Sm8U6+COq6HDsW@cq_X>Mmv zb#!obbW?P4Wnpa_Ke+n`v(auPF+5|b{lKU^)UN;?XlQOPbY*RDFK}{iYGq?|FI978 zazk%zZDDR?bCv-E0002^{{e#ksu3`ARsI8CUJkSMpWXrug#r<3)y_YnAql|%Rg;kj zCbI^kjspq}5$Q=@{8MlP-jl!~Q?v1=%mo3sv%ajj2?_}j-yI5u7!79RlhHO7lh6Yc tl4}){zqXPI{{cJz0RR91u(MjXf(Qy>6v&D$pnRzSC6gf^9zCOfgZPJYi4yt$nc z^Lvgq9u`I(6^6x?qAXmJEREAl%XyO+(kB-RdT*AH+AYBGOrxpfw!QP7$-+@8{2Kq? z|KI;zkeSD%`{6;hC6f)8T5T59Zf9g-=GZ(>$3>El0SX#E95~8su=#_lw8&=rsCy!t zWAjxEH}6|;mx+;a^PI&8n1NL6at$`d{hQm??%-r(oNT}SmM}Y`3RJ&fL9u(p6YGrR z$pQKjn_YG!aByVqd$LPwQ;g!|&IR(^Ec}9rA}6}^7SybqtPmhJd4dAh<}(K_2?7A- C*;*O^ diff --git a/build/reports/problems/problems-report.html b/build/reports/problems/problems-report.html index 95604b4d..532e5406 100644 --- a/build/reports/problems/problems-report.html +++ b/build/reports/problems/problems-report.html @@ -650,7 +650,7 @@ code + .copy-button { diff --git a/build/reports/tests/test/classes/hhn.temp.project.BadCasesTest.html b/build/reports/tests/test/classes/hhn.temp.project.BadCasesTest.html index 8a5844f8..97b7f9a7 100644 --- a/build/reports/tests/test/classes/hhn.temp.project.BadCasesTest.html +++ b/build/reports/tests/test/classes/hhn.temp.project.BadCasesTest.html @@ -41,7 +41,7 @@
-
0.017s
+
0.096s

duration

@@ -63,6 +63,9 @@
  • Tests
  • +
  • +Standard output +
  • Tests

    @@ -78,7 +81,7 @@ Assert Add Task is programmed defensively assertAddTaskOnlyAcceptsValidParameters() -0.003s +0.007s passed @@ -90,31 +93,31 @@ Assert non-existent commands are recognized as such assertInvalidCommandsDontCrash() -0s +0.015s passed Assert List isn't empty after adding a task assertListNowEmptyAfterAdd() -0.002s +0.045s passed Assert that added tasks can't be Null assertNewTasksAreNotNull() -0.002s +0.003s passed Assert that Remove Task is programmed defensively assertRemoveTaskOnlyAcceptsValidParameters() -0.002s +0.014s passed Assert that removing a non-existent worker throws an Exception assertRemovingNonExistentWorkerFails() -0.002s +0.006s passed @@ -125,6 +128,13 @@
    +
    +

    Standard output

    + +
    Unknown command. Type 'help' for available commands.
    +
    +
    +
    Generated by -Gradle 8.14 at 04.01.2026, 15:20:17

    +Gradle 8.14 at 04.01.2026, 16:08:46

    diff --git a/build/reports/tests/test/classes/hhn.temp.project.GoodCasesTest.html b/build/reports/tests/test/classes/hhn.temp.project.GoodCasesTest.html index b88b9466..0ed2f764 100644 --- a/build/reports/tests/test/classes/hhn.temp.project.GoodCasesTest.html +++ b/build/reports/tests/test/classes/hhn.temp.project.GoodCasesTest.html @@ -41,7 +41,7 @@
    -
    0.133s
    +
    0.083s

    duration

    @@ -66,6 +66,9 @@
  • Tests
  • +
  • +Standard output +
  • Failed tests

    @@ -118,7 +121,7 @@ Check that every required surface command actually works assertCommandsAreRecognized() -0.014s +0.012s passed @@ -130,7 +133,7 @@ Check that editing is possible through UI assertEditingTasksIsPossibleThroughUi() -0.067s +0.026s failed @@ -142,43 +145,43 @@ Check that every task command works assertFinishingTasksIsPossibleThroughUi() -0.005s +0.006s passed Check Getters assertGettersWorkCorrectly() -0.026s +0.007s passed Assert that removing a worker removes the worker from the worker list assertRemoveWorkerActuallyRemoves() -0.004s +0.003s failed Assert that removing Workers is possible through the UI assertRemovingWorkersIsPossibleThroughUI() -0.003s +0.005s passed Assert that the Scanner is actually started when AM calls start assertScannerExists() -0.001s +0.002s passed Assert that Task State is actually changed when submitted as finished assertTaskStateChanges() -0.002s +0.011s passed Assert that added Tasks are added to the List assertTasksShowInList() -0.003s +0.002s passed @@ -190,11 +193,49 @@ Assert that Worker can remove Task assertWorkerCanRemoveOwnTask() -0.001s +0.002s passed
    +
    +

    Standard output

    + +
    Enter task ID: Error: Cannot invoke "java.util.Scanner.nextLine()" because "this.scanner" is null
    +Enter new name;description: Error: Cannot invoke "java.util.Scanner.nextLine()" because "this.scanner" is null
    +Unknown command. Type 'help' for available commands.
    +Available commands:
    +  createWorker  - Create a new worker
    +  createTask    - Create a new task
    +  selectTask    - Select a task to work with
    +  listWorkers   - List all workers
    +  help/?        - Show this help
    +  exit          - Exit the program
    +Available commands:
    +  createWorker  - Create a new worker
    +  createTask    - Create a new task
    +  selectTask    - Select a task to work with
    +  listWorkers   - List all workers
    +  help/?        - Show this help
    +  exit          - Exit the program
    +Enter worker name: Error: Cannot invoke "java.util.Scanner.nextLine()" because "this.scanner" is null
    +Enter worker ID: Error: Cannot invoke "java.util.Scanner.nextLine()" because "this.scanner" is null
    +Enter task ID: Error: Cannot invoke "java.util.Scanner.nextLine()" because "this.scanner" is null
    +Unknown command. Type 'help' for available commands.
    +Unknown command. Type 'help' for available commands.
    +Enter task ID: Error: Cannot invoke "java.util.Scanner.nextLine()" because "this.scanner" is null
    +Task marked as finished
    +Task marked as unfinished
    +Task removed
    +Unknown command. Type 'help' for available commands.
    +Unknown command. Type 'help' for available commands.
    +Enter worker ID: Error: Cannot invoke "java.util.Scanner.nextLine()" because "this.scanner" is null
    +Worker removed
    +Unknown command. Type 'help' for available commands.
    +Unknown command. Type 'help' for available commands.
    +
    +
    +
    Generated by -Gradle 8.14 at 04.01.2026, 15:20:17

    +Gradle 8.14 at 04.01.2026, 16:08:46

    diff --git a/build/reports/tests/test/index.html b/build/reports/tests/test/index.html index a413e1e1..5d1594bf 100644 --- a/build/reports/tests/test/index.html +++ b/build/reports/tests/test/index.html @@ -38,7 +38,7 @@
    -
    0.988s
    +
    0.911s

    duration

    @@ -113,7 +113,7 @@ 25 5 0 -0.988s +0.911s 80% @@ -140,7 +140,7 @@ 8 0 0 -0.017s +0.096s 100% @@ -150,7 +150,7 @@ 1 0 0 -0.739s +0.037s 100% @@ -160,7 +160,7 @@ 3 3 0 -0.099s +0.695s 0% @@ -170,7 +170,7 @@ 13 2 0 -0.133s +0.083s 84% @@ -184,7 +184,7 @@ Generated by -Gradle 8.14 at 04.01.2026, 15:20:17

    +Gradle 8.14 at 04.01.2026, 16:08:46

    diff --git a/build/reports/tests/test/packages/hhn.temp.project.html b/build/reports/tests/test/packages/hhn.temp.project.html index a9d8a356..eb358303 100644 --- a/build/reports/tests/test/packages/hhn.temp.project.html +++ b/build/reports/tests/test/packages/hhn.temp.project.html @@ -40,7 +40,7 @@
    -
    0.988s
    +
    0.911s

    duration

    @@ -111,7 +111,7 @@ 8 0 0 -0.017s +0.096s 100% @@ -121,7 +121,7 @@ 1 0 0 -0.739s +0.037s 100% @@ -131,7 +131,7 @@ 3 3 0 -0.099s +0.695s 0% @@ -141,7 +141,7 @@ 13 2 0 -0.133s +0.083s 84% @@ -154,7 +154,7 @@ Generated by -Gradle 8.14 at 04.01.2026, 15:20:17

    +Gradle 8.14 at 04.01.2026, 16:08:46

    diff --git a/build/test-results/test/TEST-hhn.temp.project.BadCasesTest.xml b/build/test-results/test/TEST-hhn.temp.project.BadCasesTest.xml index 2800d73f..c500e876 100644 --- a/build/test-results/test/TEST-hhn.temp.project.BadCasesTest.xml +++ b/build/test-results/test/TEST-hhn.temp.project.BadCasesTest.xml @@ -1,14 +1,15 @@ - + - - - - - + + + + + - - + + diff --git a/build/test-results/test/TEST-hhn.temp.project.GoodCasesTest.xml b/build/test-results/test/TEST-hhn.temp.project.GoodCasesTest.xml index a5443b83..ebcb5f4a 100644 --- a/build/test-results/test/TEST-hhn.temp.project.GoodCasesTest.xml +++ b/build/test-results/test/TEST-hhn.temp.project.GoodCasesTest.xml @@ -1,8 +1,8 @@ - + - - + + org.opentest4j.AssertionFailedError: expected: <Walk> but was: <Run> at app//org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151) at app//org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:132) @@ -16,14 +16,14 @@ at java.base@17.0.2/java.util.ArrayList.forEach(ArrayList.java:1511) - - - - + + + + - + - + org.opentest4j.AssertionFailedError: Expected java.lang.IllegalArgumentException to be thrown, but nothing was thrown. at app//org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:152) at app//org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:73) @@ -35,9 +35,41 @@ at java.base@17.0.2/java.util.ArrayList.forEach(ArrayList.java:1511) - - + + - + diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin index bd0f2cb3507836247090aac313c6217da7a04c74..02748925a73bbfd4613a41bf4eb259ae6073d32f 100644 GIT binary patch delta 483 zcmX|*JxCj27{{N>-NhttJ}!5uCU+(VMF&w39KXj-APQy?K_na! z{|FLkJ2cRxP}_i5-VO$(g9uWpViALagPYx4JGR z)54=^mQ5;B9A}}FYV$j(5ti1?T5FPD5prQn>v9@-pks)T*M&z$7g^`VBm|wiUla9ma0CNf6Ap?!E zzGwbP5zNHiKCR^ydVz!3E2s1~)gxd|F;zH^r~!-S8@J7mDO$pDycz$^*Gx?2Ct^d^ fnwO;*t`eE&j&m~6*Yut-k#s{AzBOeOo8Qs{&TE>4 delta 486 zcmX|-%_~G<6vodx_rA>a&c~g52XpVt7++CH%0D1OBC+r_b4$5WQ_4atC{i}kEHphE zv9J+KYW@UPN{TF`e8fsAHWn6gd(J_&h`jQ>uIo?!6^hRM7$i*@uB&{c^#6@hNM9;pF9|b=L|*E=NXghOXk`%=En6)VvZNhW5m~#Prl6ftULap69)AZSBq< zYrZC&zs|_(%g8tJf|xzOuYikSu#ldx9+L<|C(wqn%#_q3c2S15%-n*UR56B*#FE6M z#Nt#QfdrBk*))^2}qkyZbqZ@G9lqr}8N67`b4QZ7PbJOa<&9$Gci{L}L^mQA6d zMtQYT0#hQEztgUZzQHKYl%=tuWx8}QgAC9&i6yB5Y0IBHVVv~if7^A@xrui#i_1F8 zg)+)Bv=pZnDKK>8=jJBnr4$QX-o*Uybezhu2Y*fU1LN*&WM^Pxlx5^(;ACXvWt3$Q zXJlaHtY?q}Qv3{3KvI%H79_+V&B(~f$iTqR0K{<60AsNzIx4v;>#69e>ZvibB|hP-MiKteBO00Qf0NkzqNio zAGO_;btcO)Nh|8=>FMd~8R)4QGPLDZ78m9iF*GM<88dWLq@vh!f}QnU^le1gMa6jRK;rzadTzn)A=Vr+V6L=>o;#Sq z;Hl^3;w%PcOL^=0_*(OU*}T4be!l*W*4z;7oB?`)zFrWvWRS34uyaVLwY&mYDKJoh F005=by5;}? delta 765 zcmX@jHif;Oo57bckV%Evm&JuOm`#sek3)}BkBgxtBO{NSp|vD6w}6MCqo621D>b=< zm!T8LD$7hsE#hNnHE(_G0nI~|1d%)sztjiwNwZ~gr<^N~QERevIG5xrs&f4woEwbug^evYQ z7nf&fn|MI1Ucpzn#i>Q=3?2Eoxruox#RBn0 z`pLl`Z$sh+N6@Vl&gQ7B!QeaR43n?)&N-~NuFfcNTFfd3m zGRiP8Ff%eSh)m99l&aTo)O6L-)7I0`(`9H$&d=3jXiv}2PtQr!2ggfEeo|=~p8-Qp zML}v&CMbXsa|{`p3o-?|cda@2yz5@1%4&gsYyEsa8o6s3Gjyirr4|8wk|J<^6U*nd zi~8f!O}2^3vU6ve=$Y!7>6z>4S}?TbRu&iLSTZyxXIXJEbX26ImL(QsT2B^Wl2@?N zv(>ZHGqY!Cs?fIs(4TT{dhWg+E}p?&`ri7^ynOrug03KOW*$zRV8 z%n%FE3v}@k0J9Z?^n!hzWWj8i5WP^}Fh?h8h<3?vy$Ihx2wNdiSTD*sI@C!`9jp`> H(m((JYXs(V diff --git a/build/tmp/compileTestJava/compileTransaction/stash-dir/GoodCasesTest.class.uniqueId0 b/build/tmp/compileTestJava/compileTransaction/stash-dir/GoodCasesTest.class.uniqueId0 index 55ac44299889cef1b5bfe9b57e0e4fad72ccd204..d33dc2b5716e163559eab61d586b315927fcc882 100644 GIT binary patch literal 10116 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 delta 1374 zcmZ{kS5p&F9L3Kjgf+`5Ob{Xg5la+9iC{xeM9L@@aD-8OlBiKpNRXhSsIg%0uD$n; zNDGdRy!qmTPksT%@8NjvW@i%}dAVip-v95MbMJ0X{r73gx8I*e0W85tzfxjz%V<*( zK)D2ETT7rNw4>1%+GR&OcFX8c5kjW~mo{p1X??cB#Jwu^p-cN^n^%26MK_AL%@+#! zJ31SDZGHtZ4yiaSs;PSdf7d&r;;1N=R9m-c?YjEq>uMSr27lURtJdeponF(m#oyl9 z5)6c7Jdu#P)3?{>ZS@7VdmDFj1o!zixB9goj)lp1so)h}%Xp*WE#3{fQe|l>`V=JL zgNlb(Lvn2(;P0qv6}nh$P=Z^_Npo9e3~LqXOTr2y*pSHf7<2Hlm)P4pBar$zu;4gb zu?*PJ!&Z&HfD<^$nS@hZwdk8mVb#}E&u7RRM_?a@604!`EnotrCCAm7tQv(*b5UT< z=ta*)i)tCp>SiGzof?5uD3}N*(lCuria8R3a)<@y8g&%R#yOm4B`30Qfg=k$eJ=i*srjKp(4vBY7;t}%1^{Vg;L2;x+;8^TP5#u2=X;AShs25oAZO=Ogxu zSth3k2N3>yB__s+;E{YO2#56=d?6SB36obY0b%KOP+?znhkD2jPjxBhG=j_Fg;02%cPQ-ik OLKGE0lK~7Nf{Z^aCD{!C diff --git a/build/tmp/compileTestJava/previous-compilation-data.bin b/build/tmp/compileTestJava/previous-compilation-data.bin index 3a27f48771039faf7ac24a71f831a4704ba34ec5..bcb2433d0d793ff81893fef34789d8ed9f25c155 100644 GIT binary patch delta 67 zcmV-J0KETz5QY%2)B+IGvIF7EUL?lg{WLF8Ufi*xA%6x4baxDx%jO0V9(b9 Zv-AU*0Ra`0js>3uEdc-lM6)ag)B$Ge9+3b5 delta 61 zcmV-D0K)%<5P%S{)B+G+GB0CeasFscY7yIN$wthh5yGX~QE5d9gY diff --git a/src/main/java/hhn/temp/project/AssignmentManager.java b/src/main/java/hhn/temp/project/AssignmentManager.java index ed41652a..53a24a17 100644 --- a/src/main/java/hhn/temp/project/AssignmentManager.java +++ b/src/main/java/hhn/temp/project/AssignmentManager.java @@ -17,8 +17,7 @@ public class AssignmentManager { taskMap = new HashMap<>(); int workerIdCounter = 1000; int taskIdCounter = 0; - userInterface = new UserCommands(); - userInterface.start(); + userInterface = new UserCommands(this); } public int createWorker(String name) { @@ -80,5 +79,12 @@ public class AssignmentManager { public UserCommands getUserCommands() { return userInterface; } + public void startCLI() { + userInterface.start(); + } + + public void stopCLI() { + userInterface.stop(); + } } diff --git a/src/main/java/hhn/temp/project/UserCommands.java b/src/main/java/hhn/temp/project/UserCommands.java index c9abdf06..a5862043 100644 --- a/src/main/java/hhn/temp/project/UserCommands.java +++ b/src/main/java/hhn/temp/project/UserCommands.java @@ -1,24 +1,234 @@ package hhn.temp.project; import java.util.Scanner; +import java.util.concurrent.atomic.AtomicBoolean; + +public class UserCommands implements Runnable { + private Scanner scanner; + private AssignmentManager manager; + private boolean inTaskSelection = false; + private boolean inWorkerSelection = false; + private Integer selectedTaskId = null; + private Integer selectedWorkerId = null; + private AtomicBoolean running = new AtomicBoolean(false); + private Thread cliThread; + + public UserCommands(AssignmentManager manager) { + this.manager = manager; + } + + @Override + public void run() { + scanner = new Scanner(System.in); + running.set(true); + + while (running.get()) { + printPrompt(); + String input = scanner.nextLine().trim(); + + if ("exit".equalsIgnoreCase(input)) { + stop(); + continue; + } + + handleInput(input); + } + scanner.close(); + } -public class UserCommands { - Scanner scanner; public void start() { - boolean close = false; -// scanner = new Scanner(System.in); -// while (!close) { -// System.out.println("Type '?' or 'help' for a list of commands"); -// System.out.println("Please enter a command:"); -// String input = scanner.nextLine(); -// handleInput(input); -// } -// scanner.close(); + if (cliThread == null || !cliThread.isAlive()) { + cliThread = new Thread(this, "CLI-Thread"); + cliThread.start(); + } } - public void handleInput(String input) { + public void stop() { + running.set(false); + if (cliThread != null) { + cliThread.interrupt(); + } } + + private void printPrompt() { + if (!running.get()) return; + + if (inTaskSelection && selectedTaskId != null) { + System.out.println("Task " + selectedTaskId + " selected. Commands: finish, unfinish, remove, edit, back"); + } else if (inWorkerSelection && selectedWorkerId != null) { + System.out.println("Worker " + selectedWorkerId + " selected. Commands: remove, back"); + } else { + System.out.println("Type '?' or 'help' for a list of commands"); + } + System.out.print("> "); + } + + public void handleInput(String input) { + if (input == null || input.isEmpty()) { + return; + } + + if ("?".equals(input) || "help".equalsIgnoreCase(input)) { + showHelp(); + return; + } + + try { + if (inTaskSelection) { + handleTaskSelectionInput(input); + } else if (inWorkerSelection) { + handleWorkerSelectionInput(input); + } else { + handleMainMenuInput(input); + } + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + } + } + + private void showHelp() { + if (inTaskSelection && selectedTaskId != null) { + System.out.println("Task commands:"); + System.out.println(" finish - Mark task as finished"); + System.out.println(" unfinish - Mark task as unfinished"); + System.out.println(" remove - Remove this task"); + System.out.println(" edit - Edit task (prompts for name;description)"); + System.out.println(" back - Return to main menu"); + } else if (inWorkerSelection && selectedWorkerId != null) { + System.out.println("Worker commands:"); + System.out.println(" remove - Remove this worker"); + System.out.println(" back - Return to main menu"); + } else { + System.out.println("Available commands:"); + System.out.println(" createWorker - Create a new worker"); + System.out.println(" createTask - Create a new task"); + System.out.println(" selectTask - Select a task to work with"); + System.out.println(" listWorkers - List all workers"); + System.out.println(" help/? - Show this help"); + System.out.println(" exit - Exit the program"); + } + } + + private void handleMainMenuInput(String input) { + switch (input.toLowerCase()) { + case "createworker": + System.out.print("Enter worker name: "); + String workerName = scanner.nextLine().trim(); + int workerId = manager.createWorker(workerName); + System.out.println("Created worker with ID: " + workerId); + break; + + case "createtask": + System.out.print("Enter worker ID: "); + int workerIdForTask = Integer.parseInt(scanner.nextLine().trim()); + System.out.print("Enter task name: "); + String taskName = scanner.nextLine().trim(); + System.out.print("Enter task description: "); + String taskDesc = scanner.nextLine().trim(); + int taskId = manager.addTask(workerIdForTask, taskName, taskDesc); + System.out.println("Created task with ID: " + taskId); + break; + + case "selecttask": + inTaskSelection = true; + System.out.print("Enter task ID: "); + String taskIdInput = scanner.nextLine().trim(); + selectedTaskId = Integer.parseInt(taskIdInput); + break; + + case "listworkers": + inWorkerSelection = true; + System.out.print("Enter worker ID: "); + String workerIdInput = scanner.nextLine().trim(); + selectedWorkerId = Integer.parseInt(workerIdInput); + break; + + default: + System.out.println("Unknown command. Type 'help' for available commands."); + } + } + + private void handleTaskSelectionInput(String input) { + switch (input.toLowerCase()) { + case "finish": + manager.finishTask(manager.getTask(selectedTaskId).getWorkerId(), selectedTaskId); + System.out.println("Task marked as finished"); + break; + + case "unfinish": + manager.unfinishTask(manager.getTask(selectedTaskId).getWorkerId(), selectedTaskId); + System.out.println("Task marked as unfinished"); + break; + + case "remove": + manager.removeTask(selectedTaskId); + System.out.println("Task removed"); + resetSelection(); + break; + + case "edit": + System.out.print("Enter new name;description: "); + String editInput = scanner.nextLine().trim(); + String[] parts = editInput.split(";", 2); + if (parts.length == 2) { + manager.editTask(manager.getTask(selectedTaskId).getWorkerId(),selectedTaskId,parts[0],parts[1]); + System.out.println("Task edited"); + } else { + System.out.println("Invalid format. Use: name;description"); + } + break; + + case "back": + resetSelection(); + break; + + default: + try { + selectedTaskId = Integer.parseInt(input); + } catch (NumberFormatException e) { + System.out.println("Unknown command. Type 'help' for available commands."); + } + } + } + + private void handleWorkerSelectionInput(String input) { + switch (input.toLowerCase()) { + case "remove": + manager.removeWorker(selectedWorkerId); + System.out.println("Worker removed"); + resetSelection(); + break; + + case "back": + resetSelection(); + break; + + default: + try { + selectedWorkerId = Integer.parseInt(input); + } catch (NumberFormatException e) { + System.out.println("Unknown command. Type 'help' for available commands."); + } + } + } + + private void resetSelection() { + inTaskSelection = false; + inWorkerSelection = false; + selectedTaskId = null; + selectedWorkerId = null; + } + public Scanner getScanner() { return scanner; } + + // For testing - allows setting scanner + public void setScanner(Scanner scanner) { + this.scanner = scanner; + } + + public boolean isRunning() { + return running.get(); + } }