From 933777855440b7f72db7818ad18d7264f1478bd2 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 18:36:59 +0000 Subject: [PATCH 1/9] add deadline --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d7a6ba3..e974d43 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/qcWcnElX) # Java concurrency # Цели и задачи л/р: From 249c1b754a6304368ecb84e37de6c92aa8cd8ff6 Mon Sep 17 00:00:00 2001 From: Timofey Ivankov Date: Sat, 27 Sep 2025 15:28:38 +0300 Subject: [PATCH 2/9] hw done --- .gitignore | 29 ++ .gradle/9.1.0/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/9.1.0/checksums/md5-checksums.bin | Bin 0 -> 19797 bytes .gradle/9.1.0/checksums/sha1-checksums.bin | Bin 0 -> 25949 bytes .../executionHistory/executionHistory.bin | Bin 0 -> 193519 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/9.1.0/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/9.1.0/fileHashes/fileHashes.bin | Bin 0 -> 22697 bytes .gradle/9.1.0/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../9.1.0/fileHashes/resourceHashesCache.bin | Bin 0 -> 25739 bytes .gradle/9.1.0/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 19199 bytes .gradle/file-system.probe | Bin 0 -> 8 bytes .gradle/vcs-1/gc.properties | 0 .idea/.gitignore | 8 + .idea/compiler.xml | 6 + .idea/gradle.xml | 16 ++ .idea/inspectionProfiles/Project_Default.xml | 8 + .idea/misc.xml | 10 + .idea/vcs.xml | 6 + Dockerfile | 9 + Makefile | 5 + build.gradle | 29 ++ .../java/main/org/example/app/Main.class | Bin 0 -> 1776 bytes .../java/main/org/example/dinner/Dinner.class | Bin 0 -> 3684 bytes .../org/example/dinner/DinnerVerifier.class | Bin 0 -> 848 bytes .../example/dinner/ResourceGenerator.class | Bin 0 -> 1694 bytes .../java/main/org/example/fork/Fork.class | Bin 0 -> 403 bytes .../org/example/programmer/Programmer.class | Bin 0 -> 4043 bytes .../main/org/example/utils/IndexFetcher.class | Bin 0 -> 895 bytes .../test/org/example/dinner/DinnerTest.class | Bin 0 -> 2640 bytes .../example/dinner/DinnerVerifierTest.class | Bin 0 -> 2873 bytes .../dinner/ResourceGeneratorTest.class | Bin 0 -> 1590 bytes .../java/test/org/example/fork/ForkTest.class | Bin 0 -> 761 bytes .../example/programmer/ProgrammerTest.class | Bin 0 -> 6793 bytes .../org/example/utils/IndexFetcherTest.class | Bin 0 -> 1926 bytes .../org.example.dinner.DinnerTest.html | 125 +++++++++ ...org.example.dinner.DinnerVerifierTest.html | 111 ++++++++ ....example.dinner.ResourceGeneratorTest.html | 96 +++++++ .../classes/org.example.fork.ForkTest.html | 96 +++++++ ...org.example.programmer.ProgrammerTest.html | 181 ++++++++++++ .../org.example.utils.IndexFetcherTest.html | 111 ++++++++ build/reports/tests/test/css/base-style.css | 174 ++++++++++++ build/reports/tests/test/css/style.css | 97 +++++++ build/reports/tests/test/index.html | 213 ++++++++++++++ build/reports/tests/test/js/report.js | 243 ++++++++++++++++ .../test/packages/org.example.dinner.html | 123 ++++++++ .../tests/test/packages/org.example.fork.html | 103 +++++++ .../test/packages/org.example.programmer.html | 103 +++++++ .../test/packages/org.example.utils.html | 103 +++++++ .../TEST-org.example.dinner.DinnerTest.xml | 18 ++ ...-org.example.dinner.DinnerVerifierTest.xml | 10 + ...g.example.dinner.ResourceGeneratorTest.xml | 7 + .../test/TEST-org.example.fork.ForkTest.xml | 7 + ...-org.example.programmer.ProgrammerTest.xml | 24 ++ ...EST-org.example.utils.IndexFetcherTest.xml | 10 + build/test-results/test/binary/output.bin | 9 + build/test-results/test/binary/output.bin.idx | Bin 0 -> 69 bytes build/test-results/test/binary/results.bin | Bin 0 -> 2579 bytes .../compileJava/previous-compilation-data.bin | Bin 0 -> 518 bytes .../previous-compilation-data.bin | Bin 0 -> 1573 bytes docker-compose.yml | 12 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 45457 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 248 ++++++++++++++++ gradlew.bat | 93 ++++++ readme.MD | 17 ++ src/main/java/org/example/app/Main.java | 28 ++ src/main/java/org/example/dinner/Dinner.java | 44 +++ .../org/example/dinner/DinnerVerifier.java | 15 + .../org/example/dinner/ResourceGenerator.java | 26 ++ src/main/java/org/example/fork/Fork.java | 11 + .../org/example/programmer/Programmer.java | 138 +++++++++ .../java/org/example/utils/IndexFetcher.java | 28 ++ .../java/org/example/dinner/DinnerTest.java | 43 +++ .../example/dinner/DinnerVerifierTest.java | 43 +++ .../example/dinner/ResourceGeneratorTest.java | 35 +++ src/test/java/org/example/fork/ForkTest.java | 16 ++ .../example/programmer/ProgrammerTest.java | 265 ++++++++++++++++++ .../org/example/utils/IndexFetcherTest.java | 50 ++++ 82 files changed, 3211 insertions(+) create mode 100644 .gitignore create mode 100644 .gradle/9.1.0/checksums/checksums.lock create mode 100644 .gradle/9.1.0/checksums/md5-checksums.bin create mode 100644 .gradle/9.1.0/checksums/sha1-checksums.bin create mode 100644 .gradle/9.1.0/executionHistory/executionHistory.bin create mode 100644 .gradle/9.1.0/executionHistory/executionHistory.lock create mode 100644 .gradle/9.1.0/fileChanges/last-build.bin create mode 100644 .gradle/9.1.0/fileHashes/fileHashes.bin create mode 100644 .gradle/9.1.0/fileHashes/fileHashes.lock create mode 100644 .gradle/9.1.0/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/9.1.0/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 .gradle/file-system.probe create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 build.gradle create mode 100644 build/classes/java/main/org/example/app/Main.class create mode 100644 build/classes/java/main/org/example/dinner/Dinner.class create mode 100644 build/classes/java/main/org/example/dinner/DinnerVerifier.class create mode 100644 build/classes/java/main/org/example/dinner/ResourceGenerator.class create mode 100644 build/classes/java/main/org/example/fork/Fork.class create mode 100644 build/classes/java/main/org/example/programmer/Programmer.class create mode 100644 build/classes/java/main/org/example/utils/IndexFetcher.class create mode 100644 build/classes/java/test/org/example/dinner/DinnerTest.class create mode 100644 build/classes/java/test/org/example/dinner/DinnerVerifierTest.class create mode 100644 build/classes/java/test/org/example/dinner/ResourceGeneratorTest.class create mode 100644 build/classes/java/test/org/example/fork/ForkTest.class create mode 100644 build/classes/java/test/org/example/programmer/ProgrammerTest.class create mode 100644 build/classes/java/test/org/example/utils/IndexFetcherTest.class create mode 100644 build/reports/tests/test/classes/org.example.dinner.DinnerTest.html create mode 100644 build/reports/tests/test/classes/org.example.dinner.DinnerVerifierTest.html create mode 100644 build/reports/tests/test/classes/org.example.dinner.ResourceGeneratorTest.html create mode 100644 build/reports/tests/test/classes/org.example.fork.ForkTest.html create mode 100644 build/reports/tests/test/classes/org.example.programmer.ProgrammerTest.html create mode 100644 build/reports/tests/test/classes/org.example.utils.IndexFetcherTest.html create mode 100644 build/reports/tests/test/css/base-style.css create mode 100644 build/reports/tests/test/css/style.css create mode 100644 build/reports/tests/test/index.html create mode 100644 build/reports/tests/test/js/report.js create mode 100644 build/reports/tests/test/packages/org.example.dinner.html create mode 100644 build/reports/tests/test/packages/org.example.fork.html create mode 100644 build/reports/tests/test/packages/org.example.programmer.html create mode 100644 build/reports/tests/test/packages/org.example.utils.html create mode 100644 build/test-results/test/TEST-org.example.dinner.DinnerTest.xml create mode 100644 build/test-results/test/TEST-org.example.dinner.DinnerVerifierTest.xml create mode 100644 build/test-results/test/TEST-org.example.dinner.ResourceGeneratorTest.xml create mode 100644 build/test-results/test/TEST-org.example.fork.ForkTest.xml create mode 100644 build/test-results/test/TEST-org.example.programmer.ProgrammerTest.xml create mode 100644 build/test-results/test/TEST-org.example.utils.IndexFetcherTest.xml create mode 100644 build/test-results/test/binary/output.bin create mode 100644 build/test-results/test/binary/output.bin.idx create mode 100644 build/test-results/test/binary/results.bin create mode 100644 build/tmp/compileJava/previous-compilation-data.bin create mode 100644 build/tmp/compileTestJava/previous-compilation-data.bin create mode 100644 docker-compose.yml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 readme.MD create mode 100644 src/main/java/org/example/app/Main.java create mode 100644 src/main/java/org/example/dinner/Dinner.java create mode 100644 src/main/java/org/example/dinner/DinnerVerifier.java create mode 100644 src/main/java/org/example/dinner/ResourceGenerator.java create mode 100644 src/main/java/org/example/fork/Fork.java create mode 100644 src/main/java/org/example/programmer/Programmer.java create mode 100644 src/main/java/org/example/utils/IndexFetcher.java create mode 100644 src/test/java/org/example/dinner/DinnerTest.java create mode 100644 src/test/java/org/example/dinner/DinnerVerifierTest.java create mode 100644 src/test/java/org/example/dinner/ResourceGeneratorTest.java create mode 100644 src/test/java/org/example/fork/ForkTest.java create mode 100644 src/test/java/org/example/programmer/ProgrammerTest.java create mode 100644 src/test/java/org/example/utils/IndexFetcherTest.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.gradle/9.1.0/checksums/checksums.lock b/.gradle/9.1.0/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..39bc40f93ba8649ebca82c4b4ab2eabc98dc940b GIT binary patch literal 17 UcmZQ(au@M!ox03{0Rqkd03W#ndH?_b literal 0 HcmV?d00001 diff --git a/.gradle/9.1.0/checksums/md5-checksums.bin b/.gradle/9.1.0/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..81cc7282b7c3a2f0f6b5684c14c0e6f1789c1080 GIT binary patch literal 19797 zcmeI3X;52L7={C~lr3y&q=cZzZm|VI3KGg9TOiP(mfF#xHlYYk#1<*Cl$HW&EkzhY zqy>hhEJ_)n(4>n{fr8W-sAHmS(*cF5fapLK3ZaV>6V5r)k;@N%JKvqTxo6&-=lgP> zbMCLq4WrR)ELQMAdva`iGK3Kr00UqE41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq& z0Wk1?F|b>6BgW`vY&>+e1M^H8&C^sfu&te_5}yB3@eTSq`YH1NLEGYawqJNy0?K20 zN#43z|W_dd!6^^-|{L+^#1!sY9aas9m{ zA1z2v6?CxM+57SQIg+om>#EPl6s0JSG9tOnqdjvGjdxx{xnPOp4w8Dw z@LF*2D0dUlt(X<+&6kSLJ&8r#PxY356tQC)N3>v$Mv_8oG+FvCUHwo z`Wl3M?LwR&1$@c`@O+LV7^x`@~l8f5?Uw?e9+6U$Qbdslb1{=NH!Fhn| za7q5Ifx&mzzv3Rp^P5SYHa#Pk7Ho<`c~l+Ab9lmM+wC1|y-$XjcBU_Z*S28rYH81UEN&zCg4lLxcyLN;s9b#daDxnR~sdm)nqHrL#)3 zlvyHzslBebk8WqN)d+VkD)8rQpCB211ryzfVC|w3hW0nENJ^NM+2aRY?5g54Zz^ck zqos5K5vCtf3D(<}Px20bT#=?9uuv}l$q5mXO^C2QL?wckbgLpyw{k+oe>J|OY8=8u zHX=;=sYJ?5-CKEVnSX=yM-SDuHzG0dJtA!4sYKC*gpE6PSKo>pnvO6(diEqD%5xE6 zdXP%|Q8qA|)I8G0Ns-Z&Z4D)uxQPg+h)UGGqAF+4)V9CK>8C4Qoqr>I2XIqr$XvG|G%heW--L7~?WQ6<1V)^U|UOYl`3 z?a-5du3GU4H@u1o{0v&RQG3vfvnB^}-)s1y<(K25leTClwlYjm4-@TfS+nLB>1Do( ZbF3q7Twk*(*$88`M=JxnvdYsE{{Ssqk~shX literal 0 HcmV?d00001 diff --git a/.gradle/9.1.0/checksums/sha1-checksums.bin b/.gradle/9.1.0/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..a4009d28114a876405b363e52f31dfa63ac8f764 GIT binary patch literal 25949 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 literal 0 HcmV?d00001 diff --git a/.gradle/9.1.0/executionHistory/executionHistory.bin b/.gradle/9.1.0/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..f4da6ae486a0e19e2f3cdc81ec5a279575e50ac2 GIT binary patch literal 193519 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 literal 0 HcmV?d00001 diff --git a/.gradle/9.1.0/fileChanges/last-build.bin b/.gradle/9.1.0/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/9.1.0/fileHashes/fileHashes.bin b/.gradle/9.1.0/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..0bd39b95491ef48db57f2cec716ca5143568a0a2 GIT binary patch literal 22697 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 GGx2|cHZiaO literal 0 HcmV?d00001 diff --git a/.gradle/9.1.0/fileHashes/fileHashes.lock b/.gradle/9.1.0/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..aabe1b3b2d9b532857744f3001878605e669663c GIT binary patch literal 17 VcmZR+alLSd>BMhe7{Gv+2LMFy1*HH0 literal 0 HcmV?d00001 diff --git a/.gradle/9.1.0/fileHashes/resourceHashesCache.bin b/.gradle/9.1.0/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..0038c7bfcd88f6ba7791d3b4b98842b6aeaafa50 GIT binary patch literal 25739 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 literal 0 HcmV?d00001 diff --git a/.gradle/9.1.0/gc.properties b/.gradle/9.1.0/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..e72683141a210092ed34c38643e7c8330b333e10 GIT binary patch literal 17 VcmZR6pS^K!{jaA+3}C=<763&91~C8t literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..d2f51d7 --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Sun Sep 21 16:09:01 MSK 2025 +gradle.version=9.1.0 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..f4e3ae1e0a9b766180e5e613520ba84cbd39973b GIT binary patch literal 19199 zcmeI&Ye9{l9*Ob)0{{Onp&CJSQL?|m4|JLv$UXtrg$n8Lo6keOi(Jb3i^K$#Von&mV!F)%CbLx<^m-%9L@NDVy3IL9UsnewojOWWiOB+4FYqx7-rq|D5J; zu@~Hz-*c*p3!wRW_OmhBLwo#3O9fY+VlTehbk18Q7t=nr>?IKv*@~drJaR3&K3^N9 zZFD$EE@rP=8tgUh6K^lLYJ~l+S^MbTfv-!*HSFy*mFw0=m&?hE*xz?CyF+bof(eYr&P9*_Y=xyD2}_U8ntf*jMVLYjqa8f@xmI z?q?=(-8W$Mh&+Qm(5^UUB*D5taCPgHA1^E!FRu-w`EYji3WL_yD^W_`#vbD4BAM^2 zc`dkVK6`k#&9&7xyFAJ5*>_eKB!wonzMy?7+2d*&a*K408wFRFu^%XV7`v^^rI_a9 z*;8KjH#a8 literal 0 HcmV?d00001 diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe new file mode 100644 index 0000000000000000000000000000000000000000..99a341a202fe3ca7e04bf29dde2256aa79524bb9 GIT binary patch literal 8 PcmZQzV4T@4b?Pht2j&9T literal 0 HcmV?d00001 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..bcf4711 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..ce1c62c --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..db0f74e --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..7b2a2bd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e908837 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM openjdk:24-jdk-slim + +WORKDIR /app + +COPY . . + +RUN chmod +x gradlew + +RUN ./gradlew build --no-daemon \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..857c713 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +run_homework: + docker compose up --build + +test_homework: + docker compose --profile homework1_test run --rm --build homework1_test \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..e6ca0f2 --- /dev/null +++ b/build.gradle @@ -0,0 +1,29 @@ +plugins { + id 'java' + id 'application' +} + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.0' +} + +application { + mainClass = 'org.example.app.Main' +} + +configurations { + jcstress +} + +test { + useJUnitPlatform() + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + showStandardStreams = true + } +} \ No newline at end of file diff --git a/build/classes/java/main/org/example/app/Main.class b/build/classes/java/main/org/example/app/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..6a00d5a4fb0ad3a9d36d50ae6a6c78de91ef10ed GIT binary patch literal 1776 zcmb_dT~ixX7=BK&VPOdYLPL$vT3d<<*sdRyDrr#~icJj^2~yD+heL7$PbjH0n=e+NEKc4qF?>YO&tCQaWEaE#0F~m(6 zNhHuGF!Dm~OS>W6y8UeDg{o?Sz6Xx$=mmjzF28A_|FuzDI}LkXx;3w9!9+Y929ro) zNWgT}fiAi9HgctW$;7ZgJ_;RqRXw-b4g%$BTWYWARPDuRqKB%hz(NY6A)s`}e{%p= zkTEfy#8tfYI)4PRa@f+UNo-!5$ui|AhvV66f#d3m4wP&b`ti2F(w+a|voMKkCax#( z4sHmHU6PHp`(f^eOE|d>o(@t?b-j?^Oq2MVN!-Gez}2SQQ$?~N^>at>a@Eq()veIC zl)vbmhQLh|?+IkRpl+)J+4LLAt~su&0(&W%EKG-oF^!odX7Rp2qNRd;C1B@DorwSD z3<%W3U4bjTd8F^#E7D)oQ!Bqk;{&)1W3@_Nub6DFY{zyGldvI;?5D zd|9vpqcx+TzOMhkYeV0)sz#UM-SUATaPo5}5rDg|fpt z{0U5)19*;Aq7)91%An3l#x4QM&49Ndq~NU6JNJXm@s-7I1%@hGR`*t<-zCO+d{9-s zc6jb4mIbayo>9MqcOeMczE-t2MgmsFYX?=e?1WqoglBO#bRk8LJWscDApI4kcfDGx zA72Ti*3O8Vzajdu!v0()YZQk2@XW#*zBaKQwqr$L>MXtE?t6R6<`rVsb~yhnxJThR?sl#NEk(TX%D zOW{o@He{=%NGW^g_Jx`*gKC1O)5HEbaNVldD4n|SF7EKz48IsJBp*(WHYJ<0;GCE_ zhWItw{(xh+4fNwfj>(PzKElV825=9bFbJK+Ef}-`{8N})#~3J&#{Ya6U${16y~Gc* zlSi=TjErGy&rW8H8l~;I#3@o+nZz+h=KFrbSUP)z3C%h;gKqWlfPZXx>* DeSx;T literal 0 HcmV?d00001 diff --git a/build/classes/java/main/org/example/dinner/Dinner.class b/build/classes/java/main/org/example/dinner/Dinner.class new file mode 100644 index 0000000000000000000000000000000000000000..30273e6a665f3de1e8459743e3fda3d53ddee797 GIT binary patch literal 3684 zcmb_f`%@fM7XB{GOvBI-GDsp}jgSBWCXVj<%wXJv1cQ=?k|k@@U7O)DG|Y65-90R5 z_Tl<|?fQzktNUJ!uiee6kOZsL-?qwsWPk8KNTrP5?d}=6lTphmshaL{&pqcm=bl$z zKL2v{69BugnnnW}H6(N-krHT|GZu_&(Xa~HgHv-d?+K)aP0RFl3N#K3PHJcp=&_wb zRxTQ)a#3cdP0Nx_c8~v>l#V%LN+%5sjm>C*u3?>yOVBFN`L$XCO$(u-z}E4vm8+uX zG^`ists{4rbnS|hm$ym!WOz0mX$u^=R7VFk2&{K56cOmJXYwK_TD?r5-49U3GmF_> zj$3&i;k`66-dt5&OD(9BGBIiKx_Rx`d>U? z84gQsH}>fmQ=G({ZCcH^1LGR@>o|aeu|A$yay?n1Uv`Dwg~e#vgf}g3!gHii$~ECm zf!3ghyG^&-W{q5f+SMMIM}CH$)MF@skS^5(Uk0a{XM#{V)VJmW+9+s=@G%nBFWYhQ}}97+BSv zAiGg870A4fX|M#_3er1dJDy3Dy@n@wC?<0(jRIyhnCb{~)h_Ze!lG7%GZuBUTI^}` zp{Sz-BIyJ_=H~6yiv6mL?>PuCLahKflOgX+MbTH9RD+Zmp`hq2ZU+jQg@2LcMzxP799V*E)Wq zDm%p^-64I}Z*@GPSZwIPqYMNdQ%QQ8t8zpzha%wH1%R zQn?z1TOu&E>irHeUpL_y`FU!FQBCh%%*(Pr8#MewU~@cGj#DXna=IqO7)|(Bkx^46 zswJ4MS1Tn(V7G01uICu#{nDGYr`;yJP3|az&~21dNYoG(O?a1StWKnEsYcR{Zn3S~ zj})oa6y8tcU--9%|EOL&$y?EyTc)*O&&zDkZNZEjHS)X^EeX699Y3L9;LAS4nl4JW zcigt;E9J0mqZ2by_%X%9jC~#Pdm{36rdkLwVib!L{1CG|^f7gz94Q*ED_spA#zqtK z!AkTek%kq4zKf1q?-UwN#}XFvJ3KJQS#V_Z@ZQ?MZ%h&yb#o<^QFllG&FdWp+f$?) z@HF|njn&rAkjG0@ZT&3QbQUQ-pQFZuXe0#;51oP-`WV{Xr_j8NG|4uSnPs$-+(@!> z8JkFMCfU7=9+G_|uUy8!e|^ip<8u>n0UZf?*vc!_CamYs&)^!g_RXa#riz3nu9x{99xTwbU;5`pL5fHE<48Z(XjtziB$6jos0 zkc@71Bop`hyUvjl=U3Iv3Myy7(ylqZvx<65IeiAdQU?f-)biolGDY_~k{zj4JnFl5 z;{2z|@h9l1igyAk-lL2!c+qc0Cu7}(oxJK#u^Q%hH(x?GjBY_$bwkWt_qpbbbXt C0scM! literal 0 HcmV?d00001 diff --git a/build/classes/java/main/org/example/dinner/DinnerVerifier.class b/build/classes/java/main/org/example/dinner/DinnerVerifier.class new file mode 100644 index 0000000000000000000000000000000000000000..754293f1de316f1a6dc1e60ff46096f93a9c6e04 GIT binary patch literal 848 zcmb7C-EI;=6#k|_7Z&Ibm0HE>wp9T&?gP}AkZKbW{7En*y&RV5cIxg78D=Y9`XGAY z8+c_Mub_ZchK+N6!NY{BID9cY z7m;OHeI%8%j~Q~U_P|FGB@ccDWmFj2v+bFcNf>DrWyT0)LvD2{qp&kmU1dcq43)=% z&Td7qM8w@+0RA%^$X^hnD--e+(Iy$p+z+IsrLcZ7LY5KHgTKGJSD62-ywSi GcYgu2x6QKv literal 0 HcmV?d00001 diff --git a/build/classes/java/main/org/example/dinner/ResourceGenerator.class b/build/classes/java/main/org/example/dinner/ResourceGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..4097999e425503fa6055b16b553c05e8259de10b GIT binary patch literal 1694 zcmcIk-A)rx5dKcv?ZQ&z&z2tx2m-bgS$`2}C8{6M!@xD)7NCBM^dwAVc>K z-{WeD8%1?xb4SbD48fFc==LImKNeqC(1vyyN(dbYG4wRuvxcn|HH$&sGQuH5(9baCM620) zNzI!^zGhjPVXK*jy3DKFPk4o}R%!%&KITbZuP51h;>GAX$rxl9^FpjxX3^s1vSz8z z8mfW;ToG`i3>&d*J@jAExe$K$}=E}Kcgzz9ZVTn%9i;|zUG2GW+r_j7uc z3ib0sfjB**-1tiw6ATmHS_-;hP#w>;s#&x0+GCA&l%3u#kTDAyLsw2Ww5PT5re>}2 z%@UpT=FB`Vt#eBkd-pJ4Z|hZhl-$1rPcpO>>zOEC$%X2W&?w{_W?J4ic@EX*P{_b^ z`ezwBn$JkU!=49gVqlO&Ka$;x@lWkWr3HD}tQqtY%9d#s((WeVN#F@^CQKTa(;V+t zPIzAMglXVRonpONm#00Gi-c^=bJ>HTh0|2s&l&xb?mLyDF{Dn|&Q+V|cWKt#UT9y{ ziw3uA7Cr7qFL4(H{6ElMv|E%_XD*g>(fN^d!VD<5PHU*{fEePmW0*#Qf{4rC$S+7Tcl0yyT}xc~qF literal 0 HcmV?d00001 diff --git a/build/classes/java/main/org/example/fork/Fork.class b/build/classes/java/main/org/example/fork/Fork.class new file mode 100644 index 0000000000000000000000000000000000000000..d978a59798d665ca362ef40fde7f24b415a8f437 GIT binary patch literal 403 zcmZutO;5r=5PefxYHI~Vg@Y$=z`_0ijfpWKAt8Fu^uEA~i={QS5Py^x6OD-ne}F&A z__lB~n|(8HcJ|H3&+peafJ<~kIH>t>BY3C_S_`#SajLR;d^1_-X(_0mo6M9Kf?BVi z1lU2~BaE<%NN|)F^H{&AR$xc05#HvjVycJ63I?`;Q#%Dt*sH@S zg_qqD9r_;jhz+tKxqS}@pOC@v2mH4xr%7y}M&w@XygV(k&L$iCXp`|@rOG*RfWxh3 eOl#|TgLn9^bR1Z@dKC;SnP`)+mEjJntj-_lNM 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 literal 0 HcmV?d00001 diff --git a/build/classes/java/test/org/example/dinner/ResourceGeneratorTest.class b/build/classes/java/test/org/example/dinner/ResourceGeneratorTest.class new file mode 100644 index 0000000000000000000000000000000000000000..aa718ef5b72cfc994d38fa5f259a95161b05e55a GIT binary patch literal 1590 zcma)6X;TwH5Pg%wNLVF;7kB|)NkG>73ZfBFQx%U=OqHLgA&g;gvm5uY)PH3ahox2i z0DqL_nLASG*e3J|3ny_(pugpN4PQ2!$|u2* z9)gY!(as1Ix@bMIvzSd?x6AQXaYNNmEbeKHnJXI?NaZVqnkn=-3+Hh`Ap6eqmdZ^p za#_cT9=iX4mdusqEfi1`*x#U`Jwh))_Fk2%5yKA`w&ToC+U2J zl`=O!$^Lq+8?Fo^p9J%}N4O)E=}o(MI@%Xe+SZz;hwR5(N;4&ayFIX-vQ2Mu=yrzv zveP87b86OGVrTzzha~4rmE>c6S3^NUMSl|9FGBa7W$!Ls%lQwmkD$#B;dkUzbt%|PNaebqAa+P z;|QGm2S_`P?Cbd9c&tr!BRk#^V>M+417qy*1YfNbS3W0{5@vQGa5I)~QRl#Q^xM=q z5d4?q8J{<M{#fsLllou9A3i+#nW$dOB)zn!`Uv)QAPqbc|VRb_F-l zdcfVh)mtGf62XKpSzIOeDw$R>lrz%VbzC$D>zGJ>V~9Lo#|A-}wgR(U6L|Co2E(83 literal 0 HcmV?d00001 diff --git a/build/classes/java/test/org/example/fork/ForkTest.class b/build/classes/java/test/org/example/fork/ForkTest.class new file mode 100644 index 0000000000000000000000000000000000000000..53b278ef47c473d70394f7621d1f3602e12201b4 GIT binary patch literal 761 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 literal 0 HcmV?d00001 diff --git a/build/classes/java/test/org/example/utils/IndexFetcherTest.class b/build/classes/java/test/org/example/utils/IndexFetcherTest.class new file mode 100644 index 0000000000000000000000000000000000000000..6306e3728c14035e8ffa4e29926ed70120303b88 GIT binary patch literal 1926 zcma)7Yi|=*5IxtAY_cq15)vLw(qJC74PB zzki>POcWwgXD!TQfg%6g^?vgiO3mW|)J&Ym1p^l?e1S!VGZUp6P9S>1V=(skAQTUu zGc1%E^yb0_ASYELbd zBx+bKoi}!=j(laIgtDqzb&27|u?ugM8z!#fhJl+FR$)_TR0X>sjRieNG7z54N7CN# zec=Vtbx2l=Yh&w0$OmNROARWCVWuT}4i7?4Ftm@U{93BUv5*HwBhj$7UL)}~-5o+d z-IR`a5DvG6*XG*;^2|2fE+2HbCzTyLb3tDczbgj-kIu9jP{PjpB6vJvxbP@+0yz{N z=}W@ea2z+_apgq~byS^uf_RE8-t806Ro#VWzssQC;RCs&-=AlmAY~lC#fL&W7#9Bn zEap?1z&sE=Vz3uo93wTkAH+!INvQU;UAM`-o*0MLrI*AmPhz)*qu>?2KjW~c!gEOn zq1-g)2PJ(q8p~?7+|cWax>Ul?>xA`aJ1FL>>fON#t%wY5p$vU!N$3;3nqc@^pR1Un zZ(2*_xkV?NzM1k=_QBrhkZJ + + + + +Test results - DinnerTest + + + + + +
+

