/* * Copyright 2008 The Closure Compiler Authors. * * 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.javascript.jscomp; import com.google.common.base.Charsets; import com.google.common.collect.ImmutableMap; import junit.framework.TestCase; import java.text.ParseException; import java.util.Arrays; import java.util.List; import java.util.Map; /** * Tests for {@link VariableMap}. * */ public class VariableMapTest extends TestCase { public void testCycle1() throws ParseException { cycleTest(ImmutableMap.of("AAA", "a", "BBB", "b")); cycleTest(ImmutableMap.of("AA:AA", "a", "BB:BB", "b")); cycleTest(ImmutableMap.of("AAA", "a:a", "BBB", "b:b")); } public void cycleTest(ImmutableMap map) throws ParseException { VariableMap in = new VariableMap(map); String serialized = new String(in.toBytes(), Charsets.UTF_8); VariableMap out = VariableMap.fromBytes(serialized.getBytes()); assertMapsEquals(in.toMap(), out.toMap()); } public void assertMapsEquals( Map expected, Map result) { assertEquals(expected.size(), result.size()); for (String key : expected.keySet()) { assertEquals(expected.get(key), result.get(key)); } } public void testToBytes() { VariableMap vm = new VariableMap(ImmutableMap.of("AAA", "a", "BBB", "b")); String serialized = new String(vm.toBytes(), Charsets.UTF_8); assertTrue(serialized.endsWith("\n")); List lines = Arrays.asList(serialized.split("\n")); assertEquals(2, lines.size()); assertTrue(lines.contains("AAA:a")); assertTrue(lines.contains("BBB:b")); } public void testFromBytes() throws ParseException { VariableMap vm = VariableMap.fromBytes("AAA:a\nBBB:b\n".getBytes()); assertEquals(2, vm.getOriginalNameToNewNameMap().size()); assertEquals("a", vm.lookupNewName("AAA")); assertEquals("b", vm.lookupNewName("BBB")); assertEquals("AAA", vm.lookupSourceName("a")); assertEquals("BBB", vm.lookupSourceName("b")); } public void testFileFormat1() { assertEqual( new VariableMap(ImmutableMap.of("x\ny", "a")).toBytes(), "x\\ny:a\n".getBytes()); assertEqual( new VariableMap(ImmutableMap.of("x:y", "a")).toBytes(), "x\\:y:a\n".getBytes()); assertEqual( new VariableMap(ImmutableMap.of("x\ny", "a")).toBytes(), "x\\ny:a\n".getBytes()); assertEqual( new VariableMap(ImmutableMap.of("x\\y", "a")).toBytes(), "x\\\\y:a\n".getBytes()); assertEqual( new VariableMap(ImmutableMap.of("\n", "a")).toBytes(), "\\n:a\n".getBytes()); assertEqual( new VariableMap(ImmutableMap.of(":", "a")).toBytes(), "\\::a\n".getBytes()); assertEqual( new VariableMap(ImmutableMap.of("\n", "a")).toBytes(), "\\n:a\n".getBytes()); assertEqual( new VariableMap(ImmutableMap.of("\\", "a")).toBytes(), "\\\\:a\n".getBytes()); } public void testFromBytesComplex1() throws ParseException { // Verify we get out what we put in. cycleTest(ImmutableMap.of("AAA[':f']", "a")); // Verify the file format is as expected. VariableMap in = new VariableMap(ImmutableMap.of("AAA[':f']", "a")); assertEqual(in.toBytes(), "AAA['\\:f']:a\n".getBytes()); } public void testFromBytesComplex2() throws ParseException { VariableMap vm = VariableMap.fromBytes("AAA['\\:f']:a\n".getBytes()); assertEquals(1, vm.getOriginalNameToNewNameMap().size()); assertEquals("a", vm.lookupNewName("AAA[':f']")); assertEquals(1, vm.getNewNameToOriginalNameMap().size()); assertEquals("AAA[':f']", vm.lookupSourceName("a")); } private void assertEqual(byte[] bytes1, byte[] bytes2) { if (bytes1 != bytes2) { assertEquals("length differs.", bytes1.length, bytes2.length); for (int i = 0; i < bytes1.length; i++) { assertEquals("byte " + i + "differs.", bytes1[i], bytes2[i]); } } } }