/*
* Copyright (C) 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 interactivespaces.util.data.json;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import java.util.Map;
/**
* Test the {@link JsonBuilder}.
*
* @author Keith M. Hughes
*/
public class StandardJsonBuilderTest {
private StandardJsonBuilder builder;
@Before
public void setup() {
builder = new StandardJsonBuilder();
}
/**
* Make sure primitives are properly handled.
*/
@Test
public void testPrimitives() {
String keyString1 = "string1";
String valueString1 = "bar";
builder.put(keyString1, valueString1);
String keyString2 = "string1";
String valueString2 = "bar";
builder.put(keyString2, valueString2);
String keyInteger = "integer";
int valueInteger = 1;
builder.put(keyInteger, valueInteger);
String keyDouble = "double";
double valueDouble = 1.23456;
builder.put(keyDouble, valueDouble);
String keyBoolean = "boolean";
boolean valueBoolean = true;
builder.put(keyBoolean, valueBoolean);
Map<String, Object> object = builder.build();
assertEquals(valueString1, object.get(keyString1));
assertEquals(valueString2, object.get(keyString2));
assertEquals(valueInteger, object.get(keyInteger));
assertEquals(valueDouble, object.get(keyDouble));
assertEquals(valueBoolean, object.get(keyBoolean));
}
/**
* Test putting all elements into a container
*/
@Test
public void testPutAll() {
Map<String, Object> testData = Maps.newHashMap();
String keyString1 = "string1";
String valueString1 = "bar";
testData.put(keyString1, valueString1);
String keyString2 = "string1";
String valueString2 = "bar";
testData.put(keyString2, valueString2);
String keyInteger = "integer";
int valueInteger = 1;
testData.put(keyInteger, valueInteger);
String keyDouble = "double";
double valueDouble = 1.23456;
testData.put(keyDouble, valueDouble);
String keyBoolean = "boolean";
boolean valueBoolean = true;
testData.put(keyBoolean, valueBoolean);
builder.putAll(testData);
Map<String, Object> object = builder.build();
assertEquals(valueString1, object.get(keyString1));
assertEquals(valueString2, object.get(keyString2));
assertEquals(valueInteger, object.get(keyInteger));
assertEquals(valueDouble, object.get(keyDouble));
assertEquals(valueBoolean, object.get(keyBoolean));
}
/**
* Test nesting objects. Also add in a new value after the last nest to make
* sure that up() works.
*/
@Test
public void testNestedObjects() {
String key = "key";
String value0 = "value0";
builder.put(key, value0);
String keyObject1 = "obj1";
builder.newObject(keyObject1);
String value1 = "value1";
builder.put(key, value1);
String keyObject2 = "obj2";
builder.newObject(keyObject2);
String value2 = "value2";
builder.put(key, value2);
// Go to obj1
builder.up();
String nextKey1 = "key7";
String nextValue1 = "value7";
builder.put(nextKey1, nextValue1);
Map<String, Object> root = builder.build();
assertEquals(value0, root.get(key));
Map<String, Object> obj1 = (Map<String, Object>) root.get(keyObject1);
assertEquals(value1, obj1.get(key));
assertEquals(nextValue1, obj1.get(nextKey1));
Map<String, Object> obj2 = (Map<String, Object>) obj1.get(keyObject2);
assertEquals(value2, obj2.get(key));
}
/**
* Test putting in unnamed objects.
*/
@Test
public void testObjectUnamedItems() {
try {
builder.newObject();
fail();
} catch (Exception e) {
// Expected
}
try {
builder.newArray();
fail();
} catch (Exception e) {
// Expected
}
}
/**
* Test putting in an array into an object.
*/
@Test
public void testObjectAddArray() {
String key = "foo";
builder.newArray(key);
List<Object> expected = Lists.newArrayList((Object) 17, (Object) 7);
for (Object value : expected) {
builder.put(value);
}
Map<String, Object> root = builder.build();
List<Object> actual = (List<Object>) root.get(key);
assertEquals(expected, actual);
}
/**
* Test putting in various types into an array. This will include a primitive,
* an array, and an object.
*/
@Test
public void testArrayAddVariousTypes() {
String key = "foo";
builder.newArray(key);
builder.newArray();
List<Object> expectedArray = Lists.newArrayList((Object) 17, (Object) 7);
for (Object value : expectedArray) {
builder.put(value);
}
builder.up();
String afterValue = "foo";
builder.put(afterValue);
String objKey = "glorp";
String objValue = "goober";
builder.newObject();
builder.put(objKey, objValue);
Map<String, Object> root = builder.build();
List<Object> actualArray = (List<Object>) ((List<Object>) root.get(key)).get(0);
assertEquals(expectedArray, actualArray);
Object actualPrimitiveValue = ((List<Object>) root.get(key)).get(1);
assertEquals(afterValue, actualPrimitiveValue);
Map<String, Object> expectedObjectValue = Maps.newHashMap();
expectedObjectValue.put(objKey, objValue);
Map<String, Object> actualObjectValue =
(Map<String, Object>) ((List<Object>) root.get(key)).get(2);
assertEquals(expectedObjectValue, actualObjectValue);
}
/**
* Test putting in adding named items into an array.
*/
@Test
public void testArrayNamedItems() {
builder.newArray("foo");
try {
builder.newObject("foo");
fail();
} catch (Exception e) {
// Expected
}
try {
builder.newArray("bar");
fail();
} catch (Exception e) {
// Expected
}
}
}