DinnerTest

+ +
+ + + + + +
+
+ + + + + + + +
+
+
3
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
7.355s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + + + + + + + + + + + +
TestDurationResult
serve_withEnoughFood_doesNotThrow()5.936spassed
serve_withExactFood_doesNotThrow()1.410spassed
serve_withZeroFood_doesNotThrow()0.009spassed
+
+
+

Standard output

+ +
Dinner is over!
+Food amount is 0
+Portions eaten: 1, Count: 2
+Portions eaten: 3, Count: 1
+--------------------------------------------------------------------
+Dinner is over!
+Food amount is 0
+Portions eaten: 1, Count: 2
+--------------------------------------------------------------------
+
+ +
+
+
+ +
+ + diff --git a/build/reports/tests/test/classes/org.example.dinner.DinnerVerifierTest.html b/build/reports/tests/test/classes/org.example.dinner.DinnerVerifierTest.html new file mode 100644 index 0000000..7f1a076 --- /dev/null +++ b/build/reports/tests/test/classes/org.example.dinner.DinnerVerifierTest.html @@ -0,0 +1,111 @@ + + + + + +Test results - DinnerVerifierTest + + + + + +
+

DinnerVerifierTest

+ +
+ + + + + +
+
+ + + + + + + +
+
+
4
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.006s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TestDurationResult
execute_withInsufficientFood_throws()0.001spassed
execute_withNegativeFood_throws()0.002spassed
execute_withNegativeProgrammers_throws()0.001spassed
execute_withValidValues_doesNotThrow()0.002spassed
+
+
+ +
+ + diff --git a/build/reports/tests/test/classes/org.example.dinner.ResourceGeneratorTest.html b/build/reports/tests/test/classes/org.example.dinner.ResourceGeneratorTest.html new file mode 100644 index 0000000..bbb9d41 --- /dev/null +++ b/build/reports/tests/test/classes/org.example.dinner.ResourceGeneratorTest.html @@ -0,0 +1,96 @@ + + + + + +Test results - ResourceGeneratorTest + + + + + +
+

ResourceGeneratorTest

+ +
+ + + + + +
+
+ + + + + + + +
+
+
1
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.001s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + +
TestDurationResult
test_generate_values_not_null()0.001spassed
+
+
+ +
+ + diff --git a/build/reports/tests/test/classes/org.example.fork.ForkTest.html b/build/reports/tests/test/classes/org.example.fork.ForkTest.html new file mode 100644 index 0000000..ddcd75d --- /dev/null +++ b/build/reports/tests/test/classes/org.example.fork.ForkTest.html @@ -0,0 +1,96 @@ + + + + + +Test results - ForkTest + + + + + +
+

ForkTest

+ +
+ + + + + +
+
+ + + + + + + +
+
+
1
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + +
TestDurationResult
testConstructorAndGetter()0spassed
+
+
+ +
+ + diff --git a/build/reports/tests/test/classes/org.example.programmer.ProgrammerTest.html b/build/reports/tests/test/classes/org.example.programmer.ProgrammerTest.html new file mode 100644 index 0000000..3ea20d5 --- /dev/null +++ b/build/reports/tests/test/classes/org.example.programmer.ProgrammerTest.html @@ -0,0 +1,181 @@ + + + + + +Test results - ProgrammerTest + + + + + +
+

ProgrammerTest

+ +
+ + + + + +
+
+ + + + + + + +
+
+
18
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
30.068s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TestDurationResult
testConcurrentProgrammers()1.319spassed
testFastSwitching()7.175spassed
testForksConsistencyAfterConcurrentEating()1.181spassed
testForksReturned()2.591spassed
testGetProgId()0.001spassed
testIncrementPortions()2.353spassed
testManyProgrammers()1.199spassed
testMissingForks()0.001spassed
testMoreProgrammersThanForks()1.302spassed
testMultipleProgrammers()1.102spassed
testNegativeMeals()0.001spassed
testNoDeadlock()1.367spassed
testNoForkDoubleOwnership()1.223spassed
testProgrammerEat()2.685spassed
testProgrammerEatMultiplePortions()2.794spassed
testRepeatedEating()2.357spassed
testTwoProgrammersGrabForks()1.415spassed
testZeroMeals()0.002spassed
+
+
+ +
+ + diff --git a/build/reports/tests/test/classes/org.example.utils.IndexFetcherTest.html b/build/reports/tests/test/classes/org.example.utils.IndexFetcherTest.html new file mode 100644 index 0000000..1d70cfd --- /dev/null +++ b/build/reports/tests/test/classes/org.example.utils.IndexFetcherTest.html @@ -0,0 +1,111 @@ + + + + + +Test results - IndexFetcherTest + + + + + +
+

IndexFetcherTest

