/*
* 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.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import java.io.InputStream;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.modeshape.schematic.document.Document;
import org.modeshape.schematic.document.DocumentSequence;
import org.modeshape.schematic.document.ParsingException;
import org.modeshape.schematic.internal.annotation.FixFor;
public class JsonReaderTest {
protected JsonReader reader;
protected boolean print;
protected Document doc;
@Before
public void beforeTest() {
reader = new JsonReader();
print = false;
}
@After
public void afterTest() {
reader = null;
}
@Test
public void shouldParseEmptyDocument() throws Exception {
doc = reader.read("{ }");
}
@Test
public void shouldParseEmptyDocumentWithLeadingWhitespace() throws Exception {
doc = reader.read(" { }");
}
@Test
public void shouldParseEmptyDocumentWithEmbeddedWhitespace() throws Exception {
doc = reader.read("{ \n \t \r\n } ");
}
@Test
public void shouldParseDocumentWithSingleFieldWithStringValue() throws Exception {
doc = reader.read("{ \"foo\" : \"bar\" }");
assertField("foo", "bar");
}
@Test
public void shouldParseDocumentWithSingleFieldWithBooleanFalseValue() throws Exception {
doc = reader.read("{ \"foo\" : false }");
assertField("foo", false);
}
@Test
public void shouldParseDocumentWithSingleFieldWithBooleanTrueValue() throws Exception {
doc = reader.read("{ \"foo\" : true }");
assertField("foo", true);
}
@Test
public void shouldParseDocumentWithSingleFieldWithIntegerValue() throws Exception {
doc = reader.read("{ \"foo\" : 0 }");
assertField("foo", 0);
}
@Test
public void shouldParseDocumentWithSingleFieldWithLongValue() throws Exception {
long val = Integer.MAX_VALUE + 10L;
doc = reader.read("{ \"foo\" : " + val + " }");
assertField("foo", val);
}
@Test
public void shouldParseDocumentWithSingleFieldWithDoubleValue() throws Exception {
doc = reader.read("{ \"foo\" : 2.3543 }");
assertField("foo", 2.3543d);
}
@Test
public void shouldParseDocumentWithMultipleFieldsAndExtraDelimiters() throws Exception {
doc = reader.read("{ \"foo\" : 32 ,, \"nested\" : { \"bar\" : \"baz\", \"bom\" : true } ,}");
assertField("foo", 32);
doc = doc.getDocument("nested");
assertField("bar", "baz");
assertField("bom", true);
}
@Test
public void shouldParseMultipleDocuments() throws Exception {
InputStream stream = getClass().getClassLoader().getResourceAsStream("json/multiple-json-files.txt");
DocumentSequence seq = reader.readMultiple(stream);
int count = 0;
while (true) {
Document doc = seq.nextDocument();
if (doc == null) break;
++count;
}
assertThat(count, is(265));
}
@Test
@FixFor( "MODE-2309" )
public void shouldParseJsonWithControlCharactersInFieldValues() throws Exception {
InputStream stream = getClass().getClassLoader().getResourceAsStream("json/example-with-control-characters.json");
doc = reader.read(stream);
assertNotNull(doc);
assertEquals(6, countFields(doc));
assertField("firstName", "Jane");
assertField("lastName", "Doe");
assertField("fieldWithLF", "This is a value\nwith a line feed");
assertField("fieldWithCRLF", "This is a value\r\nwith a line feed\r\ncarriage return");
doc = doc.getDocument("address");
assertEquals(3, countFields(doc));
assertField("street", "Main Street");
assertField("city", "Memphis");
assertField("zip", 12345);
}
@Test
@FixFor( "MODE-2082" )
public void shouldParseJsonWithComments() throws Exception {
InputStream stream = getClass().getClassLoader().getResourceAsStream("json/example-with-comments.json");
doc = reader.read(stream);
assertNotNull(doc);
assertEquals(4, countFields(doc));
assertField("firstName", "Jane");
assertField("lastName", "Doe");
doc = doc.getDocument("address");
assertEquals(3, countFields(doc));
assertField("street", "Main // Street");
assertField("city", "Mem/ phis");
assertField("zip", 12345);
}
@Test
@FixFor( "MODE-2082" )
public void shouldNotParseJsonWithInvalidComments() throws Exception {
InputStream stream = getClass().getClassLoader().getResourceAsStream("json/invalid-example-with-comments.json");
try {
doc = reader.read(stream);
fail("Expected parsing exception");
} catch (ParsingException e) {
// expected
}
stream = getClass().getClassLoader().getResourceAsStream("json/invalid-example-with-comments2.json");
try {
doc = reader.read(stream);
fail("Expected parsing exception");
} catch (ParsingException e) {
// expected
}
}
@Test
@FixFor( "MODE-2214" )
public void shouldNotParseJsonWithInvalidArray() throws Exception {
InputStream stream = getClass().getClassLoader().getResourceAsStream("json/invalid-array-repo-config-1.json");
try {
doc = reader.read(stream);
fail("Expected parsing exception");
} catch (ParsingException e) {
// expected
}
stream = getClass().getClassLoader().getResourceAsStream("json/invalid-array-repo-config-2.json");
try {
doc = reader.read(stream);
fail("Expected parsing exception");
} catch (ParsingException e) {
// expected
}
}
@Test
@FixFor( "MODE-2317" )
public void shouldParseNonUnicodeEscapeSequence() throws Exception {
String url = "jdbc:h2:file:path\\upstream.jboss-integration.modeshape\\modeshape-jcr;DB_CLOSE_DELAY=-1";
doc = reader.read("{ \"url\" : \"" + url + "\"}");
assertField("url", url);
InputStream stream = getClass().getClassLoader().getResourceAsStream("json/non-unicode-escape.json");
reader.read(stream);
}
private int countFields( Document doc ) {
int fieldCount = 0;
for (Document.Field field : doc.fields()) {
assertThat(field, is(notNullValue()));
fieldCount++;
}
return fieldCount;
}
protected void assertField( String name,
Object value ) {
Object actual = doc.get(name);
if (value == null) {
assertNull(actual);
} else {
assertEquals(value, actual);
}
}
}