/*
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.common.css.compiler.passes;
import com.google.common.collect.ImmutableSet;
import com.google.common.css.compiler.ast.CssBooleanExpressionNode;
import com.google.common.css.compiler.ast.CssBooleanExpressionNode.Type;
import com.google.common.css.testing.UtilityTestCase;
import java.util.HashSet;
import java.util.Set;
/**
* Unit tests for {@link BooleanExpressionEvaluator}.
*
*/
public class BooleanExpressionEvaluatorTest extends UtilityTestCase {
public void testOrWithTrueValues() {
CssBooleanExpressionNode input = new CssBooleanExpressionNode(Type.OR, "",
new CssBooleanExpressionNode(Type.CONSTANT, "a"),
new CssBooleanExpressionNode(Type.CONSTANT, "b"), null);
Set<String> truths = ImmutableSet.of("a");
BooleanExpressionEvaluator eval =
new BooleanExpressionEvaluator(input, truths);
CssBooleanExpressionNode output = eval.evaluate();
assertEquals(Type.CONSTANT, output.getType());
assertEquals("TRUE", output.getValue());
}
public void testNotWithTrueValue() {
CssBooleanExpressionNode input = new CssBooleanExpressionNode(Type.NOT, "",
new CssBooleanExpressionNode(Type.CONSTANT, "a"), null, null);
Set<String> truths = ImmutableSet.of("a");
BooleanExpressionEvaluator eval =
new BooleanExpressionEvaluator(input, truths);
CssBooleanExpressionNode output = eval.evaluate();
assertEquals(Type.CONSTANT, output.getType());
assertEquals("FALSE", output.getValue());
}
public void testNotWithUnknown() {
CssBooleanExpressionNode input = new CssBooleanExpressionNode(Type.NOT, "",
new CssBooleanExpressionNode(Type.CONSTANT, "a"), null, null);
Set<String> truths = new HashSet<String>();
Set<String> falses = new HashSet<String>();
BooleanExpressionEvaluator eval =
new BooleanExpressionEvaluator(input, truths, falses);
CssBooleanExpressionNode output = eval.evaluate();
assertEquals(Type.NOT, output.getType());
assertEquals("", output.getValue());
}
public void testWithSimpleTrue() {
CssBooleanExpressionNode input =
new CssBooleanExpressionNode(Type.CONSTANT, "TRUE");
Set<String> truths = new HashSet<String>();
BooleanExpressionEvaluator eval =
new BooleanExpressionEvaluator(input, truths);
CssBooleanExpressionNode output = eval.evaluate();
assertEquals(Type.CONSTANT, output.getType());
assertEquals("TRUE", output.getValue());
}
public void testAndWithTrueValues() {
CssBooleanExpressionNode input = new CssBooleanExpressionNode(Type.AND, "",
new CssBooleanExpressionNode(Type.CONSTANT, "a"),
new CssBooleanExpressionNode(Type.CONSTANT, "b"), null);
Set<String> truths = ImmutableSet.of("a", "b");
BooleanExpressionEvaluator eval =
new BooleanExpressionEvaluator(input, truths);
CssBooleanExpressionNode output = eval.evaluate();
assertEquals(Type.CONSTANT, output.getType());
assertEquals("TRUE", output.getValue());
}
public void testAndWithOneUnknown() {
CssBooleanExpressionNode input = new CssBooleanExpressionNode(Type.AND, "",
new CssBooleanExpressionNode(Type.CONSTANT, "a"),
new CssBooleanExpressionNode(Type.CONSTANT, "b"), null);
Set<String> truths = ImmutableSet.of("a");
BooleanExpressionEvaluator eval =
new BooleanExpressionEvaluator(input, truths);
CssBooleanExpressionNode output = eval.evaluate();
assertEquals(Type.CONSTANT, output.getType());
assertEquals("FALSE", output.getValue());
}
public void testAndWithTwoUnknowns() {
CssBooleanExpressionNode input = new CssBooleanExpressionNode(Type.AND, "",
new CssBooleanExpressionNode(Type.CONSTANT, "a"),
new CssBooleanExpressionNode(Type.CONSTANT, "b"), null);
Set<String> truths = new HashSet<String>();
BooleanExpressionEvaluator eval =
new BooleanExpressionEvaluator(input, truths);
CssBooleanExpressionNode output = eval.evaluate();
assertEquals(Type.CONSTANT, output.getType());
assertEquals("FALSE", output.getValue());
}
public void testNested1() {
CssBooleanExpressionNode side1 = new CssBooleanExpressionNode(Type.AND, "",
new CssBooleanExpressionNode(Type.CONSTANT, "a"),
new CssBooleanExpressionNode(Type.CONSTANT, "b"), null);
CssBooleanExpressionNode side2 = new CssBooleanExpressionNode(Type.AND, "",
new CssBooleanExpressionNode(Type.CONSTANT, "c"),
new CssBooleanExpressionNode(Type.CONSTANT, "FALSE"), null);
CssBooleanExpressionNode input = new CssBooleanExpressionNode(Type.OR, "",
side1, side2, null);
Set<String> truths = ImmutableSet.of("a");
Set<String> falses = new HashSet<String>();
BooleanExpressionEvaluator eval =
new BooleanExpressionEvaluator(input, truths, falses);
CssBooleanExpressionNode output = eval.evaluate();
assertEquals(Type.CONSTANT, output.getType());
assertEquals("b", output.getValue());
}
public void testNested2() {
CssBooleanExpressionNode side1 = new CssBooleanExpressionNode(Type.OR, "",
new CssBooleanExpressionNode(Type.CONSTANT, "a"),
new CssBooleanExpressionNode(Type.CONSTANT, "b"), null);
CssBooleanExpressionNode side2 = new CssBooleanExpressionNode(Type.AND, "",
new CssBooleanExpressionNode(Type.CONSTANT, "c"),
new CssBooleanExpressionNode(Type.CONSTANT, "FALSE"), null);
CssBooleanExpressionNode input = new CssBooleanExpressionNode(Type.OR, "",
side1, side2, null);
Set<String> truths = ImmutableSet.of("b");
Set<String> falses = new HashSet<String>();
BooleanExpressionEvaluator eval =
new BooleanExpressionEvaluator(input, truths, falses);
CssBooleanExpressionNode output = eval.evaluate();
assertEquals(Type.CONSTANT, output.getType());
assertEquals("TRUE", output.getValue());
}
public void testNested3() {
CssBooleanExpressionNode side1 = new CssBooleanExpressionNode(Type.AND, "",
new CssBooleanExpressionNode(Type.CONSTANT, "a"),
new CssBooleanExpressionNode(Type.CONSTANT, "b"), null);
CssBooleanExpressionNode side2 = new CssBooleanExpressionNode(Type.AND, "",
new CssBooleanExpressionNode(Type.CONSTANT, "c"),
new CssBooleanExpressionNode(Type.CONSTANT, "FALSE"), null);
CssBooleanExpressionNode input = new CssBooleanExpressionNode(Type.OR, "",
side1, side2, null);
Set<String> truths = ImmutableSet.of("b");
Set<String> falses = new HashSet<String>();
BooleanExpressionEvaluator eval =
new BooleanExpressionEvaluator(input, truths, falses);
CssBooleanExpressionNode output = eval.evaluate();
assertEquals(Type.CONSTANT, output.getType());
assertEquals("a", output.getValue());
}
public void testNested4() {
CssBooleanExpressionNode side1 = new CssBooleanExpressionNode(Type.OR, "",
new CssBooleanExpressionNode(Type.CONSTANT, "a"),
new CssBooleanExpressionNode(Type.CONSTANT, "b"), null);
CssBooleanExpressionNode side2 = new CssBooleanExpressionNode(Type.OR, "",
new CssBooleanExpressionNode(Type.CONSTANT, "c"),
new CssBooleanExpressionNode(Type.CONSTANT, "d"), null);
CssBooleanExpressionNode input = new CssBooleanExpressionNode(Type.OR, "",
side1, side2, null);
Set<String> truths = new HashSet<String>();
Set<String> falses = new HashSet<String>();
BooleanExpressionEvaluator eval =
new BooleanExpressionEvaluator(input, truths, falses);
CssBooleanExpressionNode output = eval.evaluate();
assertEquals(Type.OR, output.getType());
assertEquals("", output.getValue());
}
}