+ +
+ + + + + +
+
+ + + + + + + +
+
+
4
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.002s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TestDurationResult
fetch_withEmptyMap_returnsZero()0.001spassed
fetch_withIndexTooLarge_returnsFirstIndex()0spassed
fetch_withNegativeIndex_returnsLastIndex()0.001spassed
fetch_withValidIndex_returnsSameIndex()0spassed
+
+
+ +
+ + diff --git a/build/reports/tests/test/css/base-style.css b/build/reports/tests/test/css/base-style.css new file mode 100644 index 0000000..3ae6c58 --- /dev/null +++ b/build/reports/tests/test/css/base-style.css @@ -0,0 +1,174 @@ + +body { + margin: 0; + padding: 0; + font-family: sans-serif; + font-size: 12pt; +} + +body, a, a:visited { + color: #303030; +} + +#content { + padding: 30px 50px; +} + +#content h1 { + font-size: 160%; + margin-bottom: 10px; +} + +#footer { + margin-top: 100px; + font-size: 80%; + white-space: nowrap; +} + +#footer, #footer a { + color: #a0a0a0; +} + +#line-wrapping-toggle { + vertical-align: middle; +} + +#label-for-line-wrapping-toggle { + vertical-align: middle; +} + +ul { + margin-left: 0; +} + +h1, h2, h3 { + white-space: nowrap; +} + +h2 { + font-size: 120%; +} + +.tab-container .tab-container { + margin-left: 8px; +} + +ul.tabLinks { + padding: 0; + margin-bottom: 0; + overflow: auto; + min-width: 800px; + width: auto; + border-bottom: solid 1px #aaa; +} + +ul.tabLinks li { + float: left; + height: 100%; + list-style: none; + padding: 5px 10px; + border-radius: 7px 7px 0 0; + border: solid 1px transparent; + border-bottom: none; + margin-right: 6px; + background-color: #f0f0f0; +} + +ul.tabLinks li.deselected > a { + color: #6d6d6d; +} + +ul.tabLinks li:hover { + background-color: #fafafa; +} + +ul.tabLinks li.selected { + background-color: #c5f0f5; + border-color: #aaa; +} + +ul.tabLinks a { + font-size: 120%; + display: block; + outline: none; + text-decoration: none; + margin: 0; + padding: 0; +} + +ul.tabLinks li h2 { + margin: 0; + padding: 0; +} + +div.tab { +} + +div.selected { + display: block; +} + +div.deselected { + display: none; +} + +div.tab table { + min-width: 350px; + width: auto; + border-collapse: collapse; +} + +div.tab th, div.tab table { + border-bottom: solid 1px #d0d0d0; +} + +div.tab th { + text-align: left; + white-space: nowrap; + padding-left: 6em; +} + +div.tab th:first-child { + padding-left: 0; +} + +div.tab td { + white-space: nowrap; + padding-left: 6em; + padding-top: 5px; + padding-bottom: 5px; +} + +div.tab td:first-child { + padding-left: 0; +} + +div.tab td.numeric, div.tab th.numeric { + text-align: right; +} + +span.code { + display: inline-block; + margin-top: 0; + margin-bottom: 1em; +} + +span.code pre { + font-size: 11pt; + padding: 10px; + margin: 0; + background-color: #f7f7f7; + border: solid 1px #d0d0d0; + min-width: 700px; + width: auto; +} + +span.wrapped pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: break-all; +} + +label.hidden { + display: none; +} diff --git a/build/reports/tests/test/css/style.css b/build/reports/tests/test/css/style.css new file mode 100644 index 0000000..ccb271c --- /dev/null +++ b/build/reports/tests/test/css/style.css @@ -0,0 +1,97 @@ + +#summary { + margin-top: 30px; + margin-bottom: 40px; +} + +#summary table { + border-collapse: collapse; +} + +#summary td { + vertical-align: top; +} + +.breadcrumbs, .breadcrumbs a { + color: #606060; +} + +.infoBox { + width: 110px; + padding-top: 15px; + padding-bottom: 15px; + text-align: center; +} + +.infoBox p { + margin: 0; +} + +.counter, .percent { + font-size: 120%; + font-weight: bold; + margin-bottom: 8px; +} + +#duration { + width: 125px; +} + +#successRate, .summaryGroup { + border: solid 2px #d0d0d0; + -moz-border-radius: 10px; + border-radius: 10px; +} + +#successRate { + width: 140px; + margin-left: 35px; +} + +#successRate .percent { + font-size: 180%; +} + +.success, .success a { + color: #008000; +} + +div.success, #successRate.success { + background-color: #bbd9bb; + border-color: #008000; +} + +.failures, .failures a { + color: #b60808; +} + +.skipped, .skipped a { + color: #c09853; +} + +div.failures, #successRate.failures { + background-color: #ecdada; + border-color: #b60808; +} + +ul.linkList { + padding-left: 0; +} + +ul.linkList li { + list-style: none; + margin-bottom: 5px; +} + +.code { + position: relative; +} + +.clipboard-copy-btn { + position: absolute; + top: 8px; + right: 8px; + padding: 4px 8px; + font-size: 0.9em; + cursor: pointer; +} diff --git a/build/reports/tests/test/index.html b/build/reports/tests/test/index.html new file mode 100644 index 0000000..e58e7c5 --- /dev/null +++ b/build/reports/tests/test/index.html @@ -0,0 +1,213 @@ + + + + + +Test results - Test Summary + + + + + +
+

Test Summary

+
+ + + + + +
+
+ + + + + + + +
+
+
31
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
37.432s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Packages

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageTestsFailuresIgnoredDurationSuccess rate
+org.example.dinner +8007.362s100%
+org.example.fork +1000s100%
+org.example.programmer +180030.068s100%
+org.example.utils +4000.002s100%
+
+
+

Classes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+org.example.dinner.DinnerTest +3007.355s100%
+org.example.dinner.DinnerVerifierTest +4000.006s100%
+org.example.dinner.ResourceGeneratorTest +1000.001s100%
+org.example.fork.ForkTest +1000s100%
+org.example.programmer.ProgrammerTest +180030.068s100%
+org.example.utils.IndexFetcherTest +4000.002s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/js/report.js b/build/reports/tests/test/js/report.js new file mode 100644 index 0000000..e658217 --- /dev/null +++ b/build/reports/tests/test/js/report.js @@ -0,0 +1,243 @@ +(function (window, document) { + "use strict"; + + function changeElementClass(element, classValue) { + if (element.getAttribute("className")) { + element.setAttribute("className", classValue); + } else { + element.setAttribute("class", classValue); + } + } + + function getClassAttribute(element) { + if (element.getAttribute("className")) { + return element.getAttribute("className"); + } else { + return element.getAttribute("class"); + } + } + + function addClass(element, classValue) { + changeElementClass(element, getClassAttribute(element) + " " + classValue); + } + + function removeClass(element, classValue) { + changeElementClass(element, getClassAttribute(element).replace(classValue, "")); + } + + function getCheckBox() { + return document.getElementById("line-wrapping-toggle"); + } + + function getLabelForCheckBox() { + return document.getElementById("label-for-line-wrapping-toggle"); + } + + function findCodeBlocks() { + const codeBlocks = []; + const tabContainers = getTabContainers(); + for (let i = 0; i < tabContainers.length; i++) { + const spans = tabContainers[i].getElementsByTagName("span"); + for (let i = 0; i < spans.length; ++i) { + if (spans[i].className.indexOf("code") >= 0) { + codeBlocks.push(spans[i]); + } + } + } + return codeBlocks; + } + + function forAllCodeBlocks(operation) { + const codeBlocks = findCodeBlocks(); + + for (let i = 0; i < codeBlocks.length; ++i) { + operation(codeBlocks[i], "wrapped"); + } + } + + function toggleLineWrapping() { + const checkBox = getCheckBox(); + + if (checkBox.checked) { + forAllCodeBlocks(addClass); + } else { + forAllCodeBlocks(removeClass); + } + } + + function initClipboardCopyButton() { + document.querySelectorAll(".clipboard-copy-btn").forEach((button) => { + const copyElementId = button.getAttribute("data-copy-element-id"); + const elementWithCodeToSelect = document.getElementById(copyElementId); + + button.addEventListener("click", () => { + const text = elementWithCodeToSelect.innerText.trim(); + navigator.clipboard + .writeText(text) + .then(() => { + button.textContent = "Copied!"; + setTimeout(() => { + button.textContent = "Copy"; + }, 1500); + }) + .catch((err) => { + alert("Failed to copy to the clipboard: '" + err.message + "'. Check JavaScript console for more details.") + console.warn("Failed to copy to the clipboard", err); + }); + }); + }); + } + + function initControls() { + if (findCodeBlocks().length > 0) { + const checkBox = getCheckBox(); + const label = getLabelForCheckBox(); + + checkBox.onclick = toggleLineWrapping; + checkBox.checked = false; + + removeClass(label, "hidden"); + } + + initClipboardCopyButton() + } + + class TabManager { + baseId; + tabs; + titles; + headers; + + constructor(baseId, tabs, titles, headers) { + this.baseId = baseId; + this.tabs = tabs; + this.titles = titles; + this.headers = headers; + } + + select(i) { + this.deselectAll(); + + changeElementClass(this.tabs[i], "tab selected"); + changeElementClass(this.headers[i], "selected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + const a = document.createElement("a"); + + a.appendChild(document.createTextNode(this.titles[i])); + this.headers[i].appendChild(a); + } + + deselectAll() { + for (let i = 0; i < this.tabs.length; i++) { + changeElementClass(this.tabs[i], "tab deselected"); + changeElementClass(this.headers[i], "deselected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + const a = document.createElement("a"); + + const id = this.baseId + "-tab" + i; + a.setAttribute("id", id); + a.setAttribute("href", "#tab" + i); + a.onclick = () => { + this.select(i); + return false; + }; + a.appendChild(document.createTextNode(this.titles[i])); + + this.headers[i].appendChild(a); + } + } + } + + function getTabContainers() { + const tabContainers = Array.from(document.getElementsByClassName("tab-container")); + + // Used by existing TabbedPageRenderer users, which have not adjusted to use TabsRenderer yet. + const legacyContainer = document.getElementById("tabs"); + if (legacyContainer) { + tabContainers.push(legacyContainer); + } + + return tabContainers; + } + + function initTabs() { + let tabGroups = 0; + + function createTab(num, container) { + const tabElems = findTabs(container); + const tabManager = new TabManager("tabs" + num, tabElems, findTitles(tabElems), findHeaders(container)); + tabManager.select(0); + } + + const tabContainers = getTabContainers(); + + for (let i = 0; i < tabContainers.length; i++) { + createTab(tabGroups, tabContainers[i]); + tabGroups++; + } + + return true; + } + + function findTabs(container) { + return findChildElements(container, "DIV", "tab"); + } + + function findHeaders(container) { + const owner = findChildElements(container, "UL", "tabLinks"); + return findChildElements(owner[0], "LI", null); + } + + function findTitles(tabs) { + const titles = []; + + for (let i = 0; i < tabs.length; i++) { + const tab = tabs[i]; + const header = findChildElements(tab, "H2", null)[0]; + + header.parentNode.removeChild(header); + + if (header.innerText) { + titles.push(header.innerText); + } else { + titles.push(header.textContent); + } + } + + return titles; + } + + function findChildElements(container, name, targetClass) { + const elements = []; + const children = container.childNodes; + + for (let i = 0; i < children.length; i++) { + const child = children.item(i); + + if (child.nodeType === 1 && child.nodeName === name) { + if (targetClass && child.className.indexOf(targetClass) < 0) { + continue; + } + + elements.push(child); + } + } + + return elements; + } + + // Entry point. + + window.onload = function() { + initTabs(); + initControls(); + }; +} (window, window.document)); diff --git a/build/reports/tests/test/packages/org.example.dinner.html b/build/reports/tests/test/packages/org.example.dinner.html new file mode 100644 index 0000000..f04f3cc --- /dev/null +++ b/build/reports/tests/test/packages/org.example.dinner.html @@ -0,0 +1,123 @@ + + + + + +Test results - Package org.example.dinner + + + + + +
+

Package org.example.dinner

+ +
+ + + + + +
+
+ + + + + + + +
+
+
8
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
7.362s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+DinnerTest +3007.355s100%
+DinnerVerifierTest +4000.006s100%
+ResourceGeneratorTest +1000.001s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/packages/org.example.fork.html b/build/reports/tests/test/packages/org.example.fork.html new file mode 100644 index 0000000..c491ddb --- /dev/null +++ b/build/reports/tests/test/packages/org.example.fork.html @@ -0,0 +1,103 @@ + + + + + +Test results - Package org.example.fork + + + + + +
+

Package org.example.fork

+ +
+ + + + + +
+
+ + + + + + + +
+
+
1
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+ForkTest +1000s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/packages/org.example.programmer.html b/build/reports/tests/test/packages/org.example.programmer.html new file mode 100644 index 0000000..ab68c77 --- /dev/null +++ b/build/reports/tests/test/packages/org.example.programmer.html @@ -0,0 +1,103 @@ + + + + + +Test results - Package org.example.programmer + + + + + +
+

Package org.example.programmer

+ +
+ + + + + +
+
+ + + + + + + +
+
+
18
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
30.068s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+ProgrammerTest +180030.068s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/packages/org.example.utils.html b/build/reports/tests/test/packages/org.example.utils.html new file mode 100644 index 0000000..434938f --- /dev/null +++ b/build/reports/tests/test/packages/org.example.utils.html @@ -0,0 +1,103 @@ + + + + + +Test results - Package org.example.utils + + + + + +
+

Package org.example.utils

+ +
+ + + + + +
+
+ + + + + + + +
+
+
4
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.002s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+IndexFetcherTest +4000.002s100%
+
+
+ +
+ + diff --git a/build/test-results/test/TEST-org.example.dinner.DinnerTest.xml b/build/test-results/test/TEST-org.example.dinner.DinnerTest.xml new file mode 100644 index 0000000..641aae7 --- /dev/null +++ b/build/test-results/test/TEST-org.example.dinner.DinnerTest.xml @@ -0,0 +1,18 @@ + + + + + + + + + diff --git a/build/test-results/test/TEST-org.example.dinner.DinnerVerifierTest.xml b/build/test-results/test/TEST-org.example.dinner.DinnerVerifierTest.xml new file mode 100644 index 0000000..3e9f67f --- /dev/null +++ b/build/test-results/test/TEST-org.example.dinner.DinnerVerifierTest.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/build/test-results/test/TEST-org.example.dinner.ResourceGeneratorTest.xml b/build/test-results/test/TEST-org.example.dinner.ResourceGeneratorTest.xml new file mode 100644 index 0000000..85a0908 --- /dev/null +++ b/build/test-results/test/TEST-org.example.dinner.ResourceGeneratorTest.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/build/test-results/test/TEST-org.example.fork.ForkTest.xml b/build/test-results/test/TEST-org.example.fork.ForkTest.xml new file mode 100644 index 0000000..fd7894d --- /dev/null +++ b/build/test-results/test/TEST-org.example.fork.ForkTest.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/build/test-results/test/TEST-org.example.programmer.ProgrammerTest.xml b/build/test-results/test/TEST-org.example.programmer.ProgrammerTest.xml new file mode 100644 index 0000000..7f3fdec --- /dev/null +++ b/build/test-results/test/TEST-org.example.programmer.ProgrammerTest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/test-results/test/TEST-org.example.utils.IndexFetcherTest.xml b/build/test-results/test/TEST-org.example.utils.IndexFetcherTest.xml new file mode 100644 index 0000000..864a247 --- /dev/null +++ b/build/test-results/test/TEST-org.example.utils.IndexFetcherTest.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin new file mode 100644 index 0000000..ebfe90e --- /dev/null +++ b/build/test-results/test/binary/output.bin @@ -0,0 +1,9 @@ +Dinner is over! +Food amount is 0 +Portions eaten: 1, Count: 2 +Portions eaten: 3, Count: 1 +E-------------------------------------------------------------------- +Dinner is over! +Food amount is 0 +Portions eaten: 1, Count: 2 +E-------------------------------------------------------------------- diff --git a/build/test-results/test/binary/output.bin.idx b/build/test-results/test/binary/output.bin.idx new file mode 100644 index 0000000000000000000000000000000000000000..b20f36b6e3679c42385bc2fec5fcd26db69b37ac GIT binary patch literal 69 bcmZQ%Vq#`M1)2ZR01H%p6O{gqCjTD*R(>J_ literal 0 HcmV?d00001 diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin new file mode 100644 index 0000000000000000000000000000000000000000..a88c65c9b08aaa0d96d5a2a6d3f396e8e3ae3ea4 GIT binary patch literal 2579 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 c82=K%QXLKFx%@O{wJjEi6Y56o#$)Bpeg literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..2e11132 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..adff685 --- /dev/null +++ b/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..e509b2d --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,93 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/readme.MD b/readme.MD new file mode 100644 index 0000000..e12da11 --- /dev/null +++ b/readme.MD @@ -0,0 +1,17 @@ +Hello! + +That's my homework + +To run this please type: + +```bash +make run_homework +``` + +To run tests please type: + +```bash +make test_homework +``` + +Hope i did it well, because i'm not java expert (right now) \ No newline at end of file diff --git a/src/main/java/org/example/app/Main.java b/src/main/java/org/example/app/Main.java new file mode 100644 index 0000000..b59de17 --- /dev/null +++ b/src/main/java/org/example/app/Main.java @@ -0,0 +1,28 @@ +package org.example.app; + +import java.util.Random; +import java.util.concurrent.atomic.AtomicInteger; + +import org.example.dinner.*; + +public class Main { + public static void main(String[] args) throws InterruptedException { + Random rand = new Random(); + int MAX = 1000; // hehe messenger max is everywhere + // Running 10 iterations + for (int i = 0; i < 10; i++) { + // Generating random nums + int programmersCount = rand.nextInt(MAX); + int foodCounter = programmersCount + 1 + rand.nextInt(MAX - programmersCount); + AtomicInteger foodCount = new AtomicInteger(foodCounter); + System.out.println("--------------------------------------------------------------------"); + // Displaying them + System.out.println("Programmers: " + programmersCount); + System.out.println("Food: " + foodCounter); + // Initializing the dinner + Dinner dinner = new Dinner(); + // Starting the dinner + dinner.serve(programmersCount, foodCount); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/example/dinner/Dinner.java b/src/main/java/org/example/dinner/Dinner.java new file mode 100644 index 0000000..8b90829 --- /dev/null +++ b/src/main/java/org/example/dinner/Dinner.java @@ -0,0 +1,44 @@ +package org.example.dinner; + +import org.example.programmer.Programmer; +import org.example.fork.Fork; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +public class Dinner { + + // Dependencies + private final DinnerVerifier verifier = new DinnerVerifier(); + private final ResourceGenerator resourceGenerator = new ResourceGenerator(); + private final ArrayList programmers = new ArrayList<>(); + private final ConcurrentHashMap forks = new ConcurrentHashMap<>(); + private HashMap counts = new HashMap<>(); + + public void serve(int programmersCount, AtomicInteger foodCount) throws InterruptedException { + // Verifying the values to not run with garbage ones + verifier.execute(programmersCount, foodCount); + // Generating resources + resourceGenerator.generate(programmers, forks, programmersCount, foodCount); + // Starting dinner + for (Programmer p : programmers) p.start(); + for (Programmer p : programmers) p.join(); + System.out.println("Dinner is over!"); + System.out.println("Food amount is " + foodCount); + // Counting stats to display + for (Programmer programmer : programmers) { + int count = counts.getOrDefault(programmer.getPortionsEaten(), 0); + counts.put(programmer.getPortionsEaten(), count + 1); + } + // Displaying stats + for (Map.Entry entry : counts.entrySet()) { + int portionsEaten = entry.getKey(); + int count = entry.getValue(); + System.out.println("Portions eaten: " + portionsEaten + ", Count: " + count); + } + System.out.println("--------------------------------------------------------------------"); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/dinner/DinnerVerifier.java b/src/main/java/org/example/dinner/DinnerVerifier.java new file mode 100644 index 0000000..bcc83ee --- /dev/null +++ b/src/main/java/org/example/dinner/DinnerVerifier.java @@ -0,0 +1,15 @@ +package org.example.dinner; + +import java.util.concurrent.atomic.AtomicInteger; + +public class DinnerVerifier { + public void execute(int ProgrammersCount, AtomicInteger FoodCount) throws IllegalArgumentException { + // Verifying that the amount can't be negative + if (ProgrammersCount <= 0 || FoodCount.get() <= 0) { + throw new IllegalArgumentException("Amount can't be negative"); + } + if (FoodCount.get() < ProgrammersCount) { + throw new IllegalArgumentException("Some of programmers would still be hungry"); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/example/dinner/ResourceGenerator.java b/src/main/java/org/example/dinner/ResourceGenerator.java new file mode 100644 index 0000000..0d930a9 --- /dev/null +++ b/src/main/java/org/example/dinner/ResourceGenerator.java @@ -0,0 +1,26 @@ +package org.example.dinner; + +import org.example.programmer.Programmer; +import org.example.fork.Fork; + +import java.util.ArrayList; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +public class ResourceGenerator { + public void generate( + ArrayList programmers, + ConcurrentHashMap forks, + int amount, + AtomicInteger foodAmount + ) { + // Generating the N amount of forks + for (int i = 0; i < amount; i++) { + forks.put(i, new Fork(i)); + } + // The same amount of programmers + for (int i = 0; i < amount; i++) { + programmers.add(new Programmer(i, forks, foodAmount)); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/example/fork/Fork.java b/src/main/java/org/example/fork/Fork.java new file mode 100644 index 0000000..33eb639 --- /dev/null +++ b/src/main/java/org/example/fork/Fork.java @@ -0,0 +1,11 @@ +package org.example.fork; + +// Just fork +public class Fork { + int id; + + public Fork(int id) { + this.id = id; + } + public int getId() { return id; } +} diff --git a/src/main/java/org/example/programmer/Programmer.java b/src/main/java/org/example/programmer/Programmer.java new file mode 100644 index 0000000..8dd1da8 --- /dev/null +++ b/src/main/java/org/example/programmer/Programmer.java @@ -0,0 +1,138 @@ +package org.example.programmer; + +import org.example.fork.Fork; +import org.example.utils.IndexFetcher; + +import java.lang.*; +import java.util.HashMap; +import java.util.Random; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.ConcurrentHashMap; + +public class Programmer extends Thread { + + // Resources of the thread + private final int id; + final HashMap userForks; + private int portionsEaten; + private final int forkIdx1; + private final int forkIdx2; + private final Random rand; + + // Mutual resources shared between threads + private final ConcurrentHashMap forks; + private final AtomicInteger foodLeft; + + public Programmer( + int id, + ConcurrentHashMap forks, + AtomicInteger foodLeft + ) { + // Resources of the thread + this.id = id; + this.userForks = new HashMap<>(); + this.portionsEaten = 0; + IndexFetcher indexFetcher = new IndexFetcher(); + this.forkIdx1 = indexFetcher.fetch(forks, this.id - 1); + this.forkIdx2 = indexFetcher.fetch(forks, this.id + 1); + this.rand = new Random(); + + // Mutual resources shared between threads + this.forks = forks; + this.foodLeft = foodLeft; + } + + @Override + public void run() { + try { + while (true) { + if (this.forks.isEmpty()) break; + // If no food left - break the loop + if (!takeOnePortionIfAvailable()) break; + boolean ate = false; + // Loop until programmer eat + while (!ate) { + // If successfully grabbed forks + // - eat + if (grabForks(this.forks)) { + try { + EatDinnder(); + ate = true; + } finally { + // Returning forks back + ReleaseForks(this.forks); + } + } else { + // Little sleep + Thread.sleep(50); + } + } + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + private boolean takeOnePortionIfAvailable() { + int cur = foodLeft.get(); + // No food available - stop + if (cur <= 0) return false; + if (foodLeft.compareAndSet(cur, cur - 1)) return true; + return false; + } + + public int getProgId(){ return this.id; } + public int getPortionsEaten(){ return this.portionsEaten; } + + private boolean grabForks(ConcurrentHashMap forks) { + // Getting forks from the table + Fork fork1 = forks.get(this.forkIdx1); + Fork fork2 = forks.get(this.forkIdx2); + if (fork1 == null || fork2 == null) return false; + + // Grabbing the forks in ascending order by their id to prevent deadlocks. + // Deadlock can occur if two threads try to acquire the same two forks in different orders: + // - Thread A picks fork 1 then waits for fork 2 + // - Thread B picks fork 2 then waits for fork 1 + // In this situation both threads wait forever. + // + // To prevent this, we always pick the fork with the smaller id first (first), + // and the larger id second (second). This ensures all threads acquire forks + // in the same order, eliminating the possibility of circular waiting. + // p.s: it was the most difficult part of homework. + Fork first = forkIdx1 < forkIdx2 ? fork1 : fork2; + Fork second = forkIdx1 < forkIdx2 ? fork2 : fork1; + // Synchronizing only the shared forks + synchronized (first) { + synchronized (second) { + forks.remove(first.getId()); + forks.remove(second.getId()); + } + } + // Because userForks used only in current thread + // no synchronization + this.userForks.put(first.getId(), first); + this.userForks.put(second.getId(), second); + return true; + } + + private void EatDinnder() throws InterruptedException { + // Increment the eaten portions + this.portionsEaten++; + // We are eating + Thread.sleep(1000 + rand.nextInt(500)); + } + + private void ReleaseForks(ConcurrentHashMap forks) { + // Getting forks that programmer have + Fork fork1 = this.userForks.get(this.forkIdx1); + Fork fork2 = this.userForks.get(this.forkIdx2); + + // Putting back the forks + forks.put(fork1.getId(), fork1); + forks.put(fork2.getId(), fork2); + // Removing the forks from programmer + this.userForks.remove(fork1.getId()); + this.userForks.remove(fork2.getId()); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/utils/IndexFetcher.java b/src/main/java/org/example/utils/IndexFetcher.java new file mode 100644 index 0000000..6a87ff4 --- /dev/null +++ b/src/main/java/org/example/utils/IndexFetcher.java @@ -0,0 +1,28 @@ +package org.example.utils; + +import org.example.fork.Fork; + +import java.util.concurrent.ConcurrentHashMap; + +public class IndexFetcher { + public int fetch(ConcurrentHashMap forks, int id) { + // Getting the forks hashmap size + int size = forks.size(); + // if size is zero return zero + if (size == 0) { + return 0; + } + // If id is 0, return the size - 1, + // This way, we're imitating fork + // that in left from us + if (id < 0) { + id = size - 1; + } else if (id >= size) { + // Otherwise, setting it to 0, + // Imitating forks in right + // from us + id = 0; + } + return id; + } +} \ No newline at end of file diff --git a/src/test/java/org/example/dinner/DinnerTest.java b/src/test/java/org/example/dinner/DinnerTest.java new file mode 100644 index 0000000..ad65239 --- /dev/null +++ b/src/test/java/org/example/dinner/DinnerTest.java @@ -0,0 +1,43 @@ +package org.example.dinner; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class DinnerTest { + + private Dinner dinner; + + @BeforeEach + void setUp() { + dinner = new Dinner(); + } + + @Test + void serve_withEnoughFood_doesNotThrow() { + int programmersCount = 3; + AtomicInteger foodCount = new AtomicInteger(5); + + assertDoesNotThrow(() -> dinner.serve(programmersCount, foodCount)); + } + + @Test + void serve_withExactFood_doesNotThrow() { + int programmersCount = 2; + AtomicInteger foodCount = new AtomicInteger(2); + + assertDoesNotThrow(() -> dinner.serve(programmersCount, foodCount)); + } + + @Test + void serve_withZeroFood_doesNotThrow() { + int programmersCount = 1; + AtomicInteger foodCount = new AtomicInteger(0); + + assertThrows(IllegalArgumentException.class, () -> dinner.serve(programmersCount, foodCount)); + } +} diff --git a/src/test/java/org/example/dinner/DinnerVerifierTest.java b/src/test/java/org/example/dinner/DinnerVerifierTest.java new file mode 100644 index 0000000..7c745ba --- /dev/null +++ b/src/test/java/org/example/dinner/DinnerVerifierTest.java @@ -0,0 +1,43 @@ +package org.example.dinner; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class DinnerVerifierTest { + + private DinnerVerifier verifier; + + @BeforeEach + void setUp() { + verifier = new DinnerVerifier(); + } + + @Test + void execute_withValidValues_doesNotThrow() { + assertDoesNotThrow(() -> verifier.execute(3, new AtomicInteger(5))); + assertDoesNotThrow(() -> verifier.execute(2, new AtomicInteger(2))); + } + + @Test + void execute_withNegativeProgrammers_throws() { + assertThrows(IllegalArgumentException.class, + () -> verifier.execute(-1, new AtomicInteger(5))); + } + + @Test + void execute_withNegativeFood_throws() { + assertThrows(IllegalArgumentException.class, + () -> verifier.execute(3, new AtomicInteger(-2))); + } + + @Test + void execute_withInsufficientFood_throws() { + assertThrows(IllegalArgumentException.class, + () -> verifier.execute(5, new AtomicInteger(-3))); + } +} \ No newline at end of file diff --git a/src/test/java/org/example/dinner/ResourceGeneratorTest.java b/src/test/java/org/example/dinner/ResourceGeneratorTest.java new file mode 100644 index 0000000..4a926ff --- /dev/null +++ b/src/test/java/org/example/dinner/ResourceGeneratorTest.java @@ -0,0 +1,35 @@ +package org.example.dinner; + +import org.example.fork.Fork; +import org.example.programmer.Programmer; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +public class ResourceGeneratorTest { + + private ResourceGenerator generator; + private ConcurrentHashMap forks; + private ArrayList programmers; + private AtomicInteger foodAmount; + + @BeforeEach + public void setUp() { + generator = new ResourceGenerator(); + forks = new ConcurrentHashMap<>(); + programmers = new ArrayList<>(); + foodAmount = new AtomicInteger(100); + } + + @Test + void test_generate_values_not_null(){ + generator.generate(programmers, forks, 10, foodAmount); + assertNotEquals(programmers.size(), 0); + assertNotEquals(forks.size(), 0); + } +} diff --git a/src/test/java/org/example/fork/ForkTest.java b/src/test/java/org/example/fork/ForkTest.java new file mode 100644 index 0000000..f21d006 --- /dev/null +++ b/src/test/java/org/example/fork/ForkTest.java @@ -0,0 +1,16 @@ +package org.example.fork; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ForkTest { + + @Test + void testConstructorAndGetter() { + Fork fork0 = new Fork(0); + Fork fork1 = new Fork(1); + + assertEquals(0, fork0.getId(), "Fork id should be 0"); + assertEquals(1, fork1.getId(), "Fork id should be 1"); + } +} \ No newline at end of file diff --git a/src/test/java/org/example/programmer/ProgrammerTest.java b/src/test/java/org/example/programmer/ProgrammerTest.java new file mode 100644 index 0000000..deed236 --- /dev/null +++ b/src/test/java/org/example/programmer/ProgrammerTest.java @@ -0,0 +1,265 @@ +package org.example.programmer; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.example.fork.Fork; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.*; + +public class ProgrammerTest { + + private Programmer programmer; + private ConcurrentHashMap forks; + private AtomicInteger foodLeft; + + @BeforeEach + public void setUp() { + forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + foodLeft = new AtomicInteger(2); + programmer = new Programmer(1, forks, foodLeft); + } + + @Test + public void testProgrammerEat() throws InterruptedException { + programmer.start(); + programmer.join(); + int portionsEaten = programmer.getPortionsEaten(); + assertEquals(2, portionsEaten); + } + + @Test + void testProgrammerEatMultiplePortions() throws InterruptedException { + Programmer multiMealProgrammer = new Programmer(0, forks, foodLeft); + multiMealProgrammer.start(); + multiMealProgrammer.join(); + assertEquals(2, multiMealProgrammer.getPortionsEaten()); + } + + @Test + void testTwoProgrammersGrabForks() throws InterruptedException { + Programmer p1 = new Programmer(0, forks, foodLeft); + Programmer p2 = new Programmer(1, forks, foodLeft); + + p1.start(); + p2.start(); + p1.join(); + p2.join(); + + assertEquals(2, forks.size()); + assertEquals(1, p1.getPortionsEaten()); + assertEquals(1, p2.getPortionsEaten()); + } + + @Test + void testConcurrentProgrammers() throws InterruptedException { + Programmer p1 = new Programmer(0, forks, foodLeft); + Programmer p2 = new Programmer(1, forks, foodLeft); + Programmer p3 = new Programmer(2, forks, foodLeft); + + p1.start(); + p2.start(); + p3.start(); + + p1.join(); + p2.join(); + p3.join(); + + assertEquals(forks.size(), 2); + } + + @Test + void testRepeatedEating() throws InterruptedException { + Programmer p = new Programmer(0, forks, foodLeft); + p.start(); + p.join(); + + assertEquals(2, p.getPortionsEaten()); + assertEquals(forks.size(), 2); + } + + @Test + void testForksConsistencyAfterConcurrentEating() throws InterruptedException { + ConcurrentHashMap sharedForks = new ConcurrentHashMap<>(); + sharedForks.put(0, new Fork(0)); + sharedForks.put(1, new Fork(1)); + + Programmer p1 = new Programmer(0, sharedForks, foodLeft); + Programmer p2 = new Programmer(1, sharedForks, foodLeft); + + p1.start(); + p2.start(); + p1.join(); + p2.join(); + + assertEquals(2, sharedForks.size()); + assertEquals(1, p1.getPortionsEaten()); + assertEquals(1, p2.getPortionsEaten()); + } + + @Test + void testZeroMeals() throws InterruptedException { + foodLeft = new AtomicInteger(0); + Programmer p = new Programmer(0, forks, foodLeft); + p.start(); + p.join(); + assertEquals(0, p.getPortionsEaten()); + assertEquals(2, forks.size()); + } + + @Test + void testNegativeMeals() throws InterruptedException { + foodLeft = new AtomicInteger(-10); + Programmer p = new Programmer(0, forks, foodLeft); + p.start(); + p.join(); + assertEquals(0, p.getPortionsEaten()); + } + + @Test + void testMissingForks() throws InterruptedException { + forks = new ConcurrentHashMap<>(); + Programmer p = new Programmer(5, forks, foodLeft); + p.start(); + p.join(); + assertEquals(0, p.getPortionsEaten()); + } + + @Test + void testMoreProgrammersThanForks() throws InterruptedException { + Programmer p1 = new Programmer(0, forks, foodLeft); + Programmer p2 = new Programmer(1, forks, foodLeft); + Programmer p3 = new Programmer(2, forks, foodLeft); + + p1.start(); + p2.start(); + p3.start(); + + p1.join(); + p2.join(); + p3.join(); + + assertEquals(2, forks.size()); + int total = p1.getPortionsEaten() + p2.getPortionsEaten() + p3.getPortionsEaten(); + assertTrue(total <= 3); + } + + @Test + void testManyProgrammers() throws InterruptedException { + int numProgrammers = 10; + Programmer[] programmers = new Programmer[numProgrammers]; + + for (int i = 0; i < numProgrammers; i++) { + programmers[i] = new Programmer(i, forks, foodLeft); + programmers[i].start(); + } + for (Programmer p : programmers) { + p.join(); + } + assertEquals(2, forks.size()); + } + + @Test + void testNoDeadlock() throws Exception { + ExecutorService executor = Executors.newFixedThreadPool(3); + + Programmer p1 = new Programmer(0, forks, foodLeft); + Programmer p2 = new Programmer(1, forks, foodLeft); + Programmer p3 = new Programmer(2, forks, foodLeft); + + Future f1 = executor.submit(p1); + Future f2 = executor.submit(p2); + Future f3 = executor.submit(p3); + + f1.get(5, TimeUnit.SECONDS); + f2.get(5, TimeUnit.SECONDS); + f3.get(5, TimeUnit.SECONDS); + + executor.shutdownNow(); + assertEquals(2, forks.size()); + } + + @Test + void testForksReturned() throws InterruptedException { + Programmer p = new Programmer(0, forks, foodLeft); + p.start(); + p.join(); + assertEquals(2, forks.size()); + } + + @Test + void testNoForkDoubleOwnership() throws InterruptedException { + Programmer p1 = new Programmer(0, forks, foodLeft); + Programmer p2 = new Programmer(1, forks, foodLeft); + + p1.start(); + p2.start(); + p1.join(); + p2.join(); + + assertTrue(p1.userForks.isEmpty()); + assertTrue(p2.userForks.isEmpty()); + assertEquals(2, forks.size()); + } + + @Test + void testGetProgId() { + Programmer p = new Programmer(42, forks, foodLeft); + assertEquals(42, p.getProgId()); + } + + @Test + void testIncrementPortions() throws InterruptedException { + Programmer p = new Programmer(0, forks, foodLeft); + p.start(); + p.join(); + assertEquals(2, p.getPortionsEaten()); + } + + @Test + void testMultipleProgrammers() throws InterruptedException { + ConcurrentHashMap forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + + AtomicInteger foodLeft = new AtomicInteger(2); + + Programmer p1 = new Programmer(0, forks, foodLeft); + Programmer p2 = new Programmer(1, forks, foodLeft); + + p1.start(); + p2.start(); + + p1.join(); + p2.join(); + + assertEquals(1, p1.getPortionsEaten()); + assertEquals(1, p2.getPortionsEaten()); + + assertEquals(2, forks.size()); + } + + @Test + void testFastSwitching() throws InterruptedException { + foodLeft = new AtomicInteger(10); + ConcurrentHashMap localForks = new ConcurrentHashMap<>(); + localForks.put(0, new Fork(0)); + localForks.put(1, new Fork(1)); + + Programmer p1 = new Programmer(0, localForks, foodLeft); + Programmer p2 = new Programmer(1, localForks, foodLeft); + + p1.start(); + p2.start(); + p1.join(); + p2.join(); + + assertEquals(2, localForks.size()); + assertEquals(5, p1.getPortionsEaten()); + assertEquals(5, p2.getPortionsEaten()); + } +} diff --git a/src/test/java/org/example/utils/IndexFetcherTest.java b/src/test/java/org/example/utils/IndexFetcherTest.java new file mode 100644 index 0000000..e74c001 --- /dev/null +++ b/src/test/java/org/example/utils/IndexFetcherTest.java @@ -0,0 +1,50 @@ +package org.example.utils; + +import org.example.fork.Fork; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.ConcurrentHashMap; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class IndexFetcherTest { + + private IndexFetcher indexFetcher; + private ConcurrentHashMap forks; + + @BeforeEach + void setUp() { + indexFetcher = new IndexFetcher(); + forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + forks.put(2, new Fork(2)); + } + + @Test + void fetch_withValidIndex_returnsSameIndex() { + assertEquals(0, indexFetcher.fetch(forks, 0)); + assertEquals(1, indexFetcher.fetch(forks, 1)); + assertEquals(2, indexFetcher.fetch(forks, 2)); + } + + @Test + void fetch_withNegativeIndex_returnsLastIndex() { + assertEquals(2, indexFetcher.fetch(forks, -1)); + assertEquals(2, indexFetcher.fetch(forks, -10)); + } + + @Test + void fetch_withIndexTooLarge_returnsFirstIndex() { + assertEquals(0, indexFetcher.fetch(forks, 3)); + assertEquals(0, indexFetcher.fetch(forks, 10)); + } + + @Test + void fetch_withEmptyMap_returnsZero() { + ConcurrentHashMap empty = new ConcurrentHashMap<>(); + assertEquals(0, indexFetcher.fetch(empty, -1)); + assertEquals(0, indexFetcher.fetch(empty, 5)); + } +} From 865518ea87c91183842b2c8270a8ebd80aabbd91 Mon Sep 17 00:00:00 2001 From: Timofey Ivankov Date: Sat, 27 Sep 2025 15:36:42 +0300 Subject: [PATCH 3/9] added more tests --- .../example/programmer/ProgrammerTest.java | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) diff --git a/src/test/java/org/example/programmer/ProgrammerTest.java b/src/test/java/org/example/programmer/ProgrammerTest.java index deed236..17600f4 100644 --- a/src/test/java/org/example/programmer/ProgrammerTest.java +++ b/src/test/java/org/example/programmer/ProgrammerTest.java @@ -4,6 +4,9 @@ import org.junit.jupiter.api.Test; import org.example.fork.Fork; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; @@ -262,4 +265,197 @@ void testFastSwitching() throws InterruptedException { assertEquals(5, p1.getPortionsEaten()); assertEquals(5, p2.getPortionsEaten()); } + + @Test + void testForksMutualExclusion() throws InterruptedException { + ConcurrentHashMap sharedForks = new ConcurrentHashMap<>(); + sharedForks.put(0, new Fork(0)); + sharedForks.put(1, new Fork(1)); + AtomicInteger food = new AtomicInteger(2); + + Programmer p1 = new Programmer(0, sharedForks, food); + Programmer p2 = new Programmer(1, sharedForks, food); + + p1.start(); + p2.start(); + p1.join(); + p2.join(); + + assertEquals(2, p1.getPortionsEaten() + p2.getPortionsEaten()); + assertEquals(2, sharedForks.size()); + } + + @Test + void testNoOverEating() throws InterruptedException { + AtomicInteger food = new AtomicInteger(1); + ConcurrentHashMap forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + + Programmer p1 = new Programmer(0, forks, food); + Programmer p2 = new Programmer(1, forks, food); + + p1.start(); + p2.start(); + p1.join(); + p2.join(); + + assertEquals(1, p1.getPortionsEaten() + p2.getPortionsEaten()); + } + + @Test + void testForksReturnedOnInterrupt() throws InterruptedException { + AtomicInteger food = new AtomicInteger(10); + ConcurrentHashMap forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + + Programmer p = new Programmer(0, forks, food); + p.start(); + p.interrupt(); + p.join(); + + assertEquals(2, forks.size()); + assertTrue(p.userForks.isEmpty()); + } + + @Test + void testManyProgrammersLimitedFood() throws InterruptedException { + AtomicInteger food = new AtomicInteger(3); + ConcurrentHashMap forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + + Programmer[] programmers = new Programmer[5]; + for (int i = 0; i < 5; i++) { + programmers[i] = new Programmer(i, forks, food); + programmers[i].start(); + } + for (Programmer p : programmers) p.join(); + + int total = 0; + for (Programmer p : programmers) total += p.getPortionsEaten(); + assertEquals(3, total); + assertEquals(2, forks.size()); + } + + void testRandomThreadOrder() throws InterruptedException { + AtomicInteger food = new AtomicInteger(4); + ConcurrentHashMap forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + + Programmer p1 = new Programmer(0, forks, food); + Programmer p2 = new Programmer(1, forks, food); + Programmer p3 = new Programmer(2, forks, food); + + List list = Arrays.asList(p1, p2, p3); + Collections.shuffle(list); + list.forEach(Thread::start); + list.forEach(p -> { + try { p.join(); } catch (InterruptedException ignored) {} + }); + + int total = p1.getPortionsEaten() + p2.getPortionsEaten() + p3.getPortionsEaten(); + assertEquals(4, total); + } + + @Test + void testNoDeadlockTwoProgrammers() throws InterruptedException { + AtomicInteger food = new AtomicInteger(2); + ConcurrentHashMap forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + + Programmer p1 = new Programmer(0, forks, food); + Programmer p2 = new Programmer(1, forks, food); + + ExecutorService executor = Executors.newFixedThreadPool(2); + executor.submit(p1); + executor.submit(p2); + executor.shutdown(); + executor.awaitTermination(5, TimeUnit.SECONDS); + + assertEquals(2, p1.getPortionsEaten() + p2.getPortionsEaten()); + } + + @Test + void testFoodDistributionManyThreads() throws InterruptedException { + AtomicInteger food = new AtomicInteger(5); + ConcurrentHashMap forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + + Programmer[] programmers = new Programmer[10]; + for (int i = 0; i < 10; i++) { + programmers[i] = new Programmer(i, forks, food); + programmers[i].start(); + } + for (Programmer p : programmers) p.join(); + + int total = Arrays.stream(programmers).mapToInt(Programmer::getPortionsEaten).sum(); + assertEquals(5, total); + assertEquals(2, forks.size()); + } + + @Test + void testSimultaneousStart() throws InterruptedException { + AtomicInteger food = new AtomicInteger(2); + ConcurrentHashMap forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + + CountDownLatch latch = new CountDownLatch(1); + Programmer p1 = new Programmer(0, forks, food) { + public void run() { try { latch.await(); super.run(); } catch (InterruptedException ignored) {} } + }; + Programmer p2 = new Programmer(1, forks, food) { + public void run() { try { latch.await(); super.run(); } catch (InterruptedException ignored) {} } + }; + + p1.start(); + p2.start(); + latch.countDown(); + + p1.join(); + p2.join(); + + assertEquals(2, p1.getPortionsEaten() + p2.getPortionsEaten()); + } + + @Test + void testForksAlwaysReturned() throws InterruptedException { + AtomicInteger food = new AtomicInteger(3); + ConcurrentHashMap forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + + Programmer p1 = new Programmer(0, forks, food); + Programmer p2 = new Programmer(1, forks, food); + Programmer p3 = new Programmer(2, forks, food); + + p1.start(); p2.start(); p3.start(); + p1.join(); p2.join(); p3.join(); + + assertEquals(2, forks.size()); + } + + @Test + void testAtomicFoodDecrement() throws InterruptedException { + AtomicInteger food = new AtomicInteger(1); + ConcurrentHashMap forks = new ConcurrentHashMap<>(); + forks.put(0, new Fork(0)); + forks.put(1, new Fork(1)); + + Programmer p1 = new Programmer(0, forks, food); + Programmer p2 = new Programmer(1, forks, food); + + p1.start(); + p2.start(); + p1.join(); + p2.join(); + + int totalEaten = p1.getPortionsEaten() + p2.getPortionsEaten(); + assertEquals(1, totalEaten); + } } From a24dee01cc62ea224003bff7f6ae9831465d28a0 Mon Sep 17 00:00:00 2001 From: Timofey Ivankov Date: Sat, 27 Sep 2025 15:38:10 +0300 Subject: [PATCH 4/9] updated gitignore --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f68d109..246fa16 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,8 @@ bin/ .vscode/ ### Mac OS ### -.DS_Store \ No newline at end of file +.DS_Store + +### Gradle ### +.gradle/ +build/ \ No newline at end of file From eb5af9b496e235265e8c040ba7a5d5c247fe3943 Mon Sep 17 00:00:00 2001 From: Timofey Ivankov Date: Tue, 30 Sep 2025 12:54:13 +0300 Subject: [PATCH 5/9] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BA?= =?UTF-8?q?=D1=8D=D1=88=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gradle/8.10/checksums/checksums.lock | Bin 17 -> 0 bytes .gradle/8.10/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/8.10/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .gradle/8.10/gc.properties | 0 .gradle/9.1.0/checksums/checksums.lock | Bin 17 -> 0 bytes .gradle/9.1.0/checksums/md5-checksums.bin | Bin 19797 -> 0 bytes .gradle/9.1.0/checksums/sha1-checksums.bin | Bin 25949 -> 0 bytes .../executionHistory/executionHistory.bin | Bin 193519 -> 0 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .gradle/9.1.0/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/9.1.0/fileHashes/fileHashes.bin | Bin 22697 -> 0 bytes .gradle/9.1.0/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../9.1.0/fileHashes/resourceHashesCache.bin | Bin 25739 -> 0 bytes .gradle/9.1.0/gc.properties | 0 .../buildOutputCleanup.lock | Bin 17 -> 0 bytes .gradle/buildOutputCleanup/cache.properties | 2 - .gradle/file-system.probe | Bin 8 -> 0 bytes .gradle/vcs-1/gc.properties | 0 .idea/.gitignore | 8 - .idea/compiler.xml | 6 - .idea/gradle.xml | 16 - .idea/inspectionProfiles/Project_Default.xml | 8 - .idea/misc.xml | 10 - .idea/vcs.xml | 6 - .../java/main/org/example/app/Main.class | Bin 1776 -> 0 bytes .../java/main/org/example/dinner/Dinner.class | Bin 3684 -> 0 bytes .../org/example/dinner/DinnerVerifier.class | Bin 848 -> 0 bytes .../example/dinner/ResourceGenerator.class | Bin 1694 -> 0 bytes .../java/main/org/example/fork/Fork.class | Bin 403 -> 0 bytes .../org/example/programmer/Programmer.class | Bin 4043 -> 0 bytes .../main/org/example/utils/IndexFetcher.class | Bin 895 -> 0 bytes .../test/org/example/dinner/DinnerTest.class | Bin 2640 -> 0 bytes .../example/dinner/DinnerVerifierTest.class | Bin 2873 -> 0 bytes .../dinner/ResourceGeneratorTest.class | Bin 1590 -> 0 bytes .../java/test/org/example/fork/ForkTest.class | Bin 761 -> 0 bytes .../example/programmer/ProgrammerTest$1.class | Bin 1519 -> 0 bytes .../example/programmer/ProgrammerTest$2.class | Bin 1519 -> 0 bytes .../example/programmer/ProgrammerTest.class | Bin 6793 -> 0 bytes .../org/example/utils/IndexFetcherTest.class | Bin 1926 -> 0 bytes build/reports/problems/problems-report.html | 663 ---------------- .../Gradle#20Test#20Run#20#3atest.html | 740 ------------------ .../org.example.dinner.DinnerTest.html | 125 --- ...org.example.dinner.DinnerVerifierTest.html | 111 --- ....example.dinner.ResourceGeneratorTest.html | 96 --- .../classes/org.example.fork.ForkTest.html | 96 --- ...org.example.programmer.ProgrammerTest.html | 181 ----- .../org.example.utils.IndexFetcherTest.html | 111 --- build/reports/tests/test/css/base-style.css | 174 ---- build/reports/tests/test/css/style.css | 97 --- build/reports/tests/test/index.html | 213 ----- build/reports/tests/test/js/report.js | 243 ------ .../tests/test/packages/default-package.html | 115 --- .../test/packages/org.example.dinner.html | 123 --- .../tests/test/packages/org.example.fork.html | 103 --- .../test/packages/org.example.programmer.html | 103 --- .../test/packages/org.example.utils.html | 103 --- .../TEST-Gradle#20Test#20Run#20#3atest.xml | 639 --------------- .../TEST-org.example.dinner.DinnerTest.xml | 18 - ...-org.example.dinner.DinnerVerifierTest.xml | 10 - ...g.example.dinner.ResourceGeneratorTest.xml | 7 - .../test/TEST-org.example.fork.ForkTest.xml | 7 - ...-org.example.programmer.ProgrammerTest.xml | 24 - ...EST-org.example.utils.IndexFetcherTest.xml | 10 - build/test-results/test/binary/output.bin | 9 - build/test-results/test/binary/output.bin.idx | Bin 69 -> 0 bytes build/test-results/test/binary/results.bin | Bin 2579 -> 0 bytes .../stash-dir/Dinner.class.uniqueId0 | Bin 3684 -> 0 bytes .../stash-dir/Programmer.class.uniqueId2 | Bin 4087 -> 0 bytes .../ResourceGenerator.class.uniqueId1 | Bin 1694 -> 0 bytes .../compileJava/previous-compilation-data.bin | Bin 518 -> 0 bytes .../previous-compilation-data.bin | Bin 1573 -> 0 bytes 71 files changed, 4177 deletions(-) delete mode 100644 .gradle/8.10/checksums/checksums.lock delete mode 100644 .gradle/8.10/fileChanges/last-build.bin delete mode 100644 .gradle/8.10/fileHashes/fileHashes.lock delete mode 100644 .gradle/8.10/gc.properties delete mode 100644 .gradle/9.1.0/checksums/checksums.lock delete mode 100644 .gradle/9.1.0/checksums/md5-checksums.bin delete mode 100644 .gradle/9.1.0/checksums/sha1-checksums.bin delete mode 100644 .gradle/9.1.0/executionHistory/executionHistory.bin delete mode 100644 .gradle/9.1.0/executionHistory/executionHistory.lock delete mode 100644 .gradle/9.1.0/fileChanges/last-build.bin delete mode 100644 .gradle/9.1.0/fileHashes/fileHashes.bin delete mode 100644 .gradle/9.1.0/fileHashes/fileHashes.lock delete mode 100644 .gradle/9.1.0/fileHashes/resourceHashesCache.bin delete mode 100644 .gradle/9.1.0/gc.properties delete mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 .gradle/buildOutputCleanup/cache.properties delete mode 100644 .gradle/file-system.probe delete mode 100644 .gradle/vcs-1/gc.properties delete mode 100644 .idea/.gitignore delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml delete mode 100644 build/classes/java/main/org/example/app/Main.class delete mode 100644 build/classes/java/main/org/example/dinner/Dinner.class delete mode 100644 build/classes/java/main/org/example/dinner/DinnerVerifier.class delete mode 100644 build/classes/java/main/org/example/dinner/ResourceGenerator.class delete mode 100644 build/classes/java/main/org/example/fork/Fork.class delete mode 100644 build/classes/java/main/org/example/programmer/Programmer.class delete mode 100644 build/classes/java/main/org/example/utils/IndexFetcher.class delete mode 100644 build/classes/java/test/org/example/dinner/DinnerTest.class delete mode 100644 build/classes/java/test/org/example/dinner/DinnerVerifierTest.class delete mode 100644 build/classes/java/test/org/example/dinner/ResourceGeneratorTest.class delete mode 100644 build/classes/java/test/org/example/fork/ForkTest.class delete mode 100644 build/classes/java/test/org/example/programmer/ProgrammerTest$1.class delete mode 100644 build/classes/java/test/org/example/programmer/ProgrammerTest$2.class delete mode 100644 build/classes/java/test/org/example/programmer/ProgrammerTest.class delete mode 100644 build/classes/java/test/org/example/utils/IndexFetcherTest.class delete mode 100644 build/reports/problems/problems-report.html delete mode 100644 build/reports/tests/test/classes/Gradle#20Test#20Run#20#3atest.html delete mode 100644 build/reports/tests/test/classes/org.example.dinner.DinnerTest.html delete mode 100644 build/reports/tests/test/classes/org.example.dinner.DinnerVerifierTest.html delete mode 100644 build/reports/tests/test/classes/org.example.dinner.ResourceGeneratorTest.html delete mode 100644 build/reports/tests/test/classes/org.example.fork.ForkTest.html delete mode 100644 build/reports/tests/test/classes/org.example.programmer.ProgrammerTest.html delete mode 100644 build/reports/tests/test/classes/org.example.utils.IndexFetcherTest.html delete mode 100644 build/reports/tests/test/css/base-style.css delete mode 100644 build/reports/tests/test/css/style.css delete mode 100644 build/reports/tests/test/index.html delete mode 100644 build/reports/tests/test/js/report.js delete mode 100644 build/reports/tests/test/packages/default-package.html delete mode 100644 build/reports/tests/test/packages/org.example.dinner.html delete mode 100644 build/reports/tests/test/packages/org.example.fork.html delete mode 100644 build/reports/tests/test/packages/org.example.programmer.html delete mode 100644 build/reports/tests/test/packages/org.example.utils.html delete mode 100644 build/test-results/test/TEST-Gradle#20Test#20Run#20#3atest.xml delete mode 100644 build/test-results/test/TEST-org.example.dinner.DinnerTest.xml delete mode 100644 build/test-results/test/TEST-org.example.dinner.DinnerVerifierTest.xml delete mode 100644 build/test-results/test/TEST-org.example.dinner.ResourceGeneratorTest.xml delete mode 100644 build/test-results/test/TEST-org.example.fork.ForkTest.xml delete mode 100644 build/test-results/test/TEST-org.example.programmer.ProgrammerTest.xml delete mode 100644 build/test-results/test/TEST-org.example.utils.IndexFetcherTest.xml delete mode 100644 build/test-results/test/binary/output.bin delete mode 100644 build/test-results/test/binary/output.bin.idx delete mode 100644 build/test-results/test/binary/results.bin delete mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/Dinner.class.uniqueId0 delete mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/Programmer.class.uniqueId2 delete mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/ResourceGenerator.class.uniqueId1 delete mode 100644 build/tmp/compileJava/previous-compilation-data.bin delete mode 100644 build/tmp/compileTestJava/previous-compilation-data.bin diff --git a/.gradle/8.10/checksums/checksums.lock b/.gradle/8.10/checksums/checksums.lock deleted file mode 100644 index 325d7ab25a75401a4a1ee28a9006be1e606e4e34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZQpxVZM`w05ok3{U_7JPrim diff --git a/.gradle/8.10/fileChanges/last-build.bin b/.gradle/8.10/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.gradle/8.10/fileHashes/fileHashes.lock b/.gradle/8.10/fileHashes/fileHashes.lock deleted file mode 100644 index ab16857993572d63da2207094ede2479805b3a8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 ScmZSf@op7A)ULLV0SW*p=>uc{ diff --git a/.gradle/8.10/gc.properties b/.gradle/8.10/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.gradle/9.1.0/checksums/checksums.lock b/.gradle/9.1.0/checksums/checksums.lock deleted file mode 100644 index 39bc40f93ba8649ebca82c4b4ab2eabc98dc940b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZQ(au@M!ox03{0Rqkd03W#ndH?_b diff --git a/.gradle/9.1.0/checksums/md5-checksums.bin b/.gradle/9.1.0/checksums/md5-checksums.bin deleted file mode 100644 index 81cc7282b7c3a2f0f6b5684c14c0e6f1789c1080..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19797 zcmeI3X;52L7={C~lr3y&q=cZzZm|VI3KGg9TOiP(mfF#xHlYYk#1<*Cl$HW&EkzhY zqy>hhEJ_)n(4>n{fr8W-sAHmS(*cF5fapLK3ZaV>6V5r)k;@N%JKvqTxo6&-=lgP> zbMCLq4WrR)ELQMAdva`iGK3Kr00UqE41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq& z0Wk1?F|b>6BgW`vY&>+e1M^H8&C^sfu&te_5}yB3@eTSq`YH1NLEGYawqJNy0?K20 zN#43z|W_dd!6^^-|{L+^#1!sY9aas9m{ zA1z2v6?CxM+57SQIg+om>#EPl6s0JSG9tOnqdjvGjdxx{xnPOp4w8Dw z@LF*2D0dUlt(X<+&6kSLJ&8r#PxY356tQC)N3>v$Mv_8oG+FvCUHwo z`Wl3M?LwR&1$@c`@O+LV7^x`@~l8f5?Uw?e9+6U$Qbdslb1{=NH!Fhn| za7q5Ifx&mzzv3Rp^P5SYHa#Pk7Ho<`c~l+Ab9lmM+wC1|y-$XjcBU_Z*S28rYH81UEN&zCg4lLxcyLN;s9b#daDxnR~sdm)nqHrL#)3 zlvyHzslBebk8WqN)d+VkD)8rQpCB211ryzfVC|w3hW0nENJ^NM+2aRY?5g54Zz^ck zqos5K5vCtf3D(<}Px20bT#=?9uuv}l$q5mXO^C2QL?wckbgLpyw{k+oe>J|OY8=8u zHX=;=sYJ?5-CKEVnSX=yM-SDuHzG0dJtA!4sYKC*gpE6PSKo>pnvO6(diEqD%5xE6 zdXP%|Q8qA|)I8G0Ns-Z&Z4D)uxQPg+h)UGGqAF+4)V9CK>8C4Qoqr>I2XIqr$XvG|G%heW--L7~?WQ6<1V)^U|UOYl`3 z?a-5du3GU4H@u1o{0v&RQG3vfvnB^}-)s1y<(K25leTClwlYjm4-@TfS+nLB>1Do( ZbF3q7Twk*(*$88`M=JxnvdYsE{{Ssqk~shX diff --git a/.gradle/9.1.0/checksums/sha1-checksums.bin b/.gradle/9.1.0/checksums/sha1-checksums.bin deleted file mode 100644 index a4009d28114a876405b363e52f31dfa63ac8f764..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25949 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 diff --git a/.gradle/9.1.0/executionHistory/executionHistory.bin b/.gradle/9.1.0/executionHistory/executionHistory.bin deleted file mode 100644 index f4da6ae486a0e19e2f3cdc81ec5a279575e50ac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193519 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 diff --git a/.gradle/9.1.0/fileChanges/last-build.bin b/.gradle/9.1.0/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.gradle/9.1.0/fileHashes/fileHashes.bin b/.gradle/9.1.0/fileHashes/fileHashes.bin deleted file mode 100644 index 0bd39b95491ef48db57f2cec716ca5143568a0a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22697 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 GGx2|cHZiaO diff --git a/.gradle/9.1.0/fileHashes/fileHashes.lock b/.gradle/9.1.0/fileHashes/fileHashes.lock deleted file mode 100644 index aabe1b3b2d9b532857744f3001878605e669663c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZR+alLSd>BMhe7{Gv+2LMFy1*HH0 diff --git a/.gradle/9.1.0/fileHashes/resourceHashesCache.bin b/.gradle/9.1.0/fileHashes/resourceHashesCache.bin deleted file mode 100644 index 0038c7bfcd88f6ba7791d3b4b98842b6aeaafa50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25739 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 diff --git a/.gradle/9.1.0/gc.properties b/.gradle/9.1.0/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index e905e6f012f564e0efbeee69c4b2f92bba52ee1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZR6pS^K!{jaA+3}C=<4gf_21~LEu diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 43ed659..0000000 --- a/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Tue Sep 30 12:35:43 MSK 2025 -gradle.version=8.10 diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe deleted file mode 100644 index 99a341a202fe3ca7e04bf29dde2256aa79524bb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmZQzV4T@4b?Pht2j&9T diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index bcf4711..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index ce1c62c..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index db0f74e..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 7b2a2bd..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/build/classes/java/main/org/example/app/Main.class b/build/classes/java/main/org/example/app/Main.class deleted file mode 100644 index 6a00d5a4fb0ad3a9d36d50ae6a6c78de91ef10ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1776 zcmb_dT~ixX7=BK&VPOdYLPL$vT3d<<*sdRyDrr#~icJj^2~yD+heL7$PbjH0n=e+NEKc4qF?>YO&tCQaWEaE#0F~m(6 zNhHuGF!Dm~OS>W6y8UeDg{o?Sz6Xx$=mmjzF28A_|FuzDI}LkXx;3w9!9+Y929ro) zNWgT}fiAi9HgctW$;7ZgJ_;RqRXw-b4g%$BTWYWARPDuRqKB%hz(NY6A)s`}e{%p= zkTEfy#8tfYI)4PRa@f+UNo-!5$ui|AhvV66f#d3m4wP&b`ti2F(w+a|voMKkCax#( z4sHmHU6PHp`(f^eOE|d>o(@t?b-j?^Oq2MVN!-Gez}2SQQ$?~N^>at>a@Eq()veIC zl)vbmhQLh|?+IkRpl+)J+4LLAt~su&0(&W%EKG-oF^!odX7Rp2qNRd;C1B@DorwSD z3<%W3U4bjTd8F^#E7D)oQ!Bqk;{&)1W3@_Nub6DFY{zyGldvI;?5D zd|9vpqcx+TzOMhkYeV0)sz#UM-SUATaPo5}5rDg|fpt z{0U5)19*;Aq7)91%An3l#x4QM&49Ndq~NU6JNJXm@s-7I1%@hGR`*t<-zCO+d{9-s zc6jb4mIbayo>9MqcOeMczE-t2MgmsFYX?=e?1WqoglBO#bRk8LJWscDApI4kcfDGx zA72Ti*3O8Vzajdu!v0()YZQk2@XW#*zBaKQwqr$L>MXtE?t6R6<`rVsb~yhnxJThR?sl#NEk(TX%D zOW{o@He{=%NGW^g_Jx`*gKC1O)5HEbaNVldD4n|SF7EKz48IsJBp*(WHYJ<0;GCE_ zhWItw{(xh+4fNwfj>(PzKElV825=9bFbJK+Ef}-`{8N})#~3J&#{Ya6U${16y~Gc* zlSi=TjErGy&rW8H8l~;I#3@o+nZz+h=KFrbSUP)z3C%h;gKqWlfPZXx>* DeSx;T diff --git a/build/classes/java/main/org/example/dinner/Dinner.class b/build/classes/java/main/org/example/dinner/Dinner.class deleted file mode 100644 index 30273e6a665f3de1e8459743e3fda3d53ddee797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3684 zcmb_f`%@fM7XB{GOvBI-GDsp}jgSBWCXVj<%wXJv1cQ=?k|k@@U7O)DG|Y65-90R5 z_Tl<|?fQzktNUJ!uiee6kOZsL-?qwsWPk8KNTrP5?d}=6lTphmshaL{&pqcm=bl$z zKL2v{69BugnnnW}H6(N-krHT|GZu_&(Xa~HgHv-d?+K)aP0RFl3N#K3PHJcp=&_wb zRxTQ)a#3cdP0Nx_c8~v>l#V%LN+%5sjm>C*u3?>yOVBFN`L$XCO$(u-z}E4vm8+uX zG^`ists{4rbnS|hm$ym!WOz0mX$u^=R7VFk2&{K56cOmJXYwK_TD?r5-49U3GmF_> zj$3&i;k`66-dt5&OD(9BGBIiKx_Rx`d>U? z84gQsH}>fmQ=G({ZCcH^1LGR@>o|aeu|A$yay?n1Uv`Dwg~e#vgf}g3!gHii$~ECm zf!3ghyG^&-W{q5f+SMMIM}CH$)MF@skS^5(Uk0a{XM#{V)VJmW+9+s=@G%nBFWYhQ}}97+BSv zAiGg870A4fX|M#_3er1dJDy3Dy@n@wC?<0(jRIyhnCb{~)h_Ze!lG7%GZuBUTI^}` zp{Sz-BIyJ_=H~6yiv6mL?>PuCLahKflOgX+MbTH9RD+Zmp`hq2ZU+jQg@2LcMzxP799V*E)Wq zDm%p^-64I}Z*@GPSZwIPqYMNdQ%QQ8t8zpzha%wH1%R zQn?z1TOu&E>irHeUpL_y`FU!FQBCh%%*(Pr8#MewU~@cGj#DXna=IqO7)|(Bkx^46 zswJ4MS1Tn(V7G01uICu#{nDGYr`;yJP3|az&~21dNYoG(O?a1StWKnEsYcR{Zn3S~ zj})oa6y8tcU--9%|EOL&$y?EyTc)*O&&zDkZNZEjHS)X^EeX699Y3L9;LAS4nl4JW zcigt;E9J0mqZ2by_%X%9jC~#Pdm{36rdkLwVib!L{1CG|^f7gz94Q*ED_spA#zqtK z!AkTek%kq4zKf1q?-UwN#}XFvJ3KJQS#V_Z@ZQ?MZ%h&yb#o<^QFllG&FdWp+f$?) z@HF|njn&rAkjG0@ZT&3QbQUQ-pQFZuXe0#;51oP-`WV{Xr_j8NG|4uSnPs$-+(@!> z8JkFMCfU7=9+G_|uUy8!e|^ip<8u>n0UZf?*vc!_CamYs&)^!g_RXa#riz3nu9x{99xTwbU;5`pL5fHE<48Z(XjtziB$6jos0 zkc@71Bop`hyUvjl=U3Iv3Myy7(ylqZvx<65IeiAdQU?f-)biolGDY_~k{zj4JnFl5 z;{2z|@h9l1igyAk-lL2!c+qc0Cu7}(oxJK#u^Q%hH(x?GjBY_$bwkWt_qpbbbXt C0scM! diff --git a/build/classes/java/main/org/example/dinner/DinnerVerifier.class b/build/classes/java/main/org/example/dinner/DinnerVerifier.class deleted file mode 100644 index 754293f1de316f1a6dc1e60ff46096f93a9c6e04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 848 zcmb7C-EI;=6#k|_7Z&Ibm0HE>wp9T&?gP}AkZKbW{7En*y&RV5cIxg78D=Y9`XGAY z8+c_Mub_ZchK+N6!NY{BID9cY z7m;OHeI%8%j~Q~U_P|FGB@ccDWmFj2v+bFcNf>DrWyT0)LvD2{qp&kmU1dcq43)=% z&Td7qM8w@+0RA%^$X^hnD--e+(Iy$p+z+IsrLcZ7LY5KHgTKGJSD62-ywSi GcYgu2x6QKv diff --git a/build/classes/java/main/org/example/dinner/ResourceGenerator.class b/build/classes/java/main/org/example/dinner/ResourceGenerator.class deleted file mode 100644 index 4097999e425503fa6055b16b553c05e8259de10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1694 zcmcIk-A)rx5dKcv?ZQ&z&z2tx2m-bgS$`2}C8{6M!@xD)7NCBM^dwAVc>K z-{WeD8%1?xb4SbD48fFc==LImKNeqC(1vyyN(dbYG4wRuvxcn|HH$&sGQuH5(9baCM620) zNzI!^zGhjPVXK*jy3DKFPk4o}R%!%&KITbZuP51h;>GAX$rxl9^FpjxX3^s1vSz8z z8mfW;ToG`i3>&d*J@jAExe$K$}=E}Kcgzz9ZVTn%9i;|zUG2GW+r_j7uc z3ib0sfjB**-1tiw6ATmHS_-;hP#w>;s#&x0+GCA&l%3u#kTDAyLsw2Ww5PT5re>}2 z%@UpT=FB`Vt#eBkd-pJ4Z|hZhl-$1rPcpO>>zOEC$%X2W&?w{_W?J4ic@EX*P{_b^ z`ezwBn$JkU!=49gVqlO&Ka$;x@lWkWr3HD}tQqtY%9d#s((WeVN#F@^CQKTa(;V+t zPIzAMglXVRonpONm#00Gi-c^=bJ>HTh0|2s&l&xb?mLyDF{Dn|&Q+V|cWKt#UT9y{ ziw3uA7Cr7qFL4(H{6ElMv|E%_XD*g>(fN^d!VD<5PHU*{fEePmW0*#Qf{4rC$S+7Tcl0yyT}xc~qF diff --git a/build/classes/java/main/org/example/fork/Fork.class b/build/classes/java/main/org/example/fork/Fork.class deleted file mode 100644 index d978a59798d665ca362ef40fde7f24b415a8f437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 403 zcmZutO;5r=5PefxYHI~Vg@Y$=z`_0ijfpWKAt8Fu^uEA~i={QS5Py^x6OD-ne}F&A z__lB~n|(8HcJ|H3&+peafJ<~kIH>t>BY3C_S_`#SajLR;d^1_-X(_0mo6M9Kf?BVi z1lU2~BaE<%NN|)F^H{&AR$xc05#HvjVycJ63I?`;Q#%Dt*sH@S zg_qqD9r_;jhz+tKxqS}@pOC@v2mH4xr%7y}M&w@XygV(k&L$iCXp`|@rOG*RfWxh3 eOl#|TgLn9^bR1Z@dKC;SnP`)+mEjJntj-_lNM z)-+lhYpeCKD$#1k8HYD{VVyuTcE&jEjLtaD_{#sl7ybdh>O|w`ySu=qK?hz4cl&$T z-|zeI`99vC|NXn)0~o}6Q3McF5z-Jwje^FD`jVc`>&5x>CLHvfJq`sMn%1XCWn00HuLFc z^vc4hUXG#;L802Dp&1Vv6r9D;1(R=qer8(20bCki~rk z%|032la9J64P7`SvbwPBSX2?|^BTHw*pai88!_f=1xX(ppQ^fDDwx^ypfhBOwlQy5 zy-^&&7gQY8@I^eKpkvD*zMJ=fq(C(*Lxr+^$#I*rQ3}$dp;t)6Y<%_7ZDyGQV}h9L|q(8i6t zp;wIEQ=bYmXyos(gw06}U&aW{Qpp=enMRDC?3_|@icYu{MS`PcRm--K8(Pj9WpP)z zd|Ja-Fisct9Bm`oTH>9qb$l^MBLpz1;aO3t*4&^N#Wc>Sn9*<+&nf8K)->B0l{T3- z=m!kwj1W1e;XGatSxSYnZW)8c+=RRj$1@p0RL87}tcDznjSzOE^L&KHUefbbV{A^r zo_NMDzu$}IMNURqhi6TP#MtabBWw5i?|54(E-HA)AI;+ZX)#(9Ch{5zqIH;>WOCxA zB@JbvUt<}C(h{Ai4wi-rMA34U&nLEF?8ExMiz4B=q~RqjQ`MreY*Q^UH#327nHTQ# zusW1zo(XflsM}SGP!0Iv%*!5qK873MjBKl9Z-1|XNgsv(6>qyFI~~vLkZ|wz=eF~z z-p(n4a=etI<_#le(KuBt%o^6DM7E^1QdZAT>6R&LZ!=^sm`wAJ+=IZjWrSF0rZ0~x zXus#u{h6LO_T0w%dy?1u^C>UP94;$Zo<~H zi!7ZEh$_CvI=Pi^m`6%4xsV5$S|pJgwv^)x>r11|{Uy_@DcuV8-UH`msF9yjbyz^c zbEZ|H-`7+Ox?)bn^^MBri)01UJ5AQRg0_?RL^l&CedhnfhAtePC{?YjF>H$4Hf(h= zhXiEoXCVo&0z}xYum$3*QTi4rc!l!-zRE9q6V98ZKX6921kT7(?~E+wo9D0a9P2ap zBisw)Ro=hK)!#XnYI7#>0hC1R8q~yxsGIo!4Qpsj1lQ2=A@*_^>j@=dp;Y1~)KG36 zpIJlO=K6xO-p`8%d9q^-k0nxTNG7`0kba-EgZLVsho}e8h7jegrG70qfEe4D1I&7d z@hD4a2S(YZj8pn)B=L2gKH|!T*YFLlD5Zmi;><)lLFkO5SCDj$;&ogj{cmztqn7fn z3s-o`#q164eG4^wUIi4VBjuU%)G4`+$5&9ZicDf1PhOYVK(Md%I*umXw|y%(z*omY zecs0LRn(7e%u}~l@BXa?CvG9LdiO7@cYm{r=*TUMtz+VSa*tEeC&>wzz!Y_K@fb!E zce1A=caD((xpSkpK4` zyNE0*0(aP{H<0NM@SMjw%~8x2CNov&2OQ54ivg1kP1mkrkEVhjZhN`q)0dy!=5jzf zK(e?>XZV<^M9Ji4lC0Zqfi6Aw2biO>+`qXzmHH#pu0MHjw8^_)K~1e9)Wz`NMQ^8z zJE@*QmImSe2;Ht98P zT$J&}X=lf~EmU5d4&5O9XHdm5 z)$=%TiN5eMf49Bj^O}90)<5U_5J`^m2HSj(&0l#>g5aFkhhNu)E{O|yJFXYW&Z%U| zwLXW-)5$J(!QrxFUGL>OUUrt=YgumP(l*8qXrgAC^&oR&H#1*9;T^>rc%C^fgc6r7FixN%a_7APN0nwA4<3&KAjZ6s7F!cu@ks*3Bz*(PpXJKET&@KX>M z#DPmMTtMQ$58yW;#H^DddO^X5_jaG>&CI^tAHTkR2k;cz9!juW*flsP3#^>V*V2z= zGV)&zPF0u*l=q_~$~pqp&hD{?B~)B^HB?a(cv!&mEQ7 z0ec#~RRu-h;)cLxsz<)Mkmr+F`KEvB2gy)fbX69Pm1e_XI%Gq=7bWUNem+q8NDg9F z)_Q3u<725Kv!563Y#dDmwtD}jZ3{RjMnT~5PH!>q?O-=BZK*z^!opnwrD!N1*t>q+ z@tet&>!SrN?9Xt;tprJ?MoPD@oz$4~yA16PkGR~=WO&B0&xcd#N25e$x#sjg_0wF3svDVGTK)SrpO{Hw8_Rra<|}~%MVYbAozEz~(u0x02U6$vC2q%;g+m?3>&92&Z9 zI1T;L-T^m#hT&z)vHY(YlDT|M!3e{oa2q;5GFok$>vhXAyfC-EZ$hUx05l0^lV8SZR~kaeUt3u8K6S zNS8ifNaZT|T86wG*D!&r3<^KuX5e#%qul9~(zs%!dS=REKEyf*C|LSI(6)SviqW?8 z{lGDOOE`Ktq&4?#t0{Cf_q!S-)XwyCBsr= zf4}A+P8kG-aRu`X3*9tVY@0U>yW}>47KO8XWb(G;%ur#BOFOd~ZsHb$7FiHdlR?|L zC^liOtlG3$JVyZXJ<1_s92NyR4S5t8hRF9r%8{NsR}yNJ@KsSK#j&d8@U5V=$K4%? zPBE+s)39rXYsq=MnDUzzxikBYN(c?|pR}p^9|w+awRp|)EP^RHj_{2*OADujV1@4s zmzNE*S!9?GJ$wGr@|$Hx1dZmp5cTKv6PZo7UD0rjR*SpdsvtrJR$&<3C((F*=Nz@k zaP1V!!ZN1{?6K*{F#Q20&2~keaaRnG$k|3~uWn@DA(*|-pmyraQ$W4tO1B_8WKLci?b;AZa<{k8~PldoH{EXJbVB_pvU&7dy0B82bxuF>A)epA%FG=|59 zu&z>P`%c5RDA24TXAd=e6V9q~wyB{=vtc|^@dJKT@L0n(c21l(%Q+M;xLyrIMexQx zg|->%zx zq+{Au!?w4n5mM1>6?sjBeS%ZUpEBI+ru>AJC*4!9%P{kHQMyB-SYVElkf2u2=u4Lm zjYjCDn~hfP&`760lPiT|uwQ79z#@I+Hc0g&`f8B?mPlAWcWE~fDnCFn+|vqgpzI!F z^f#zo40(|PmkA})gQLYb_h?VD+?SB}xPxgBW|CGWhL_(Uy*qM@%w}PF@ijgK{=j4x zK7$mAjT6ZPQB2ZkDx{f<)MJ_i>3xDviHNRXe1^|S{y*w3Bs0G3rydHahdR`=1F2^S zYL;Nfj9;=3}KjIa-Sb? z-Q-qXf4I9Z43A-WSz6M&%P^41R^k|8xMVwZT^#a8(-eADT9$D1wct?^j;u-HBoN2I zD8``0F|OeZCKxWCYE>34`5QTCLl_oHr`qIGlt)rS3R4VmaVQMm6Ab0d>88qEJ{#!m z`;?--?>D7Kx$vgcYrbW8(zf*V0Lgbvkx$@VOvf>!;VfnuE~?;;TNYebILg#zNbx{e zvxU29d*waHe$KGiitV^%l+SD>1%_lCa}4v{;uK9&)VW!3>V895-uj^-n#yO2%9&Jg zUeIt6ml(8G1c7S`Xe(3dLRL+BnSYA|$cBsqVsI=e3?P}ppo;P`LpE^Wd(zYm+cJE| zp#XL6*$rvvh2T-NJW*F&lEzilco~MlOfg$gZIe^A{D48v6kFcjgp|)#2(fBcsq_;i zX^Bn0u`8UiijS&LvJGxlxFeO^-W>GyBpt}rH|!IJAy;@$nhdj#ean*#QIW1BT*0zz zkGJbR-{&w_M9p@@Iyd(64C!{4?mU;?UWJ>oN`Jm^cd9*YGS`O{v@OGxFlCdP!IKB# zkz>~#-e?HN-SJenQHB?y6gOscJo1*G%5nt@57e`zWWE7!sYH zbmLfNnCkXjr*#-I5zv2=33*T7riM5{^?2UtTMXADEc%^y`sQ2e-=Gw?Y~L}&hEz>9 z(>noGl@?XXG*ee>+jBjKHy;RZ&#tgr&d2 zGofwNiu69Ws-|$$CEI@HH}j#df6H^ERS)m<7?xi&#s7QRa(S|Ccnr1Ou5#1dqTx-S zmsV64QZU;DwcZbO^K@IUC(7RR;@Dw0f3hmwhOM)p;W|d67Brh<>UyKq82#uDrJZZE z(&@?6PVNZoXIjK?o&MEprMgJ}T1$acZ;%Asq_?ra_zq1}rKjayA-;Wt(O;41GSrn# zcOFqvA&%DO+@g2N%WZlBOC9Dq?J4F|?jG<2Sz=~JPf^nor!Lo)=; zoeZ6fsZX$7v1KZ~NN~PbP-(u$kN63*{{UXWr2GH? diff --git a/build/classes/java/test/org/example/dinner/ResourceGeneratorTest.class b/build/classes/java/test/org/example/dinner/ResourceGeneratorTest.class deleted file mode 100644 index aa718ef5b72cfc994d38fa5f259a95161b05e55a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1590 zcma)6X;TwH5Pg%wNLVF;7kB|)NkG>73ZfBFQx%U=OqHLgA&g;gvm5uY)PH3ahox2i z0DqL_nLASG*e3J|3ny_(pugpN4PQ2!$|u2* z9)gY!(as1Ix@bMIvzSd?x6AQXaYNNmEbeKHnJXI?NaZVqnkn=-3+Hh`Ap6eqmdZ^p za#_cT9=iX4mdusqEfi1`*x#U`Jwh))_Fk2%5yKA`w&ToC+U2J zl`=O!$^Lq+8?Fo^p9J%}N4O)E=}o(MI@%Xe+SZz;hwR5(N;4&ayFIX-vQ2Mu=yrzv zveP87b86OGVrTzzha~4rmE>c6S3^NUMSl|9FGBa7W$!Ls%lQwmkD$#B;dkUzbt%|PNaebqAa+P z;|QGm2S_`P?Cbd9c&tr!BRk#^V>M+417qy*1YfNbS3W0{5@vQGa5I)~QRl#Q^xM=q z5d4?q8J{<M{#fsLllou9A3i+#nW$dOB)zn!`Uv)QAPqbc|VRb_F-l zdcfVh)mtGf62XKpSzIOeDw$R>lrz%VbzC$D>zGJ>V~9Lo#|A-}wgR(U6L|Co2E(83 diff --git a/build/classes/java/test/org/example/fork/ForkTest.class b/build/classes/java/test/org/example/fork/ForkTest.class deleted file mode 100644 index 53b278ef47c473d70394f7621d1f3602e12201b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 761 zcmZ`%+iuf95Iq~ab>ccraY-+ppe%*bvdBvY zkJpD+pDLcwakCdi@r{Brtz1NCiVDmbrLaO@~6A z^I=9FKQ2Z*OSqEeJa^jqQc@c`@qZbQ8MZVrpHTZ+RU=)fL7u)An$*#h%rFm0$6^9X zu5TPs&+n^T%c)3YDXIP-&kN1xL)opf{~erBL=^5>QK^wQl}1L}{00+vZpMZHcj!Hs zWsqJ37kLZT*0CbIQR+YgLQ>gYz&)> zH`dc{@cgy!@a<>D+9Kllg|a{asiKG?1==DkUw);8#8e1PN+E$jd>odsENpk{>@1*9{tbQg z!DkW`Bq z=vRc~ZUeT(CWm1=2 zQFNfwK+HrJx)}zqWx>!q=Xj2qXV^^Uu4?~;$r2BCmU%f-KaMNEl zx)NcCpC|jSd_s7=ewpm)*{UgWt{QhL2d%tweBbzT&swBMW}XS5w^RpRSS%LP_Y|Q9`gdV~>;ppY z5vh3N>At3KU}LX;z}VbO_mB5Qj?sQZ5sg#>6vL>llg|a{asiKG?1==DkUw);8#2^HcQb-^WABSaZ7q+`~b{5ble~3Q$ z;4_Je@xdS9k22nA3s@+D7n^kN*}M1Nx#!NA`TghTF93^p(TWB%8i<%^LNmjtFY}f- z;>D6HtdjKek{63YTI*+UQv@n8&Cq(l-Gs}PU0@i_?(qX|h01X)+xP5HO5rJM!4Ez4 z%0Kk7IxG`K3tA0CO|-#e=sM3?+u0Mg3K%-1cpExW=vQpaRUf!yNWm1=2 zQFNfwK+HrJx)}zqWx>!q=Xj2qXV^}zT-E+5lVu(hR(UB?KaMNE=-AfFvRUzz$P1ZC zZAEbly$0eYZsQKa&^g^JN5s&?54ocl8k4#}2kx4XYGV{bRwklM?-(BZ)ss)LM zX4<}?xV=x}u8umo;fK-|OOD=*p4wwSp|wYww&>ZeA2?pVQqI6ET>&=|or$Mf&Ao~Q zxZxB-S8-4HVL(ktQhiH~{L6ko&|L96As1X81R}sgx}`ek!eX(QzNZK^(7y`q&1IG4tx_`Vca)S0_ifE)7pcqC)K4OsYEL8&Hc!VLc8YM8SzY`k4 zXnBP=l1Ndm_N6gKt2`!bR-=*_r*9MF>7`O1Vg&yAQL9WJUV7>l*U0LoW9hG8-_esk zLEjfdvd86OZA7oXrpZs`CM!$Ds!dvyZ=fM(P%QN_Nv{omV diff --git a/build/classes/java/test/org/example/programmer/ProgrammerTest.class b/build/classes/java/test/org/example/programmer/ProgrammerTest.class deleted file mode 100644 index 8bb12132cd4699c8eceeb8d9446b016c6dcc7b68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6793 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 diff --git a/build/classes/java/test/org/example/utils/IndexFetcherTest.class b/build/classes/java/test/org/example/utils/IndexFetcherTest.class deleted file mode 100644 index 6306e3728c14035e8ffa4e29926ed70120303b88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1926 zcma)7Yi|=*5IxtAY_cq15)vLw(qJC74PB zzki>POcWwgXD!TQfg%6g^?vgiO3mW|)J&Ym1p^l?e1S!VGZUp6P9S>1V=(skAQTUu zGc1%E^yb0_ASYELbd zBx+bKoi}!=j(laIgtDqzb&27|u?ugM8z!#fhJl+FR$)_TR0X>sjRieNG7z54N7CN# zec=Vtbx2l=Yh&w0$OmNROARWCVWuT}4i7?4Ftm@U{93BUv5*HwBhj$7UL)}~-5o+d z-IR`a5DvG6*XG*;^2|2fE+2HbCzTyLb3tDczbgj-kIu9jP{PjpB6vJvxbP@+0yz{N z=}W@ea2z+_apgq~byS^uf_RE8-t806Ro#VWzssQC;RCs&-=AlmAY~lC#fL&W7#9Bn zEap?1z&sE=Vz3uo93wTkAH+!INvQU;UAM`-o*0MLrI*AmPhz)*qu>?2KjW~c!gEOn zq1-g)2PJ(q8p~?7+|cWax>Ul?>xA`aJ1FL>>fON#t%wY5p$vU!N$3;3nqc@^pR1Un zZ(2*_xkV?NzM1k=_QBrhkZJ - - - - - - - - - - - - Gradle Configuration Cache - - - -

- -
- Loading... -
- - - - - - diff --git a/build/reports/tests/test/classes/Gradle#20Test#20Run#20#3atest.html b/build/reports/tests/test/classes/Gradle#20Test#20Run#20#3atest.html deleted file mode 100644 index be7a420..0000000 --- a/build/reports/tests/test/classes/Gradle#20Test#20Run#20#3atest.html +++ /dev/null @@ -1,740 +0,0 @@ - - - - - -Test results - Class Gradle Test Run :test - - - - - -
-

Class Gradle Test Run :test

- -
- - - - - -
-
- - - - - - - -
-
-
1
-

tests

-
-
-
-
1
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
11.823s
-

duration

-
-
-
-
-
-
0%
-

successful

-
-
-
-
- -
-

Failed tests

-
- -

failed to execute tests

- -
org.gradle.internal.exceptions.DefaultMultiCauseException: Could not stop all services.
-	at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:130)
-	at org.gradle.api.internal.tasks.testing.processors.MaxNParallelTestClassProcessor.stop(MaxNParallelTestClassProcessor.java:86)
-	at org.gradle.api.internal.tasks.testing.processors.RunPreviousFailedFirstTestClassProcessor.stop(RunPreviousFailedFirstTestClassProcessor.java:63)
-	at org.gradle.api.internal.tasks.testing.processors.PatternMatchTestClassProcessor.stop(PatternMatchTestClassProcessor.java:48)
-	at org.gradle.api.internal.tasks.testing.processors.TestMainAction$1.run(TestMainAction.java:64)
-	at org.gradle.internal.Factories$1.create(Factories.java:31)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:335)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:318)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.blocking(DefaultWorkerLeaseService.java:224)
-	at org.gradle.api.internal.tasks.testing.processors.TestMainAction.run(TestMainAction.java:61)
-	at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:130)
-	at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:50)
-	at org.gradle.api.tasks.testing.AbstractTestTask.executeTests(AbstractTestTask.java:511)
-	at org.gradle.api.tasks.testing.Test.executeTests(Test.java:714)
-	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
-	at java.base/java.lang.reflect.Method.invoke(Method.java:565)
-	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
-	at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:237)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:220)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:203)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:170)
-	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
-	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
-	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
-	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
-	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
-	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
-	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42)
-	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75)
-	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
-	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)
-	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)
-	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
-	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
-	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)
-	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)
-	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69)
-	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46)
-	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39)
-	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28)
-	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)
-	at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
-	at org.gradle.internal.Either$Right.fold(Either.java:176)
-	at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)
-	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
-	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
-	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)
-	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53)
-	at java.base/java.util.Optional.orElseGet(Optional.java:364)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
-	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)
-	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)
-	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)
-	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)
-	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:64)
-	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35)
-	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:62)
-	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:40)
-	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:76)
-	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:45)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:136)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:66)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:38)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
-	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
-	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
-	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)
-	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)
-	at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:297)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)
-	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)
-	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)
-	at java.base/java.util.Optional.orElseGet(Optional.java:364)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)
-	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)
-	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)
-	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47)
-	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34)
-	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)
-	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:132)
-	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:121)
-	at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41)
-	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
-	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
-	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
-	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
-	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
-	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:45)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:342)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:338)
-	at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:327)
-	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
-	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
-	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
-	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
-	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
-	at java.base/java.lang.Thread.run(Thread.java:1474)
-Cause 1: org.gradle.internal.exceptions.DefaultMultiCauseException: Could not stop all services.
-	at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:130)
-	at org.gradle.internal.actor.internal.DefaultActorFactory$NonBlockingActor.stop(DefaultActorFactory.java:165)
-	at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114)
-	at org.gradle.api.internal.tasks.testing.processors.MaxNParallelTestClassProcessor.stop(MaxNParallelTestClassProcessor.java:86)
-	at org.gradle.api.internal.tasks.testing.processors.RunPreviousFailedFirstTestClassProcessor.stop(RunPreviousFailedFirstTestClassProcessor.java:63)
-	at org.gradle.api.internal.tasks.testing.processors.PatternMatchTestClassProcessor.stop(PatternMatchTestClassProcessor.java:48)
-	at org.gradle.api.internal.tasks.testing.processors.TestMainAction$1.run(TestMainAction.java:64)
-	at org.gradle.internal.Factories$1.create(Factories.java:31)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:335)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:318)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.blocking(DefaultWorkerLeaseService.java:224)
-	at org.gradle.api.internal.tasks.testing.processors.TestMainAction.run(TestMainAction.java:61)
-	at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:130)
-	at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:50)
-	at org.gradle.api.tasks.testing.AbstractTestTask.executeTests(AbstractTestTask.java:511)
-	at org.gradle.api.tasks.testing.Test.executeTests(Test.java:714)
-	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
-	at java.base/java.lang.reflect.Method.invoke(Method.java:565)
-	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
-	at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:237)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:220)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:203)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:170)
-	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
-	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
-	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
-	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
-	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
-	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
-	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42)
-	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75)
-	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
-	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)
-	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)
-	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
-	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
-	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)
-	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)
-	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69)
-	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46)
-	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39)
-	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28)
-	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)
-	at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
-	at org.gradle.internal.Either$Right.fold(Either.java:176)
-	at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)
-	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
-	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
-	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)
-	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53)
-	at java.base/java.util.Optional.orElseGet(Optional.java:364)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
-	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)
-	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)
-	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)
-	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)
-	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:64)
-	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35)
-	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:62)
-	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:40)
-	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:76)
-	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:45)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:136)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:66)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:38)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
-	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
-	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
-	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)
-	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)
-	at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:297)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)
-	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)
-	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)
-	at java.base/java.util.Optional.orElseGet(Optional.java:364)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)
-	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)
-	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)
-	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47)
-	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34)
-	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)
-	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:132)
-	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:121)
-	at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41)
-	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
-	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
-	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
-	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
-	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
-	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:45)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:342)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:338)
-	at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:327)
-	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
-	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
-	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
-	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
-	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
-	at java.base/java.lang.Thread.run(Thread.java:1474)
-Cause 1: org.gradle.internal.UncheckedException: java.lang.InterruptedException
-	at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:69)
-	at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:42)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:92)
-	at org.gradle.internal.concurrent.DefaultExecutorFactory$TrackedManagedExecutor.stop(DefaultExecutorFactory.java:117)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:76)
-	at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114)
-	at org.gradle.internal.actor.internal.DefaultActorFactory$NonBlockingActor.stop(DefaultActorFactory.java:165)
-	at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114)
-	at org.gradle.api.internal.tasks.testing.processors.MaxNParallelTestClassProcessor.stop(MaxNParallelTestClassProcessor.java:86)
-	at org.gradle.api.internal.tasks.testing.processors.RunPreviousFailedFirstTestClassProcessor.stop(RunPreviousFailedFirstTestClassProcessor.java:63)
-	at org.gradle.api.internal.tasks.testing.processors.PatternMatchTestClassProcessor.stop(PatternMatchTestClassProcessor.java:48)
-	at org.gradle.api.internal.tasks.testing.processors.TestMainAction$1.run(TestMainAction.java:64)
-	at org.gradle.internal.Factories$1.create(Factories.java:31)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:335)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:318)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.blocking(DefaultWorkerLeaseService.java:224)
-	at org.gradle.api.internal.tasks.testing.processors.TestMainAction.run(TestMainAction.java:61)
-	at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:130)
-	at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:50)
-	at org.gradle.api.tasks.testing.AbstractTestTask.executeTests(AbstractTestTask.java:511)
-	at org.gradle.api.tasks.testing.Test.executeTests(Test.java:714)
-	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
-	at java.base/java.lang.reflect.Method.invoke(Method.java:565)
-	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
-	at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:237)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:220)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:203)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:170)
-	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
-	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
-	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
-	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
-	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
-	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
-	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42)
-	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75)
-	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
-	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)
-	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)
-	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
-	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
-	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)
-	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)
-	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69)
-	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46)
-	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39)
-	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28)
-	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)
-	at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
-	at org.gradle.internal.Either$Right.fold(Either.java:176)
-	at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)
-	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
-	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
-	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)
-	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53)
-	at java.base/java.util.Optional.orElseGet(Optional.java:364)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
-	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)
-	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)
-	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)
-	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)
-	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:64)
-	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35)
-	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:62)
-	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:40)
-	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:76)
-	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:45)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:136)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:66)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:38)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
-	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
-	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
-	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)
-	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)
-	at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:297)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)
-	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)
-	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)
-	at java.base/java.util.Optional.orElseGet(Optional.java:364)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)
-	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)
-	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)
-	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47)
-	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34)
-	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)
-	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:132)
-	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:121)
-	at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41)
-	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
-	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
-	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
-	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
-	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
-	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:45)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:342)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:338)
-	at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:327)
-	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
-	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
-	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
-	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
-	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
-	at java.base/java.lang.Thread.run(Thread.java:1474)
-Caused by: java.lang.InterruptedException
-	at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1789)
-	at java.base/java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1421)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:86)
-	... 143 more
-Cause 2: org.gradle.internal.dispatch.DispatchException: Could not dispatch message [MethodInvocation method: stop()].
-	at org.gradle.internal.dispatch.ExceptionTrackingFailureHandler.dispatchFailed(ExceptionTrackingFailureHandler.java:35)
-	at org.gradle.internal.dispatch.FailureHandlingDispatch.dispatch(FailureHandlingDispatch.java:32)
-	at org.gradle.internal.dispatch.AsyncDispatch.dispatchMessages(AsyncDispatch.java:87)
-	at org.gradle.internal.dispatch.AsyncDispatch.access$000(AsyncDispatch.java:36)
-	at org.gradle.internal.dispatch.AsyncDispatch$1.run(AsyncDispatch.java:71)
-	at org.gradle.internal.concurrent.InterruptibleRunnable.run(InterruptibleRunnable.java:42)
-	at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84)
-	at org.gradle.internal.operations.CurrentBuildOperationPreservingRunnable.run(CurrentBuildOperationPreservingRunnable.java:51)
-	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
-	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
-	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
-	at java.base/java.lang.Thread.run(Thread.java:1474)
-Caused by: org.gradle.internal.exceptions.DefaultMultiCauseException: Could not stop all services.
-	at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:130)
-	at org.gradle.process.internal.worker.DefaultWorkerProcess.cleanup(DefaultWorkerProcess.java:256)
-	at org.gradle.process.internal.worker.DefaultWorkerProcess.waitForStop(DefaultWorkerProcess.java:232)
-	at org.gradle.process.internal.worker.DefaultWorkerProcessBuilder$MemoryRequestingWorkerProcess.waitForStop(DefaultWorkerProcessBuilder.java:298)
-	at org.gradle.api.internal.tasks.testing.worker.ForkingTestClassProcessor.stop(ForkingTestClassProcessor.java:154)
-	at org.gradle.api.internal.tasks.testing.processors.RestartEveryNTestClassProcessor.endBatch(RestartEveryNTestClassProcessor.java:77)
-	at org.gradle.api.internal.tasks.testing.processors.RestartEveryNTestClassProcessor.stop(RestartEveryNTestClassProcessor.java:62)
-	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
-	at java.base/java.lang.reflect.Method.invoke(Method.java:565)
-	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
-	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
-	at org.gradle.internal.dispatch.FailureHandlingDispatch.dispatch(FailureHandlingDispatch.java:30)
-	... 11 more
-Caused by: org.gradle.internal.UncheckedException: java.lang.InterruptedException
-	at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:69)
-	at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:42)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:92)
-	at org.gradle.internal.concurrent.DefaultExecutorFactory$TrackedManagedExecutor.stop(DefaultExecutorFactory.java:117)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:76)
-	at org.gradle.internal.remote.internal.hub.MessageHub.stop(MessageHub.java:225)
-	at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114)
-	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection.stop(MessageHubBackedObjectConnection.java:150)
-	at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114)
-	... 22 more
-Caused by: java.lang.InterruptedException
-	at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1789)
-	at java.base/java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1421)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:86)
-	... 28 more
-Cause 2: org.gradle.internal.UncheckedException: java.lang.InterruptedException
-	at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:69)
-	at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:42)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:92)
-	at org.gradle.internal.concurrent.DefaultExecutorFactory$TrackedManagedExecutor.stop(DefaultExecutorFactory.java:117)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:76)
-	at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114)
-	at org.gradle.internal.actor.internal.DefaultActorFactory$NonBlockingActor.stop(DefaultActorFactory.java:165)
-	at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114)
-	at org.gradle.api.internal.tasks.testing.processors.MaxNParallelTestClassProcessor.stop(MaxNParallelTestClassProcessor.java:86)
-	at org.gradle.api.internal.tasks.testing.processors.RunPreviousFailedFirstTestClassProcessor.stop(RunPreviousFailedFirstTestClassProcessor.java:63)
-	at org.gradle.api.internal.tasks.testing.processors.PatternMatchTestClassProcessor.stop(PatternMatchTestClassProcessor.java:48)
-	at org.gradle.api.internal.tasks.testing.processors.TestMainAction$1.run(TestMainAction.java:64)
-	at org.gradle.internal.Factories$1.create(Factories.java:31)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:335)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:318)
-	at org.gradle.internal.work.DefaultWorkerLeaseService.blocking(DefaultWorkerLeaseService.java:224)
-	at org.gradle.api.internal.tasks.testing.processors.TestMainAction.run(TestMainAction.java:61)
-	at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:130)
-	at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:50)
-	at org.gradle.api.tasks.testing.AbstractTestTask.executeTests(AbstractTestTask.java:511)
-	at org.gradle.api.tasks.testing.Test.executeTests(Test.java:714)
-	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
-	at java.base/java.lang.reflect.Method.invoke(Method.java:565)
-	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
-	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
-	at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:237)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:220)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:203)
-	at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:170)
-	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
-	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
-	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
-	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
-	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
-	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
-	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42)
-	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75)
-	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
-	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)
-	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)
-	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
-	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
-	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)
-	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)
-	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69)
-	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46)
-	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39)
-	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28)
-	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)
-	at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
-	at org.gradle.internal.Either$Right.fold(Either.java:176)
-	at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)
-	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
-	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
-	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)
-	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53)
-	at java.base/java.util.Optional.orElseGet(Optional.java:364)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53)
-	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
-	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)
-	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)
-	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)
-	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)
-	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:64)
-	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35)
-	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:62)
-	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:40)
-	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:76)
-	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:45)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:136)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:66)
-	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:38)
-	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
-	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
-	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
-	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)
-	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)
-	at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:297)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)
-	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)
-	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)
-	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)
-	at java.base/java.util.Optional.orElseGet(Optional.java:364)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)
-	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)
-	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)
-	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)
-	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47)
-	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34)
-	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)
-	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:132)
-	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:121)
-	at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41)
-	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
-	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
-	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
-	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
-	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
-	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
-	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
-	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:45)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:342)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:338)
-	at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
-	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:327)
-	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
-	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
-	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
-	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
-	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
-	at java.base/java.lang.Thread.run(Thread.java:1474)
-Caused by: java.lang.InterruptedException
-	at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1789)
-	at java.base/java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1421)
-	at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:86)
-	... 143 more
-
- -
-
-
-
-

