blob: 7da8d7bfc24745369fcc4447e60d300c8eed81de [file] [log] [blame]
package org.codehaus.jackson.smile;
import java.io.*;
import org.codehaus.jackson.*;
import org.codehaus.jackson.format.DataFormatDetector;
import org.codehaus.jackson.format.DataFormatMatcher;
import org.codehaus.jackson.format.MatchStrength;
public class TestSmileDetection extends SmileTestBase
{
public void testSimpleObjectWithHeader() throws IOException
{
SmileFactory f = new SmileFactory();
DataFormatDetector detector = new DataFormatDetector(f);
byte[] doc = _smileDoc("{\"a\":3}", true);
DataFormatMatcher matcher = detector.findFormat(doc);
// should have match
assertTrue(matcher.hasMatch());
assertEquals("Smile", matcher.getMatchedFormatName());
assertSame(f, matcher.getMatch());
// with header, should be full match
assertEquals(MatchStrength.FULL_MATCH, matcher.getMatchStrength());
// and so:
JsonParser jp = matcher.createParserWithMatch();
assertToken(JsonToken.START_OBJECT, jp.nextToken());
assertToken(JsonToken.FIELD_NAME, jp.nextToken());
assertEquals("a", jp.getCurrentName());
assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken());
assertEquals(3, jp.getIntValue());
assertToken(JsonToken.END_OBJECT, jp.nextToken());
assertNull(jp.nextToken());
jp.close();
}
public void testSimpleObjectWithoutHeader() throws IOException
{
SmileFactory f = new SmileFactory();
DataFormatDetector detector = new DataFormatDetector(f);
f.disable(SmileParser.Feature.REQUIRE_HEADER);
byte[] doc = _smileDoc("{\"abc\":false}", false);
DataFormatMatcher matcher = detector.findFormat(doc);
assertTrue(matcher.hasMatch());
assertEquals("Smile", matcher.getMatchedFormatName());
assertSame(f, matcher.getMatch());
assertEquals(MatchStrength.SOLID_MATCH, matcher.getMatchStrength());
JsonParser jp = matcher.createParserWithMatch();
assertToken(JsonToken.START_OBJECT, jp.nextToken());
assertToken(JsonToken.FIELD_NAME, jp.nextToken());
assertEquals("abc", jp.getCurrentName());
assertToken(JsonToken.VALUE_FALSE, jp.nextToken());
assertToken(JsonToken.END_OBJECT, jp.nextToken());
assertNull(jp.nextToken());
jp.close();
}
public void testSimpleArrayWithHeader() throws IOException
{
SmileFactory f = new SmileFactory();
DataFormatDetector detector = new DataFormatDetector(f);
byte[] doc = _smileDoc("[ true, 7 ]", true);
DataFormatMatcher matcher = detector.findFormat(doc);
// should have match
assertTrue(matcher.hasMatch());
assertEquals("Smile", matcher.getMatchedFormatName());
assertSame(f, matcher.getMatch());
// with header, should be full match
assertEquals(MatchStrength.FULL_MATCH, matcher.getMatchStrength());
JsonParser jp = matcher.createParserWithMatch();
assertToken(JsonToken.START_ARRAY, jp.nextToken());
assertToken(JsonToken.VALUE_TRUE, jp.nextToken());
assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken());
assertEquals(7, jp.getIntValue());
assertToken(JsonToken.END_ARRAY, jp.nextToken());
assertNull(jp.nextToken());
jp.close();
}
public void testSimpleArrayWithoutHeader() throws IOException
{
SmileFactory f = new SmileFactory();
f.disable(SmileParser.Feature.REQUIRE_HEADER);
DataFormatDetector detector = new DataFormatDetector(f);
byte[] doc = _smileDoc("[ -13 ]", false);
DataFormatMatcher matcher = detector.findFormat(doc);
assertTrue(matcher.hasMatch());
assertEquals("Smile", matcher.getMatchedFormatName());
assertSame(f, matcher.getMatch());
assertEquals(MatchStrength.SOLID_MATCH, matcher.getMatchStrength());
JsonParser jp = matcher.createParserWithMatch();
assertToken(JsonToken.START_ARRAY, jp.nextToken());
assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken());
assertToken(JsonToken.END_ARRAY, jp.nextToken());
assertNull(jp.nextToken());
jp.close();
}
/*
/**********************************************************
/* Simple negative tests
/**********************************************************
*/
/*
* Also let's ensure no match is found if data doesn't support it...
* Let's use 0xFD since it can not be included (except in raw binary;
* use of which requires header to be present)
*/
public void testSimpleInvalid() throws Exception
{
DataFormatDetector detector = new DataFormatDetector(new SmileFactory());
byte FD = (byte) 0xFD;
byte[] DOC = new byte[] { FD, FD, FD, FD };
DataFormatMatcher matcher = detector.findFormat(new ByteArrayInputStream(DOC));
assertFalse(matcher.hasMatch());
assertEquals(MatchStrength.INCONCLUSIVE, matcher.getMatchStrength());
assertNull(matcher.createParserWithMatch());
}
/*
/**********************************************************
/* Fallback tests to ensure Smile is found even against JSON
/**********************************************************
*/
public void testSmileVsJson() throws IOException
{
SmileFactory f = new SmileFactory();
f.disable(SmileParser.Feature.REQUIRE_HEADER);
DataFormatDetector detector = new DataFormatDetector(new JsonFactory(), f);
// to make it bit trickier, leave out header
byte[] doc = _smileDoc("[ \"abc\" ]", false);
DataFormatMatcher matcher = detector.findFormat(doc);
assertTrue(matcher.hasMatch());
assertEquals("Smile", matcher.getMatchedFormatName());
assertSame(f, matcher.getMatch());
// without header, just solid
assertEquals(MatchStrength.SOLID_MATCH, matcher.getMatchStrength());
JsonParser jp = matcher.createParserWithMatch();
assertToken(JsonToken.START_ARRAY, jp.nextToken());
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
assertToken(JsonToken.END_ARRAY, jp.nextToken());
assertNull(jp.nextToken());
jp.close();
}
}