/*
* 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 static com.google.common.truth.Truth.assertThat;
import static java.nio.charset.StandardCharsets.UTF_8;
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 final 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<String, String> map)
throws ParseException {
VariableMap in = new VariableMap(map);
String serialized = new String(in.toBytes(), UTF_8);
VariableMap out = VariableMap.fromBytes(serialized.getBytes(UTF_8));
assertMapsEquals(in.toMap(), out.toMap());
}
public void assertMapsEquals(
Map<String, String> expected, Map<String, String> result) {
assertThat(result).hasSize(expected.size());
for (String key : expected.keySet()) {
assertThat(result).containsEntry(key, expected.get(key));
}
}
public void testToBytes() {
VariableMap vm = new VariableMap(ImmutableMap.of("AAA", "a", "BBB", "b"));
String serialized = new String(vm.toBytes(), UTF_8);
assertThat(serialized).endsWith("\n");
List<String> lines = Arrays.asList(serialized.split("\n"));
assertThat(lines).hasSize(2);
assertThat(lines).contains("AAA:a");
assertThat(lines).contains("BBB:b");
}
public void testFromBytes() throws ParseException {
VariableMap vm = VariableMap.fromBytes("AAA:a\nBBB:b\n".getBytes(UTF_8));
assertThat(vm.getOriginalNameToNewNameMap()).hasSize(2);
assertEquals("a", vm.lookupNewName("AAA"));
assertEquals("b", vm.lookupNewName("BBB"));
assertEquals("AAA", vm.lookupSourceName("a"));
assertEquals("BBB", vm.lookupSourceName("b"));
}
public void testFromBytesWithEmptyValue() throws ParseException {
VariableMap vm = VariableMap.fromBytes("AAA:".getBytes(UTF_8));
assertThat(vm.lookupNewName("AAA")).isEmpty();
}
public void testFileFormat1() {
assertEqual(
new VariableMap(ImmutableMap.of("x\ny", "a")).toBytes(), "x\\ny:a\n".getBytes(UTF_8));
assertEqual(
new VariableMap(ImmutableMap.of("x:y", "a")).toBytes(), "x\\:y:a\n".getBytes(UTF_8));
assertEqual(
new VariableMap(ImmutableMap.of("x\ny", "a")).toBytes(), "x\\ny:a\n".getBytes(UTF_8));
assertEqual(
new VariableMap(ImmutableMap.of("x\\y", "a")).toBytes(), "x\\\\y:a\n".getBytes(UTF_8));
assertEqual(new VariableMap(ImmutableMap.of("\n", "a")).toBytes(), "\\n:a\n".getBytes(UTF_8));
assertEqual(new VariableMap(ImmutableMap.of(":", "a")).toBytes(), "\\::a\n".getBytes(UTF_8));
assertEqual(new VariableMap(ImmutableMap.of("\n", "a")).toBytes(), "\\n:a\n".getBytes(UTF_8));
assertEqual(new VariableMap(ImmutableMap.of("\\", "a")).toBytes(), "\\\\:a\n".getBytes(UTF_8));
}
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(UTF_8));
}
public void testFromBytesComplex2() throws ParseException {
VariableMap vm = VariableMap.fromBytes("AAA['\\:f']:a\n".getBytes(UTF_8));
assertThat(vm.getOriginalNameToNewNameMap()).hasSize(1);
assertEquals("a", vm.lookupNewName("AAA[':f']"));
assertThat(vm.getNewNameToOriginalNameMap()).hasSize(1);
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]);
}
}
}
public void testReverseThrowsErrorOnDuplicate() {
try {
new VariableMap(ImmutableMap.of("AA", "b", "BB", "b"));
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testReverseLookupOfNullFindsNoName() {
VariableMap vm = new VariableMap(ImmutableMap.of("AA", "a", "BB", "b"));
assertNull(vm.lookupSourceName(null));
}
}