Tests

- - - - - - - - - - - - - -
TestDurationResult
failed to execute tests11.823sfailed
-
-
- -
- - diff --git a/build/reports/tests/test/classes/org.example.dinner.DinnerTest.html b/build/reports/tests/test/classes/org.example.dinner.DinnerTest.html deleted file mode 100644 index a7643b3..0000000 --- a/build/reports/tests/test/classes/org.example.dinner.DinnerTest.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - -Test results - DinnerTest - - - - - -
-

DinnerTest

- -
- - - - - -
-
- - - - - - - -
-
-
3
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
7.355s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Tests

- - - - - - - - - - - - - - - - - - - - - - - -
TestDurationResult
serve_withEnoughFood_doesNotThrow()5.936spassed
serve_withExactFood_doesNotThrow()1.410spassed
serve_withZeroFood_doesNotThrow()0.009spassed
-
-
-

Standard output

- -
Dinner is over!
-Food amount is 0
-Portions eaten: 1, Count: 2
-Portions eaten: 3, Count: 1
---------------------------------------------------------------------
-Dinner is over!
-Food amount is 0
-Portions eaten: 1, Count: 2
---------------------------------------------------------------------
-
- -
-
-
- -
- - diff --git a/build/reports/tests/test/classes/org.example.dinner.DinnerVerifierTest.html b/build/reports/tests/test/classes/org.example.dinner.DinnerVerifierTest.html deleted file mode 100644 index 7f1a076..0000000 --- a/build/reports/tests/test/classes/org.example.dinner.DinnerVerifierTest.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - -Test results - DinnerVerifierTest - - - - - -
-

