blob: 2c06394a43108ec328e6ebe5fac0da5d050de286 [file] [log] [blame]
/*
* Copyright 2008 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.gwt.dev.util.test;
import com.google.gwt.dev.cfg.BindingProperty;
import com.google.gwt.dev.cfg.ConditionAny;
import com.google.gwt.dev.cfg.ConditionWhenPropertyIs;
import com.google.gwt.dev.cfg.ModuleDef;
import com.google.gwt.dev.cfg.Properties;
import com.google.gwt.dev.cfg.PropertyPermutations;
import junit.framework.TestCase;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* Tests the PropertyPermutations code.
*/
public class PropertyPermutationsTest extends TestCase {
/**
* Make sure that a cycle doesn't cause an infinite loop.
*/
public void testCycle() {
// This is what you'd get with a conditional <set-property value="false">
ModuleDef md = new ModuleDef("testCycle");
Properties props = md.getProperties();
{
BindingProperty prop = props.createBinding("A");
prop.addDefinedValue(prop.getRootCondition(), "a1");
prop.addDefinedValue(prop.getRootCondition(), "a2");
prop.addDefinedValue(new ConditionWhenPropertyIs("B", "b3"), "a3");
}
{
BindingProperty prop = props.createBinding("B");
prop.addDefinedValue(prop.getRootCondition(), "b1");
prop.addDefinedValue(prop.getRootCondition(), "b2");
prop.addDefinedValue(new ConditionWhenPropertyIs("A", "a3"), "b3");
}
try {
new PropertyPermutations(props, md.getActiveLinkerNames());
fail();
} catch (IllegalStateException e) {
// OK
}
}
public void testOneDimensionPerm() {
ModuleDef md = new ModuleDef("testOneDimensionPerm");
Properties props = md.getProperties();
{
BindingProperty prop = props.createBinding("debug");
prop.addDefinedValue(prop.getRootCondition(), "false");
prop.addDefinedValue(prop.getRootCondition(), "true");
}
// Permutations and their values are in stable alphabetical order.
//
PropertyPermutations perms = new PropertyPermutations(md.getProperties(),
md.getActiveLinkerNames());
String[] perm;
Iterator<String[]> iter = perms.iterator();
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("false", perm[0]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("true", perm[0]);
}
public void testOneDimensionPermWithCollapse() {
ModuleDef md = new ModuleDef("testOneDimensionPerm");
Properties props = md.getProperties();
{
BindingProperty prop = props.createBinding("debug");
prop.addDefinedValue(prop.getRootCondition(), "false");
prop.addDefinedValue(prop.getRootCondition(), "true");
prop.addCollapsedValues("true", "false");
}
// Permutations and their values are in stable alphabetical order.
//
PropertyPermutations perms = new PropertyPermutations(md.getProperties(),
md.getActiveLinkerNames());
List<PropertyPermutations> collapsed = perms.collapseProperties();
assertEquals("size", 1, collapsed.size());
perms = collapsed.get(0);
String[] perm;
Iterator<String[]> iter = perms.iterator();
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("false", perm[0]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("true", perm[0]);
}
public void testTwoDimensionPerm() {
ModuleDef md = new ModuleDef("testTwoDimensionPerm");
Properties props = md.getProperties();
{
BindingProperty prop = props.createBinding("user.agent");
prop.addDefinedValue(prop.getRootCondition(), "moz");
prop.addDefinedValue(prop.getRootCondition(), "ie6");
prop.addDefinedValue(prop.getRootCondition(), "opera");
}
{
BindingProperty prop = props.createBinding("debug");
prop.addDefinedValue(prop.getRootCondition(), "false");
prop.addDefinedValue(prop.getRootCondition(), "true");
}
// String[]s and their values are in stable alphabetical order.
//
PropertyPermutations perms = new PropertyPermutations(md.getProperties(),
md.getActiveLinkerNames());
String[] perm;
Iterator<String[]> iter = perms.iterator();
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("false", perm[0]);
assertEquals("ie6", perm[1]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("false", perm[0]);
assertEquals("moz", perm[1]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("false", perm[0]);
assertEquals("opera", perm[1]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("true", perm[0]);
assertEquals("ie6", perm[1]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("true", perm[0]);
assertEquals("moz", perm[1]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("true", perm[0]);
assertEquals("opera", perm[1]);
}
public void testTwoDimensionPermWithCollapse() {
ModuleDef md = new ModuleDef("testTwoDimensionPerm");
Properties props = md.getProperties();
{
BindingProperty prop = props.createBinding("user.agent");
prop.addDefinedValue(prop.getRootCondition(), "moz");
prop.addDefinedValue(prop.getRootCondition(), "ie6");
prop.addDefinedValue(prop.getRootCondition(), "opera");
prop.addCollapsedValues("moz", "ie6", "opera");
}
{
BindingProperty prop = props.createBinding("debug");
prop.addDefinedValue(prop.getRootCondition(), "false");
prop.addDefinedValue(prop.getRootCondition(), "true");
}
// String[]s and their values are in stable alphabetical order.
//
PropertyPermutations perms = new PropertyPermutations(md.getProperties(),
md.getActiveLinkerNames());
List<PropertyPermutations> collapsed = perms.collapseProperties();
assertEquals("size", 2, collapsed.size());
Iterator<String[]> it = collapsed.get(0).iterator();
assertEquals(Arrays.asList("false", "ie6"), Arrays.asList(it.next()));
assertEquals(Arrays.asList("false", "moz"), Arrays.asList(it.next()));
assertEquals(Arrays.asList("false", "opera"), Arrays.asList(it.next()));
assertFalse(it.hasNext());
it = collapsed.get(1).iterator();
assertEquals(Arrays.asList("true", "ie6"), Arrays.asList(it.next()));
assertEquals(Arrays.asList("true", "moz"), Arrays.asList(it.next()));
assertEquals(Arrays.asList("true", "opera"), Arrays.asList(it.next()));
assertFalse(it.hasNext());
}
public void testTwoDimensionPermWithExpansion() {
ModuleDef md = new ModuleDef("testTwoDimensionsWithExpansion");
Properties props = md.getProperties();
{
BindingProperty prop = props.createBinding("user.agent");
prop.addDefinedValue(prop.getRootCondition(), "moz");
prop.addDefinedValue(prop.getRootCondition(), "ie6");
prop.addDefinedValue(prop.getRootCondition(), "ie8");
prop.addDefinedValue(prop.getRootCondition(), "opera");
}
{
BindingProperty prop = props.createBinding("stackTraces");
prop.addDefinedValue(prop.getRootCondition(), "false");
prop.addDefinedValue(prop.getRootCondition(), "true");
// <set-property name="stackTraces" value="false" />
prop.setAllowedValues(prop.getRootCondition(), "false");
/*
* <set-property name="stackTraces" value="true,false"> <when user.agent
* is ie6 or ie 8> </set-property>
*/
ConditionAny cond = new ConditionAny();
cond.getConditions().add(new ConditionWhenPropertyIs("user.agent", "ie6"));
cond.getConditions().add(new ConditionWhenPropertyIs("user.agent", "ie8"));
prop.setAllowedValues(cond, "true", "false");
}
validateTwoDimensionPerm(props, md.getActiveLinkerNames());
}
public void testTwoDimensionPermWithExtension() {
// This is what you'd get with a conditional <extend-property>
ModuleDef md = new ModuleDef("testTwoDimensionsWithConditions");
Properties props = md.getProperties();
{
BindingProperty prop = props.createBinding("user.agent");
prop.addDefinedValue(prop.getRootCondition(), "moz");
prop.addDefinedValue(prop.getRootCondition(), "ie6");
prop.addDefinedValue(prop.getRootCondition(), "ie8");
prop.addDefinedValue(prop.getRootCondition(), "opera");
}
{
BindingProperty prop = props.createBinding("stackTraces");
prop.addDefinedValue(prop.getRootCondition(), "false");
ConditionAny cond = new ConditionAny();
cond.getConditions().add(new ConditionWhenPropertyIs("user.agent", "ie6"));
cond.getConditions().add(new ConditionWhenPropertyIs("user.agent", "ie8"));
prop.addDefinedValue(cond, "true");
}
validateTwoDimensionPerm(props, md.getActiveLinkerNames());
}
public void testTwoDimensionPermWithRestriction() {
// This is what you'd get with a conditional <set-property value="false">
ModuleDef md = new ModuleDef("testTwoDimensionsWithRestriction");
Properties props = md.getProperties();
{
BindingProperty prop = props.createBinding("user.agent");
prop.addDefinedValue(prop.getRootCondition(), "moz");
prop.addDefinedValue(prop.getRootCondition(), "ie6");
prop.addDefinedValue(prop.getRootCondition(), "ie8");
prop.addDefinedValue(prop.getRootCondition(), "opera");
}
{
BindingProperty prop = props.createBinding("stackTraces");
prop.addDefinedValue(prop.getRootCondition(), "false");
prop.addDefinedValue(prop.getRootCondition(), "true");
ConditionAny cond = new ConditionAny();
cond.getConditions().add(new ConditionWhenPropertyIs("user.agent", "moz"));
cond.getConditions().add(
new ConditionWhenPropertyIs("user.agent", "opera"));
prop.setAllowedValues(cond, "false");
}
validateTwoDimensionPerm(props, md.getActiveLinkerNames());
}
private void validateTwoDimensionPerm(Properties props,
Set<String> activeLinkerNames) {
PropertyPermutations perms = new PropertyPermutations(props,
activeLinkerNames);
assertEquals(6, perms.size());
// Order is alphabetical in dependency order
String[] perm;
Iterator<String[]> iter = perms.iterator();
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("ie6", perm[0]);
assertEquals("false", perm[1]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("ie6", perm[0]);
assertEquals("true", perm[1]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("ie8", perm[0]);
assertEquals("false", perm[1]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("ie8", perm[0]);
assertEquals("true", perm[1]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("moz", perm[0]);
assertEquals("false", perm[1]);
assertTrue(iter.hasNext());
perm = iter.next();
assertEquals("opera", perm[0]);
assertEquals("false", perm[1]);
assertFalse(iter.hasNext());
}
}