You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by go...@apache.org on 2012/09/28 22:23:42 UTC
svn commit: r1391636 - in /incubator/flex/falcon/trunk/compiler.tests: ./
unit-tests/ unit-tests/org/ unit-tests/org/apache/
unit-tests/org/apache/flex/ unit-tests/org/apache/flex/compiler/
unit-tests/org/apache/flex/compiler/internal/ unit-tests/org/a...
Author: gordonsmith
Date: Fri Sep 28 20:23:42 2012
New Revision: 1391636
URL: http://svn.apache.org/viewvc?rev=1391636&view=rev
Log:
Falcon: Added first JUnit test file (for MXMLTokenizer). Added compiler.tests project for debugging unit tests in Eclipse. The ability to run unit tests in Ant will come next.
Added:
incubator/flex/falcon/trunk/compiler.tests/.classpath (with props)
incubator/flex/falcon/trunk/compiler.tests/.project (with props)
incubator/flex/falcon/trunk/compiler.tests/unit-tests/
incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/
incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/
incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/flex/
incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/flex/compiler/
incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/flex/compiler/internal/
incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/flex/compiler/internal/parsing/
incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/flex/compiler/internal/parsing/mxml/
incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/flex/compiler/internal/parsing/mxml/MXMLTokenizerTests.java (with props)
Added: incubator/flex/falcon/trunk/compiler.tests/.classpath
URL: http://svn.apache.org/viewvc/incubator/flex/falcon/trunk/compiler.tests/.classpath?rev=1391636&view=auto
==============================================================================
--- incubator/flex/falcon/trunk/compiler.tests/.classpath (added)
+++ incubator/flex/falcon/trunk/compiler.tests/.classpath Fri Sep 28 20:23:42 2012
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="unit-tests"/>
+ <classpathentry kind="lib" path="lib/junit-4.10.jar"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="lib" path="/compiler/lib/commons-io.jar"/>
+ <classpathentry kind="src" path="/compiler"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
Propchange: incubator/flex/falcon/trunk/compiler.tests/.classpath
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/flex/falcon/trunk/compiler.tests/.project
URL: http://svn.apache.org/viewvc/incubator/flex/falcon/trunk/compiler.tests/.project?rev=1391636&view=auto
==============================================================================
--- incubator/flex/falcon/trunk/compiler.tests/.project (added)
+++ incubator/flex/falcon/trunk/compiler.tests/.project Fri Sep 28 20:23:42 2012
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>compiler.tests</name>
+ <comment></comment>
+ <projects>
+ <project>compiler</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
Propchange: incubator/flex/falcon/trunk/compiler.tests/.project
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/flex/compiler/internal/parsing/mxml/MXMLTokenizerTests.java
URL: http://svn.apache.org/viewvc/incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/flex/compiler/internal/parsing/mxml/MXMLTokenizerTests.java?rev=1391636&view=auto
==============================================================================
--- incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/flex/compiler/internal/parsing/mxml/MXMLTokenizerTests.java (added)
+++ incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/flex/compiler/internal/parsing/mxml/MXMLTokenizerTests.java Fri Sep 28 20:23:42 2012
@@ -0,0 +1,799 @@
+package org.apache.flex.compiler.internal.parsing.mxml;
+
+import static org.junit.Assert.*;
+import static org.hamcrest.core.Is.is;
+
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.flex.compiler.parsing.MXMLTokenTypes;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class MXMLTokenizerTests
+{
+ /**
+ * Lexes MXML code into MXML tokens.
+ */
+ private MXMLToken[] lex(String code)
+ {
+ Reader reader = new StringReader(code);
+ MXMLTokenizer tokenizer = new MXMLTokenizer();
+ List<MXMLToken> tokens = tokenizer.parseTokens(reader);
+ IOUtils.closeQuietly(tokenizer);
+ return tokens.toArray(new MXMLToken[0]);
+ }
+
+ /*
+ * Smallest processing instruction.
+ */
+ @Test
+ public void processingInstruction1()
+ {
+ String code = "<?xml?>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_PROCESSING_INSTRUCTION));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * An entire processing instruction is lexed as a single token.
+ */
+ @Test
+ public void processingInstruction2()
+ {
+ String code = "<?xml version='1.0' encoding=\"utf-8\"?>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_PROCESSING_INSTRUCTION));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * Smallest normal comment.
+ * This is getting incorrectly lexed as an ASDoc comment.
+ */
+ @Ignore
+ @Test
+ public void comment1()
+ {
+ String code = "<!---->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * Normal comment with some whitespace.
+ */
+ @Test
+ public void comment2()
+ {
+ String code = "<!-- -->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * Normal comment with some text, including whitespace.
+ */
+ @Test
+ public void comment3()
+ {
+ String code = "<!-- xxx \t\r\nxxx -->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * Normal comment with a tag inside.
+ */
+ @Test
+ public void comment4()
+ {
+ String code = "<!-- <a/> -->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * Normal comment with an entity inside.
+ */
+ @Test
+ public void comment5()
+ {
+ String code = "<!-- A -->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * Normal comment with a comment "nested" inside.
+ * Note that the they don't actually nest.
+ */
+ @Test
+ public void nestedComment()
+ {
+ String code = "<!-- <!-- --> -->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(2));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is("<!-- <!-- -->"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_TEXT));
+ assertThat("1 text", tokens[1].getText(), is(" -->"));
+ }
+
+ /*
+ * Smallest ASDoc comment.
+ */
+ @Test
+ public void asdoc1()
+ {
+ String code = "<!----->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_ASDOC_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * ASDoc comment with some whitespace.
+ */
+ @Test
+ public void asdoc2()
+ {
+ String code = "<!--- -->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_ASDOC_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * ASDoc comment with some text.
+ */
+ @Test
+ public void asdoc3()
+ {
+ String code = "<!--- xxx \t\r\nxxx -->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_ASDOC_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * ASDoc comment with a tag inside.
+ */
+ @Test
+ public void asdoc4()
+ {
+ String code = "<!--- <a/> -->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_ASDOC_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * ASDoc comment with an entity inside.
+ */
+ @Test
+ public void asdoc5()
+ {
+ String code = "<!---A -->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_ASDOC_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * ASDoc comment with an ASDoc comment "nested" inside.
+ * Note that they don't actually nest.
+ */
+ @Test
+ public void nestedASDoc()
+ {
+ String code = "<!--- <!--- ---> --->";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(2));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_ASDOC_COMMENT));
+ assertThat("0 text", tokens[0].getText(), is("<!--- <!--- --->"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_TEXT));
+ assertThat("1 text", tokens[1].getText(), is(" --->"));
+ }
+
+ /*
+ * Pure whitespace of various kinds. TODO: What are all the kinds?
+ */
+ @Test
+ public void whitespace()
+ {
+ String code = " \t\r\n";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_WHITESPACE));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * Letters with surrounding and contained whitespace are just text.
+ */
+ @Test
+ public void text1()
+ {
+ String code = " xxx yyy ";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_TEXT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * Digits with surrounding and contained whitespace are just text.
+ */
+ @Test
+ public void text2()
+ {
+ String code = " 123 456 ";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_TEXT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * Punctuation characters other than < are just text.
+ */
+ @Test
+ public void text3()
+ {
+ String code = "`~!@#$%^&*()-_=+[{]};:'\",./?\\|>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(1));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_TEXT));
+ assertThat("0 text", tokens[0].getText(), is(code));
+ }
+
+ /*
+ * An empty tag has a start token and and end token.
+ */
+ @Test
+ public void emptyTag1()
+ {
+ String code = "<a/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(2));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("1 text", tokens[1].getText(), is("/>"));
+ }
+
+ /*
+ * Whitespace between the start and end is ignored.
+ */
+ @Test
+ public void emptyTag2()
+ {
+ String code = "<a />";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(2));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("1 text", tokens[1].getText(), is("/>"));
+ }
+
+ /*
+ * A single underscore is a legal tag name, at least in XML.
+ */
+ @Test
+ public void emptyTagName1()
+ {
+ String code = "<_/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(2));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<_"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("1 text", tokens[1].getText(), is("/>"));
+ }
+
+ /*
+ * A single colon is a legal tag name, at least in XML.
+ */
+ @Test
+ public void emptyTagName2()
+ {
+ String code = "<:/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(2));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<:"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("1 text", tokens[1].getText(), is("/>"));
+ }
+
+ /*
+ * The non-first character of a tag name can be letter, digit, underscore, colon, period, or hyphen.
+ * Hyphen doesn't currently work.
+ * TODO: What other Unicode characters are allowed?
+ */
+ @Ignore
+ @Test
+ public void emptyTagName3()
+ {
+ String code = "<azAZ19_:.-/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(2));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<azAZ19_:.-"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("1 text", tokens[1].getText(), is("/>"));
+ }
+
+ /*
+ * Each attribute produces three tokens.
+ * Note that the text of the attribute value includes the single or double quotes.
+ */
+ @Test
+ public void emptyTagWithAttributes()
+ {
+ String code = "<a b='c' d=\"f\"/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(8));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_NAME));
+ assertThat("1 text", tokens[1].getText(), is("b"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_EQUALS));
+ assertThat("2 text", tokens[2].getText(), is("="));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_STRING));
+ assertThat("3 text", tokens[3].getText(), is("'c'"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_NAME));
+ assertThat("4 text", tokens[4].getText(), is("d"));
+
+ assertThat("5 type", tokens[5].getType(), is(MXMLTokenTypes.TOKEN_EQUALS));
+ assertThat("5 text", tokens[5].getText(), is("="));
+
+ assertThat("6 type", tokens[6].getType(), is(MXMLTokenTypes.TOKEN_STRING));
+ assertThat("6 text", tokens[6].getText(), is("\"f\""));
+
+ assertThat("7 type", tokens[7].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("7 text", tokens[7].getText(), is("/>"));
+ }
+
+ /*
+ * A single underscore is a legal attribute name, at least in XML.
+ */
+ @Test
+ public void attributeName1()
+ {
+ String code = "<a _='c'/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(5));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_NAME));
+ assertThat("1 text", tokens[1].getText(), is("_"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_EQUALS));
+ assertThat("2 text", tokens[2].getText(), is("="));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_STRING));
+ assertThat("3 text", tokens[3].getText(), is("'c'"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("4 text", tokens[4].getText(), is("/>"));
+ }
+
+ /*
+ * A single colon is a legal attribute name, at least in XML.
+ */
+ @Test
+ public void attributeName2()
+ {
+ String code = "<a :='c'/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(5));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_NAME));
+ assertThat("1 text", tokens[1].getText(), is(":"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_EQUALS));
+ assertThat("2 text", tokens[2].getText(), is("="));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_STRING));
+ assertThat("3 text", tokens[3].getText(), is("'c'"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("4 text", tokens[4].getText(), is("/>"));
+ }
+
+ /*
+ * Attribute names have the same rules as tag names.
+ */
+ @Ignore
+ @Test
+ public void attributeName3()
+ {
+ String code = "<a azAZ19_:.-='c'/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(5));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_NAME));
+ assertThat("1 text", tokens[1].getText(), is("azAZ19_:.-"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_EQUALS));
+ assertThat("2 text", tokens[2].getText(), is("="));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_STRING));
+ assertThat("3 text", tokens[3].getText(), is("'c'"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("4 text", tokens[4].getText(), is("/>"));
+ }
+
+ /*
+ * Whitespace as attribute value.
+ */
+ @Test
+ public void attributeValue1()
+ {
+ String code = "<a b=' \t\r\n'/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(5));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_NAME));
+ assertThat("1 text", tokens[1].getText(), is("b"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_EQUALS));
+ assertThat("2 text", tokens[2].getText(), is("="));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_STRING));
+ assertThat("3 text", tokens[3].getText(), is("' \t\r\n'"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("4 text", tokens[4].getText(), is("/>"));
+ }
+
+ /*
+ * > as attribute value.
+ */
+ @Test
+ public void attributeValue2()
+ {
+ String code = "<a b='>'/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(5));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_NAME));
+ assertThat("1 text", tokens[1].getText(), is("b"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_EQUALS));
+ assertThat("2 text", tokens[2].getText(), is("="));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_STRING));
+ assertThat("3 text", tokens[3].getText(), is("'>'"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("4 text", tokens[4].getText(), is("/>"));
+ }
+
+ /*
+ * Entity as attribute value.
+ */
+ @Test
+ public void attributeValue3()
+ {
+ String code = "<a b='A'/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(5));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_NAME));
+ assertThat("1 text", tokens[1].getText(), is("b"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_EQUALS));
+ assertThat("2 text", tokens[2].getText(), is("="));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_STRING));
+ assertThat("3 text", tokens[3].getText(), is("'A'"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("4 text", tokens[4].getText(), is("/>"));
+ }
+
+ /*
+ * Punctuation as attribute value. Note: < and the delimiter are not allowed.
+ */
+ @Test
+ public void attributeValue4()
+ {
+ String code = "<a b='`~!@#$%^*()-_=+{}[];:\",./?\\|'/>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(5));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_NAME));
+ assertThat("1 text", tokens[1].getText(), is("b"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_EQUALS));
+ assertThat("2 text", tokens[2].getText(), is("="));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_STRING));
+ assertThat("3 text", tokens[3].getText(), is("'`~!@#$%^*()-_=+{}[];:\",./?\\|'"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("4 text", tokens[4].getText(), is("/>"));
+ }
+
+ /*
+ * Open/close tags.
+ */
+ @Test
+ public void openTag_closeTag()
+ {
+ String code = "<a></a>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(4));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("1 text", tokens[1].getText(), is(">"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_CLOSE_TAG_START));
+ assertThat("2 text", tokens[2].getText(), is("</a"));
+
+ assertThat("3 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("3 text", tokens[1].getText(), is(">"));
+ }
+
+ /*
+ * Open/close tags with whitespace content.
+ */
+ @Test
+ public void openTag_ws_closeTag()
+ {
+ String code = "<a> \t\r\n</a>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(5));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("1 text", tokens[1].getText(), is(">"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_WHITESPACE));
+ assertThat("2 text", tokens[2].getText(), is(" \t\r\n"));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_CLOSE_TAG_START));
+ assertThat("3 text", tokens[3].getText(), is("</a"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("4 text", tokens[4].getText(), is(">"));
+ }
+
+ /*
+ * Open/close tags with text content.
+ */
+ @Test
+ public void openTag_text_closeTag1()
+ {
+ String code = "<a>xxx</a>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(5));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("1 text", tokens[1].getText(), is(">"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_TEXT));
+ assertThat("2 text", tokens[2].getText(), is("xxx"));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_CLOSE_TAG_START));
+ assertThat("3 text", tokens[3].getText(), is("</a"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("4 text", tokens[4].getText(), is(">"));
+ }
+
+ /*
+ * Open/close tags with text content that includes whitespace.
+ */
+ @Test
+ public void openTag_text_closeTag2()
+ {
+ String code = "<a> \t\r\nxxx \t\r\n</a>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(5));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("1 text", tokens[1].getText(), is(">"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_TEXT));
+ assertThat("2 text", tokens[2].getText(), is(" \t\r\nxxx \t\r\n"));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_CLOSE_TAG_START));
+ assertThat("3 text", tokens[3].getText(), is("</a"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("4 text", tokens[4].getText(), is(">"));
+ }
+
+ /*
+ * Open/close tags with an empty tag as content.
+ */
+ @Test
+ public void openTag_emptyTag_closeTag()
+ {
+ String code = "<a><b/></a>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(6));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("1 text", tokens[1].getText(), is(">"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("2 text", tokens[2].getText(), is("<b"));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_EMPTY_TAG_END));
+ assertThat("3 text", tokens[3].getText(), is("/>"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_CLOSE_TAG_START));
+ assertThat("4 text", tokens[4].getText(), is("</a"));
+
+ assertThat("5 type", tokens[5].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("5 text", tokens[5].getText(), is(">"));
+ }
+
+ /*
+ * Open/close tags with open/close tags nested inside.
+ */
+ @Test
+ public void openTag_openTag_closeTag_closeTag()
+ {
+ String code = "<a><b></b></a>";
+ MXMLToken[] tokens = lex(code);
+
+ assertThat("count", tokens.length, is(8));
+
+ assertThat("0 type", tokens[0].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("0 text", tokens[0].getText(), is("<a"));
+
+ assertThat("1 type", tokens[1].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("1 text", tokens[1].getText(), is(">"));
+
+ assertThat("2 type", tokens[2].getType(), is(MXMLTokenTypes.TOKEN_OPEN_TAG_START));
+ assertThat("2 text", tokens[2].getText(), is("<b"));
+
+ assertThat("3 type", tokens[3].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("3 text", tokens[3].getText(), is(">"));
+
+ assertThat("4 type", tokens[4].getType(), is(MXMLTokenTypes.TOKEN_CLOSE_TAG_START));
+ assertThat("4 text", tokens[4].getText(), is("</b"));
+
+ assertThat("5 type", tokens[5].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("5 text", tokens[5].getText(), is(">"));
+
+ assertThat("6 type", tokens[6].getType(), is(MXMLTokenTypes.TOKEN_CLOSE_TAG_START));
+ assertThat("6 text", tokens[6].getText(), is("</a"));
+
+ assertThat("7 type", tokens[7].getType(), is(MXMLTokenTypes.TOKEN_TAG_END));
+ assertThat("7 text", tokens[7].getText(), is(">"));
+ }
+}
Propchange: incubator/flex/falcon/trunk/compiler.tests/unit-tests/org/apache/flex/compiler/internal/parsing/mxml/MXMLTokenizerTests.java
------------------------------------------------------------------------------
svn:eol-style = native