/*
* Copyright 2013 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.template.soy.data.internal;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.template.soy.data.SoyDict;
import com.google.template.soy.data.SoyValue;
import com.google.template.soy.data.SoyValueProvider;
import com.google.template.soy.data.restricted.BooleanData;
import com.google.template.soy.data.restricted.FloatData;
import com.google.template.soy.data.restricted.IntegerData;
import com.google.template.soy.data.restricted.StringData;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Unit tests for DictImpl.
*
*/
@RunWith(JUnit4.class)
public class DictImplTest {
@Test
public void testSoyValueMethods() {
SoyValue val1 = DictImpl.forProviderMap(ImmutableMap.<String, SoyValue>of());
assertTrue(val1.coerceToBoolean()); // DictImpl is always truthy.
assertEquals("{}", val1.coerceToString());
SoyValue val2 = DictImpl.forProviderMap(ImmutableMap.<String, SoyValue>of());
assertFalse(val1.equals(val2)); // DictImpl uses object identity.
SoyValue val3 =
DictImpl.forProviderMap(
ImmutableMap.<String, SoyValue>of(
"foo", FloatData.forValue(3.14), "too", BooleanData.TRUE));
assertTrue(val3.coerceToBoolean());
assertEquals("{foo: 3.14, too: true}", val3.coerceToString());
}
@Test
public void testDictMethods() {
SoyDict dict =
DictImpl.forProviderMap(
ImmutableMap.<String, SoyValue>of(
"boo", StringData.forValue("aaah"), "foo", FloatData.forValue(3.14)));
Map<String, ? extends SoyValueProvider> m1 = dict.asJavaStringMap();
assertEquals(2, m1.size());
assertEquals("aaah", m1.get("boo").resolve().stringValue());
Map<String, ? extends SoyValue> m2 = dict.asResolvedJavaStringMap();
assertEquals(2, m2.size());
assertEquals(3.14, m2.get("foo").floatValue(), 0.0);
}
@Test
public void testRecordMethods() {
Map<String, SoyValueProvider> providerMap = Maps.newHashMap();
SoyDict dict = DictImpl.forProviderMap(providerMap);
assertFalse(dict.hasField("boo"));
assertNull(dict.getField("boo"));
assertNull(dict.getFieldProvider("boo"));
providerMap.put("boo", StringData.forValue("blah"));
assertTrue(dict.hasField("boo"));
assertEquals("blah", dict.getField("boo").stringValue());
assertEquals("blah", dict.getFieldProvider("boo").resolve().stringValue());
providerMap.remove("boo");
assertFalse(dict.hasField("boo"));
assertNull(dict.getField("boo"));
assertNull(dict.getFieldProvider("boo"));
providerMap.put("foo", FloatData.forValue(3.14));
providerMap.put("too", BooleanData.TRUE);
assertTrue(dict.hasField("foo"));
assertEquals(3.14, dict.getField("foo").floatValue(), 0.0);
assertEquals(true, dict.getField("too").booleanValue());
}
@Test
public void testMapMethods() {
StringData BOO = StringData.forValue("boo");
Map<String, SoyValueProvider> providerMap = Maps.newHashMap();
SoyDict dict = DictImpl.forProviderMap(providerMap);
assertEquals(0, dict.getItemCnt());
assertEquals(0, Iterables.size(dict.getItemKeys()));
assertFalse(dict.hasItem(BOO));
assertNull(dict.getItem(BOO));
assertNull(dict.getItemProvider(BOO));
providerMap.put("boo", IntegerData.forValue(111));
assertEquals(1, dict.getItemCnt());
assertEquals(1, Iterables.size(dict.getItemKeys()));
assertEquals("boo", Iterables.getOnlyElement(dict.getItemKeys()).stringValue());
providerMap.put("foo", IntegerData.forValue(222));
providerMap.put("goo", IntegerData.forValue(333));
assertEquals(3, dict.getItemCnt());
assertEquals(3, Iterables.size(dict.getItemKeys()));
assertTrue(dict.hasItem(BOO));
assertEquals(111, dict.getItem(BOO).integerValue());
assertEquals(111, dict.getItemProvider(BOO).resolve().integerValue());
providerMap.remove("foo");
assertEquals(2, dict.getItemCnt());
providerMap.remove("boo");
providerMap.remove("goo");
assertEquals(0, dict.getItemCnt());
assertEquals(0, Iterables.size(dict.getItemKeys()));
assertFalse(dict.hasItem(BOO));
assertNull(dict.getItem(BOO));
assertNull(dict.getItemProvider(BOO));
}
}