blob: 67f955ae56007a62f9e1d0a678ba7921042645a1 [file] [log] [blame]
package org.codehaus.jackson.main;
import main.BaseTest;
import org.codehaus.jackson.*;
import java.io.*;
/**
* Some unit tests to try to exercise part of parser code that
* deals with symbol (table) management.
*/
public class TestWithTonsaSymbols
extends BaseTest
{
final static String FIELD_BASENAME = "f";
/**
* How many fields to generate? Since maximum symbol table
* size is defined as 6000 (above which table gets cleared,
* assuming the name vocabulary is unbounded), let's do something
* just slightly below it.
*/
final static int FIELD_COUNT = 5000;
public void testStreamReaderParser() throws Exception
{
_testWith(true);
}
public void testReaderParser() throws Exception
{
_testWith(false);
}
/*
//////////////////////////////////////////////////////
// Helper methods
//////////////////////////////////////////////////////
*/
private void _testWith(boolean useStream)
throws Exception
{
JsonFactory jf = new JsonFactory();
String doc = buildDoc(FIELD_COUNT);
/* And let's do this multiple times: just so that symbol table
* state is different between runs.
*/
for (int x = 0; x < 3; ++x) {
JsonParser jp = useStream ?
jf.createJsonParser(new ByteArrayInputStream(doc.getBytes("UTF-8")))
: jf.createJsonParser(new StringReader(doc));
assertToken(JsonToken.START_OBJECT, jp.nextToken());
for (int i = 0; i < FIELD_COUNT; ++i) {
assertToken(JsonToken.FIELD_NAME, jp.nextToken());
assertEquals(fieldNameFor(i), jp.getCurrentName());
assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken());
assertEquals(i, jp.getIntValue());
}
assertToken(JsonToken.END_OBJECT, jp.nextToken());
jp.close();
}
}
private void fieldNameFor(StringBuilder sb, int index)
{
/* let's do something like "f1.1" to exercise different
* field names (important for byte-based codec)
* Other name shuffling done mostly just for fun... :)
*/
sb.append(FIELD_BASENAME);
sb.append(index);
if (index > 50) {
sb.append('.');
if (index > 200) {
sb.append(index);
if (index > 4000) { // and some even longer symbols...
sb.append(".").append(index);
}
} else {
sb.append(index >> 3); // divide by 8
}
}
}
private String fieldNameFor(int index)
{
StringBuilder sb = new StringBuilder(16);
fieldNameFor(sb, index);
return sb.toString();
}
private String buildDoc(int len)
{
StringBuilder sb = new StringBuilder(len * 12);
sb.append('{');
for (int i = 0; i < len; ++i) {
if (i > 0) {
sb.append(',');
}
sb.append('"');
fieldNameFor(sb, i);
sb.append('"');
sb.append(':');
sb.append(i);
}
sb.append('}');
return sb.toString();
}
}