// Path: src/main/java/org/tsers/junitquest/expr/AddNode.java
// public class AddNode extends ExprNode {
// 
//     public AddNode(List<ExprNode> children) {
//         super(children);
//     }
// 
//     @Override
//     public ExprNode copy(List<ExprNode> newchildren) {
//         return new AddNode(newchildren);
//     }
// 
//     @Override
//     public boolean equals(ExprNode exprNode) {
//         if (exprNode.getClass().equals(this.getClass())) {
//             return childrenEquals(exprNode.getChildren());
//         }
//         return false;
//     }
// }
// 
// Path: src/main/java/org/tsers/junitquest/expr/AndNode.java
// public class AndNode extends ExprNode {
// 
//     public AndNode(List<ExprNode> children) {
//         super(children);
//     }
// 
//     @Override
//     public ExprNode copy(List<ExprNode> newchildren) {
//         return new AndNode(newchildren);
//     }
// 
//     @Override
//     public boolean equals(ExprNode exprNode) {
//         if (exprNode.getClass().equals(this.getClass())) {
//             return childrenEquals(exprNode.getChildren());
//         }
//         return false;
//     }
// 
// }
// 
// Path: src/main/java/org/tsers/junitquest/expr/ExprNode.java
// public abstract class ExprNode {
// 
//     private final List<ExprNode> children;
// 
//     public ExprNode(List<ExprNode> children) {
//         this.children = children;
//     }
// 
//     public List<ExprNode> getChildren() {
//         return children;
//     }
// 
//     abstract public ExprNode copy(List<ExprNode> newchildren);
// 
//     abstract public boolean equals(ExprNode exprNode);
// 
//     public boolean childrenEquals(List<ExprNode> otherChildren) {
//         if (otherChildren.size() != children.size()) {
//             return false;
//         }
//         for (int i = 0; i < children.size(); i++) {
//             ExprNode a = children.get(i);
//             ExprNode b = otherChildren.get(i);
//             if (!a.equals(b)) {
//                 return false;
//             }
//         }
//         return true;
//     }
// 
// }
// 
// Path: src/main/java/org/tsers/junitquest/expr/IntNode.java
// public class IntNode extends ConstantNode {
// 
//     final int value;
// 
//     public IntNode(int value) {
//         super();
//         this.value = value;
//     }
// 
//     public int getValue() {
//         return this.value;
//     }
// 
//     @Override
//     public ExprNode copy(List<ExprNode> newchildren) {
//         return new IntNode(value);
//     }
// 
//     @Override
//     public boolean equals(ExprNode exprNode) {
//         if (exprNode.getClass().equals(this.getClass())) {
//             return ((IntNode) exprNode).getValue() == value;
//         }
//         return false;
//     }
// 
// }


import org.tsers.junitquest.expr.AddNode;
import org.tsers.junitquest.expr.AndNode;
import org.tsers.junitquest.expr.ExprNode;
import org.tsers.junitquest.expr.IntNode;
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
package org.tsers.junitquest.solver;





public class LogicalSolverTest {

    ExprNode baseAnd = new AndNode(
            Arrays.asList(new IntNode(555), new IntNode(666))
    );

    @Test
    public void testcombineANDs() {

        ExprNode newAndNode = LogicalSolver.combineANDs.apply(baseAnd);

        assertEquals(2, newAndNode.getChildren().size());
    }

    @Test
    public void testcombineANDs2() {

        ExprNode andNode = new AndNode(Arrays.asList(
                new AndNode(
                        Arrays.asList(baseAnd)
                )));
// Path: src/main/java/org/tsers/junitquest/expr/AddNode.java
// public class AddNode extends ExprNode {
// 
//     public AddNode(List<ExprNode> children) {
//         super(children);
//     }
// 
//     @Override
//     public ExprNode copy(List<ExprNode> newchildren) {
//         return new AddNode(newchildren);
//     }
// 
//     @Override
//     public boolean equals(ExprNode exprNode) {
//         if (exprNode.getClass().equals(this.getClass())) {
//             return childrenEquals(exprNode.getChildren());
//         }
//         return false;
//     }
// }
// 
// Path: src/main/java/org/tsers/junitquest/expr/AndNode.java
// public class AndNode extends ExprNode {
// 
//     public AndNode(List<ExprNode> children) {
//         super(children);
//     }
// 
//     @Override
//     public ExprNode copy(List<ExprNode> newchildren) {
//         return new AndNode(newchildren);
//     }
// 
//     @Override
//     public boolean equals(ExprNode exprNode) {
//         if (exprNode.getClass().equals(this.getClass())) {
//             return childrenEquals(exprNode.getChildren());
//         }
//         return false;
//     }
// 
// }
// 
// Path: src/main/java/org/tsers/junitquest/expr/ExprNode.java
// public abstract class ExprNode {
// 
//     private final List<ExprNode> children;
// 
//     public ExprNode(List<ExprNode> children) {
//         this.children = children;
//     }
// 
//     public List<ExprNode> getChildren() {
//         return children;
//     }
// 
//     abstract public ExprNode copy(List<ExprNode> newchildren);
// 
//     abstract public boolean equals(ExprNode exprNode);
// 
//     public boolean childrenEquals(List<ExprNode> otherChildren) {
//         if (otherChildren.size() != children.size()) {
//             return false;
//         }
//         for (int i = 0; i < children.size(); i++) {
//             ExprNode a = children.get(i);
//             ExprNode b = otherChildren.get(i);
//             if (!a.equals(b)) {
//                 return false;
//             }
//         }
//         return true;
//     }
// 
// }
// 
// Path: src/main/java/org/tsers/junitquest/expr/IntNode.java
// public class IntNode extends ConstantNode {
// 
//     final int value;
// 
//     public IntNode(int value) {
//         super();
//         this.value = value;
//     }
// 
//     public int getValue() {
//         return this.value;
//     }
// 
//     @Override
//     public ExprNode copy(List<ExprNode> newchildren) {
//         return new IntNode(value);
//     }
// 
//     @Override
//     public boolean equals(ExprNode exprNode) {
//         if (exprNode.getClass().equals(this.getClass())) {
//             return ((IntNode) exprNode).getValue() == value;
//         }
//         return false;
//     }
// 
// }


// Path: src/test/java/org/tsers/junitquest/solver/LogicalSolverTest.java
import org.tsers.junitquest.expr.AddNode;
import org.tsers.junitquest.expr.AndNode;
import org.tsers.junitquest.expr.ExprNode;
import org.tsers.junitquest.expr.IntNode;
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;

package org.tsers.junitquest.solver;





public class LogicalSolverTest {

    ExprNode baseAnd = new AndNode(
            Arrays.asList(new IntNode(555), new IntNode(666))
    );

    @Test
    public void testcombineANDs() {

        ExprNode newAndNode = LogicalSolver.combineANDs.apply(baseAnd);

        assertEquals(2, newAndNode.getChildren().size());
    }

    @Test
    public void testcombineANDs2() {

        ExprNode andNode = new AndNode(Arrays.asList(
                new AndNode(
                        Arrays.asList(baseAnd)
                )));
        ExprNode newAndNode = LogicalSolver.combineANDs.apply(andNode);