/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.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; /** * JUnit tests for MXMLTokenizer. * * @author Gordon Smith */ 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(">")); } }