diff --git a/src/main/java/analyzer/AnalyzerRoot.java b/src/main/java/analyzer/AnalyzerRoot.java index 394ddfd3..2dfa39f3 100644 --- a/src/main/java/analyzer/AnalyzerRoot.java +++ b/src/main/java/analyzer/AnalyzerRoot.java @@ -2,6 +2,7 @@ import analyzer.comments.FeedbackRequest; import analyzer.exercises.GlobalAnalyzer; +import analyzer.exercises.annalynsinfiltration.AnnalynsInfiltrationAnalyzer; import analyzer.exercises.hamming.HammingAnalyzer; import analyzer.exercises.lasagna.LasagnaAnalyzer; import analyzer.exercises.leap.LeapAnalyzer; @@ -45,6 +46,7 @@ private static List createAnalyzers(String slug) { analyzers.add(new GlobalAnalyzer()); switch (slug) { + case "annalyns-infiltration" -> analyzers.add(new AnnalynsInfiltrationAnalyzer()); case "hamming" -> analyzers.add(new HammingAnalyzer()); case "lasagna" -> analyzers.add(new LasagnaAnalyzer()); case "leap" -> analyzers.add(new LeapAnalyzer()); diff --git a/src/main/java/analyzer/exercises/annalynsinfiltration/AnnalynsInfiltrationAnalyzer.java b/src/main/java/analyzer/exercises/annalynsinfiltration/AnnalynsInfiltrationAnalyzer.java new file mode 100644 index 00000000..b6bf4883 --- /dev/null +++ b/src/main/java/analyzer/exercises/annalynsinfiltration/AnnalynsInfiltrationAnalyzer.java @@ -0,0 +1,67 @@ +package analyzer.exercises.annalynsinfiltration; + +import analyzer.Analyzer; +import analyzer.OutputCollector; +import analyzer.Solution; +import analyzer.comments.ExemplarSolution; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.expr.BinaryExpr; +import com.github.javaparser.ast.expr.BooleanLiteralExpr; +import com.github.javaparser.ast.expr.EnclosedExpr; +import com.github.javaparser.ast.stmt.IfStmt; +import com.github.javaparser.ast.stmt.ReturnStmt; +import com.github.javaparser.ast.visitor.VoidVisitorAdapter; + +/** + * The {@link AnnalynsInfiltrationAnalyzer} is the analyzer implementation for the {@code annalyns-infiltration} practice exercise. + * It extends from the {@link VoidVisitorAdapter} and uses the visitor pattern to traverse each compilation unit. + * + * @see The Annalyns Infiltration exercise on the Java track + */ +public class AnnalynsInfiltrationAnalyzer extends VoidVisitorAdapter implements Analyzer { + private static final String EXERCISE_NAME = "Annalyn's Infiltration"; + + @Override + public void analyze(Solution solution, OutputCollector output) { + for (CompilationUnit compilationUnit : solution.getCompilationUnits()) { + compilationUnit.accept(this, output); + } + + if (output.getComments().isEmpty()) { + output.addComment(new ExemplarSolution(EXERCISE_NAME)); + } + } + + @Override + public void visit(IfStmt node, OutputCollector output) { + output.addComment(new AvoidIfStatements()); + super.visit(node, output); + } + + @Override + public void visit(ReturnStmt node, OutputCollector output) { + if (node.getExpression().isPresent() && node.getExpression().get() instanceof BooleanLiteralExpr) { + output.addComment(new AvoidBooleanLiteralReturns()); + } + super.visit(node, output); + } + + @Override + public void visit(BinaryExpr node, OutputCollector output) { + if (node.getOperator().equals(BinaryExpr.Operator.OR)) { + for (Node childNode : node.getChildNodes()) { + if (childNode instanceof EnclosedExpr + && ((EnclosedExpr) childNode).getInner() instanceof BinaryExpr + && ((BinaryExpr) ((EnclosedExpr) childNode).getInner()).getOperator().equals(BinaryExpr.Operator.AND)) { + output.addComment(new RedundantParentheses()); + } + } + } + if (node.getOperator().equals(BinaryExpr.Operator.EQUALS) + && (node.getLeft() instanceof BooleanLiteralExpr || node.getRight() instanceof BooleanLiteralExpr)) { + output.addComment(new AvoidComparisonWithLiteral()); + } + super.visit(node, output); + } +} diff --git a/src/main/java/analyzer/exercises/annalynsinfiltration/AvoidBooleanLiteralReturns.java b/src/main/java/analyzer/exercises/annalynsinfiltration/AvoidBooleanLiteralReturns.java new file mode 100644 index 00000000..c96c1c46 --- /dev/null +++ b/src/main/java/analyzer/exercises/annalynsinfiltration/AvoidBooleanLiteralReturns.java @@ -0,0 +1,18 @@ +package analyzer.exercises.annalynsinfiltration; + +import analyzer.Comment; + +/** + * @see Markdown Template + */ +public class AvoidBooleanLiteralReturns extends Comment { + @Override + public String getKey() { + return "java.annalyns-infiltration.avoid_boolean_literal_returns"; + } + + @Override + public Type getType() { + return Type.ESSENTIAL; + } +} diff --git a/src/main/java/analyzer/exercises/annalynsinfiltration/AvoidComparisonWithLiteral.java b/src/main/java/analyzer/exercises/annalynsinfiltration/AvoidComparisonWithLiteral.java new file mode 100644 index 00000000..2d49eb49 --- /dev/null +++ b/src/main/java/analyzer/exercises/annalynsinfiltration/AvoidComparisonWithLiteral.java @@ -0,0 +1,18 @@ +package analyzer.exercises.annalynsinfiltration; + +import analyzer.Comment; + +/** + * @see Markdown Template + */ +public class AvoidComparisonWithLiteral extends Comment { + @Override + public String getKey() { + return "java.annalyns-infiltration.avoid_comparison_with_literal"; + } + + @Override + public Type getType() { + return Type.ESSENTIAL; + } +} diff --git a/src/main/java/analyzer/exercises/annalynsinfiltration/AvoidIfStatements.java b/src/main/java/analyzer/exercises/annalynsinfiltration/AvoidIfStatements.java new file mode 100644 index 00000000..c65792c1 --- /dev/null +++ b/src/main/java/analyzer/exercises/annalynsinfiltration/AvoidIfStatements.java @@ -0,0 +1,18 @@ +package analyzer.exercises.annalynsinfiltration; + +import analyzer.Comment; + +/** + * @see Markdown Template + */ +public class AvoidIfStatements extends Comment { + @Override + public String getKey() { + return "java.annalyns-infiltration.avoid_if_statements"; + } + + @Override + public Type getType() { + return Type.ESSENTIAL; + } +} diff --git a/src/main/java/analyzer/exercises/annalynsinfiltration/RedundantParentheses.java b/src/main/java/analyzer/exercises/annalynsinfiltration/RedundantParentheses.java new file mode 100644 index 00000000..5b3d2c6e --- /dev/null +++ b/src/main/java/analyzer/exercises/annalynsinfiltration/RedundantParentheses.java @@ -0,0 +1,18 @@ +package analyzer.exercises.annalynsinfiltration; + +import analyzer.Comment; + +/** + * @see Markdown Template + */ +public class RedundantParentheses extends Comment { + @Override + public String getKey() { + return "java.annalyns-infiltration.some_parentheses_are_redundant"; + } + + @Override + public Type getType() { + return Type.INFORMATIVE; + } +} diff --git a/src/test/java/analyzer/AnalyzerIntegrationTest.java b/src/test/java/analyzer/AnalyzerIntegrationTest.java index 321c6a8a..b040708d 100644 --- a/src/test/java/analyzer/AnalyzerIntegrationTest.java +++ b/src/test/java/analyzer/AnalyzerIntegrationTest.java @@ -97,4 +97,20 @@ public void twofer(String scenario) throws IOException { Approvals.verify(serialize(output.analysis()), Approvals.NAMES.withParameters(scenario)); } + + @ParameterizedTest + @ValueSource(strings = { + "Optimal", + "ComparingBooleanWithLiteral", + "ReturningBooleanLiteral", + "UsingIfStatement", + "UsingRedundantParenthesis", + }) + public void annalynsinfiltration(String scenario) throws IOException { + var path = Path.of("annalynsinfiltration", scenario + ".java"); + var solution = new SolutionFromFiles("annalyns-infiltration", SCENARIOS.resolve(path)); + var output = AnalyzerRoot.analyze(solution); + + Approvals.verify(serialize(output.analysis()), Approvals.NAMES.withParameters(scenario)); + } } diff --git a/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.ComparingBooleanWithLiteral.approved.txt b/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.ComparingBooleanWithLiteral.approved.txt new file mode 100644 index 00000000..77b7fc2e --- /dev/null +++ b/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.ComparingBooleanWithLiteral.approved.txt @@ -0,0 +1,14 @@ +{ + "comments": [ + { + "comment": "java.annalyns-infiltration.avoid_comparison_with_literal", + "params": {}, + "type": "essential" + }, + { + "comment": "java.general.feedback_request", + "params": {}, + "type": "informative" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.Optimal.approved.txt b/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.Optimal.approved.txt new file mode 100644 index 00000000..0130a34f --- /dev/null +++ b/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.Optimal.approved.txt @@ -0,0 +1,11 @@ +{ + "comments": [ + { + "comment": "java.general.exemplar", + "params": { + "exerciseName": "Annalyn\u0027s Infiltration" + }, + "type": "celebratory" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.ReturningBooleanLiteral.approved.txt b/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.ReturningBooleanLiteral.approved.txt new file mode 100644 index 00000000..09c7e6ba --- /dev/null +++ b/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.ReturningBooleanLiteral.approved.txt @@ -0,0 +1,19 @@ +{ + "comments": [ + { + "comment": "java.annalyns-infiltration.avoid_if_statements", + "params": {}, + "type": "essential" + }, + { + "comment": "java.annalyns-infiltration.avoid_boolean_literal_returns", + "params": {}, + "type": "essential" + }, + { + "comment": "java.general.feedback_request", + "params": {}, + "type": "informative" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.UsingIfStatement.approved.txt b/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.UsingIfStatement.approved.txt new file mode 100644 index 00000000..09c7e6ba --- /dev/null +++ b/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.UsingIfStatement.approved.txt @@ -0,0 +1,19 @@ +{ + "comments": [ + { + "comment": "java.annalyns-infiltration.avoid_if_statements", + "params": {}, + "type": "essential" + }, + { + "comment": "java.annalyns-infiltration.avoid_boolean_literal_returns", + "params": {}, + "type": "essential" + }, + { + "comment": "java.general.feedback_request", + "params": {}, + "type": "informative" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.UsingRedundantParenthesis.approved.txt b/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.UsingRedundantParenthesis.approved.txt new file mode 100644 index 00000000..e8f73e0a --- /dev/null +++ b/src/test/resources/analyzer/AnalyzerIntegrationTest.annalynsinfiltration.UsingRedundantParenthesis.approved.txt @@ -0,0 +1,14 @@ +{ + "comments": [ + { + "comment": "java.annalyns-infiltration.some_parentheses_are_redundant", + "params": {}, + "type": "informative" + }, + { + "comment": "java.general.feedback_request", + "params": {}, + "type": "informative" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/scenarios/annalynsinfiltration/ComparingBooleanWithLiteral.java b/src/test/resources/scenarios/annalynsinfiltration/ComparingBooleanWithLiteral.java new file mode 100644 index 00000000..76759eaa --- /dev/null +++ b/src/test/resources/scenarios/annalynsinfiltration/ComparingBooleanWithLiteral.java @@ -0,0 +1,17 @@ +class AnnalynsInfiltration { + public static boolean canFastAttack(boolean knightIsAwake) { + return !knightIsAwake; + } + + public static boolean canSpy(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake) { + return knightIsAwake || archerIsAwake || prisonerIsAwake; + } + + public static boolean canSignalPrisoner(boolean archerIsAwake, boolean prisonerIsAwake) { + return prisonerIsAwake == true && archerIsAwake == false; + } + + public static boolean canFreePrisoner(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake, boolean petDogIsPresent) { + return !archerIsAwake && (petDogIsPresent || prisonerIsAwake && !knightIsAwake); + } +} diff --git a/src/test/resources/scenarios/annalynsinfiltration/Optimal.java b/src/test/resources/scenarios/annalynsinfiltration/Optimal.java new file mode 100644 index 00000000..162524ad --- /dev/null +++ b/src/test/resources/scenarios/annalynsinfiltration/Optimal.java @@ -0,0 +1,17 @@ +class AnnalynsInfiltration { + public static boolean canFastAttack(boolean knightIsAwake) { + return !knightIsAwake; + } + + public static boolean canSpy(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake) { + return knightIsAwake || archerIsAwake || prisonerIsAwake; + } + + public static boolean canSignalPrisoner(boolean archerIsAwake, boolean prisonerIsAwake) { + return prisonerIsAwake && !archerIsAwake; + } + + public static boolean canFreePrisoner(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake, boolean petDogIsPresent) { + return !archerIsAwake && (petDogIsPresent || prisonerIsAwake && !knightIsAwake); + } +} diff --git a/src/test/resources/scenarios/annalynsinfiltration/ReturningBooleanLiteral.java b/src/test/resources/scenarios/annalynsinfiltration/ReturningBooleanLiteral.java new file mode 100644 index 00000000..f60d80ac --- /dev/null +++ b/src/test/resources/scenarios/annalynsinfiltration/ReturningBooleanLiteral.java @@ -0,0 +1,20 @@ +class AnnalynsInfiltration { + public static boolean canFastAttack(boolean knightIsAwake) { + return !knightIsAwake; + } + + public static boolean canSpy(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake) { + if(knightIsAwake) return true; + if(archerIsAwake) return true; + if(prisonerIsAwake) return true; + return false; + } + + public static boolean canSignalPrisoner(boolean archerIsAwake, boolean prisonerIsAwake) { + return prisonerIsAwake && !archerIsAwake; + } + + public static boolean canFreePrisoner(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake, boolean petDogIsPresent) { + return !archerIsAwake && (petDogIsPresent || prisonerIsAwake && !knightIsAwake); + } +} diff --git a/src/test/resources/scenarios/annalynsinfiltration/UsingIfStatement.java b/src/test/resources/scenarios/annalynsinfiltration/UsingIfStatement.java new file mode 100644 index 00000000..a44758f4 --- /dev/null +++ b/src/test/resources/scenarios/annalynsinfiltration/UsingIfStatement.java @@ -0,0 +1,20 @@ +class AnnalynsInfiltration { + public static boolean canFastAttack(boolean knightIsAwake) { + return !knightIsAwake; + } + + public static boolean canSpy(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake) { + return knightIsAwake || archerIsAwake || prisonerIsAwake; + } + + public static boolean canSignalPrisoner(boolean archerIsAwake, boolean prisonerIsAwake) { + return prisonerIsAwake && !archerIsAwake; + } + + public static boolean canFreePrisoner(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake, boolean petDogIsPresent) { + if(!archerIsAwake){ + return petDogIsPresent || prisonerIsAwake && !knightIsAwake; + } + return false; + } +} diff --git a/src/test/resources/scenarios/annalynsinfiltration/UsingRedundantParenthesis.java b/src/test/resources/scenarios/annalynsinfiltration/UsingRedundantParenthesis.java new file mode 100644 index 00000000..953cd69f --- /dev/null +++ b/src/test/resources/scenarios/annalynsinfiltration/UsingRedundantParenthesis.java @@ -0,0 +1,17 @@ +class AnnalynsInfiltration { + public static boolean canFastAttack(boolean knightIsAwake) { + return !knightIsAwake; + } + + public static boolean canSpy(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake) { + return knightIsAwake || archerIsAwake || prisonerIsAwake; + } + + public static boolean canSignalPrisoner(boolean archerIsAwake, boolean prisonerIsAwake) { + return prisonerIsAwake && !archerIsAwake; + } + + public static boolean canFreePrisoner(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake, boolean petDogIsPresent) { + return !archerIsAwake && (petDogIsPresent || (prisonerIsAwake && !knightIsAwake)); + } +} diff --git a/tests/annalyns-infiltration/comparing-boolean-with-literal/.meta/config.json b/tests/annalyns-infiltration/comparing-boolean-with-literal/.meta/config.json new file mode 100644 index 00000000..45d7e8b6 --- /dev/null +++ b/tests/annalyns-infiltration/comparing-boolean-with-literal/.meta/config.json @@ -0,0 +1,23 @@ +{ + "authors": [ + "mikedamay" + ], + "files": { + "solution": [ + "src/main/java/AnnalynsInfiltration.java" + ], + "test": [ + "src/test/java/AnnalynsInfiltrationTest.java" + ], + "exemplar": [ + ".meta/src/reference/java/AnnalynsInfiltration.java" + ], + "invalidator": [ + "build.gradle" + ] + }, + "forked_from": [ + "csharp/annalyns-infiltration" + ], + "blurb": "Learn about booleans while helping Annalyn rescue her friend." +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/comparing-boolean-with-literal/expected_analysis.json b/tests/annalyns-infiltration/comparing-boolean-with-literal/expected_analysis.json new file mode 100644 index 00000000..77b7fc2e --- /dev/null +++ b/tests/annalyns-infiltration/comparing-boolean-with-literal/expected_analysis.json @@ -0,0 +1,14 @@ +{ + "comments": [ + { + "comment": "java.annalyns-infiltration.avoid_comparison_with_literal", + "params": {}, + "type": "essential" + }, + { + "comment": "java.general.feedback_request", + "params": {}, + "type": "informative" + } + ] +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/comparing-boolean-with-literal/expected_tags.json b/tests/annalyns-infiltration/comparing-boolean-with-literal/expected_tags.json new file mode 100644 index 00000000..eb25b190 --- /dev/null +++ b/tests/annalyns-infiltration/comparing-boolean-with-literal/expected_tags.json @@ -0,0 +1,3 @@ +{ + "tags": [] +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/comparing-boolean-with-literal/src/main/java/AnnalynsInfiltration.java b/tests/annalyns-infiltration/comparing-boolean-with-literal/src/main/java/AnnalynsInfiltration.java new file mode 100644 index 00000000..76759eaa --- /dev/null +++ b/tests/annalyns-infiltration/comparing-boolean-with-literal/src/main/java/AnnalynsInfiltration.java @@ -0,0 +1,17 @@ +class AnnalynsInfiltration { + public static boolean canFastAttack(boolean knightIsAwake) { + return !knightIsAwake; + } + + public static boolean canSpy(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake) { + return knightIsAwake || archerIsAwake || prisonerIsAwake; + } + + public static boolean canSignalPrisoner(boolean archerIsAwake, boolean prisonerIsAwake) { + return prisonerIsAwake == true && archerIsAwake == false; + } + + public static boolean canFreePrisoner(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake, boolean petDogIsPresent) { + return !archerIsAwake && (petDogIsPresent || prisonerIsAwake && !knightIsAwake); + } +} diff --git a/tests/annalyns-infiltration/exemplar-solution/.meta/config.json b/tests/annalyns-infiltration/exemplar-solution/.meta/config.json new file mode 100644 index 00000000..45d7e8b6 --- /dev/null +++ b/tests/annalyns-infiltration/exemplar-solution/.meta/config.json @@ -0,0 +1,23 @@ +{ + "authors": [ + "mikedamay" + ], + "files": { + "solution": [ + "src/main/java/AnnalynsInfiltration.java" + ], + "test": [ + "src/test/java/AnnalynsInfiltrationTest.java" + ], + "exemplar": [ + ".meta/src/reference/java/AnnalynsInfiltration.java" + ], + "invalidator": [ + "build.gradle" + ] + }, + "forked_from": [ + "csharp/annalyns-infiltration" + ], + "blurb": "Learn about booleans while helping Annalyn rescue her friend." +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/exemplar-solution/expected_analysis.json b/tests/annalyns-infiltration/exemplar-solution/expected_analysis.json new file mode 100644 index 00000000..0130a34f --- /dev/null +++ b/tests/annalyns-infiltration/exemplar-solution/expected_analysis.json @@ -0,0 +1,11 @@ +{ + "comments": [ + { + "comment": "java.general.exemplar", + "params": { + "exerciseName": "Annalyn\u0027s Infiltration" + }, + "type": "celebratory" + } + ] +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/exemplar-solution/expected_tags.json b/tests/annalyns-infiltration/exemplar-solution/expected_tags.json new file mode 100644 index 00000000..eb25b190 --- /dev/null +++ b/tests/annalyns-infiltration/exemplar-solution/expected_tags.json @@ -0,0 +1,3 @@ +{ + "tags": [] +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/exemplar-solution/src/main/java/AnnalynsInfiltration.java b/tests/annalyns-infiltration/exemplar-solution/src/main/java/AnnalynsInfiltration.java new file mode 100644 index 00000000..162524ad --- /dev/null +++ b/tests/annalyns-infiltration/exemplar-solution/src/main/java/AnnalynsInfiltration.java @@ -0,0 +1,17 @@ +class AnnalynsInfiltration { + public static boolean canFastAttack(boolean knightIsAwake) { + return !knightIsAwake; + } + + public static boolean canSpy(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake) { + return knightIsAwake || archerIsAwake || prisonerIsAwake; + } + + public static boolean canSignalPrisoner(boolean archerIsAwake, boolean prisonerIsAwake) { + return prisonerIsAwake && !archerIsAwake; + } + + public static boolean canFreePrisoner(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake, boolean petDogIsPresent) { + return !archerIsAwake && (petDogIsPresent || prisonerIsAwake && !knightIsAwake); + } +} diff --git a/tests/annalyns-infiltration/returning-boolean-literal/.meta/config.json b/tests/annalyns-infiltration/returning-boolean-literal/.meta/config.json new file mode 100644 index 00000000..45d7e8b6 --- /dev/null +++ b/tests/annalyns-infiltration/returning-boolean-literal/.meta/config.json @@ -0,0 +1,23 @@ +{ + "authors": [ + "mikedamay" + ], + "files": { + "solution": [ + "src/main/java/AnnalynsInfiltration.java" + ], + "test": [ + "src/test/java/AnnalynsInfiltrationTest.java" + ], + "exemplar": [ + ".meta/src/reference/java/AnnalynsInfiltration.java" + ], + "invalidator": [ + "build.gradle" + ] + }, + "forked_from": [ + "csharp/annalyns-infiltration" + ], + "blurb": "Learn about booleans while helping Annalyn rescue her friend." +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/returning-boolean-literal/expected_analysis.json b/tests/annalyns-infiltration/returning-boolean-literal/expected_analysis.json new file mode 100644 index 00000000..09c7e6ba --- /dev/null +++ b/tests/annalyns-infiltration/returning-boolean-literal/expected_analysis.json @@ -0,0 +1,19 @@ +{ + "comments": [ + { + "comment": "java.annalyns-infiltration.avoid_if_statements", + "params": {}, + "type": "essential" + }, + { + "comment": "java.annalyns-infiltration.avoid_boolean_literal_returns", + "params": {}, + "type": "essential" + }, + { + "comment": "java.general.feedback_request", + "params": {}, + "type": "informative" + } + ] +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/returning-boolean-literal/expected_tags.json b/tests/annalyns-infiltration/returning-boolean-literal/expected_tags.json new file mode 100644 index 00000000..eb25b190 --- /dev/null +++ b/tests/annalyns-infiltration/returning-boolean-literal/expected_tags.json @@ -0,0 +1,3 @@ +{ + "tags": [] +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/returning-boolean-literal/src/main/java/AnnalynsInfiltration.java b/tests/annalyns-infiltration/returning-boolean-literal/src/main/java/AnnalynsInfiltration.java new file mode 100644 index 00000000..f60d80ac --- /dev/null +++ b/tests/annalyns-infiltration/returning-boolean-literal/src/main/java/AnnalynsInfiltration.java @@ -0,0 +1,20 @@ +class AnnalynsInfiltration { + public static boolean canFastAttack(boolean knightIsAwake) { + return !knightIsAwake; + } + + public static boolean canSpy(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake) { + if(knightIsAwake) return true; + if(archerIsAwake) return true; + if(prisonerIsAwake) return true; + return false; + } + + public static boolean canSignalPrisoner(boolean archerIsAwake, boolean prisonerIsAwake) { + return prisonerIsAwake && !archerIsAwake; + } + + public static boolean canFreePrisoner(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake, boolean petDogIsPresent) { + return !archerIsAwake && (petDogIsPresent || prisonerIsAwake && !knightIsAwake); + } +} diff --git a/tests/annalyns-infiltration/using-if-statement/.meta/config.json b/tests/annalyns-infiltration/using-if-statement/.meta/config.json new file mode 100644 index 00000000..45d7e8b6 --- /dev/null +++ b/tests/annalyns-infiltration/using-if-statement/.meta/config.json @@ -0,0 +1,23 @@ +{ + "authors": [ + "mikedamay" + ], + "files": { + "solution": [ + "src/main/java/AnnalynsInfiltration.java" + ], + "test": [ + "src/test/java/AnnalynsInfiltrationTest.java" + ], + "exemplar": [ + ".meta/src/reference/java/AnnalynsInfiltration.java" + ], + "invalidator": [ + "build.gradle" + ] + }, + "forked_from": [ + "csharp/annalyns-infiltration" + ], + "blurb": "Learn about booleans while helping Annalyn rescue her friend." +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/using-if-statement/expected_analysis.json b/tests/annalyns-infiltration/using-if-statement/expected_analysis.json new file mode 100644 index 00000000..09c7e6ba --- /dev/null +++ b/tests/annalyns-infiltration/using-if-statement/expected_analysis.json @@ -0,0 +1,19 @@ +{ + "comments": [ + { + "comment": "java.annalyns-infiltration.avoid_if_statements", + "params": {}, + "type": "essential" + }, + { + "comment": "java.annalyns-infiltration.avoid_boolean_literal_returns", + "params": {}, + "type": "essential" + }, + { + "comment": "java.general.feedback_request", + "params": {}, + "type": "informative" + } + ] +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/using-if-statement/expected_tags.json b/tests/annalyns-infiltration/using-if-statement/expected_tags.json new file mode 100644 index 00000000..eb25b190 --- /dev/null +++ b/tests/annalyns-infiltration/using-if-statement/expected_tags.json @@ -0,0 +1,3 @@ +{ + "tags": [] +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/using-if-statement/src/main/java/AnnalynsInfiltration.java b/tests/annalyns-infiltration/using-if-statement/src/main/java/AnnalynsInfiltration.java new file mode 100644 index 00000000..a44758f4 --- /dev/null +++ b/tests/annalyns-infiltration/using-if-statement/src/main/java/AnnalynsInfiltration.java @@ -0,0 +1,20 @@ +class AnnalynsInfiltration { + public static boolean canFastAttack(boolean knightIsAwake) { + return !knightIsAwake; + } + + public static boolean canSpy(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake) { + return knightIsAwake || archerIsAwake || prisonerIsAwake; + } + + public static boolean canSignalPrisoner(boolean archerIsAwake, boolean prisonerIsAwake) { + return prisonerIsAwake && !archerIsAwake; + } + + public static boolean canFreePrisoner(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake, boolean petDogIsPresent) { + if(!archerIsAwake){ + return petDogIsPresent || prisonerIsAwake && !knightIsAwake; + } + return false; + } +} diff --git a/tests/annalyns-infiltration/using-redundant-parenthesis/.meta/config.json b/tests/annalyns-infiltration/using-redundant-parenthesis/.meta/config.json new file mode 100644 index 00000000..45d7e8b6 --- /dev/null +++ b/tests/annalyns-infiltration/using-redundant-parenthesis/.meta/config.json @@ -0,0 +1,23 @@ +{ + "authors": [ + "mikedamay" + ], + "files": { + "solution": [ + "src/main/java/AnnalynsInfiltration.java" + ], + "test": [ + "src/test/java/AnnalynsInfiltrationTest.java" + ], + "exemplar": [ + ".meta/src/reference/java/AnnalynsInfiltration.java" + ], + "invalidator": [ + "build.gradle" + ] + }, + "forked_from": [ + "csharp/annalyns-infiltration" + ], + "blurb": "Learn about booleans while helping Annalyn rescue her friend." +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/using-redundant-parenthesis/expected_analysis.json b/tests/annalyns-infiltration/using-redundant-parenthesis/expected_analysis.json new file mode 100644 index 00000000..e8f73e0a --- /dev/null +++ b/tests/annalyns-infiltration/using-redundant-parenthesis/expected_analysis.json @@ -0,0 +1,14 @@ +{ + "comments": [ + { + "comment": "java.annalyns-infiltration.some_parentheses_are_redundant", + "params": {}, + "type": "informative" + }, + { + "comment": "java.general.feedback_request", + "params": {}, + "type": "informative" + } + ] +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/using-redundant-parenthesis/expected_tags.json b/tests/annalyns-infiltration/using-redundant-parenthesis/expected_tags.json new file mode 100644 index 00000000..eb25b190 --- /dev/null +++ b/tests/annalyns-infiltration/using-redundant-parenthesis/expected_tags.json @@ -0,0 +1,3 @@ +{ + "tags": [] +} \ No newline at end of file diff --git a/tests/annalyns-infiltration/using-redundant-parenthesis/src/main/java/AnnalynsInfiltration.java b/tests/annalyns-infiltration/using-redundant-parenthesis/src/main/java/AnnalynsInfiltration.java new file mode 100644 index 00000000..953cd69f --- /dev/null +++ b/tests/annalyns-infiltration/using-redundant-parenthesis/src/main/java/AnnalynsInfiltration.java @@ -0,0 +1,17 @@ +class AnnalynsInfiltration { + public static boolean canFastAttack(boolean knightIsAwake) { + return !knightIsAwake; + } + + public static boolean canSpy(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake) { + return knightIsAwake || archerIsAwake || prisonerIsAwake; + } + + public static boolean canSignalPrisoner(boolean archerIsAwake, boolean prisonerIsAwake) { + return prisonerIsAwake && !archerIsAwake; + } + + public static boolean canFreePrisoner(boolean knightIsAwake, boolean archerIsAwake, boolean prisonerIsAwake, boolean petDogIsPresent) { + return !archerIsAwake && (petDogIsPresent || (prisonerIsAwake && !knightIsAwake)); + } +}