// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/domain/FunctionNode.java
// public class FunctionNode implements Node {
// 
//     private final FunctionType functionType;
// 
//     private List<Node> arguments;
//     private String value;
// 
//     public FunctionNode(FunctionType functionType) {
//         this.functionType = functionType;
//         this.arguments = new ArrayList<>();
//     }
// 
//     @Override
//     public String getName() {
//         return functionType.name();
//     }
// 
//     @Override
//     public String getValue() {
//         return value;
//     }
// 
//     public void setValue(String value) {
//         this.value = value;
//     }
// 
//     @Override
//     public void addChild(Node node) {
//         arguments.add(node);
//     }
// 
//     @Override
//     public List<Node> children() {
//         return arguments;
//     }
// 
//     @Override
//     public void accept(NodeVisitor visitor) {
//         visitor.visit(this);
//         for (Node child : children()) {
//             child.accept(visitor);
//         }
//     }
// 
//     @Override
//     public String toString() {
//         return "FunctionNode{"
//                 + "functionType=" + functionType
//                 + ", arguments=" + arguments.toString()
//                 + '}';
//     }
// }
// 
// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/domain/FunctionType.java
// public enum FunctionType {
// 
//     OPACITY("opacity");
// 
//     private String functionName;
// 
//     FunctionType(String functionName) {
//         this.functionName = functionName;
//     }
// 
//     public String getName() {
//         return functionName;
//     }
// 
//     public static FunctionType fromString(String text) {
//         if (text != null) {
//             for (FunctionType functionType : FunctionType.values()) {
//                 if (text.equalsIgnoreCase(functionType.functionName)) {
//                     return functionType;
//                 }
//             }
//         }
//         return null;
//     }
// }
// 
// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/domain/ValueNode.java
// public class ValueNode implements Node {
// 
//     private String value;
// 
//     public ValueNode(String value) {
//         this.value = value;
//     }
// 
//     @Override
//     public String getName() {
//         return null;
//     }
// 
//     @Override
//     public String getValue() {
//         return value;
//     }
// 
//     @Override
//     public void addChild(Node node) {
// 
//     }
// 
//     @Override
//     public List<Node> children() {
//         return Collections.emptyList();
//     }
// 
//     @Override
//     public void accept(NodeVisitor visitor) {
//         visitor.visit(this);
//     }
// 
//     @Override
//     public String toString() {
//         return "val: " + value;
//     }
// 
//     public void setValue(String value) {
//         this.value = value;
//     }
// }


import com.manolovn.cssdroid.parser.domain.FunctionNode;
import com.manolovn.cssdroid.parser.domain.FunctionType;
import com.manolovn.cssdroid.parser.domain.ValueNode;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
        whenVisitValueNode();

        thenNodeHasVariableValue();
    }

    @Test
    public void shouldNotApplyVariableToValueNodeWithVariable() {
        givenAVisitor();
        givenAValueNodeWithNotRegisteredVariableValue();

        whenVisitValueNode();

        thenNodeHasNotVariableValue();
    }

    @Test
    public void shouldNotApplyToFunctionNode() {
        givenAVisitor();
        givenAFunctionNode();

        whenVisitFunctionNode();

        thenFunctionNodeHasNotVariableValue();
    }

    private void givenAFunctionNode() {
        functionNode = new FunctionNode(FunctionType.OPACITY);
    }

    private void givenAValueNodeWithNotRegisteredVariableValue() {
// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/domain/FunctionNode.java
// public class FunctionNode implements Node {
// 
//     private final FunctionType functionType;
// 
//     private List<Node> arguments;
//     private String value;
// 
//     public FunctionNode(FunctionType functionType) {
//         this.functionType = functionType;
//         this.arguments = new ArrayList<>();
//     }
// 
//     @Override
//     public String getName() {
//         return functionType.name();
//     }
// 
//     @Override
//     public String getValue() {
//         return value;
//     }
// 
//     public void setValue(String value) {
//         this.value = value;
//     }
// 
//     @Override
//     public void addChild(Node node) {
//         arguments.add(node);
//     }
// 
//     @Override
//     public List<Node> children() {
//         return arguments;
//     }
// 
//     @Override
//     public void accept(NodeVisitor visitor) {
//         visitor.visit(this);
//         for (Node child : children()) {
//             child.accept(visitor);
//         }
//     }
// 
//     @Override
//     public String toString() {
//         return "FunctionNode{"
//                 + "functionType=" + functionType
//                 + ", arguments=" + arguments.toString()
//                 + '}';
//     }
// }
// 
// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/domain/FunctionType.java
// public enum FunctionType {
// 
//     OPACITY("opacity");
// 
//     private String functionName;
// 
//     FunctionType(String functionName) {
//         this.functionName = functionName;
//     }
// 
//     public String getName() {
//         return functionName;
//     }
// 
//     public static FunctionType fromString(String text) {
//         if (text != null) {
//             for (FunctionType functionType : FunctionType.values()) {
//                 if (text.equalsIgnoreCase(functionType.functionName)) {
//                     return functionType;
//                 }
//             }
//         }
//         return null;
//     }
// }
// 
// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/domain/ValueNode.java
// public class ValueNode implements Node {
// 
//     private String value;
// 
//     public ValueNode(String value) {
//         this.value = value;
//     }
// 
//     @Override
//     public String getName() {
//         return null;
//     }
// 
//     @Override
//     public String getValue() {
//         return value;
//     }
// 
//     @Override
//     public void addChild(Node node) {
// 
//     }
// 
//     @Override
//     public List<Node> children() {
//         return Collections.emptyList();
//     }
// 
//     @Override
//     public void accept(NodeVisitor visitor) {
//         visitor.visit(this);
//     }
// 
//     @Override
//     public String toString() {
//         return "val: " + value;
//     }
// 
//     public void setValue(String value) {
//         this.value = value;
//     }
// }


// Path: cssdroid/src/test/java/com/manolovn/cssdroid/parser/visitor/ApplyVariableVisitorTest.java
import com.manolovn.cssdroid.parser.domain.FunctionNode;
import com.manolovn.cssdroid.parser.domain.FunctionType;
import com.manolovn.cssdroid.parser.domain.ValueNode;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;

        whenVisitValueNode();

        thenNodeHasVariableValue();
    }

    @Test
    public void shouldNotApplyVariableToValueNodeWithVariable() {
        givenAVisitor();
        givenAValueNodeWithNotRegisteredVariableValue();

        whenVisitValueNode();

        thenNodeHasNotVariableValue();
    }

    @Test
    public void shouldNotApplyToFunctionNode() {
        givenAVisitor();
        givenAFunctionNode();

        whenVisitFunctionNode();

        thenFunctionNodeHasNotVariableValue();
    }

    private void givenAFunctionNode() {
        functionNode = new FunctionNode(FunctionType.OPACITY);
    }

    private void givenAValueNodeWithNotRegisteredVariableValue() {
        valueNode = new ValueNode(ANY_VARIABLE_NOT_REGISTERED);