Skip to content

Commit

Permalink
Merge branch 'main' into ImplementAnalyzerForNeedForSpeed
Browse files Browse the repository at this point in the history
  • Loading branch information
manumafe98 authored Feb 16, 2024
2 parents b41507e + 898a1f2 commit 92e12b1
Show file tree
Hide file tree
Showing 37 changed files with 624 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/main/java/analyzer/AnalyzerRoot.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -46,6 +47,7 @@ private static List<Analyzer> 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());
Expand Down
Original file line number Diff line number Diff line change
@@ -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 <a href="https://github.com/exercism/java/tree/main/exercises/practice/annalyns-infiltration">The Annalyns Infiltration exercise on the Java track</a>
*/
public class AnnalynsInfiltrationAnalyzer extends VoidVisitorAdapter<OutputCollector> 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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package analyzer.exercises.annalynsinfiltration;

import analyzer.Comment;

/**
* @see <a href="https://github.com/exercism/website-copy/blob/main/analyzer-comments/java/annalyns-infiltration/avoid_boolean_literal_returns.md">Markdown Template</a>
*/
public class AvoidBooleanLiteralReturns extends Comment {
@Override
public String getKey() {
return "java.annalyns-infiltration.avoid_boolean_literal_returns";
}

@Override
public Type getType() {
return Type.ESSENTIAL;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package analyzer.exercises.annalynsinfiltration;

import analyzer.Comment;

/**
* @see <a href="https://github.com/exercism/website-copy/blob/main/analyzer-comments/java/annalyns-infiltration/avoid_comparison_with_literal.md">Markdown Template</a>
*/
public class AvoidComparisonWithLiteral extends Comment {
@Override
public String getKey() {
return "java.annalyns-infiltration.avoid_comparison_with_literal";
}

@Override
public Type getType() {
return Type.ESSENTIAL;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package analyzer.exercises.annalynsinfiltration;

import analyzer.Comment;

/**
* @see <a href="https://github.com/exercism/website-copy/blob/main/analyzer-comments/java/annalyns-infiltration/avoid_if_statements.md">Markdown Template</a>
*/
public class AvoidIfStatements extends Comment {
@Override
public String getKey() {
return "java.annalyns-infiltration.avoid_if_statements";
}

@Override
public Type getType() {
return Type.ESSENTIAL;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package analyzer.exercises.annalynsinfiltration;

import analyzer.Comment;

/**
* @see <a href="https://github.com/exercism/website-copy/blob/main/analyzer-comments/java/annalyns-infiltration/some_parentheses_are_redundant.md">Markdown Template</a>
*/
public class RedundantParentheses extends Comment {
@Override
public String getKey() {
return "java.annalyns-infiltration.some_parentheses_are_redundant";
}

@Override
public Type getType() {
return Type.INFORMATIVE;
}
}
18 changes: 17 additions & 1 deletion src/test/java/analyzer/AnalyzerIntegrationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,22 @@ 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));
}

@ParameterizedTest
@ValueSource(strings = {
"ExemplarSolution",
Expand All @@ -110,7 +126,7 @@ void needforspeed(String scenario) throws IOException {
var path = Path.of("need-for-speed", scenario + ".java");
var solution = new SolutionFromFiles("need-for-speed", SCENARIOS.resolve(path));
var output = AnalyzerRoot.analyze(solution);

Approvals.verify(serialize(output.analysis()), Approvals.NAMES.withParameters(scenario));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"comments": [
{
"comment": "java.annalyns-infiltration.avoid_comparison_with_literal",
"params": {},
"type": "essential"
},
{
"comment": "java.general.feedback_request",
"params": {},
"type": "informative"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"comments": [
{
"comment": "java.general.exemplar",
"params": {
"exerciseName": "Annalyn\u0027s Infiltration"
},
"type": "celebratory"
}
]
}
Original file line number Diff line number Diff line change
@@ -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"
}
]
}
Original file line number Diff line number Diff line change
@@ -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"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"comments": [
{
"comment": "java.annalyns-infiltration.some_parentheses_are_redundant",
"params": {},
"type": "informative"
},
{
"comment": "java.general.feedback_request",
"params": {},
"type": "informative"
}
]
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
17 changes: 17 additions & 0 deletions src/test/resources/scenarios/annalynsinfiltration/Optimal.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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));
}
}
Original file line number Diff line number Diff line change
@@ -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."
}
Loading

0 comments on commit 92e12b1

Please sign in to comment.