DinnerVerifierTest

- -
- - - - - -
-
- - - - - - - -
-
-
4
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
0.006s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Tests

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TestDurationResult
execute_withInsufficientFood_throws()0.001spassed
execute_withNegativeFood_throws()0.002spassed
execute_withNegativeProgrammers_throws()0.001spassed
execute_withValidValues_doesNotThrow()0.002spassed
-
-
- -
- - diff --git a/build/reports/tests/test/classes/org.example.dinner.ResourceGeneratorTest.html b/build/reports/tests/test/classes/org.example.dinner.ResourceGeneratorTest.html deleted file mode 100644 index bbb9d41..0000000 --- a/build/reports/tests/test/classes/org.example.dinner.ResourceGeneratorTest.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - -Test results - ResourceGeneratorTest - - - - - -
-

ResourceGeneratorTest

- -
- - - - - -
-
- - - - - - - -
-
-
1
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
0.001s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Tests

- - - - - - - - - - - - - -
TestDurationResult
test_generate_values_not_null()0.001spassed
-
-
- -
- - diff --git a/build/reports/tests/test/classes/org.example.fork.ForkTest.html b/build/reports/tests/test/classes/org.example.fork.ForkTest.html deleted file mode 100644 index ddcd75d..0000000 --- a/build/reports/tests/test/classes/org.example.fork.ForkTest.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - -Test results - ForkTest - - - - - -
-

ForkTest

- -
- - - - - -
-
- - - - - - - -
-
-
1
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
0s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Tests

