From 312d018096e73331caeb5894c581f8bcc441ebcb Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Fri, 2 Feb 2024 10:34:08 -0300 Subject: [PATCH 1/6] Gradlew.bat update --- gradlew.bat | 184 ++++++++++++++++++++++++++-------------------------- 1 file changed, 92 insertions(+), 92 deletions(-) diff --git a/gradlew.bat b/gradlew.bat index 6689b85b..93e3f59f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,92 +1,92 @@ -@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 - -@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. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -: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 +@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 + +@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. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +: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 From c034180925100c11db8ca9d6e29f340490dd9aa6 Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Fri, 2 Feb 2024 11:14:03 -0300 Subject: [PATCH 2/6] Removing redundant analyzer comments for hamming exercise --- .../exercises/hamming/HammingAnalyzer.java | 26 -------- .../exercises/hamming/HammingWalker.java | 62 ------------------- .../hamming/MustCalculateHammingDistance.java | 18 ------ .../hamming/MustThrowInConstructor.java | 18 ------ .../MustUseConditionalLogicInConstructor.java | 18 ------ .../exercises/hamming/MustUseConstructor.java | 18 ------ .../MustUseStringCharAtOrCodePointAt.java | 18 ------ .../hamming/HammingAnalyzerTest.java | 5 -- .../DoesNotThrowInConstructor.java.txt | 18 ------ .../MustUseCharAtOrCodePointAt.java.txt | 35 ----------- .../NoCalculationOfHammingDistance.java.txt | 30 --------- .../NoConditionalInConstructor.java.txt | 14 ----- .../exercises/hamming/NoConstructor.java.txt | 15 ----- .../.meta/src/reference/java/Hamming.java | 6 -- tests/hamming/.meta/version | 1 - tests/hamming/src/main/java/Hamming.java | 9 --- 16 files changed, 311 deletions(-) delete mode 100644 src/main/java/analyzer/exercises/hamming/MustCalculateHammingDistance.java delete mode 100644 src/main/java/analyzer/exercises/hamming/MustThrowInConstructor.java delete mode 100644 src/main/java/analyzer/exercises/hamming/MustUseConditionalLogicInConstructor.java delete mode 100644 src/main/java/analyzer/exercises/hamming/MustUseConstructor.java delete mode 100644 src/main/java/analyzer/exercises/hamming/MustUseStringCharAtOrCodePointAt.java delete mode 100644 src/test/resources/analyzer/exercises/hamming/DoesNotThrowInConstructor.java.txt delete mode 100644 src/test/resources/analyzer/exercises/hamming/MustUseCharAtOrCodePointAt.java.txt delete mode 100644 src/test/resources/analyzer/exercises/hamming/NoCalculationOfHammingDistance.java.txt delete mode 100644 src/test/resources/analyzer/exercises/hamming/NoConditionalInConstructor.java.txt delete mode 100644 src/test/resources/analyzer/exercises/hamming/NoConstructor.java.txt delete mode 100644 tests/hamming/.meta/version diff --git a/src/main/java/analyzer/exercises/hamming/HammingAnalyzer.java b/src/main/java/analyzer/exercises/hamming/HammingAnalyzer.java index 9d75df7a..91909d69 100644 --- a/src/main/java/analyzer/exercises/hamming/HammingAnalyzer.java +++ b/src/main/java/analyzer/exercises/hamming/HammingAnalyzer.java @@ -22,37 +22,11 @@ public void analyze(Solution solution, Analysis analysis) { solution.getCompilationUnits().forEach(cu -> cu.walk(ClassOrInterfaceDeclaration.class, walker)); - if (!walker.hasConstructor()) { - analysis.addComment(new MustUseConstructor()); - return; - } - - if (!walker.constructorHasIfStatements() && !walker.constructorHasMethodCalls()) { - analysis.addComment(new MustUseConditionalLogicInConstructor()); - return; - } - - if (!walker.constructorThrowsIllegalArgument()) { - analysis.addComment(new MustThrowInConstructor()); - return; - } - - if (!walker.getHammingDistanceMethodMayCalculateDistance() - && !walker.constructorMayCalculateDistance()) { - analysis.addComment(new MustCalculateHammingDistance()); - return; - } - if (walker.usesCharacterLiterals()) { analysis.addComment(new AvoidCharacterLiterals()); return; } - if (!walker.usesStringCharAtOrCodePointAt()) { - analysis.addComment(new MustUseStringCharAtOrCodePointAt()); - return; - } - if (!walker.constructorMayCalculateDistance()) { analysis.addComment(new CalculateDistanceInConstructor()); } diff --git a/src/main/java/analyzer/exercises/hamming/HammingWalker.java b/src/main/java/analyzer/exercises/hamming/HammingWalker.java index 70423131..ab964362 100644 --- a/src/main/java/analyzer/exercises/hamming/HammingWalker.java +++ b/src/main/java/analyzer/exercises/hamming/HammingWalker.java @@ -21,8 +21,6 @@ class HammingWalker implements Consumer { private ConstructorDeclaration constructor; private final Map> methods = new HashMap<>(); private final Set methodsCalledByConstructor = new HashSet<>(); - private boolean constructorHasIfStatements; - private boolean constructorThrowsIllegalArgumentDirectly; private boolean constructorMayCalculateDistanceDirectly; private final Set methodsCalledByGetHammingDistance = new HashSet<>(); private boolean getHammingDistanceMayCalculateDistanceDirectly; @@ -62,13 +60,6 @@ private void walkConstructor(ConstructorDeclaration foundConstructor) { } private void walkConstructorStatement(Statement statement) { - if (statement.isIfStmt()) { - constructorHasIfStatements = true; - } - - if (isThrowNewIllegalArgument(statement)) { - constructorThrowsIllegalArgumentDirectly = true; - } if (statementMayCalculateHammingDistance(statement)) { constructorMayCalculateDistanceDirectly = true; @@ -79,21 +70,6 @@ private void walkConstructorStatement(Statement statement) { recursivelyAddMethodsCalled(methodName, methodsCalledByConstructor)); } - private boolean isThrowNewIllegalArgument(Statement statement) { - return statement.findAll(ThrowStmt.class).stream() - .anyMatch(this::isCreatingIllegalArgumentException); - } - - private boolean isCreatingIllegalArgumentException(ThrowStmt throwStmt) { - return throwStmt.getExpression().isObjectCreationExpr() - && throwStmt - .getExpression() - .asObjectCreationExpr() - .getType() - .getNameAsString() - .equals("IllegalArgumentException"); - } - private boolean isMethodCall(Statement statement) { return !statement.findAll(MethodCallExpr.class).isEmpty(); } @@ -160,44 +136,10 @@ private Stream getMethodsCalledBy(BlockStmt body) { .flatMap(this::getMethodCallNames); } - public boolean hasConstructor() { - return constructor != null; - } - - public boolean constructorHasIfStatements() { - return constructorHasIfStatements; - } - public boolean constructorHasMethodCalls() { return !methodsCalledByConstructor.isEmpty(); } - public boolean constructorThrowsIllegalArgument() { - return constructorThrowsIllegalArgumentDirectly - || constructorThrowsIllegarArgumentIndirectly(); - } - - private boolean constructorThrowsIllegarArgumentIndirectly() { - return methodsCalledByConstructor.stream() - .anyMatch(this::methodThrowsIllegalArgumentException); - } - - private boolean methodThrowsIllegalArgumentException(String methodName) { - return methods.getOrDefault(methodName, List.of()).stream() - .anyMatch(this::methodThrowsIllegalArgumentException); - } - - private boolean methodThrowsIllegalArgumentException(MethodDeclaration method) { - return method.getBody() - .map(this::methodBodyThrowsIllegalArgumentException) - .orElse(false); - } - - private boolean methodBodyThrowsIllegalArgumentException(BlockStmt body) { - return body.getStatements().stream() - .anyMatch(this::isThrowNewIllegalArgument); - } - public boolean constructorMayCalculateDistance() { return constructorMayCalculateDistanceDirectly || constructorCallsMethodThatMayCalculateDistance(); @@ -271,10 +213,6 @@ public boolean usesCharacterLiterals() { return !hammingClass.findAll(CharLiteralExpr.class).isEmpty(); } - public boolean usesStringCharAtOrCodePointAt() { - return usesMethod("charAt") || usesMethod("codePointAt"); - } - public boolean shouldUseStreamFilterAndCount() { return usesMethod("reduce"); } diff --git a/src/main/java/analyzer/exercises/hamming/MustCalculateHammingDistance.java b/src/main/java/analyzer/exercises/hamming/MustCalculateHammingDistance.java deleted file mode 100644 index 4c547122..00000000 --- a/src/main/java/analyzer/exercises/hamming/MustCalculateHammingDistance.java +++ /dev/null @@ -1,18 +0,0 @@ -package analyzer.exercises.hamming; - -import analyzer.Comment; - -/** - * @see Markdown Template - */ -class MustCalculateHammingDistance extends Comment { - @Override - public String getKey() { - return "java.hamming.must_calculate_hamming_distance"; - } - - @Override - public Type getType() { - return Type.ACTIONABLE; - } -} diff --git a/src/main/java/analyzer/exercises/hamming/MustThrowInConstructor.java b/src/main/java/analyzer/exercises/hamming/MustThrowInConstructor.java deleted file mode 100644 index 419d48c8..00000000 --- a/src/main/java/analyzer/exercises/hamming/MustThrowInConstructor.java +++ /dev/null @@ -1,18 +0,0 @@ -package analyzer.exercises.hamming; - -import analyzer.Comment; - -/** - * @see Markdown Template - */ -class MustThrowInConstructor extends Comment { - @Override - public String getKey() { - return "java.hamming.must_throw_in_constructor"; - } - - @Override - public Type getType() { - return Type.ESSENTIAL; - } -} diff --git a/src/main/java/analyzer/exercises/hamming/MustUseConditionalLogicInConstructor.java b/src/main/java/analyzer/exercises/hamming/MustUseConditionalLogicInConstructor.java deleted file mode 100644 index 33bd29ab..00000000 --- a/src/main/java/analyzer/exercises/hamming/MustUseConditionalLogicInConstructor.java +++ /dev/null @@ -1,18 +0,0 @@ -package analyzer.exercises.hamming; - -import analyzer.Comment; - -/** - * @see Markdown Template - */ -class MustUseConditionalLogicInConstructor extends Comment { - @Override - public String getKey() { - return "java.hamming.must_use_conditional_logic_in_constructor"; - } - - @Override - public Type getType() { - return Type.ESSENTIAL; - } -} diff --git a/src/main/java/analyzer/exercises/hamming/MustUseConstructor.java b/src/main/java/analyzer/exercises/hamming/MustUseConstructor.java deleted file mode 100644 index 061e5318..00000000 --- a/src/main/java/analyzer/exercises/hamming/MustUseConstructor.java +++ /dev/null @@ -1,18 +0,0 @@ -package analyzer.exercises.hamming; - -import analyzer.Comment; - -/** - * @see Markdown Template - */ -class MustUseConstructor extends Comment { - @Override - public String getKey() { - return "java.hamming.must_use_constructor"; - } - - @Override - public Type getType() { - return Type.ESSENTIAL; - } -} diff --git a/src/main/java/analyzer/exercises/hamming/MustUseStringCharAtOrCodePointAt.java b/src/main/java/analyzer/exercises/hamming/MustUseStringCharAtOrCodePointAt.java deleted file mode 100644 index 99ebfe47..00000000 --- a/src/main/java/analyzer/exercises/hamming/MustUseStringCharAtOrCodePointAt.java +++ /dev/null @@ -1,18 +0,0 @@ -package analyzer.exercises.hamming; - -import analyzer.Comment; - -/** - * @see Markdown Template - */ -class MustUseStringCharAtOrCodePointAt extends Comment { - @Override - public String getKey() { - return "java.hamming.must_use_string_char_at_or_code_point_at"; - } - - @Override - public Type getType() { - return Type.ACTIONABLE; - } -} diff --git a/src/test/java/analyzer/exercises/hamming/HammingAnalyzerTest.java b/src/test/java/analyzer/exercises/hamming/HammingAnalyzerTest.java index 48a72b1f..a7787022 100644 --- a/src/test/java/analyzer/exercises/hamming/HammingAnalyzerTest.java +++ b/src/test/java/analyzer/exercises/hamming/HammingAnalyzerTest.java @@ -17,12 +17,7 @@ public class HammingAnalyzerTest { private static Stream testCases() { return Stream.of( - Arguments.of("NoConstructor.java.txt", new Comment[]{new MustUseConstructor()}), - Arguments.of("NoConditionalInConstructor.java.txt", new Comment[]{new MustUseConditionalLogicInConstructor()}), - Arguments.of("DoesNotThrowInConstructor.java.txt", new Comment[]{new MustThrowInConstructor()}), - Arguments.of("NoCalculationOfHammingDistance.java.txt", new Comment[]{new MustCalculateHammingDistance()}), Arguments.of("UsesCharacterLiterals.java.txt", new Comment[]{new AvoidCharacterLiterals()}), - Arguments.of("MustUseCharAtOrCodePointAt.java.txt", new Comment[]{new MustUseStringCharAtOrCodePointAt()}), Arguments.of("NestedValidation.java.txt", new Comment[]{new CalculateDistanceInConstructor()}), Arguments.of("NestedCalculation.java.txt", new Comment[0]), Arguments.of("OptimalWithCalculationInGetHammingDistance.java.txt", new Comment[]{new CalculateDistanceInConstructor()}), diff --git a/src/test/resources/analyzer/exercises/hamming/DoesNotThrowInConstructor.java.txt b/src/test/resources/analyzer/exercises/hamming/DoesNotThrowInConstructor.java.txt deleted file mode 100644 index 87e1870b..00000000 --- a/src/test/resources/analyzer/exercises/hamming/DoesNotThrowInConstructor.java.txt +++ /dev/null @@ -1,18 +0,0 @@ -import java.util.stream.IntStream; - -/** Constructor must throw IllegalArgumentException. */ -class Hamming { - private final int hammingDistance; - - Hamming(String leftStrand, String rightStrand) { - if (leftStrand.isEmpty()) { - this.hammingDistance = 0; - } else { - this.hammingDistance = 1; - } - } - - int getHammingDistance() { - return hammingDistance; - } -} \ No newline at end of file diff --git a/src/test/resources/analyzer/exercises/hamming/MustUseCharAtOrCodePointAt.java.txt b/src/test/resources/analyzer/exercises/hamming/MustUseCharAtOrCodePointAt.java.txt deleted file mode 100644 index b7946ca6..00000000 --- a/src/test/resources/analyzer/exercises/hamming/MustUseCharAtOrCodePointAt.java.txt +++ /dev/null @@ -1,35 +0,0 @@ -import java.util.stream.IntStream; - -/** Optimal solution, but uses String.toCharArray. */ -class Hamming { - private final int hammingDistance; - - Hamming(String leftStrand, String rightStrand) { - validateStrandsHaveEqualLength(leftStrand, rightStrand); - - char[] left = leftStrand.toCharArray(); - char[] right = rightStrand.toCharArray(); - - hammingDistance = (int) IntStream.range(0, leftStrand.length()) - .filter(index -> left[index] != right[index]) - .count(); - } - - private void validateStrandsHaveEqualLength() { - if (leftStrand.length() == rightStrand.length()) { - return; - } - if (leftStrand.isEmpty()) { - throw new IllegalArgumentException("left strand must not be empty."); - } - if (rightStrand.isEmpty()) { - throw new IllegalArgumentException("right strand must not be empty."); - } - throw new IllegalArgumentException( - "leftStrand and rightStrand must be of equal length."); - } - - int getHammingDistance() { - return hammingDistance; - } -} \ No newline at end of file diff --git a/src/test/resources/analyzer/exercises/hamming/NoCalculationOfHammingDistance.java.txt b/src/test/resources/analyzer/exercises/hamming/NoCalculationOfHammingDistance.java.txt deleted file mode 100644 index 4a62b051..00000000 --- a/src/test/resources/analyzer/exercises/hamming/NoCalculationOfHammingDistance.java.txt +++ /dev/null @@ -1,30 +0,0 @@ -import java.util.stream.IntStream; - -/** Must actually calculate the hamming distance somewhere. */ -class Hamming { - private final int hammingDistance; - - Hamming(String leftStrand, String rightStrand) { - validateStrandsHaveEqualLength(leftStrand, rightStrand); - - hammingDistance = 0; - } - - private void validateStrandsHaveEqualLength() { - if (leftStrand.length() == rightStrand.length()) { - return; - } - if (leftStrand.isEmpty()) { - throw new IllegalArgumentException("left strand must not be empty."); - } - if (rightStrand.isEmpty()) { - throw new IllegalArgumentException("right strand must not be empty."); - } - throw new IllegalArgumentException( - "leftStrand and rightStrand must be of equal length."); - } - - int getHammingDistance() { - return hammingDistance; - } -} \ No newline at end of file diff --git a/src/test/resources/analyzer/exercises/hamming/NoConditionalInConstructor.java.txt b/src/test/resources/analyzer/exercises/hamming/NoConditionalInConstructor.java.txt deleted file mode 100644 index 8d389c12..00000000 --- a/src/test/resources/analyzer/exercises/hamming/NoConditionalInConstructor.java.txt +++ /dev/null @@ -1,14 +0,0 @@ -import java.util.stream.IntStream; - -/** Constructor must have conditional logic. */ -class Hamming { - private final int hammingDistance; - - Hamming(String leftStrand, String rightStrand) { - this.hammingDistance = 0; - } - - int getHammingDistance() { - return hammingDistance; - } -} \ No newline at end of file diff --git a/src/test/resources/analyzer/exercises/hamming/NoConstructor.java.txt b/src/test/resources/analyzer/exercises/hamming/NoConstructor.java.txt deleted file mode 100644 index d38d1bb4..00000000 --- a/src/test/resources/analyzer/exercises/hamming/NoConstructor.java.txt +++ /dev/null @@ -1,15 +0,0 @@ -import java.util.stream.IntStream; - -/** Must use a custom constructor that takes two strings. */ -class Hamming { - private final int hammingDistance; - - /** Not the right type params. */ - Hamming(int hammingDistance) { - this.hammingDistance = hammingDistance; - } - - int getHammingDistance() { - return hammingDistance; - } -} \ No newline at end of file diff --git a/tests/hamming/.meta/src/reference/java/Hamming.java b/tests/hamming/.meta/src/reference/java/Hamming.java index 7db3984d..24e5af61 100644 --- a/tests/hamming/.meta/src/reference/java/Hamming.java +++ b/tests/hamming/.meta/src/reference/java/Hamming.java @@ -7,12 +7,6 @@ class Hamming { Hamming(String leftStrand, String rightStrand) { String exceptionMessage = "leftStrand and rightStrand must be of equal length."; if (leftStrand.length() != rightStrand.length()) { - if (leftStrand.isEmpty()) { - exceptionMessage = "left strand must not be empty."; - } - if (rightStrand.isEmpty()) { - exceptionMessage = "right strand must not be empty."; - } throw new IllegalArgumentException(exceptionMessage); } diff --git a/tests/hamming/.meta/version b/tests/hamming/.meta/version deleted file mode 100644 index 276cbf9e..00000000 --- a/tests/hamming/.meta/version +++ /dev/null @@ -1 +0,0 @@ -2.3.0 diff --git a/tests/hamming/src/main/java/Hamming.java b/tests/hamming/src/main/java/Hamming.java index a3998156..cce71fbe 100644 --- a/tests/hamming/src/main/java/Hamming.java +++ b/tests/hamming/src/main/java/Hamming.java @@ -13,7 +13,6 @@ class Hamming { private void validate(String leftStrand, String rightStrand) { validateNotNull(leftStrand, rightStrand); - validateNotOneEmpty(leftStrand, rightStrand); validateSameLength(leftStrand, rightStrand); } @@ -23,14 +22,6 @@ private void validateNotNull(String leftStrand, String rightStrand) { } } - private void validateNotOneEmpty(String leftStrand, String rightStrand) { - if (leftStrand.length() == 0 && rightStrand.length() > 0) { - throw new IllegalArgumentException("left strand must not be empty."); - } else if (rightStrand.length() == 0 && leftStrand.length() > 0) { - throw new IllegalArgumentException("right strand must not be empty."); - } - } - private void validateSameLength(String leftStrand, String rightStrand) { if (leftStrand.length() != rightStrand.length()) { throw new IllegalArgumentException("leftStrand and rightStrand must be of equal length."); From 0d999dcc9b46aefea974ec57ff8a88b3c8970516 Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Fri, 2 Feb 2024 11:35:27 -0300 Subject: [PATCH 3/6] Removing redundant analyzer comments for two fer exercise --- .../exercises/twofer/TwoferAnalyzer.java | 6 ------ .../exercises/twofer/TwoferWalker.java | 10 ---------- .../exercises/twofer/UseConditionalLogic.java | 18 ------------------ .../exercises/twofer/TwoferAnalyzerTest.java | 1 - .../twofer/NoConditionalLogic.java.txt | 8 -------- 5 files changed, 43 deletions(-) delete mode 100644 src/main/java/analyzer/exercises/twofer/UseConditionalLogic.java delete mode 100644 src/test/resources/analyzer/exercises/twofer/NoConditionalLogic.java.txt diff --git a/src/main/java/analyzer/exercises/twofer/TwoferAnalyzer.java b/src/main/java/analyzer/exercises/twofer/TwoferAnalyzer.java index b076b144..9f25e9d4 100644 --- a/src/main/java/analyzer/exercises/twofer/TwoferAnalyzer.java +++ b/src/main/java/analyzer/exercises/twofer/TwoferAnalyzer.java @@ -20,12 +20,6 @@ public void analyze(Solution solution, Analysis analysis) { if (walker.hasHardCodedTestCases) { analysis.addComment(new AvoidHardCodedTestCases()); - } else if (walker.usesLambda) { - // could be used later for additional comments? - } else if (walker.usesLoops) { - // could be used later for additional comments? - } else if (!walker.hasMethodCall && !(walker.usesIfStatement || walker.usesConditional)) { - analysis.addComment(new UseConditionalLogic()); } else if (walker.usesFormat) { analysis.addComment(new AvoidStringFormat()); } else if (walker.returnCount > 1) { diff --git a/src/main/java/analyzer/exercises/twofer/TwoferWalker.java b/src/main/java/analyzer/exercises/twofer/TwoferWalker.java index 38536a92..400cfe91 100644 --- a/src/main/java/analyzer/exercises/twofer/TwoferWalker.java +++ b/src/main/java/analyzer/exercises/twofer/TwoferWalker.java @@ -1,8 +1,6 @@ package analyzer.exercises.twofer; import com.github.javaparser.ast.Node; -import com.github.javaparser.ast.expr.ConditionalExpr; -import com.github.javaparser.ast.expr.LambdaExpr; import com.github.javaparser.ast.expr.MethodCallExpr; import com.github.javaparser.ast.expr.StringLiteralExpr; import com.github.javaparser.ast.stmt.*; @@ -14,8 +12,6 @@ class TwoferWalker implements Consumer { boolean usesIfStatement; boolean usesConditional; boolean hasMethodCall; - boolean usesLambda; - boolean usesLoops; boolean usesFormat; int returnCount; @@ -27,18 +23,12 @@ public void accept(Node node) { this.returnCount++; } else if (node instanceof IfStmt) { this.usesIfStatement = true; - } else if (node instanceof ConditionalExpr) { - this.usesConditional = true; } else if (node instanceof MethodCallExpr && !this.hasMethodCall) { this.hasMethodCall = true; if (((MethodCallExpr) node).getName().toString().equals("format")) { this.usesFormat = true; } - } else if (node instanceof LambdaExpr) { - this.usesLambda = true; - } else if (node instanceof WhileStmt || node instanceof ForStmt || node instanceof ForEachStmt) { - this.usesLoops = true; } } } \ No newline at end of file diff --git a/src/main/java/analyzer/exercises/twofer/UseConditionalLogic.java b/src/main/java/analyzer/exercises/twofer/UseConditionalLogic.java deleted file mode 100644 index 50a432a9..00000000 --- a/src/main/java/analyzer/exercises/twofer/UseConditionalLogic.java +++ /dev/null @@ -1,18 +0,0 @@ -package analyzer.exercises.twofer; - -import analyzer.Comment; - -/** - * @see Markdown Template - */ -class UseConditionalLogic extends Comment { - @Override - public String getKey() { - return "java.two-fer.use_conditional_logic"; - } - - @Override - public Type getType() { - return Type.ESSENTIAL; - } -} diff --git a/src/test/java/analyzer/exercises/twofer/TwoferAnalyzerTest.java b/src/test/java/analyzer/exercises/twofer/TwoferAnalyzerTest.java index e0b3fd35..94f109b2 100644 --- a/src/test/java/analyzer/exercises/twofer/TwoferAnalyzerTest.java +++ b/src/test/java/analyzer/exercises/twofer/TwoferAnalyzerTest.java @@ -19,7 +19,6 @@ private static Stream testCases() { Arguments.of("UsesLambda.java.txt", new Comment[0]), Arguments.of("UsesLoop.java.txt", new Comment[0]), Arguments.of("HardCodedTestCases.java.txt", new Comment[]{new AvoidHardCodedTestCases()}), - Arguments.of("NoConditionalLogic.java.txt", new Comment[]{new UseConditionalLogic()}), Arguments.of("UsesStringFormat.java.txt", new Comment[]{new AvoidStringFormat()}), Arguments.of("UsesMultipleReturns.java.txt", new Comment[]{new UseOneReturn()}), Arguments.of("OptimalNoTernary.java.txt", new Comment[]{new UseTernaryOperator()}), diff --git a/src/test/resources/analyzer/exercises/twofer/NoConditionalLogic.java.txt b/src/test/resources/analyzer/exercises/twofer/NoConditionalLogic.java.txt deleted file mode 100644 index e187582a..00000000 --- a/src/test/resources/analyzer/exercises/twofer/NoConditionalLogic.java.txt +++ /dev/null @@ -1,8 +0,0 @@ -package analyzer.exercises.twofer; - -/** Missing necessary conditional logic. */ -public class Twofer { - public String twofer(String name) { - return "One for you, one for me."; - } -} \ No newline at end of file From bce48a6146ea0ce49aede794343e9e6ca4670164 Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Fri, 2 Feb 2024 11:44:13 -0300 Subject: [PATCH 4/6] Removing tests that there aren't used anymore --- .../analyzer/exercises/twofer/TwoferAnalyzerTest.java | 2 -- .../analyzer/exercises/twofer/UsesLambda.java.txt | 11 ----------- .../analyzer/exercises/twofer/UsesLoop.java.txt | 11 ----------- 3 files changed, 24 deletions(-) delete mode 100644 src/test/resources/analyzer/exercises/twofer/UsesLambda.java.txt delete mode 100644 src/test/resources/analyzer/exercises/twofer/UsesLoop.java.txt diff --git a/src/test/java/analyzer/exercises/twofer/TwoferAnalyzerTest.java b/src/test/java/analyzer/exercises/twofer/TwoferAnalyzerTest.java index 94f109b2..86609226 100644 --- a/src/test/java/analyzer/exercises/twofer/TwoferAnalyzerTest.java +++ b/src/test/java/analyzer/exercises/twofer/TwoferAnalyzerTest.java @@ -16,8 +16,6 @@ public class TwoferAnalyzerTest { private static Stream testCases() { return Stream.of( - Arguments.of("UsesLambda.java.txt", new Comment[0]), - Arguments.of("UsesLoop.java.txt", new Comment[0]), Arguments.of("HardCodedTestCases.java.txt", new Comment[]{new AvoidHardCodedTestCases()}), Arguments.of("UsesStringFormat.java.txt", new Comment[]{new AvoidStringFormat()}), Arguments.of("UsesMultipleReturns.java.txt", new Comment[]{new UseOneReturn()}), diff --git a/src/test/resources/analyzer/exercises/twofer/UsesLambda.java.txt b/src/test/resources/analyzer/exercises/twofer/UsesLambda.java.txt deleted file mode 100644 index d66b75fb..00000000 --- a/src/test/resources/analyzer/exercises/twofer/UsesLambda.java.txt +++ /dev/null @@ -1,11 +0,0 @@ -package analyzer.exercises.twofer; - -/** Using lambdas probably deserves a mentor review. */ -public class Twofer { - public String twofer(String name) { - Predicate isNull = s -> s == null; - if (isNull.test(name)) - return "One for you, one for me."; - return "One for " + name + ", one for me."; - } -} \ No newline at end of file diff --git a/src/test/resources/analyzer/exercises/twofer/UsesLoop.java.txt b/src/test/resources/analyzer/exercises/twofer/UsesLoop.java.txt deleted file mode 100644 index 76b9a315..00000000 --- a/src/test/resources/analyzer/exercises/twofer/UsesLoop.java.txt +++ /dev/null @@ -1,11 +0,0 @@ -package analyzer.exercises.twofer; - -/** Using loops deserves mentor review. */ -public class Twofer { - public String twofer(String name) { - for (int i = 0; i < 10; i++) { - // noop - } - return "One for " + name + ", one for me."; - } -} \ No newline at end of file From 5f7c0b904045a4b89d8d657579e873222908eaec Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Fri, 2 Feb 2024 17:23:57 -0300 Subject: [PATCH 5/6] Applying suggestions Restoring MustUseStringCharAtOrCodePointAt analyzer functionality Deleting unused usesConditional variable Removing tests/hamming/.meta/src/reference/java/Hamming.java and tests/hamming/.meta/tests.toml --- .../exercises/hamming/HammingAnalyzer.java | 5 +++ .../exercises/hamming/HammingWalker.java | 4 +++ .../MustUseStringCharAtOrCodePointAt.java | 18 ++++++++++ .../exercises/twofer/TwoferWalker.java | 1 - .../hamming/HammingAnalyzerTest.java | 1 + .../MustUseCharAtOrCodePointAt.java.txt | 35 +++++++++++++++++++ .../.meta/src/reference/java/Hamming.java | 20 ----------- tests/hamming/.meta/tests.toml | 30 ---------------- 8 files changed, 63 insertions(+), 51 deletions(-) create mode 100644 src/main/java/analyzer/exercises/hamming/MustUseStringCharAtOrCodePointAt.java create mode 100644 src/test/resources/analyzer/exercises/hamming/MustUseCharAtOrCodePointAt.java.txt delete mode 100644 tests/hamming/.meta/src/reference/java/Hamming.java delete mode 100644 tests/hamming/.meta/tests.toml diff --git a/src/main/java/analyzer/exercises/hamming/HammingAnalyzer.java b/src/main/java/analyzer/exercises/hamming/HammingAnalyzer.java index 91909d69..b14106a8 100644 --- a/src/main/java/analyzer/exercises/hamming/HammingAnalyzer.java +++ b/src/main/java/analyzer/exercises/hamming/HammingAnalyzer.java @@ -27,6 +27,11 @@ public void analyze(Solution solution, Analysis analysis) { return; } + if (!walker.usesStringCharAtOrCodePointAt()) { + analysis.addComment(new MustUseStringCharAtOrCodePointAt()); + return; + } + if (!walker.constructorMayCalculateDistance()) { analysis.addComment(new CalculateDistanceInConstructor()); } diff --git a/src/main/java/analyzer/exercises/hamming/HammingWalker.java b/src/main/java/analyzer/exercises/hamming/HammingWalker.java index ab964362..9a1c15d4 100644 --- a/src/main/java/analyzer/exercises/hamming/HammingWalker.java +++ b/src/main/java/analyzer/exercises/hamming/HammingWalker.java @@ -213,6 +213,10 @@ public boolean usesCharacterLiterals() { return !hammingClass.findAll(CharLiteralExpr.class).isEmpty(); } + public boolean usesStringCharAtOrCodePointAt() { + return usesMethod("charAt") || usesMethod("codePointAt"); + } + public boolean shouldUseStreamFilterAndCount() { return usesMethod("reduce"); } diff --git a/src/main/java/analyzer/exercises/hamming/MustUseStringCharAtOrCodePointAt.java b/src/main/java/analyzer/exercises/hamming/MustUseStringCharAtOrCodePointAt.java new file mode 100644 index 00000000..99ebfe47 --- /dev/null +++ b/src/main/java/analyzer/exercises/hamming/MustUseStringCharAtOrCodePointAt.java @@ -0,0 +1,18 @@ +package analyzer.exercises.hamming; + +import analyzer.Comment; + +/** + * @see Markdown Template + */ +class MustUseStringCharAtOrCodePointAt extends Comment { + @Override + public String getKey() { + return "java.hamming.must_use_string_char_at_or_code_point_at"; + } + + @Override + public Type getType() { + return Type.ACTIONABLE; + } +} diff --git a/src/main/java/analyzer/exercises/twofer/TwoferWalker.java b/src/main/java/analyzer/exercises/twofer/TwoferWalker.java index 400cfe91..f5c8c943 100644 --- a/src/main/java/analyzer/exercises/twofer/TwoferWalker.java +++ b/src/main/java/analyzer/exercises/twofer/TwoferWalker.java @@ -10,7 +10,6 @@ class TwoferWalker implements Consumer { boolean hasHardCodedTestCases; boolean usesIfStatement; - boolean usesConditional; boolean hasMethodCall; boolean usesFormat; int returnCount; diff --git a/src/test/java/analyzer/exercises/hamming/HammingAnalyzerTest.java b/src/test/java/analyzer/exercises/hamming/HammingAnalyzerTest.java index a7787022..357238f0 100644 --- a/src/test/java/analyzer/exercises/hamming/HammingAnalyzerTest.java +++ b/src/test/java/analyzer/exercises/hamming/HammingAnalyzerTest.java @@ -18,6 +18,7 @@ public class HammingAnalyzerTest { private static Stream testCases() { return Stream.of( Arguments.of("UsesCharacterLiterals.java.txt", new Comment[]{new AvoidCharacterLiterals()}), + Arguments.of("MustUseCharAtOrCodePointAt.java.txt", new Comment[]{new MustUseStringCharAtOrCodePointAt()}), Arguments.of("NestedValidation.java.txt", new Comment[]{new CalculateDistanceInConstructor()}), Arguments.of("NestedCalculation.java.txt", new Comment[0]), Arguments.of("OptimalWithCalculationInGetHammingDistance.java.txt", new Comment[]{new CalculateDistanceInConstructor()}), diff --git a/src/test/resources/analyzer/exercises/hamming/MustUseCharAtOrCodePointAt.java.txt b/src/test/resources/analyzer/exercises/hamming/MustUseCharAtOrCodePointAt.java.txt new file mode 100644 index 00000000..b7946ca6 --- /dev/null +++ b/src/test/resources/analyzer/exercises/hamming/MustUseCharAtOrCodePointAt.java.txt @@ -0,0 +1,35 @@ +import java.util.stream.IntStream; + +/** Optimal solution, but uses String.toCharArray. */ +class Hamming { + private final int hammingDistance; + + Hamming(String leftStrand, String rightStrand) { + validateStrandsHaveEqualLength(leftStrand, rightStrand); + + char[] left = leftStrand.toCharArray(); + char[] right = rightStrand.toCharArray(); + + hammingDistance = (int) IntStream.range(0, leftStrand.length()) + .filter(index -> left[index] != right[index]) + .count(); + } + + private void validateStrandsHaveEqualLength() { + if (leftStrand.length() == rightStrand.length()) { + return; + } + if (leftStrand.isEmpty()) { + throw new IllegalArgumentException("left strand must not be empty."); + } + if (rightStrand.isEmpty()) { + throw new IllegalArgumentException("right strand must not be empty."); + } + throw new IllegalArgumentException( + "leftStrand and rightStrand must be of equal length."); + } + + int getHammingDistance() { + return hammingDistance; + } +} \ No newline at end of file diff --git a/tests/hamming/.meta/src/reference/java/Hamming.java b/tests/hamming/.meta/src/reference/java/Hamming.java deleted file mode 100644 index 24e5af61..00000000 --- a/tests/hamming/.meta/src/reference/java/Hamming.java +++ /dev/null @@ -1,20 +0,0 @@ -import java.util.function.IntPredicate; -import java.util.stream.IntStream; - -class Hamming { - private final int hammingDistance; - - Hamming(String leftStrand, String rightStrand) { - String exceptionMessage = "leftStrand and rightStrand must be of equal length."; - if (leftStrand.length() != rightStrand.length()) { - throw new IllegalArgumentException(exceptionMessage); - } - - IntPredicate areNotEqual = index -> leftStrand.charAt(index) != rightStrand.charAt(index); - hammingDistance = (int) IntStream.range(0, leftStrand.length()).filter(areNotEqual).count(); - } - - int getHammingDistance() { - return hammingDistance; - } -} diff --git a/tests/hamming/.meta/tests.toml b/tests/hamming/.meta/tests.toml deleted file mode 100644 index b2f80f48..00000000 --- a/tests/hamming/.meta/tests.toml +++ /dev/null @@ -1,30 +0,0 @@ -# This is an auto-generated file. Regular comments will be removed when this -# file is regenerated. Regenerating will not touch any manually added keys, -# so comments can be added in a "comment" key. - -[f6dcb64f-03b0-4b60-81b1-3c9dbf47e887] -description = "empty strands" - -[54681314-eee2-439a-9db0-b0636c656156] -description = "single letter identical strands" - -[294479a3-a4c8-478f-8d63-6209815a827b] -description = "single letter different strands" - -[9aed5f34-5693-4344-9b31-40c692fb5592] -description = "long identical strands" - -[cd2273a5-c576-46c8-a52b-dee251c3e6e5] -description = "long different strands" - -[919f8ef0-b767-4d1b-8516-6379d07fcb28] -description = "disallow first strand longer" - -[8a2d4ed0-ead5-4fdd-924d-27c4cf56e60e] -description = "disallow second strand longer" - -[5dce058b-28d4-4ca7-aa64-adfe4e17784c] -description = "disallow left empty strand" - -[38826d4b-16fb-4639-ac3e-ba027dec8b5f] -description = "disallow right empty strand" From 68a6edbd053237cefaaff1ff1e08f5a336e0bcc2 Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Fri, 2 Feb 2024 17:30:16 -0300 Subject: [PATCH 6/6] Removing validateNotNull outdated check --- tests/hamming/src/main/java/Hamming.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/hamming/src/main/java/Hamming.java b/tests/hamming/src/main/java/Hamming.java index cce71fbe..7890e831 100644 --- a/tests/hamming/src/main/java/Hamming.java +++ b/tests/hamming/src/main/java/Hamming.java @@ -12,16 +12,9 @@ class Hamming { private void validate(String leftStrand, String rightStrand) { - validateNotNull(leftStrand, rightStrand); validateSameLength(leftStrand, rightStrand); } - private void validateNotNull(String leftStrand, String rightStrand) { - if (leftStrand == null || rightStrand == null) { - throw new IllegalArgumentException("Either left or right stand is null"); - } - } - private void validateSameLength(String leftStrand, String rightStrand) { if (leftStrand.length() != rightStrand.length()) { throw new IllegalArgumentException("leftStrand and rightStrand must be of equal length.");