/*
* File: TestXMLTokener.java
* Author: JSON.org
*/
package org.json.tests;
import org.json.JSONException;
import org.json.XMLTokener;
import junit.framework.TestCase;
/**
* The Class TestXMLTokener.
*/
public class TestXMLTokener extends TestCase
{
/** The xmltokener. */
private XMLTokener xmltokener;
/**
* Tests the nextContent method.
*/
public void testNextContent()
{
try
{
xmltokener = new XMLTokener("< abc>");
assertEquals('<', xmltokener.nextContent());
assertEquals("abc>", xmltokener.nextContent());
assertEquals('<', xmltokener.nextContent());
assertEquals("de f/>", xmltokener.nextContent());
assertEquals('<', xmltokener.nextContent());
assertEquals("/abc>", xmltokener.nextContent());
assertEquals(null, xmltokener.nextContent());
} catch (JSONException e)
{
fail(e.getMessage());
}
}
/**
* Tests the nextCdata method.
*/
public void testNextCdata()
{
try
{
xmltokener = new XMLTokener("<[CDATA[]]>");
assertEquals('<', xmltokener.next('<'));
assertEquals('[', xmltokener.next('['));
assertEquals("CDATA", xmltokener.nextToken());
assertEquals('[', xmltokener.next('['));
assertEquals("", xmltokener.nextCDATA());
} catch (JSONException e)
{
fail(e.getMessage());
}
}
/**
* Tests the nextCdata method using broken cdata.
*/
public void testNextCdata_BrokenCdata1()
{
try
{
xmltokener = new XMLTokener("<[CDATA[]>");
assertEquals('<', xmltokener.next('<'));
assertEquals('[', xmltokener.next('['));
assertEquals("CDATA", xmltokener.nextToken());
assertEquals('[', xmltokener.next('['));
xmltokener.nextCDATA();
fail("Should have thrown exception.");
} catch (JSONException e)
{
assertEquals("Unclosed CDATA at 22 [character 23 line 1]", e.getMessage());
}
}
/**
* Tests the nextCdata method using broken cdata.
*/
public void testNextCdata_BrokenCdata2()
{
try
{
xmltokener = new XMLTokener("<[CDATA[]]");
assertEquals('<', xmltokener.next('<'));
assertEquals('[', xmltokener.next('['));
assertEquals("CDATA", xmltokener.nextToken());
assertEquals('[', xmltokener.next('['));
xmltokener.nextCDATA();
fail("Should have thrown exception.");
} catch (JSONException e)
{
assertEquals("Unclosed CDATA at 22 [character 23 line 1]", e.getMessage());
}
}
/**
* Tests the nextCdata method using broken cdata.
*/
public void testNextCdata_BrokenCdata3()
{
try
{
xmltokener = new XMLTokener("<[CDATA[]]");
assertEquals('<', xmltokener.next('<'));
assertEquals('[', xmltokener.next('['));
assertEquals("CDATA", xmltokener.nextToken());
assertEquals('[', xmltokener.next('['));
xmltokener.nextCDATA();
fail("Should have thrown exception.");
} catch (JSONException e)
{
assertEquals("Unclosed CDATA at 22 [character 23 line 1]", e.getMessage());
}
}
/**
* Tests the nextCdata method using broken cdata.
*/
public void testNextCdata_BrokenCdata4()
{
try
{
xmltokener = new XMLTokener("<[CDATA[");
assertEquals('<', xmltokener.next('<'));
assertEquals('[', xmltokener.next('['));
assertEquals("CDATA", xmltokener.nextToken());
assertEquals('[', xmltokener.next('['));
xmltokener.nextCDATA();
fail("Should have thrown exception.");
} catch (JSONException e)
{
assertEquals("Unclosed CDATA at 15 [character 16 line 1]", e.getMessage());
}
}
/**
* Tests the nextEntity method using ampersand.
*/
public void testNextEntity_Ampersand()
{
try
{
xmltokener = new XMLTokener("<&>");
assertEquals('<', xmltokener.next('<'));
assertEquals('&', xmltokener.next('&'));
assertEquals('&', xmltokener.nextEntity('&'));
} catch (JSONException e)
{
fail(e.getMessage());
}
}
/**
* Tests the nextEntity method using number entity.
*/
public void testNextEntity_NumberEntity()
{
try
{
xmltokener = new XMLTokener("<<>");
assertEquals('<', xmltokener.next('<'));
assertEquals('&', xmltokener.next('&'));
assertEquals("<", xmltokener.nextEntity('&'));
} catch (JSONException e)
{
fail(e.getMessage());
}
}
/**
* Tests the nextEntity method using broken entity.
*/
public void testNextEntity_BrokenEntity()
{
try
{
xmltokener = new XMLTokener("< ");
assertEquals('<', xmltokener.next('<'));
assertEquals('&', xmltokener.next('&'));
assertEquals("<", xmltokener.nextEntity('&'));
fail("Should have thrown exception.");
} catch (JSONException e)
{
assertEquals("Missing ';' in XML entity:   at 7 [character 8 line 1]", e.getMessage());
}
}
/**
* Tests the nextMeta method using string.
*/
public void testNextMeta_String()
{
try
{
xmltokener = new XMLTokener("");
assertEquals('<', xmltokener.next('<'));
assertEquals('!', xmltokener.next('!'));
assertEquals(true, xmltokener.nextMeta());
} catch (JSONException e)
{
fail(e.getMessage());
}
}
/**
* Tests the nextMeta method using open string.
*/
public void testNextMeta_OpenString()
{
try
{
xmltokener = new XMLTokener("");
assertEquals('<', xmltokener.next('<'));
assertEquals('!', xmltokener.next('!'));
xmltokener.nextMeta();
fail("Should have thrown exception.");
} catch (JSONException e)
{
assertEquals("Unterminated string at 16 [character 17 line 1]", e.getMessage());
}
}
/**
* Tests the nextMeta method using symbols.
*/
public void testNextMeta_Symbols()
{
try
{
xmltokener = new XMLTokener("/=!?>");
assertEquals('<', xmltokener.next('<'));
assertEquals('!', xmltokener.next('!'));
assertEquals('<', xmltokener.nextMeta());
assertEquals('>', xmltokener.nextMeta());
assertEquals('/', xmltokener.nextMeta());
assertEquals('=', xmltokener.nextMeta());
assertEquals('!', xmltokener.nextMeta());
assertEquals('?', xmltokener.nextMeta());
} catch (JSONException e)
{
fail(e.getMessage());
}
}
/**
* Tests the nextMeta method using misshaped.
*/
public void testNextMeta_Misshaped()
{
try
{
xmltokener = new XMLTokener("");
assertEquals('<', xmltokener.next('<'));
assertEquals("da", xmltokener.nextToken());
assertEquals("ta", xmltokener.nextToken());
assertEquals('>', xmltokener.nextToken());
} catch (JSONException e)
{
fail(e.getMessage());
}
}
/**
* Tests the nextToken method using tag with bad character.
*/
public void testNextToken_TagWithBadCharacter()
{
try
{
xmltokener = new XMLTokener("");
assertEquals('<', xmltokener.next('<'));
xmltokener.nextToken();
fail("Should have thrown exception.");
} catch (JSONException e)
{
assertEquals("Bad character in a name at 4 [character 5 line 1]", e.getMessage());
}
}
/**
* Tests the nextToken method using tag with misplaced less than.
*/
public void testNextToken_TagWithMisplacedLessThan()
{
try
{
xmltokener = new XMLTokener("<");
assertEquals('<', xmltokener.next('<'));
xmltokener.nextToken();
fail("Should have thrown exception.");
} catch (JSONException e)
{
assertEquals("Misplaced '<' at 2 [character 3 line 1]", e.getMessage());
}
}
/**
* Tests the nextToken method using misshaped element.
*/
public void testNextToken_MisshapedElement()
{
try
{
xmltokener = new XMLTokener("<");
assertEquals('<', xmltokener.next('<'));
xmltokener.nextToken();
fail("Should have thrown exception.");
} catch (JSONException e)
{
assertEquals("Misshaped element at 2 [character 3 line 1]", e.getMessage());
}
}
/**
* Tests the nextToken method using symbols.
*/
public void testNextToken_Symbols()
{
try
{
xmltokener = new XMLTokener("< /=!?");
assertEquals('<', xmltokener.next('<'));
assertEquals('/', xmltokener.nextToken());
assertEquals('=', xmltokener.nextToken());
assertEquals('!', xmltokener.nextToken());
assertEquals('?', xmltokener.nextToken());
} catch (JSONException e)
{
fail(e.getMessage());
}
}
/**
* Tests the nextToken method using string.
*/
public void testNextToken_String()
{
try
{
xmltokener = new XMLTokener("<\"abc&123\">");
assertEquals('<', xmltokener.next('<'));
assertEquals("abc&123", xmltokener.nextToken());
} catch (JSONException e)
{
fail(e.getMessage());
}
}
/**
* Tests the nextToken method using no greater than.
*/
public void testNextToken_NoGreaterThan()
{
try
{
xmltokener = new XMLTokener("");
assertEquals('<', xmltokener.next('<'));
xmltokener.nextToken();
fail("Should have thrown exception.");
} catch (JSONException e)
{
assertEquals("Unterminated string at 10 [character 11 line 1]", e.getMessage());
}
}
/**
* Tests the skipTo method.
*/
public void testSkipTo()
{
try
{
xmltokener = new XMLTokener("");
assertEquals('<', xmltokener.next('<'));
assertEquals(true, xmltokener.skipPast("c1"));
assertEquals('2', xmltokener.next('2'));
assertEquals(false, xmltokener.skipPast("b1"));
} catch (JSONException e)
{
fail(e.getMessage());
}
}
/**
* Tests the skipTo method using long parameter.
*/
public void testSkipTo_LongParameter()
{
try
{
xmltokener = new XMLTokener("");
assertEquals('<', xmltokener.next('<'));
assertEquals(false, xmltokener.skipPast("abcdefghi"));
} catch (JSONException e)
{
fail(e.getMessage());
}
}
}