- - - - - - - - - - - - - -
TestDurationResult
testConstructorAndGetter()0spassed
-
-
- -
- - diff --git a/build/reports/tests/test/classes/org.example.programmer.ProgrammerTest.html b/build/reports/tests/test/classes/org.example.programmer.ProgrammerTest.html deleted file mode 100644 index 3ea20d5..0000000 --- a/build/reports/tests/test/classes/org.example.programmer.ProgrammerTest.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - -Test results - ProgrammerTest - - - - - -
-

ProgrammerTest

- -
- - - - - -
-
- - - - - - - -
-
-
18
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
30.068s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Tests

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TestDurationResult
testConcurrentProgrammers()1.319spassed
testFastSwitching()7.175spassed
testForksConsistencyAfterConcurrentEating()1.181spassed
testForksReturned()2.591spassed
testGetProgId()0.001spassed
testIncrementPortions()2.353spassed
testManyProgrammers()1.199spassed
testMissingForks()0.001spassed
testMoreProgrammersThanForks()1.302spassed
testMultipleProgrammers()1.102spassed
testNegativeMeals()0.001spassed
testNoDeadlock()1.367spassed
testNoForkDoubleOwnership()1.223spassed
testProgrammerEat()2.685spassed
testProgrammerEatMultiplePortions()2.794spassed
testRepeatedEating()2.357spassed
testTwoProgrammersGrabForks()1.415spassed
testZeroMeals()0.002spassed
-
-
- -
- - diff --git a/build/reports/tests/test/classes/org.example.utils.IndexFetcherTest.html b/build/reports/tests/test/classes/org.example.utils.IndexFetcherTest.html deleted file mode 100644 index 1d70cfd..0000000 --- a/build/reports/tests/test/classes/org.example.utils.IndexFetcherTest.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - -Test results - IndexFetcherTest - - - - - -
-

IndexFetcherTest

