/*
* ModeShape (http://www.modeshape.org)
*
* 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 org.modeshape.schematic.internal.document;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.regex.Pattern;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.modeshape.schematic.document.Binary;
import org.modeshape.schematic.document.Bson;
import org.modeshape.schematic.document.Code;
import org.modeshape.schematic.document.CodeWithScope;
import org.modeshape.schematic.document.MaxKey;
import org.modeshape.schematic.document.MinKey;
import org.modeshape.schematic.document.ObjectId;
import org.modeshape.schematic.document.Symbol;
import org.modeshape.schematic.document.Timestamp;
public class CompactJsonWriterTest {
protected JsonWriter writer;
protected boolean print;
@Before
public void beforeTest() {
writer = new CompactJsonWriter();
print = false;
}
@After
public void afterTest() {
writer = null;
}
@Test
public void shouldCorrectlyWriteNullValue() {
assertSame("null", writer.write(null));
}
@Test
public void shouldCorrectlyWriteBooleanValues() {
assertSame("true", writer.write(Boolean.TRUE));
assertSame("false", writer.write(Boolean.FALSE));
}
@Test
public void shouldCorrectlyWriteIntegerValues() {
assertSame("10", writer.write(10));
assertSame("0", writer.write(0));
assertSame("-1", writer.write(-1));
assertSame(Integer.toString(Integer.MAX_VALUE), writer.write(Integer.MAX_VALUE));
assertSame(Integer.toString(Integer.MIN_VALUE), writer.write(Integer.MIN_VALUE));
}
@Test
public void shouldCorrectlyWriteLongValues() {
assertSame("10", writer.write(10L));
assertSame("0", writer.write(0L));
assertSame("-1", writer.write(-1L));
assertSame(Long.toString(Integer.MAX_VALUE + 10L), writer.write(Integer.MAX_VALUE + 10L));
assertSame(Long.toString(Integer.MIN_VALUE - 10L), writer.write(Integer.MIN_VALUE - 10L));
assertSame(Long.toString(Long.MAX_VALUE), writer.write(Long.MAX_VALUE));
assertSame(Long.toString(Long.MIN_VALUE), writer.write(Long.MIN_VALUE));
}
@Test
public void shouldCorrectlyWriteFloatValues() {
assertSame("10.01", writer.write(10.01));
assertSame("0.0", writer.write(0.0));
assertSame("-1.0135", writer.write(-1.0135));
assertSame(Float.toString(Float.MAX_VALUE), writer.write(Float.MAX_VALUE));
assertSame(Float.toString(Float.MIN_VALUE), writer.write(Float.MIN_VALUE));
}
@Test
public void shouldCorrectlyWriteDoubleValues() {
assertSame("10.01", writer.write(10.01d));
assertSame("0.0", writer.write(0.0d));
assertSame("-1.0135", writer.write(-1.0135d));
assertSame(Double.toString(Double.MAX_VALUE), writer.write(Double.MAX_VALUE));
assertSame(Double.toString(Double.MIN_VALUE), writer.write(Double.MIN_VALUE));
}
@Test
public void shouldCorrectlyWriteStringValues() {
assertSame("\"\"", writer.write(""));
assertSame("\"10.01\"", writer.write("10.01"));
assertSame("\"10.01d\"", writer.write("10.01d"));
assertSame("\"null\"", writer.write("null"));
assertSame("\"abcdefghijklmnopqrstuvwxyz\"", writer.write("abcdefghijklmnopqrstuvwxyz"));
}
@Test
public void shouldCorrectlyWriteSymbolValues() {
assertSame("\"\"", writer.write(new Symbol("")));
assertSame("\"10.01\"", writer.write(new Symbol("10.01")));
assertSame("\"10.01d\"", writer.write(new Symbol("10.01d")));
assertSame("\"null\"", writer.write(new Symbol("null")));
assertSame("\"abcdefghijklmnopqrstuvwxyz\"", writer.write(new Symbol("abcdefghijklmnopqrstuvwxyz")));
}
@Test
public void shouldCorrectlyWriteUuid() {
UUID id = UUID.randomUUID();
String expected = "{ \"$uuid\" : \"" + id + "\" }";
String actual = writer.write(id);
// print =true;
assertSame(expected, actual);
}
@Test
public void shouldCorrectlyWriteObjectId() {
ObjectId id = new ObjectId(300, 200, 9, 15);
String expected = "{ \"$oid\" : \"0000012c0000c8000900000f\" }";
String actual = writer.write(id);
assertSame(expected, actual);
}
@Test
public void shouldCorrectlyWriteDate() {
Date now = new Date();
String dateStr = Bson.getDateFormatter().format(now);
String expected = "{ \"$date\" : \"" + dateStr + "\" }";
String actual = writer.write(now);
assertSame(expected, actual);
}
@Test
public void shouldCorrectlyWriteTimestamp() {
Timestamp now = new Timestamp(new Date());
String expected = "{ \"$ts\" : " + now.getTime() + " , \"$inc\" : " + now.getInc() + " }";
String actual = writer.write(now);
assertSame(expected, actual);
}
@Test
public void shouldCorrectlyWriteMinKeyValue() {
assertSame("\"MinKey\"", writer.write(MinKey.getInstance()));
}
@Test
public void shouldCorrectlyWriteMaxKeyValue() {
assertSame("\"MaxKey\"", writer.write(MaxKey.getInstance()));
}
@Test
public void shouldCorrectlyWriteBinaryValue() {
byte[] data = new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};
@SuppressWarnings( "deprecation" )
Binary binary = new Binary(Bson.BinaryType.BINARY, data);
String expected = "{ \"$type\" : 2 , \"$base64\" : \"AAECAwQF\" }";
String actual = writer.write(binary);
// print =true;
assertSame(expected, actual);
}
@Test
public void shouldCorrectlyWritePattern() {
Pattern pattern = Pattern.compile("[CH]at\\s+in", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
String expected = "{ \"$regex\" : \"[CH]at\\\\s+in\" , \"$options\" : \"im\" }";
String actual = writer.write(pattern);
assertSame(expected, actual);
}
@Test
public void shouldCorrectlyWriteSimpleBsonObject() {
BasicDocument top = new BasicDocument();
top.put("firstName", "Jack");
top.put("lastName", "Riley");
top.put("age", 31);
String actual = writer.write(top);
String expected = "{ \"firstName\" : \"Jack\" , \"lastName\" : \"Riley\" , \"age\" : 31 }";
assertSame(expected, actual);
}
@Test
public void shouldCorrectlyWriteSimpleBsonObjectWithNullValue() {
BasicDocument top = new BasicDocument();
top.put("firstName", "Jack");
top.put("lastName", null);
top.put("age", 31);
String actual = writer.write(top);
String expected = "{ \"firstName\" : \"Jack\" , \"lastName\" : null , \"age\" : 31 }";
assertSame(expected, actual);
}
@Test
public void shouldCorrectlyWriteBsonObjectWithNestedObjectValue() {
BasicDocument address = new BasicDocument();
address.put("street", "100 Main St.");
address.put("city", "Springfield");
BasicDocument top = new BasicDocument();
top.put("firstName", "Jack");
top.put("lastName", "Riley");
top.put("address", address);
String actual = writer.write(top);
String expected = "{ \"firstName\" : \"Jack\" , \"lastName\" : \"Riley\" , \"address\" : { \"street\" : \"100 Main St.\" , \"city\" : \"Springfield\" } }";
assertSame(expected, actual);
}
@Test
public void shouldCorrectlyWriteListValue() {
testWritingList("[ ]");
testWritingList("[ \"value1\" ]", "value1");
testWritingList("[ \"value1\" , null , \"value3\" ]", "value1", null, "value3");
testWritingList("[ \"value1\" , \"value2\" , \"value3\" ]", "value1", "value2", "value3");
testWritingList("[ \"value1\" , \"value2\" , 4 ]", "value1", "value2", 4L);
}
protected void testWritingList( String expected,
Object... values ) {
List<Object> list = Arrays.asList(values);
String actual = writer.write(list);
assertSame(expected, actual);
}
@Test
public void shouldCorrectlyWriteCode() {
Code code = new Code("name");
String expected = "{ \"$code\" : \"name\" }";
String actual = writer.write(code);
assertSame(expected, actual);
}
@Test
public void shouldCorrectlyWriteCodeWithScope() {
BasicDocument scope = new BasicDocument();
scope.put("firstName", "Jack");
scope.put("lastName", "Riley");
CodeWithScope code = new CodeWithScope("name", scope);
String actual = writer.write(code);
String expected = "{ \"$code\" : \"name\" , \"$scope\" : { \"firstName\" : \"Jack\" , \"lastName\" : \"Riley\" } }";
assertSame(expected, actual);
}
protected void assertSame( String expected,
String actual ) {
if (print) {
System.out.println("************************************************************");
System.out.println(actual);
System.out.println(expected);
}
assertThat(actual, is(expected));
}
}