- -
- - - - - -
-
- - - - - - - -
-
-
4
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
0.002s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Tests

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TestDurationResult
fetch_withEmptyMap_returnsZero()0.001spassed
fetch_withIndexTooLarge_returnsFirstIndex()0spassed
fetch_withNegativeIndex_returnsLastIndex()0.001spassed
fetch_withValidIndex_returnsSameIndex()0spassed
-
-
- -
- - diff --git a/build/reports/tests/test/css/base-style.css b/build/reports/tests/test/css/base-style.css deleted file mode 100644 index 3ae6c58..0000000 --- a/build/reports/tests/test/css/base-style.css +++ /dev/null @@ -1,174 +0,0 @@ - -body { - margin: 0; - padding: 0; - font-family: sans-serif; - font-size: 12pt; -} - -body, a, a:visited { - color: #303030; -} - -#content { - padding: 30px 50px; -} - -#content h1 { - font-size: 160%; - margin-bottom: 10px; -} - -#footer { - margin-top: 100px; - font-size: 80%; - white-space: nowrap; -} - -#footer, #footer a { - color: #a0a0a0; -} - -#line-wrapping-toggle { - vertical-align: middle; -} - -#label-for-line-wrapping-toggle { - vertical-align: middle; -} - -ul { - margin-left: 0; -} - -h1, h2, h3 { - white-space: nowrap; -} - -h2 { - font-size: 120%; -} - -.tab-container .tab-container { - margin-left: 8px; -} - -ul.tabLinks { - padding: 0; - margin-bottom: 0; - overflow: auto; - min-width: 800px; - width: auto; - border-bottom: solid 1px #aaa; -} - -ul.tabLinks li { - float: left; - height: 100%; - list-style: none; - padding: 5px 10px; - border-radius: 7px 7px 0 0; - border: solid 1px transparent; - border-bottom: none; - margin-right: 6px; - background-color: #f0f0f0; -} - -ul.tabLinks li.deselected > a { - color: #6d6d6d; -} - -ul.tabLinks li:hover { - background-color: #fafafa; -} - -ul.tabLinks li.selected { - background-color: #c5f0f5; - border-color: #aaa; -} - -ul.tabLinks a { - font-size: 120%; - display: block; - outline: none; - text-decoration: none; - margin: 0; - padding: 0; -} - -ul.tabLinks li h2 { - margin: 0; - padding: 0; -} - -div.tab { -} - -div.selected { - display: block; -} - -div.deselected { - display: none; -} - -div.tab table { - min-width: 350px; - width: auto; - border-collapse: collapse; -} - -div.tab th, div.tab table { - border-bottom: solid 1px #d0d0d0; -} - -div.tab th { - text-align: left; - white-space: nowrap; - padding-left: 6em; -} - -div.tab th:first-child { - padding-left: 0; -} - -div.tab td { - white-space: nowrap; - padding-left: 6em; - padding-top: 5px; - padding-bottom: 5px; -} - -div.tab td:first-child { - padding-left: 0; -} - -div.tab td.numeric, div.tab th.numeric { - text-align: right; -} - -span.code { - display: inline-block; - margin-top: 0; - margin-bottom: 1em; -} - -span.code pre { - font-size: 11pt; - padding: 10px; - margin: 0; - background-color: #f7f7f7; - border: solid 1px #d0d0d0; - min-width: 700px; - width: auto; -} - -span.wrapped pre { - word-wrap: break-word; - white-space: pre-wrap; - word-break: break-all; -} - -label.hidden { - display: none; -} diff --git a/build/reports/tests/test/css/style.css b/build/reports/tests/test/css/style.css deleted file mode 100644 index ccb271c..0000000 --- a/build/reports/tests/test/css/style.css +++ /dev/null @@ -1,97 +0,0 @@ - -#summary { - margin-top: 30px; - margin-bottom: 40px; -} - -#summary table { - border-collapse: collapse; -} - -#summary td { - vertical-align: top; -} - -.breadcrumbs, .breadcrumbs a { - color: #606060; -} - -.infoBox { - width: 110px; - padding-top: 15px; - padding-bottom: 15px; - text-align: center; -} - -.infoBox p { - margin: 0; -} - -.counter, .percent { - font-size: 120%; - font-weight: bold; - margin-bottom: 8px; -} - -#duration { - width: 125px; -} - -#successRate, .summaryGroup { - border: solid 2px #d0d0d0; - -moz-border-radius: 10px; - border-radius: 10px; -} - -#successRate { - width: 140px; - margin-left: 35px; -} - -#successRate .percent { - font-size: 180%; -} - -.success, .success a { - color: #008000; -} - -div.success, #successRate.success { - background-color: #bbd9bb; - border-color: #008000; -} - -.failures, .failures a { - color: #b60808; -} - -.skipped, .skipped a { - color: #c09853; -} - -div.failures, #successRate.failures { - background-color: #ecdada; - border-color: #b60808; -} - -ul.linkList { - padding-left: 0; -} - -ul.linkList li { - list-style: none; - margin-bottom: 5px; -} - -.code { - position: relative; -} - -.clipboard-copy-btn { - position: absolute; - top: 8px; - right: 8px; - padding: 4px 8px; - font-size: 0.9em; - cursor: pointer; -} diff --git a/build/reports/tests/test/index.html b/build/reports/tests/test/index.html deleted file mode 100644 index e58e7c5..0000000 --- a/build/reports/tests/test/index.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - -Test results - Test Summary - - - - - -
-

Test Summary

-
- - - - - -
-
- - - - - - - -
-
-
31
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
37.432s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Packages

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PackageTestsFailuresIgnoredDurationSuccess rate
-org.example.dinner -8007.362s100%
-org.example.fork -1000s100%
-org.example.programmer -180030.068s100%
-org.example.utils -4000.002s100%
-
-
-

Classes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ClassTestsFailuresIgnoredDurationSuccess rate
-org.example.dinner.DinnerTest -3007.355s100%
-org.example.dinner.DinnerVerifierTest -4000.006s100%
-org.example.dinner.ResourceGeneratorTest -1000.001s100%
-org.example.fork.ForkTest -1000s100%
-org.example.programmer.ProgrammerTest -180030.068s100%
-org.example.utils.IndexFetcherTest -4000.002s100%
-
-
- -
- - diff --git a/build/reports/tests/test/js/report.js b/build/reports/tests/test/js/report.js deleted file mode 100644 index e658217..0000000 --- a/build/reports/tests/test/js/report.js +++ /dev/null @@ -1,243 +0,0 @@ -(function (window, document) { - "use strict"; - - function changeElementClass(element, classValue) { - if (element.getAttribute("className")) { - element.setAttribute("className", classValue); - } else { - element.setAttribute("class", classValue); - } - } - - function getClassAttribute(element) { - if (element.getAttribute("className")) { - return element.getAttribute("className"); - } else { - return element.getAttribute("class"); - } - } - - function addClass(element, classValue) { - changeElementClass(element, getClassAttribute(element) + " " + classValue); - } - - function removeClass(element, classValue) { - changeElementClass(element, getClassAttribute(element).replace(classValue, "")); - } - - function getCheckBox() { - return document.getElementById("line-wrapping-toggle"); - } - - function getLabelForCheckBox() { - return document.getElementById("label-for-line-wrapping-toggle"); - } - - function findCodeBlocks() { - const codeBlocks = []; - const tabContainers = getTabContainers(); - for (let i = 0; i < tabContainers.length; i++) { - const spans = tabContainers[i].getElementsByTagName("span"); - for (let i = 0; i < spans.length; ++i) { - if (spans[i].className.indexOf("code") >= 0) { - codeBlocks.push(spans[i]); - } - } - } - return codeBlocks; - } - - function forAllCodeBlocks(operation) { - const codeBlocks = findCodeBlocks(); - - for (let i = 0; i < codeBlocks.length; ++i) { - operation(codeBlocks[i], "wrapped"); - } - } - - function toggleLineWrapping() { - const checkBox = getCheckBox(); - - if (checkBox.checked) { - forAllCodeBlocks(addClass); - } else { - forAllCodeBlocks(removeClass); - } - } - - function initClipboardCopyButton() { - document.querySelectorAll(".clipboard-copy-btn").forEach((button) => { - const copyElementId = button.getAttribute("data-copy-element-id"); - const elementWithCodeToSelect = document.getElementById(copyElementId); - - button.addEventListener("click", () => { - const text = elementWithCodeToSelect.innerText.trim(); - navigator.clipboard - .writeText(text) - .then(() => { - button.textContent = "Copied!"; - setTimeout(() => { - button.textContent = "Copy"; - }, 1500); - }) - .catch((err) => { - alert("Failed to copy to the clipboard: '" + err.message + "'. Check JavaScript console for more details.") - console.warn("Failed to copy to the clipboard", err); - }); - }); - }); - } - - function initControls() { - if (findCodeBlocks().length > 0) { - const checkBox = getCheckBox(); - const label = getLabelForCheckBox(); - - checkBox.onclick = toggleLineWrapping; - checkBox.checked = false; - - removeClass(label, "hidden"); - } - - initClipboardCopyButton() - } - - class TabManager { - baseId; - tabs; - titles; - headers; - - constructor(baseId, tabs, titles, headers) { - this.baseId = baseId; - this.tabs = tabs; - this.titles = titles; - this.headers = headers; - } - - select(i) { - this.deselectAll(); - - changeElementClass(this.tabs[i], "tab selected"); - changeElementClass(this.headers[i], "selected"); - - while (this.headers[i].firstChild) { - this.headers[i].removeChild(this.headers[i].firstChild); - } - - const a = document.createElement("a"); - - a.appendChild(document.createTextNode(this.titles[i])); - this.headers[i].appendChild(a); - } - - deselectAll() { - for (let i = 0; i < this.tabs.length; i++) { - changeElementClass(this.tabs[i], "tab deselected"); - changeElementClass(this.headers[i], "deselected"); - - while (this.headers[i].firstChild) { - this.headers[i].removeChild(this.headers[i].firstChild); - } - - const a = document.createElement("a"); - - const id = this.baseId + "-tab" + i; - a.setAttribute("id", id); - a.setAttribute("href", "#tab" + i); - a.onclick = () => { - this.select(i); - return false; - }; - a.appendChild(document.createTextNode(this.titles[i])); - - this.headers[i].appendChild(a); - } - } - } - - function getTabContainers() { - const tabContainers = Array.from(document.getElementsByClassName("tab-container")); - - // Used by existing TabbedPageRenderer users, which have not adjusted to use TabsRenderer yet. - const legacyContainer = document.getElementById("tabs"); - if (legacyContainer) { - tabContainers.push(legacyContainer); - } - - return tabContainers; - } - - function initTabs() { - let tabGroups = 0; - - function createTab(num, container) { - const tabElems = findTabs(container); - const tabManager = new TabManager("tabs" + num, tabElems, findTitles(tabElems), findHeaders(container)); - tabManager.select(0); - } - - const tabContainers = getTabContainers(); - - for (let i = 0; i < tabContainers.length; i++) { - createTab(tabGroups, tabContainers[i]); - tabGroups++; - } - - return true; - } - - function findTabs(container) { - return findChildElements(container, "DIV", "tab"); - } - - function findHeaders(container) { - const owner = findChildElements(container, "UL", "tabLinks"); - return findChildElements(owner[0], "LI", null); - } - - function findTitles(tabs) { - const titles = []; - - for (let i = 0; i < tabs.length; i++) { - const tab = tabs[i]; - const header = findChildElements(tab, "H2", null)[0]; - - header.parentNode.removeChild(header); - - if (header.innerText) { - titles.push(header.innerText); - } else { - titles.push(header.textContent); - } - } - - return titles; - } - - function findChildElements(container, name, targetClass) { - const elements = []; - const children = container.childNodes; - - for (let i = 0; i < children.length; i++) { - const child = children.item(i); - - if (child.nodeType === 1 && child.nodeName === name) { - if (targetClass && child.className.indexOf(targetClass) < 0) { - continue; - } - - elements.push(child); - } - } - - return elements; - } - - // Entry point. - - window.onload = function() { - initTabs(); - initControls(); - }; -} (window, window.document)); diff --git a/build/reports/tests/test/packages/default-package.html b/build/reports/tests/test/packages/default-package.html deleted file mode 100644 index 9ca97e8..0000000 --- a/build/reports/tests/test/packages/default-package.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - -Test results - Default package - - - - - -
-

Default package

- -
- - - - - -
-
- - - - - - - -
-
-
1
-

tests

-
-
-
-
1
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
11.823s
-

duration

-
-
-
-
-
-
0%
-

successful

-
-
-
-
- - -
-

Classes

- - - - - - - - - - - - - - - - - - - -
ClassTestsFailuresIgnoredDurationSuccess rate
-Gradle Test Run :test -11011.823s0%
-
-
- -
- - diff --git a/build/reports/tests/test/packages/org.example.dinner.html b/build/reports/tests/test/packages/org.example.dinner.html deleted file mode 100644 index f04f3cc..0000000 --- a/build/reports/tests/test/packages/org.example.dinner.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - -Test results - Package org.example.dinner - - - - - -
-

Package org.example.dinner

- -
- - - - - -
-
- - - - - - - -
-
-
8
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
7.362s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Classes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ClassTestsFailuresIgnoredDurationSuccess rate
-DinnerTest -3007.355s100%
-DinnerVerifierTest -4000.006s100%
-ResourceGeneratorTest -1000.001s100%
-
-
- -
- - diff --git a/build/reports/tests/test/packages/org.example.fork.html b/build/reports/tests/test/packages/org.example.fork.html deleted file mode 100644 index c491ddb..0000000 --- a/build/reports/tests/test/packages/org.example.fork.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - -Test results - Package org.example.fork - - - - - -
-

Package org.example.fork

- -
- - - - - -
-
- - - - - - - -
-
-
1
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
0s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Classes

- - - - - - - - - - - - - - - - - - - -
ClassTestsFailuresIgnoredDurationSuccess rate
-ForkTest -1000s100%
-
-
- -
- - diff --git a/build/reports/tests/test/packages/org.example.programmer.html b/build/reports/tests/test/packages/org.example.programmer.html deleted file mode 100644 index ab68c77..0000000 --- a/build/reports/tests/test/packages/org.example.programmer.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - -Test results - Package org.example.programmer - - - - - -
-

Package org.example.programmer

- -
- - - - - -
-
- - - - - - - -
-
-
18
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
30.068s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Classes

- - - - - - - - - - - - - - - - - - - -
ClassTestsFailuresIgnoredDurationSuccess rate
-ProgrammerTest -180030.068s100%
-
-
- -
- - diff --git a/build/reports/tests/test/packages/org.example.utils.html b/build/reports/tests/test/packages/org.example.utils.html deleted file mode 100644 index 434938f..0000000 --- a/build/reports/tests/test/packages/org.example.utils.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - -Test results - Package org.example.utils - - - - - -
-

Package org.example.utils

- -
- - - - - -
-
- - - - - - - -
-
-
4
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
0.002s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Classes

- - - - - - - - - - - - - - - - - - - -
ClassTestsFailuresIgnoredDurationSuccess rate
-IndexFetcherTest -4000.002s100%
-
-
- -
- - diff --git a/build/test-results/test/TEST-Gradle#20Test#20Run#20#3atest.xml b/build/test-results/test/TEST-Gradle#20Test#20Run#20#3atest.xml deleted file mode 100644 index 9a34bc9..0000000 --- a/build/test-results/test/TEST-Gradle#20Test#20Run#20#3atest.xml +++ /dev/null @@ -1,639 +0,0 @@ - - - - - org.gradle.internal.exceptions.DefaultMultiCauseException: Could not stop all services. - at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:130) - at org.gradle.api.internal.tasks.testing.processors.MaxNParallelTestClassProcessor.stop(MaxNParallelTestClassProcessor.java:86) - at org.gradle.api.internal.tasks.testing.processors.RunPreviousFailedFirstTestClassProcessor.stop(RunPreviousFailedFirstTestClassProcessor.java:63) - at org.gradle.api.internal.tasks.testing.processors.PatternMatchTestClassProcessor.stop(PatternMatchTestClassProcessor.java:48) - at org.gradle.api.internal.tasks.testing.processors.TestMainAction$1.run(TestMainAction.java:64) - at org.gradle.internal.Factories$1.create(Factories.java:31) - at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:335) - at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:318) - at org.gradle.internal.work.DefaultWorkerLeaseService.blocking(DefaultWorkerLeaseService.java:224) - at org.gradle.api.internal.tasks.testing.processors.TestMainAction.run(TestMainAction.java:61) - at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:130) - at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:50) - at org.gradle.api.tasks.testing.AbstractTestTask.executeTests(AbstractTestTask.java:511) - at org.gradle.api.tasks.testing.Test.executeTests(Test.java:714) - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) - at java.base/java.lang.reflect.Method.invoke(Method.java:565) - at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29) - at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252) - at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) - at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:237) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:220) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:203) - at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:170) - at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105) - at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44) - at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59) - at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) - at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56) - at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44) - at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42) - at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75) - at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55) - at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50) - at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28) - at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68) - at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38) - at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61) - at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26) - at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69) - at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46) - at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39) - at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28) - at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189) - at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75) - at org.gradle.internal.Either$Right.fold(Either.java:176) - at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62) - at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73) - at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48) - at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46) - at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35) - at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75) - at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53) - at java.base/java.util.Optional.orElseGet(Optional.java:364) - at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53) - at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) - at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49) - at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27) - at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71) - at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39) - at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:64) - at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35) - at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:62) - at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:40) - at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:76) - at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:45) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:136) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:66) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:38) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38) - at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36) - at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23) - at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75) - at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35) - at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:297) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22) - at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40) - at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67) - at java.base/java.util.Optional.orElseGet(Optional.java:364) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39) - at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46) - at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34) - at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47) - at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34) - at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64) - at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:132) - at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:121) - at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41) - at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) - at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) - at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) - at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) - at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) - at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:45) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:342) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:338) - at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:327) - at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) - at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) - at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) - at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47) - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090) - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614) - at java.base/java.lang.Thread.run(Thread.java:1474) -Cause 1: org.gradle.internal.exceptions.DefaultMultiCauseException: Could not stop all services. - at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:130) - at org.gradle.internal.actor.internal.DefaultActorFactory$NonBlockingActor.stop(DefaultActorFactory.java:165) - at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114) - at org.gradle.api.internal.tasks.testing.processors.MaxNParallelTestClassProcessor.stop(MaxNParallelTestClassProcessor.java:86) - at org.gradle.api.internal.tasks.testing.processors.RunPreviousFailedFirstTestClassProcessor.stop(RunPreviousFailedFirstTestClassProcessor.java:63) - at org.gradle.api.internal.tasks.testing.processors.PatternMatchTestClassProcessor.stop(PatternMatchTestClassProcessor.java:48) - at org.gradle.api.internal.tasks.testing.processors.TestMainAction$1.run(TestMainAction.java:64) - at org.gradle.internal.Factories$1.create(Factories.java:31) - at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:335) - at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:318) - at org.gradle.internal.work.DefaultWorkerLeaseService.blocking(DefaultWorkerLeaseService.java:224) - at org.gradle.api.internal.tasks.testing.processors.TestMainAction.run(TestMainAction.java:61) - at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:130) - at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:50) - at org.gradle.api.tasks.testing.AbstractTestTask.executeTests(AbstractTestTask.java:511) - at org.gradle.api.tasks.testing.Test.executeTests(Test.java:714) - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) - at java.base/java.lang.reflect.Method.invoke(Method.java:565) - at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29) - at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252) - at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) - at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:237) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:220) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:203) - at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:170) - at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105) - at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44) - at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59) - at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) - at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56) - at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44) - at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42) - at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75) - at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55) - at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50) - at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28) - at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68) - at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38) - at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61) - at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26) - at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69) - at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46) - at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39) - at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28) - at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189) - at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75) - at org.gradle.internal.Either$Right.fold(Either.java:176) - at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62) - at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73) - at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48) - at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46) - at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35) - at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75) - at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53) - at java.base/java.util.Optional.orElseGet(Optional.java:364) - at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53) - at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) - at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49) - at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27) - at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71) - at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39) - at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:64) - at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35) - at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:62) - at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:40) - at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:76) - at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:45) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:136) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:66) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:38) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38) - at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36) - at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23) - at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75) - at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35) - at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:297) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22) - at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40) - at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67) - at java.base/java.util.Optional.orElseGet(Optional.java:364) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39) - at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46) - at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34) - at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47) - at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34) - at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64) - at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:132) - at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:121) - at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41) - at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) - at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) - at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) - at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) - at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) - at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:45) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:342) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:338) - at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:327) - at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) - at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) - at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) - at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47) - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090) - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614) - at java.base/java.lang.Thread.run(Thread.java:1474) -Cause 1: org.gradle.internal.UncheckedException: java.lang.InterruptedException - at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:69) - at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:42) - at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:92) - at org.gradle.internal.concurrent.DefaultExecutorFactory$TrackedManagedExecutor.stop(DefaultExecutorFactory.java:117) - at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:76) - at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114) - at org.gradle.internal.actor.internal.DefaultActorFactory$NonBlockingActor.stop(DefaultActorFactory.java:165) - at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114) - at org.gradle.api.internal.tasks.testing.processors.MaxNParallelTestClassProcessor.stop(MaxNParallelTestClassProcessor.java:86) - at org.gradle.api.internal.tasks.testing.processors.RunPreviousFailedFirstTestClassProcessor.stop(RunPreviousFailedFirstTestClassProcessor.java:63) - at org.gradle.api.internal.tasks.testing.processors.PatternMatchTestClassProcessor.stop(PatternMatchTestClassProcessor.java:48) - at org.gradle.api.internal.tasks.testing.processors.TestMainAction$1.run(TestMainAction.java:64) - at org.gradle.internal.Factories$1.create(Factories.java:31) - at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:335) - at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:318) - at org.gradle.internal.work.DefaultWorkerLeaseService.blocking(DefaultWorkerLeaseService.java:224) - at org.gradle.api.internal.tasks.testing.processors.TestMainAction.run(TestMainAction.java:61) - at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:130) - at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:50) - at org.gradle.api.tasks.testing.AbstractTestTask.executeTests(AbstractTestTask.java:511) - at org.gradle.api.tasks.testing.Test.executeTests(Test.java:714) - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) - at java.base/java.lang.reflect.Method.invoke(Method.java:565) - at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29) - at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252) - at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) - at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:237) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:220) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:203) - at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:170) - at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105) - at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44) - at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59) - at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) - at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56) - at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44) - at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42) - at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75) - at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55) - at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50) - at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28) - at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68) - at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38) - at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61) - at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26) - at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69) - at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46) - at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39) - at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28) - at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189) - at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75) - at org.gradle.internal.Either$Right.fold(Either.java:176) - at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62) - at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73) - at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48) - at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46) - at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35) - at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75) - at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53) - at java.base/java.util.Optional.orElseGet(Optional.java:364) - at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53) - at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) - at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49) - at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27) - at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71) - at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39) - at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:64) - at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35) - at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:62) - at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:40) - at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:76) - at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:45) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:136) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:66) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:38) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38) - at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36) - at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23) - at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75) - at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35) - at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:297) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22) - at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40) - at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67) - at java.base/java.util.Optional.orElseGet(Optional.java:364) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39) - at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46) - at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34) - at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47) - at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34) - at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64) - at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:132) - at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:121) - at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41) - at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) - at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) - at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) - at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) - at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) - at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:45) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:342) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:338) - at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:327) - at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) - at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) - at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) - at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47) - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090) - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614) - at java.base/java.lang.Thread.run(Thread.java:1474) -Caused by: java.lang.InterruptedException - at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1789) - at java.base/java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1421) - at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:86) - ... 143 more -Cause 2: org.gradle.internal.dispatch.DispatchException: Could not dispatch message [MethodInvocation method: stop()]. - at org.gradle.internal.dispatch.ExceptionTrackingFailureHandler.dispatchFailed(ExceptionTrackingFailureHandler.java:35) - at org.gradle.internal.dispatch.FailureHandlingDispatch.dispatch(FailureHandlingDispatch.java:32) - at org.gradle.internal.dispatch.AsyncDispatch.dispatchMessages(AsyncDispatch.java:87) - at org.gradle.internal.dispatch.AsyncDispatch.access$000(AsyncDispatch.java:36) - at org.gradle.internal.dispatch.AsyncDispatch$1.run(AsyncDispatch.java:71) - at org.gradle.internal.concurrent.InterruptibleRunnable.run(InterruptibleRunnable.java:42) - at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84) - at org.gradle.internal.operations.CurrentBuildOperationPreservingRunnable.run(CurrentBuildOperationPreservingRunnable.java:51) - at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) - at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47) - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090) - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614) - at java.base/java.lang.Thread.run(Thread.java:1474) -Caused by: org.gradle.internal.exceptions.DefaultMultiCauseException: Could not stop all services. - at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:130) - at org.gradle.process.internal.worker.DefaultWorkerProcess.cleanup(DefaultWorkerProcess.java:256) - at org.gradle.process.internal.worker.DefaultWorkerProcess.waitForStop(DefaultWorkerProcess.java:232) - at org.gradle.process.internal.worker.DefaultWorkerProcessBuilder$MemoryRequestingWorkerProcess.waitForStop(DefaultWorkerProcessBuilder.java:298) - at org.gradle.api.internal.tasks.testing.worker.ForkingTestClassProcessor.stop(ForkingTestClassProcessor.java:154) - at org.gradle.api.internal.tasks.testing.processors.RestartEveryNTestClassProcessor.endBatch(RestartEveryNTestClassProcessor.java:77) - at org.gradle.api.internal.tasks.testing.processors.RestartEveryNTestClassProcessor.stop(RestartEveryNTestClassProcessor.java:62) - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) - at java.base/java.lang.reflect.Method.invoke(Method.java:565) - at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) - at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) - at org.gradle.internal.dispatch.FailureHandlingDispatch.dispatch(FailureHandlingDispatch.java:30) - ... 11 more -Caused by: org.gradle.internal.UncheckedException: java.lang.InterruptedException - at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:69) - at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:42) - at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:92) - at org.gradle.internal.concurrent.DefaultExecutorFactory$TrackedManagedExecutor.stop(DefaultExecutorFactory.java:117) - at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:76) - at org.gradle.internal.remote.internal.hub.MessageHub.stop(MessageHub.java:225) - at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114) - at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection.stop(MessageHubBackedObjectConnection.java:150) - at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114) - ... 22 more -Caused by: java.lang.InterruptedException - at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1789) - at java.base/java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1421) - at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:86) - ... 28 more -Cause 2: org.gradle.internal.UncheckedException: java.lang.InterruptedException - at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:69) - at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:42) - at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:92) - at org.gradle.internal.concurrent.DefaultExecutorFactory$TrackedManagedExecutor.stop(DefaultExecutorFactory.java:117) - at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:76) - at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114) - at org.gradle.internal.actor.internal.DefaultActorFactory$NonBlockingActor.stop(DefaultActorFactory.java:165) - at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:114) - at org.gradle.api.internal.tasks.testing.processors.MaxNParallelTestClassProcessor.stop(MaxNParallelTestClassProcessor.java:86) - at org.gradle.api.internal.tasks.testing.processors.RunPreviousFailedFirstTestClassProcessor.stop(RunPreviousFailedFirstTestClassProcessor.java:63) - at org.gradle.api.internal.tasks.testing.processors.PatternMatchTestClassProcessor.stop(PatternMatchTestClassProcessor.java:48) - at org.gradle.api.internal.tasks.testing.processors.TestMainAction$1.run(TestMainAction.java:64) - at org.gradle.internal.Factories$1.create(Factories.java:31) - at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:335) - at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:318) - at org.gradle.internal.work.DefaultWorkerLeaseService.blocking(DefaultWorkerLeaseService.java:224) - at org.gradle.api.internal.tasks.testing.processors.TestMainAction.run(TestMainAction.java:61) - at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:130) - at org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter.execute(DefaultTestExecuter.java:50) - at org.gradle.api.tasks.testing.AbstractTestTask.executeTests(AbstractTestTask.java:511) - at org.gradle.api.tasks.testing.Test.executeTests(Test.java:714) - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) - at java.base/java.lang.reflect.Method.invoke(Method.java:565) - at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51) - at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29) - at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252) - at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) - at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:237) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:220) - at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:203) - at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:170) - at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105) - at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44) - at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59) - at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) - at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56) - at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44) - at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42) - at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75) - at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55) - at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50) - at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28) - at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68) - at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38) - at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61) - at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26) - at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69) - at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46) - at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39) - at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28) - at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189) - at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75) - at org.gradle.internal.Either$Right.fold(Either.java:176) - at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62) - at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73) - at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48) - at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46) - at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35) - at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75) - at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53) - at java.base/java.util.Optional.orElseGet(Optional.java:364) - at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53) - at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) - at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49) - at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27) - at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71) - at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39) - at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:64) - at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35) - at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:62) - at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:40) - at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:76) - at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:45) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:136) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:66) - at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:38) - at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38) - at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36) - at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23) - at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75) - at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35) - at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:297) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31) - at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22) - at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40) - at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67) - at java.base/java.util.Optional.orElseGet(Optional.java:364) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67) - at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39) - at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46) - at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34) - at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47) - at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34) - at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64) - at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:132) - at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:121) - at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41) - at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) - at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) - at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) - at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) - at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) - at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) - at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) - at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) - at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) - at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) - at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:45) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:342) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:338) - at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338) - at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:327) - at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) - at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) - at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) - at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47) - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090) - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614) - at java.base/java.lang.Thread.run(Thread.java:1474) -Caused by: java.lang.InterruptedException - at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1789) - at java.base/java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1421) - at org.gradle.internal.concurrent.AbstractManagedExecutor.stop(AbstractManagedExecutor.java:86) - ... 143 more - - - - - diff --git a/build/test-results/test/TEST-org.example.dinner.DinnerTest.xml b/build/test-results/test/TEST-org.example.dinner.DinnerTest.xml deleted file mode 100644 index 641aae7..0000000 --- a/build/test-results/test/TEST-org.example.dinner.DinnerTest.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - diff --git a/build/test-results/test/TEST-org.example.dinner.DinnerVerifierTest.xml b/build/test-results/test/TEST-org.example.dinner.DinnerVerifierTest.xml deleted file mode 100644 index 3e9f67f..0000000 --- a/build/test-results/test/TEST-org.example.dinner.DinnerVerifierTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/build/test-results/test/TEST-org.example.dinner.ResourceGeneratorTest.xml b/build/test-results/test/TEST-org.example.dinner.ResourceGeneratorTest.xml deleted file mode 100644 index 85a0908..0000000 --- a/build/test-results/test/TEST-org.example.dinner.ResourceGeneratorTest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/build/test-results/test/TEST-org.example.fork.ForkTest.xml b/build/test-results/test/TEST-org.example.fork.ForkTest.xml deleted file mode 100644 index fd7894d..0000000 --- a/build/test-results/test/TEST-org.example.fork.ForkTest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/build/test-results/test/TEST-org.example.programmer.ProgrammerTest.xml b/build/test-results/test/TEST-org.example.programmer.ProgrammerTest.xml deleted file mode 100644 index 7f3fdec..0000000 --- a/build/test-results/test/TEST-org.example.programmer.ProgrammerTest.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/test-results/test/TEST-org.example.utils.IndexFetcherTest.xml b/build/test-results/test/TEST-org.example.utils.IndexFetcherTest.xml deleted file mode 100644 index 864a247..0000000 --- a/build/test-results/test/TEST-org.example.utils.IndexFetcherTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin deleted file mode 100644 index ebfe90e..0000000 --- a/build/test-results/test/binary/output.bin +++ /dev/null @@ -1,9 +0,0 @@ -Dinner is over! -Food amount is 0 -Portions eaten: 1, Count: 2 -Portions eaten: 3, Count: 1 -E-------------------------------------------------------------------- -Dinner is over! -Food amount is 0 -Portions eaten: 1, Count: 2 -E-------------------------------------------------------------------- diff --git a/build/test-results/test/binary/output.bin.idx b/build/test-results/test/binary/output.bin.idx deleted file mode 100644 index b20f36b6e3679c42385bc2fec5fcd26db69b37ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69 bcmZQ%Vq#`M1)2ZR01H%p6O{gqCjTD*R(>J_ diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin deleted file mode 100644 index a88c65c9b08aaa0d96d5a2a6d3f396e8e3ae3ea4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2579 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 E0C;u&LI3~& diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Programmer.class.uniqueId2 b/build/tmp/compileJava/compileTransaction/stash-dir/Programmer.class.uniqueId2 deleted file mode 100644 index 73319223b4d6ec772f05ca9fa8a86d7e4ebc993e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4087 zcmcImTXPfV8Gcq;d1YmNz&H@qpaLO|E!n70ni9(4Eib|C*cSzBzw>)| z-sgS4@AH5E@lOB-@#_$L@M}YIuMtDGt1OM^z)%xic; zLBwm3C@RI1`LtObGRvt2(+Xib{POA0u>(651mTQm*dClUDx15 zvO6g@d|AgXu^~7|Ta)SPewo~(<4N!20S!;Bf@*s`YUI;}TnKv|r@M4?BdS2PIIp11 zV}rBPcDF}IFZPM84lElsRZRMdj{P`b+gV5tn{#CaF^?LLt46ty%cSB*?IxKooAaiX z2;m^Urr{YKU&kQ@oofN{oO}c%1zM&wm@Aeq+q9Vu(U3kJ3G_3-B+0BB;Mj&;>86as zcuvC+9Y=9YLHD|rtmgwwm^bM*`I{6WCv*~ji0nxfaz(>3kLJ^3vL5J4CPhsUCv_wx z8$#sOiAVAjdM1Cn>&&@qZJDlTPBvq%Ntlf@xo#1YPz;}bvxnpBr&7t!%I3|7N;6B zs}e)_CSKJrqr<@LYI4?q>eBd-;);keDQg8%d1-w2FuJ97ELJ`1sz3PWK4?{M()r$ ziaj9wcT*%0OFGJ^(AB(IEz>QD19M!o*xC!y%M!P-%zWM`S1elcoF{|ay3p@YxC+kj zx=tnzClri(B>b;T+N9XYuH*&%LYkhp3}^D@NF_IGTI0rSmNRX` zg_Mz-AT2)kYNFT@*xD)y&#B%p7B&@1-l+P^k@y|iER(-yj)z>`}&6c-xRQ$ z#L90~^5iBnlV4s8W4p_dR8O)mW;T6m8Y>&A3%nX_C^g*RJ-Aj5nC68`4)Ec! zalt&3H_tkkU~=y0qLIluYmH1ExrCFvRa&L*y(rzAWWR##4?$f|Lt0_qHM}+ga~Z3| zoMkD^#qMIg}Afx2(Ni_6hXZ z&Fb%C*$(oJ!iNugt@2udg3Ijt@EU)7k+9z;uL8T}L%?o%!P_mb@cRBM+{as)^Fhu9 z@GYMIHb;MFU#^IA(T|}-JC>nEKS9&f$7oqbYt+At_D`^#!*HJ(4XZuTJJ8g04PRPD zq&}Xp$GdrOFL!n>BmHZ~9)$UL*~5x>08il< zI&qqhlTlhfi5R}i-3J}p@I8E=BU))=q1Zj~P7pe0`{k#cXYd2OPWe|ktJ6za>%|rB zaxlBbx$9`)m!2y}xKrhxDt(I8@YS1WSVGF*-|-=)qt4v3H!;LsyoP}RX?N@p-;dvf z9bFzKe+(rf<`(2nH}l z8^G(Ph;bLGQDOsn)kIuch{0CAgd*r8J_(KnaEMQe0i58Q;s{Q%Jsd zC~t%khjEdZUcwn0%_#ltBu+mhIzCE%32)#{qH&R!yoI-I#HudV@6dt>_vsIyC=bx9 z+(+n?hId20`w04uX&7&yj33b!8%^p{IR;RQ%BHw58P2vnp z*)knA1YDU4ezNZ2_AefuUgxk+-jq}!6#9&=gs9|BjH)Ad@k$M;KV$B+40qRuBRzkC z*85i%j)<)N7Fy2|)LteP54tnGoayNcgw?6OhEKzRsXpz~SXixL!IpGkG8PW34Z_-I zOL(j=$Tl3j7jCdejcmh>_b9J*^`Nx*NqfdUEmHE6>Mg>54i!{sf0f=yJIeIA&h|RV zAgyWx*~jpJ54RS)${@|43t5seM{*T-qDUzhVZ!475&X1vU9Q$dTvo0}UTQA&u`t8+01CHr%8ce1SWGWxn`r_Uw#K-9fuL z!!o$V{|}=0^cLlxHCQv(n9x$%9I7>QJBU??KJH+t60aSLce-AG$QhL)$9aM;dRNWg zcuwWYD-s|6911N8h1?m3MKUuI>v5vb=F()W*BP+6WJlLstf6WT-DMfBRp1Eo2e`(Y z;5uvWo2)QzF*xtgoOf9}ZrEl^ji5oU+0t`@)yA6Q1Zyvzb%S-4I~_M=mjuSCv%h5T KS6uVqqyGR8Qsi#{ diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/ResourceGenerator.class.uniqueId1 b/build/tmp/compileJava/compileTransaction/stash-dir/ResourceGenerator.class.uniqueId1 deleted file mode 100644 index a59baf47e19cd63a7d291118e8d67058454bb9b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1694 zcmcIk-A)rx5dKcv?ZQ&z&z2tx2m-bgS$`2}HNi%Nq>2#&(Yr&tl!bP;+3pg#_es3* z+8ZzueE^@s_yXP;qR!ba?P5XY!X`a4=ggd$Z@x3LpMQM#1mF?wD+nMcBNTyzFhl1y z-{oqF8%1?_V_VDH4B?D!==KAKU?RDuparcmlnB}oVd!eOFB!I0)GP*hmzNxEd6OZQ zSW4!aJkl~QFhotOsA{ixxl+>9P1D*@7idw?j!prkiy=g}DPIpR%7{h~LodUG8_lux zlA1S-ykl9KVXN7?y2z_rPk4o}RvdypoA9Nt)st>M@niIyWb`wP_#sv-vuN>hS+mq< zbyYzhE(y4ChV{f!E%aZ}c@Td0*FSa+5D*j4_P)Ybof4L3KRWs-|P*wZ|ImC_BAfC~FophK`(WXiuH;hGwnu zjS`)7=gd4Wt#L~id+#u0Z|PNfl-$1rPcyU>Yndos$%E>WP%q>RW}4nNeFoKMP{_b^ z`Y$oGHJ*`xM|}_0z`!7hek8jeQq3sc9LIl+3PE?;}59}u!t-(??$CQdUoKX>$xyYEDb`jEO|+gEI!-=SIadZBei zFB;r-EPC9Je&Wsv_I>5j_25a`OB6SEN^$=uQyU|MD(m2Uc`j)29iwwz! z=yxG4l1~uBn8G!xWgLT^Mo>JMLYsE06WVp$aI4SaCfx`M$hd{ul<^MfG0!%Q8Mjp7 gf0xc?$<~R`5rXVHhK>**5yw3`4PcHu)2^2J1ye%Yy#N3J diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin deleted file mode 100644 index d106386d4c0a36a569c32fc732e2891deea8a0f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 518 zcmZQ)2xD|%(qqR^QT=8+vQ_dfAt4nHS++~B9 z{%6uk9PBSr=br6nOS>&vCm8MGKBND^?!Owz|wF#0Ug33<^M! znOjJPfdR;1VBltC6k=eI0keUGI0FMi0}#VO1Dpkv0IFwTSJhKA2~7>gnt2Yw~jl2x@@@xefFT-Hn3O<>bL!8Dl*YH&cBxeNAN! y6|jhcxt>Ls8W)(&V5w&nV6AVXuPMqQ1{M*r)wA=p*LTp@l;V&Ei-?0AkQwmSH(m3u2iM)U%b0&2D9Vp{7(2%N4M0+=!=K3DvAaLfhWhAbuN^bKP}g ze4x9!-sngB8w1h<@ncwqpss}Dc~(>eLG7p#OrnWgDaVRR~xa1x2@ z5S*fkje-W2WMm|PqpsgpNJoWLudg2qbLbA%^&l5SQWSAhlng>5NX!6=A|O~xzK3h=11(I0zDV8iO41d6$@t&~DKJLW z>5sD4AM4Kf`~q}z9b%gEg~O>haW>T18PXF63g7Ja>z!$70|VLJJwIOTFwenrv3wr9 zO8&Ua$%rK!!(*hb+2ih=vHH!BbFFt>eZNml!}9siB-mMABCJWVpdHG4E%BBg9PjEn zi}B8u?;{a?CE;#scFW~MH#b-c?!UfSm$ksKP?wJ9D9A#C!37x`U0pZ6`+26;`|y5O z0J=KZb9`Q}xb?`w$*Yc*r}ky!>0@<@OsJI@$>~5T%qi*WS=F9iO^~l8p`*+zv=7;F~5A6-Imba7Ntg3l)nAt#Z}u}F@sE@=H$Wz)GtIv z+;Dfz{n&lgaBNq)J15UTr!0kfvnW(>d|58kJMDHW83fcHkO40pJ#Z~KaCvy&`Jn@$ zsG=`(--(N1zW&WUn=gySQO4L9lPz_H!#VPeou+H2@&Z$#%O;dK zt?YD;FBQ~6sXC6l6?k+Ci1f^Whc0nyGviR3%nV<~mdt_9N8$d-9HNhbq`~`-g8a>- zF{gDD_-gVN#pNVxA%g-+2Z^xfQTQ>XjtQ}dz_gG6`~DY(|6Oa&C^VGFNJt*l^N5Ti zlL+4G&`2;s_kRa{&@=p3$Ho)|Ybi3YKF{Ij>7w*v%?lbvBlkgyAmvJ^u`n)%I4PA0 zm(Z-fG^ Date: Wed, 1 Oct 2025 20:11:15 +0300 Subject: [PATCH 6/9] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B4=D0=BE=D0=BC=D0=BD=D1=8B=D0=B9=20=D0=B3=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=20=D1=87=D0=B8=D1=81?= =?UTF-8?q?=D0=B5=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/config.properties | 4 ++++ src/main/java/org/example/app/Main.java | 28 ++++++++++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 src/main/config.properties diff --git a/src/main/config.properties b/src/main/config.properties new file mode 100644 index 0000000..deaf32b --- /dev/null +++ b/src/main/config.properties @@ -0,0 +1,4 @@ +iterations=10 +max_programmers=1000 +programmers_count=50 +food_count=75 \ No newline at end of file diff --git a/src/main/java/org/example/app/Main.java b/src/main/java/org/example/app/Main.java index b59de17..e8f31c2 100644 --- a/src/main/java/org/example/app/Main.java +++ b/src/main/java/org/example/app/Main.java @@ -1,27 +1,35 @@ package org.example.app; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; import org.example.dinner.*; public class Main { - public static void main(String[] args) throws InterruptedException { + public static void main(String[] args) throws InterruptedException, IOException { + Properties props = new Properties(); + props.load(new FileInputStream("src/main/config.properties")); + + int iterations = Integer.parseInt(props.getProperty("iterations", "10")); + int maxProgrammers = Integer.parseInt(props.getProperty("max_programmers", "1000")); + int fixedProgrammers = Integer.parseInt(props.getProperty("programmers_count", "-1")); + int fixedFood = Integer.parseInt(props.getProperty("food_count", "-1")); + Random rand = new Random(); - int MAX = 1000; // hehe messenger max is everywhere - // Running 10 iterations - for (int i = 0; i < 10; i++) { - // Generating random nums - int programmersCount = rand.nextInt(MAX); - int foodCounter = programmersCount + 1 + rand.nextInt(MAX - programmersCount); + + for (int i = 0; i < iterations; i++) { + int programmersCount = (fixedProgrammers >= 0) ? fixedProgrammers : rand.nextInt(maxProgrammers); + int foodCounter = (fixedFood >= 0) ? fixedFood : programmersCount + 1 + rand.nextInt(maxProgrammers - programmersCount); AtomicInteger foodCount = new AtomicInteger(foodCounter); + System.out.println("--------------------------------------------------------------------"); - // Displaying them System.out.println("Programmers: " + programmersCount); System.out.println("Food: " + foodCounter); - // Initializing the dinner + Dinner dinner = new Dinner(); - // Starting the dinner dinner.serve(programmersCount, foodCount); } } From a98c2a7f5af034d7aa082014d4d079f7bba4eb07 Mon Sep 17 00:00:00 2001 From: Timofey Ivankov Date: Wed, 1 Oct 2025 20:37:05 +0300 Subject: [PATCH 7/9] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/config.properties | 2 +- src/main/java/org/example/fork/Fork.java | 5 ++ .../org/example/programmer/Programmer.java | 63 +++++++------------ 3 files changed, 28 insertions(+), 42 deletions(-) diff --git a/src/main/config.properties b/src/main/config.properties index deaf32b..ccb95d2 100644 --- a/src/main/config.properties +++ b/src/main/config.properties @@ -1,4 +1,4 @@ iterations=10 max_programmers=1000 programmers_count=50 -food_count=75 \ No newline at end of file +food_count=50 \ No newline at end of file diff --git a/src/main/java/org/example/fork/Fork.java b/src/main/java/org/example/fork/Fork.java index 33eb639..e5416c2 100644 --- a/src/main/java/org/example/fork/Fork.java +++ b/src/main/java/org/example/fork/Fork.java @@ -1,11 +1,16 @@ package org.example.fork; +import java.util.concurrent.locks.ReentrantLock; + // Just fork public class Fork { int id; + private final ReentrantLock lock = new ReentrantLock(true); public Fork(int id) { this.id = id; } public int getId() { return id; } + public void lock() { lock.lock(); } + public void unlock() { lock.unlock(); } } diff --git a/src/main/java/org/example/programmer/Programmer.java b/src/main/java/org/example/programmer/Programmer.java index 8dd1da8..7839780 100644 --- a/src/main/java/org/example/programmer/Programmer.java +++ b/src/main/java/org/example/programmer/Programmer.java @@ -45,25 +45,20 @@ public Programmer( @Override public void run() { try { - while (true) { - if (this.forks.isEmpty()) break; - // If no food left - break the loop - if (!takeOnePortionIfAvailable()) break; + // Trying to eat while food is here + while (!forks.isEmpty() && takeOnePortionIfAvailable()) { boolean ate = false; - // Loop until programmer eat + // Trying while the programmer eat while (!ate) { - // If successfully grabbed forks - // - eat - if (grabForks(this.forks)) { + // If grabbed forks - eat + if (grabForks()) { try { EatDinnder(); ate = true; } finally { - // Returning forks back - ReleaseForks(this.forks); + ReleaseForks(); } } else { - // Little sleep Thread.sleep(50); } } @@ -84,12 +79,7 @@ private boolean takeOnePortionIfAvailable() { public int getProgId(){ return this.id; } public int getPortionsEaten(){ return this.portionsEaten; } - private boolean grabForks(ConcurrentHashMap forks) { - // Getting forks from the table - Fork fork1 = forks.get(this.forkIdx1); - Fork fork2 = forks.get(this.forkIdx2); - if (fork1 == null || fork2 == null) return false; - + private boolean grabForks() { // Grabbing the forks in ascending order by their id to prevent deadlocks. // Deadlock can occur if two threads try to acquire the same two forks in different orders: // - Thread A picks fork 1 then waits for fork 2 @@ -100,19 +90,14 @@ private boolean grabForks(ConcurrentHashMap forks) { // and the larger id second (second). This ensures all threads acquire forks // in the same order, eliminating the possibility of circular waiting. // p.s: it was the most difficult part of homework. - Fork first = forkIdx1 < forkIdx2 ? fork1 : fork2; - Fork second = forkIdx1 < forkIdx2 ? fork2 : fork1; - // Synchronizing only the shared forks - synchronized (first) { - synchronized (second) { - forks.remove(first.getId()); - forks.remove(second.getId()); - } - } - // Because userForks used only in current thread - // no synchronization - this.userForks.put(first.getId(), first); - this.userForks.put(second.getId(), second); + Fork first = forkIdx1 < forkIdx2 ? forks.get(forkIdx1) : forks.get(forkIdx2); + Fork second = forkIdx1 < forkIdx2 ? forks.get(forkIdx2) : forks.get(forkIdx1); + + // Locking only the shared forks + first.lock(); + second.lock(); + userForks.put(first.getId(), first); + userForks.put(second.getId(), second); return true; } @@ -120,19 +105,15 @@ private void EatDinnder() throws InterruptedException { // Increment the eaten portions this.portionsEaten++; // We are eating - Thread.sleep(1000 + rand.nextInt(500)); + Thread.sleep(10); } - private void ReleaseForks(ConcurrentHashMap forks) { + private void ReleaseForks() { // Getting forks that programmer have - Fork fork1 = this.userForks.get(this.forkIdx1); - Fork fork2 = this.userForks.get(this.forkIdx2); - - // Putting back the forks - forks.put(fork1.getId(), fork1); - forks.put(fork2.getId(), fork2); - // Removing the forks from programmer - this.userForks.remove(fork1.getId()); - this.userForks.remove(fork2.getId()); + Fork first = userForks.remove(forkIdx1); + Fork second = userForks.remove(forkIdx2); + // Unlocking forks + if (first != null) first.unlock(); + if (second != null) second.unlock(); } } \ No newline at end of file From 76f22464f61f0117488518af439dabd72b54b1bf Mon Sep 17 00:00:00 2001 From: Timofey Ivankov Date: Wed, 1 Oct 2025 20:39:58 +0300 Subject: [PATCH 8/9] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/config.properties | 3 +-- src/main/java/org/example/app/Main.java | 14 ++++---------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/main/config.properties b/src/main/config.properties index ccb95d2..a27650c 100644 --- a/src/main/config.properties +++ b/src/main/config.properties @@ -1,4 +1,3 @@ iterations=10 -max_programmers=1000 programmers_count=50 -food_count=50 \ No newline at end of file +food_count=100 \ No newline at end of file diff --git a/src/main/java/org/example/app/Main.java b/src/main/java/org/example/app/Main.java index e8f31c2..973dda0 100644 --- a/src/main/java/org/example/app/Main.java +++ b/src/main/java/org/example/app/Main.java @@ -3,7 +3,6 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; -import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; import org.example.dinner.*; @@ -14,23 +13,18 @@ public static void main(String[] args) throws InterruptedException, IOException props.load(new FileInputStream("src/main/config.properties")); int iterations = Integer.parseInt(props.getProperty("iterations", "10")); - int maxProgrammers = Integer.parseInt(props.getProperty("max_programmers", "1000")); int fixedProgrammers = Integer.parseInt(props.getProperty("programmers_count", "-1")); int fixedFood = Integer.parseInt(props.getProperty("food_count", "-1")); - Random rand = new Random(); - for (int i = 0; i < iterations; i++) { - int programmersCount = (fixedProgrammers >= 0) ? fixedProgrammers : rand.nextInt(maxProgrammers); - int foodCounter = (fixedFood >= 0) ? fixedFood : programmersCount + 1 + rand.nextInt(maxProgrammers - programmersCount); - AtomicInteger foodCount = new AtomicInteger(foodCounter); + AtomicInteger foodCount = new AtomicInteger(fixedFood); System.out.println("--------------------------------------------------------------------"); - System.out.println("Programmers: " + programmersCount); - System.out.println("Food: " + foodCounter); + System.out.println("Programmers: " + fixedProgrammers); + System.out.println("Food: " + fixedFood); Dinner dinner = new Dinner(); - dinner.serve(programmersCount, foodCount); + dinner.serve(fixedProgrammers, foodCount); } } } \ No newline at end of file From 709cd69c1a40d772cd7d3634c4fc66ad464253e7 Mon Sep 17 00:00:00 2001 From: Timofey Ivankov Date: Tue, 7 Oct 2025 18:25:42 +0300 Subject: [PATCH 9/9] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=B2=D0=B8=D0=BB=D0=BA=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D1=8C,=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=82=D1=80=D0=B5=D0=B4=D0=BF=D1=83=D0=BB,=20=D0=B8=D1=81?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/config.properties | 2 +- src/main/java/org/example/dinner/Dinner.java | 12 +- .../org/example/dinner/ResourceGenerator.java | 9 +- src/main/java/org/example/fork/Fork.java | 9 +- .../org/example/programmer/Programmer.java | 75 ++-- .../java/org/example/utils/IndexFetcher.java | 28 -- .../example/dinner/ResourceGeneratorTest.java | 6 +- .../example/programmer/ProgrammerTest.java | 380 +++++++----------- .../org/example/utils/IndexFetcherTest.java | 50 --- 9 files changed, 197 insertions(+), 374 deletions(-) delete mode 100644 src/main/java/org/example/utils/IndexFetcher.java delete mode 100644 src/test/java/org/example/utils/IndexFetcherTest.java diff --git a/src/main/config.properties b/src/main/config.properties index a27650c..8e38782 100644 --- a/src/main/config.properties +++ b/src/main/config.properties @@ -1,3 +1,3 @@ iterations=10 programmers_count=50 -food_count=100 \ No newline at end of file +food_count=1000 \ No newline at end of file diff --git a/src/main/java/org/example/dinner/Dinner.java b/src/main/java/org/example/dinner/Dinner.java index 8b90829..4906463 100644 --- a/src/main/java/org/example/dinner/Dinner.java +++ b/src/main/java/org/example/dinner/Dinner.java @@ -6,7 +6,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; public class Dinner { @@ -15,7 +15,7 @@ public class Dinner { private final DinnerVerifier verifier = new DinnerVerifier(); private final ResourceGenerator resourceGenerator = new ResourceGenerator(); private final ArrayList programmers = new ArrayList<>(); - private final ConcurrentHashMap forks = new ConcurrentHashMap<>(); + private final BlockingQueue forks = new LinkedBlockingQueue<>(); private HashMap counts = new HashMap<>(); public void serve(int programmersCount, AtomicInteger foodCount) throws InterruptedException { @@ -24,8 +24,12 @@ public void serve(int programmersCount, AtomicInteger foodCount) throws Interrup // Generating resources resourceGenerator.generate(programmers, forks, programmersCount, foodCount); // Starting dinner - for (Programmer p : programmers) p.start(); - for (Programmer p : programmers) p.join(); + ExecutorService pool = Executors.newFixedThreadPool(programmersCount); + for (Programmer p : programmers) { + pool.submit(p); + } + pool.shutdown(); + pool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); System.out.println("Dinner is over!"); System.out.println("Food amount is " + foodCount); // Counting stats to display diff --git a/src/main/java/org/example/dinner/ResourceGenerator.java b/src/main/java/org/example/dinner/ResourceGenerator.java index 0d930a9..0a3f9ab 100644 --- a/src/main/java/org/example/dinner/ResourceGenerator.java +++ b/src/main/java/org/example/dinner/ResourceGenerator.java @@ -4,23 +4,26 @@ import org.example.fork.Fork; import java.util.ArrayList; +import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicInteger; public class ResourceGenerator { public void generate( ArrayList programmers, - ConcurrentHashMap forks, + BlockingQueue forks, int amount, AtomicInteger foodAmount ) { + Semaphore availableForks = new Semaphore(amount, true); // Generating the N amount of forks for (int i = 0; i < amount; i++) { - forks.put(i, new Fork(i)); + forks.add(new Fork(i)); } // The same amount of programmers for (int i = 0; i < amount; i++) { - programmers.add(new Programmer(i, forks, foodAmount)); + programmers.add(new Programmer(i, forks, foodAmount, availableForks)); } } } \ No newline at end of file diff --git a/src/main/java/org/example/fork/Fork.java b/src/main/java/org/example/fork/Fork.java index e5416c2..e768056 100644 --- a/src/main/java/org/example/fork/Fork.java +++ b/src/main/java/org/example/fork/Fork.java @@ -3,7 +3,7 @@ import java.util.concurrent.locks.ReentrantLock; // Just fork -public class Fork { +public class Fork implements Comparable { int id; private final ReentrantLock lock = new ReentrantLock(true); @@ -11,6 +11,9 @@ public Fork(int id) { this.id = id; } public int getId() { return id; } - public void lock() { lock.lock(); } - public void unlock() { lock.unlock(); } + + @Override + public int compareTo(Fork other) { + return Integer.compare(this.id, other.id); + } } diff --git a/src/main/java/org/example/programmer/Programmer.java b/src/main/java/org/example/programmer/Programmer.java index 7839780..5dccd29 100644 --- a/src/main/java/org/example/programmer/Programmer.java +++ b/src/main/java/org/example/programmer/Programmer.java @@ -1,41 +1,35 @@ package org.example.programmer; import org.example.fork.Fork; -import org.example.utils.IndexFetcher; - import java.lang.*; import java.util.HashMap; -import java.util.Random; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.ConcurrentHashMap; -public class Programmer extends Thread { +public class Programmer implements Runnable { // Resources of the thread private final int id; final HashMap userForks; private int portionsEaten; - private final int forkIdx1; - private final int forkIdx2; - private final Random rand; + private final Semaphore availableForks; // Mutual resources shared between threads - private final ConcurrentHashMap forks; + private final BlockingQueue forks; private final AtomicInteger foodLeft; public Programmer( int id, - ConcurrentHashMap forks, - AtomicInteger foodLeft + BlockingQueue forks, + AtomicInteger foodLeft, + Semaphore availableForks ) { // Resources of the thread this.id = id; this.userForks = new HashMap<>(); this.portionsEaten = 0; - IndexFetcher indexFetcher = new IndexFetcher(); - this.forkIdx1 = indexFetcher.fetch(forks, this.id - 1); - this.forkIdx2 = indexFetcher.fetch(forks, this.id + 1); - this.rand = new Random(); + this.availableForks = availableForks; // Mutual resources shared between threads this.forks = forks; @@ -46,7 +40,7 @@ public Programmer( public void run() { try { // Trying to eat while food is here - while (!forks.isEmpty() && takeOnePortionIfAvailable()) { + while (takeOnePortionIfAvailable()) { boolean ate = false; // Trying while the programmer eat while (!ate) { @@ -56,10 +50,8 @@ public void run() { EatDinnder(); ate = true; } finally { - ReleaseForks(); + releaseForks(); } - } else { - Thread.sleep(50); } } } @@ -80,25 +72,25 @@ private boolean takeOnePortionIfAvailable() { public int getPortionsEaten(){ return this.portionsEaten; } private boolean grabForks() { - // Grabbing the forks in ascending order by their id to prevent deadlocks. - // Deadlock can occur if two threads try to acquire the same two forks in different orders: - // - Thread A picks fork 1 then waits for fork 2 - // - Thread B picks fork 2 then waits for fork 1 - // In this situation both threads wait forever. - // - // To prevent this, we always pick the fork with the smaller id first (first), - // and the larger id second (second). This ensures all threads acquire forks - // in the same order, eliminating the possibility of circular waiting. - // p.s: it was the most difficult part of homework. - Fork first = forkIdx1 < forkIdx2 ? forks.get(forkIdx1) : forks.get(forkIdx2); - Fork second = forkIdx1 < forkIdx2 ? forks.get(forkIdx2) : forks.get(forkIdx1); + try { + availableForks.acquire(2); + Fork first = forks.take(); + Fork second = forks.take(); + userForks.put(1, first); + userForks.put(2, second); + return true; + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return false; + } + } - // Locking only the shared forks - first.lock(); - second.lock(); - userForks.put(first.getId(), first); - userForks.put(second.getId(), second); - return true; + private void releaseForks() throws InterruptedException { + Fork first = userForks.remove(1); + Fork second = userForks.remove(2); + if (first != null) forks.put(first); + if (second != null) forks.put(second); + availableForks.release(2); } private void EatDinnder() throws InterruptedException { @@ -107,13 +99,4 @@ private void EatDinnder() throws InterruptedException { // We are eating Thread.sleep(10); } - - private void ReleaseForks() { - // Getting forks that programmer have - Fork first = userForks.remove(forkIdx1); - Fork second = userForks.remove(forkIdx2); - // Unlocking forks - if (first != null) first.unlock(); - if (second != null) second.unlock(); - } } \ No newline at end of file diff --git a/src/main/java/org/example/utils/IndexFetcher.java b/src/main/java/org/example/utils/IndexFetcher.java deleted file mode 100644 index 6a87ff4..0000000 --- a/src/main/java/org/example/utils/IndexFetcher.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.example.utils; - -import org.example.fork.Fork; - -import java.util.concurrent.ConcurrentHashMap; - -public class IndexFetcher { - public int fetch(ConcurrentHashMap forks, int id) { - // Getting the forks hashmap size - int size = forks.size(); - // if size is zero return zero - if (size == 0) { - return 0; - } - // If id is 0, return the size - 1, - // This way, we're imitating fork - // that in left from us - if (id < 0) { - id = size - 1; - } else if (id >= size) { - // Otherwise, setting it to 0, - // Imitating forks in right - // from us - id = 0; - } - return id; - } -} \ No newline at end of file diff --git a/src/test/java/org/example/dinner/ResourceGeneratorTest.java b/src/test/java/org/example/dinner/ResourceGeneratorTest.java index 4a926ff..dcbf59c 100644 --- a/src/test/java/org/example/dinner/ResourceGeneratorTest.java +++ b/src/test/java/org/example/dinner/ResourceGeneratorTest.java @@ -6,7 +6,9 @@ import org.junit.jupiter.api.Test; import java.util.ArrayList; +import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -14,14 +16,14 @@ public class ResourceGeneratorTest { private ResourceGenerator generator; - private ConcurrentHashMap forks; + private BlockingQueue forks; private ArrayList programmers; private AtomicInteger foodAmount; @BeforeEach public void setUp() { generator = new ResourceGenerator(); - forks = new ConcurrentHashMap<>(); + forks = new LinkedBlockingQueue<>(); programmers = new ArrayList<>(); foodAmount = new AtomicInteger(100); } diff --git a/src/test/java/org/example/programmer/ProgrammerTest.java b/src/test/java/org/example/programmer/ProgrammerTest.java index 17600f4..ee5eb9d 100644 --- a/src/test/java/org/example/programmer/ProgrammerTest.java +++ b/src/test/java/org/example/programmer/ProgrammerTest.java @@ -5,8 +5,6 @@ import org.example.fork.Fork; import java.util.Arrays; -import java.util.Collections; -import java.util.List; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; @@ -15,43 +13,45 @@ public class ProgrammerTest { private Programmer programmer; - private ConcurrentHashMap forks; + private BlockingQueue forks; private AtomicInteger foodLeft; + private Semaphore semaphore; @BeforeEach public void setUp() { - forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); + forks = new LinkedBlockingQueue<>(); + forks.add(new Fork(0)); + forks.add(new Fork(1)); foodLeft = new AtomicInteger(2); - programmer = new Programmer(1, forks, foodLeft); + semaphore = new Semaphore(2); + programmer = new Programmer(1, forks, foodLeft, semaphore); } @Test - public void testProgrammerEat() throws InterruptedException { - programmer.start(); - programmer.join(); + public void testProgrammerEat() { + programmer.run(); int portionsEaten = programmer.getPortionsEaten(); assertEquals(2, portionsEaten); } @Test - void testProgrammerEatMultiplePortions() throws InterruptedException { - Programmer multiMealProgrammer = new Programmer(0, forks, foodLeft); - multiMealProgrammer.start(); - multiMealProgrammer.join(); + void testProgrammerEatMultiplePortions() { + Programmer multiMealProgrammer = new Programmer(0, forks, foodLeft, semaphore); + multiMealProgrammer.run(); assertEquals(2, multiMealProgrammer.getPortionsEaten()); } @Test void testTwoProgrammersGrabForks() throws InterruptedException { - Programmer p1 = new Programmer(0, forks, foodLeft); - Programmer p2 = new Programmer(1, forks, foodLeft); + Programmer p1 = new Programmer(0, forks, foodLeft, semaphore); + Programmer p2 = new Programmer(1, forks, foodLeft, semaphore); - p1.start(); - p2.start(); - p1.join(); - p2.join(); + Thread t1 = new Thread(p1); + Thread t2 = new Thread(p2); + t1.start(); + t2.start(); + t1.join(); + t2.join(); assertEquals(2, forks.size()); assertEquals(1, p1.getPortionsEaten()); @@ -59,27 +59,22 @@ void testTwoProgrammersGrabForks() throws InterruptedException { } @Test - void testConcurrentProgrammers() throws InterruptedException { - Programmer p1 = new Programmer(0, forks, foodLeft); - Programmer p2 = new Programmer(1, forks, foodLeft); - Programmer p3 = new Programmer(2, forks, foodLeft); + void testConcurrentProgrammers() { + Programmer p1 = new Programmer(0, forks, foodLeft, semaphore); + Programmer p2 = new Programmer(1, forks, foodLeft, semaphore); + Programmer p3 = new Programmer(2, forks, foodLeft, semaphore); - p1.start(); - p2.start(); - p3.start(); - - p1.join(); - p2.join(); - p3.join(); + p1.run(); + p2.run(); + p3.run(); assertEquals(forks.size(), 2); } @Test - void testRepeatedEating() throws InterruptedException { - Programmer p = new Programmer(0, forks, foodLeft); - p.start(); - p.join(); + void testRepeatedEating() { + Programmer p = new Programmer(0, forks, foodLeft, semaphore); + p.run(); assertEquals(2, p.getPortionsEaten()); assertEquals(forks.size(), 2); @@ -87,17 +82,19 @@ void testRepeatedEating() throws InterruptedException { @Test void testForksConsistencyAfterConcurrentEating() throws InterruptedException { - ConcurrentHashMap sharedForks = new ConcurrentHashMap<>(); - sharedForks.put(0, new Fork(0)); - sharedForks.put(1, new Fork(1)); + BlockingQueue sharedForks = new LinkedBlockingQueue<>(); + sharedForks.put(new Fork(0)); + sharedForks.put(new Fork(1)); - Programmer p1 = new Programmer(0, sharedForks, foodLeft); - Programmer p2 = new Programmer(1, sharedForks, foodLeft); + Programmer p1 = new Programmer(0, sharedForks, foodLeft, semaphore); + Programmer p2 = new Programmer(1, sharedForks, foodLeft, semaphore); - p1.start(); - p2.start(); - p1.join(); - p2.join(); + Thread t1 = new Thread(p1); + Thread t2 = new Thread(p2); + t1.start(); + t2.start(); + t1.join(); + t2.join(); assertEquals(2, sharedForks.size()); assertEquals(1, p1.getPortionsEaten()); @@ -107,9 +104,10 @@ void testForksConsistencyAfterConcurrentEating() throws InterruptedException { @Test void testZeroMeals() throws InterruptedException { foodLeft = new AtomicInteger(0); - Programmer p = new Programmer(0, forks, foodLeft); - p.start(); - p.join(); + Programmer p = new Programmer(0, forks, foodLeft, semaphore); + Thread t = new Thread(p); + t.start(); + t.join(); assertEquals(0, p.getPortionsEaten()); assertEquals(2, forks.size()); } @@ -117,34 +115,39 @@ void testZeroMeals() throws InterruptedException { @Test void testNegativeMeals() throws InterruptedException { foodLeft = new AtomicInteger(-10); - Programmer p = new Programmer(0, forks, foodLeft); - p.start(); - p.join(); + Programmer p = new Programmer(0, forks, foodLeft, semaphore); + Thread t = new Thread(p); + t.start(); + t.join(); assertEquals(0, p.getPortionsEaten()); } @Test void testMissingForks() throws InterruptedException { - forks = new ConcurrentHashMap<>(); - Programmer p = new Programmer(5, forks, foodLeft); - p.start(); - p.join(); + forks = new LinkedBlockingQueue<>(); + Programmer p = new Programmer(5, forks, foodLeft, semaphore); + Thread t = new Thread(p); + t.start(); + t.join(500); assertEquals(0, p.getPortionsEaten()); + assertEquals(0, forks.size()); } @Test void testMoreProgrammersThanForks() throws InterruptedException { - Programmer p1 = new Programmer(0, forks, foodLeft); - Programmer p2 = new Programmer(1, forks, foodLeft); - Programmer p3 = new Programmer(2, forks, foodLeft); - - p1.start(); - p2.start(); - p3.start(); - - p1.join(); - p2.join(); - p3.join(); + Programmer p1 = new Programmer(0, forks, foodLeft, semaphore); + Programmer p2 = new Programmer(1, forks, foodLeft, semaphore); + Programmer p3 = new Programmer(2, forks, foodLeft, semaphore); + + Thread t1 = new Thread(p1); + Thread t2 = new Thread(p2); + Thread t3 = new Thread(p3); + t1.start(); + t2.start(); + t3.start(); + t1.join(); + t2.join(); + t3.join(); assertEquals(2, forks.size()); int total = p1.getPortionsEaten() + p2.getPortionsEaten() + p3.getPortionsEaten(); @@ -152,16 +155,13 @@ void testMoreProgrammersThanForks() throws InterruptedException { } @Test - void testManyProgrammers() throws InterruptedException { + void testManyProgrammers() { int numProgrammers = 10; Programmer[] programmers = new Programmer[numProgrammers]; for (int i = 0; i < numProgrammers; i++) { - programmers[i] = new Programmer(i, forks, foodLeft); - programmers[i].start(); - } - for (Programmer p : programmers) { - p.join(); + programmers[i] = new Programmer(i, forks, foodLeft, semaphore); + programmers[i].run(); } assertEquals(2, forks.size()); } @@ -170,9 +170,9 @@ void testManyProgrammers() throws InterruptedException { void testNoDeadlock() throws Exception { ExecutorService executor = Executors.newFixedThreadPool(3); - Programmer p1 = new Programmer(0, forks, foodLeft); - Programmer p2 = new Programmer(1, forks, foodLeft); - Programmer p3 = new Programmer(2, forks, foodLeft); + Programmer p1 = new Programmer(0, forks, foodLeft, semaphore); + Programmer p2 = new Programmer(1, forks, foodLeft, semaphore); + Programmer p3 = new Programmer(2, forks, foodLeft, semaphore); Future f1 = executor.submit(p1); Future f2 = executor.submit(p2); @@ -187,22 +187,19 @@ void testNoDeadlock() throws Exception { } @Test - void testForksReturned() throws InterruptedException { - Programmer p = new Programmer(0, forks, foodLeft); - p.start(); - p.join(); + void testForksReturned() { + Programmer p = new Programmer(0, forks, foodLeft, semaphore); + p.run(); assertEquals(2, forks.size()); } @Test - void testNoForkDoubleOwnership() throws InterruptedException { - Programmer p1 = new Programmer(0, forks, foodLeft); - Programmer p2 = new Programmer(1, forks, foodLeft); + void testNoForkDoubleOwnership() { + Programmer p1 = new Programmer(0, forks, foodLeft, semaphore); + Programmer p2 = new Programmer(1, forks, foodLeft, semaphore); - p1.start(); - p2.start(); - p1.join(); - p2.join(); + p1.run(); + p2.run(); assertTrue(p1.userForks.isEmpty()); assertTrue(p2.userForks.isEmpty()); @@ -211,164 +208,102 @@ void testNoForkDoubleOwnership() throws InterruptedException { @Test void testGetProgId() { - Programmer p = new Programmer(42, forks, foodLeft); + Programmer p = new Programmer(42, forks, foodLeft, semaphore); assertEquals(42, p.getProgId()); } @Test void testIncrementPortions() throws InterruptedException { - Programmer p = new Programmer(0, forks, foodLeft); - p.start(); - p.join(); + Programmer p = new Programmer(0, forks, foodLeft, semaphore); + p.run(); assertEquals(2, p.getPortionsEaten()); } @Test void testMultipleProgrammers() throws InterruptedException { - ConcurrentHashMap forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); + BlockingQueue forks = new LinkedBlockingQueue<>(); + forks.add(new Fork(0)); + forks.add(new Fork(1)); AtomicInteger foodLeft = new AtomicInteger(2); - Programmer p1 = new Programmer(0, forks, foodLeft); - Programmer p2 = new Programmer(1, forks, foodLeft); - - p1.start(); - p2.start(); + Programmer p1 = new Programmer(0, forks, foodLeft, semaphore); + Programmer p2 = new Programmer(1, forks, foodLeft, semaphore); - p1.join(); - p2.join(); + Thread t1 = new Thread(p1); + Thread t2 = new Thread(p2); + t1.start(); + t2.start(); + t1.join(); + t2.join(); assertEquals(1, p1.getPortionsEaten()); assertEquals(1, p2.getPortionsEaten()); assertEquals(2, forks.size()); } - - @Test - void testFastSwitching() throws InterruptedException { - foodLeft = new AtomicInteger(10); - ConcurrentHashMap localForks = new ConcurrentHashMap<>(); - localForks.put(0, new Fork(0)); - localForks.put(1, new Fork(1)); - - Programmer p1 = new Programmer(0, localForks, foodLeft); - Programmer p2 = new Programmer(1, localForks, foodLeft); - - p1.start(); - p2.start(); - p1.join(); - p2.join(); - - assertEquals(2, localForks.size()); - assertEquals(5, p1.getPortionsEaten()); - assertEquals(5, p2.getPortionsEaten()); - } - @Test void testForksMutualExclusion() throws InterruptedException { - ConcurrentHashMap sharedForks = new ConcurrentHashMap<>(); - sharedForks.put(0, new Fork(0)); - sharedForks.put(1, new Fork(1)); + BlockingQueue sharedForks = new LinkedBlockingQueue<>(); + sharedForks.add(new Fork(0)); + sharedForks.add(new Fork(1)); AtomicInteger food = new AtomicInteger(2); - Programmer p1 = new Programmer(0, sharedForks, food); - Programmer p2 = new Programmer(1, sharedForks, food); + Programmer p1 = new Programmer(0, sharedForks, food, semaphore); + Programmer p2 = new Programmer(1, sharedForks, food, semaphore); - p1.start(); - p2.start(); - p1.join(); - p2.join(); + Thread t1 = new Thread(p1); + Thread t2 = new Thread(p2); + t1.start(); + t2.start(); + t1.join(); + t2.join(); assertEquals(2, p1.getPortionsEaten() + p2.getPortionsEaten()); assertEquals(2, sharedForks.size()); } - @Test void testNoOverEating() throws InterruptedException { AtomicInteger food = new AtomicInteger(1); - ConcurrentHashMap forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); + BlockingQueue forks = new LinkedBlockingQueue<>(); + forks.put(new Fork(0)); + forks.put(new Fork(1)); - Programmer p1 = new Programmer(0, forks, food); - Programmer p2 = new Programmer(1, forks, food); + Programmer p1 = new Programmer(0, forks, food, semaphore); + Programmer p2 = new Programmer(1, forks, food, semaphore); - p1.start(); - p2.start(); - p1.join(); - p2.join(); + p1.run(); + p2.run(); assertEquals(1, p1.getPortionsEaten() + p2.getPortionsEaten()); } - @Test - void testForksReturnedOnInterrupt() throws InterruptedException { - AtomicInteger food = new AtomicInteger(10); - ConcurrentHashMap forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); - - Programmer p = new Programmer(0, forks, food); - p.start(); - p.interrupt(); - p.join(); - - assertEquals(2, forks.size()); - assertTrue(p.userForks.isEmpty()); - } - @Test void testManyProgrammersLimitedFood() throws InterruptedException { AtomicInteger food = new AtomicInteger(3); - ConcurrentHashMap forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); + BlockingQueue forks = new LinkedBlockingQueue<>(); + forks.put(new Fork(0)); + forks.put(new Fork(1)); Programmer[] programmers = new Programmer[5]; for (int i = 0; i < 5; i++) { - programmers[i] = new Programmer(i, forks, food); - programmers[i].start(); + programmers[i] = new Programmer(i, forks, food, semaphore); + programmers[i].run(); } - for (Programmer p : programmers) p.join(); - int total = 0; for (Programmer p : programmers) total += p.getPortionsEaten(); assertEquals(3, total); assertEquals(2, forks.size()); } - - void testRandomThreadOrder() throws InterruptedException { - AtomicInteger food = new AtomicInteger(4); - ConcurrentHashMap forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); - - Programmer p1 = new Programmer(0, forks, food); - Programmer p2 = new Programmer(1, forks, food); - Programmer p3 = new Programmer(2, forks, food); - - List list = Arrays.asList(p1, p2, p3); - Collections.shuffle(list); - list.forEach(Thread::start); - list.forEach(p -> { - try { p.join(); } catch (InterruptedException ignored) {} - }); - - int total = p1.getPortionsEaten() + p2.getPortionsEaten() + p3.getPortionsEaten(); - assertEquals(4, total); - } - @Test void testNoDeadlockTwoProgrammers() throws InterruptedException { AtomicInteger food = new AtomicInteger(2); - ConcurrentHashMap forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); + BlockingQueue forks = new LinkedBlockingQueue<>(); + forks.put(new Fork(0)); + forks.put(new Fork(1)); - Programmer p1 = new Programmer(0, forks, food); - Programmer p2 = new Programmer(1, forks, food); + Programmer p1 = new Programmer(0, forks, food, semaphore); + Programmer p2 = new Programmer(1, forks, food, semaphore); ExecutorService executor = Executors.newFixedThreadPool(2); executor.submit(p1); @@ -382,60 +317,33 @@ void testNoDeadlockTwoProgrammers() throws InterruptedException { @Test void testFoodDistributionManyThreads() throws InterruptedException { AtomicInteger food = new AtomicInteger(5); - ConcurrentHashMap forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); + BlockingQueue forks = new LinkedBlockingQueue<>(); + forks.put(new Fork(0)); + forks.put(new Fork(1)); Programmer[] programmers = new Programmer[10]; for (int i = 0; i < 10; i++) { - programmers[i] = new Programmer(i, forks, food); - programmers[i].start(); + programmers[i] = new Programmer(i, forks, food, semaphore); + programmers[i].run(); } - for (Programmer p : programmers) p.join(); int total = Arrays.stream(programmers).mapToInt(Programmer::getPortionsEaten).sum(); assertEquals(5, total); assertEquals(2, forks.size()); } - @Test - void testSimultaneousStart() throws InterruptedException { - AtomicInteger food = new AtomicInteger(2); - ConcurrentHashMap forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); - - CountDownLatch latch = new CountDownLatch(1); - Programmer p1 = new Programmer(0, forks, food) { - public void run() { try { latch.await(); super.run(); } catch (InterruptedException ignored) {} } - }; - Programmer p2 = new Programmer(1, forks, food) { - public void run() { try { latch.await(); super.run(); } catch (InterruptedException ignored) {} } - }; - - p1.start(); - p2.start(); - latch.countDown(); - - p1.join(); - p2.join(); - - assertEquals(2, p1.getPortionsEaten() + p2.getPortionsEaten()); - } - @Test void testForksAlwaysReturned() throws InterruptedException { AtomicInteger food = new AtomicInteger(3); - ConcurrentHashMap forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); + BlockingQueue forks = new LinkedBlockingQueue<>(); + forks.put(new Fork(0)); + forks.put(new Fork(1)); - Programmer p1 = new Programmer(0, forks, food); - Programmer p2 = new Programmer(1, forks, food); - Programmer p3 = new Programmer(2, forks, food); + Programmer p1 = new Programmer(0, forks, food, semaphore); + Programmer p2 = new Programmer(1, forks, food, semaphore); + Programmer p3 = new Programmer(2, forks, food, semaphore); - p1.start(); p2.start(); p3.start(); - p1.join(); p2.join(); p3.join(); + p1.run(); p2.run(); p3.run(); assertEquals(2, forks.size()); } @@ -443,17 +351,15 @@ void testForksAlwaysReturned() throws InterruptedException { @Test void testAtomicFoodDecrement() throws InterruptedException { AtomicInteger food = new AtomicInteger(1); - ConcurrentHashMap forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); + BlockingQueue forks = new LinkedBlockingQueue<>(); + forks.put(new Fork(0)); + forks.put(new Fork(1)); - Programmer p1 = new Programmer(0, forks, food); - Programmer p2 = new Programmer(1, forks, food); + Programmer p1 = new Programmer(0, forks, food, semaphore); + Programmer p2 = new Programmer(1, forks, food, semaphore); - p1.start(); - p2.start(); - p1.join(); - p2.join(); + p1.run(); + p2.run(); int totalEaten = p1.getPortionsEaten() + p2.getPortionsEaten(); assertEquals(1, totalEaten); diff --git a/src/test/java/org/example/utils/IndexFetcherTest.java b/src/test/java/org/example/utils/IndexFetcherTest.java deleted file mode 100644 index e74c001..0000000 --- a/src/test/java/org/example/utils/IndexFetcherTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.example.utils; - -import org.example.fork.Fork; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.concurrent.ConcurrentHashMap; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class IndexFetcherTest { - - private IndexFetcher indexFetcher; - private ConcurrentHashMap forks; - - @BeforeEach - void setUp() { - indexFetcher = new IndexFetcher(); - forks = new ConcurrentHashMap<>(); - forks.put(0, new Fork(0)); - forks.put(1, new Fork(1)); - forks.put(2, new Fork(2)); - } - - @Test - void fetch_withValidIndex_returnsSameIndex() { - assertEquals(0, indexFetcher.fetch(forks, 0)); - assertEquals(1, indexFetcher.fetch(forks, 1)); - assertEquals(2, indexFetcher.fetch(forks, 2)); - } - - @Test - void fetch_withNegativeIndex_returnsLastIndex() { - assertEquals(2, indexFetcher.fetch(forks, -1)); - assertEquals(2, indexFetcher.fetch(forks, -10)); - } - - @Test - void fetch_withIndexTooLarge_returnsFirstIndex() { - assertEquals(0, indexFetcher.fetch(forks, 3)); - assertEquals(0, indexFetcher.fetch(forks, 10)); - } - - @Test - void fetch_withEmptyMap_returnsZero() { - ConcurrentHashMap empty = new ConcurrentHashMap<>(); - assertEquals(0, indexFetcher.fetch(empty, -1)); - assertEquals(0, indexFetcher.fetch(empty, 5)); - } -}