001: /*
002: * LanguageTest.java
003: * JUnit based test
004: *
005: * Created on March 19, 2007, 9:26 AM
006: */
007:
008: package org.netbeans.modules.languages;
009:
010: import java.io.IOException;
011: import java.util.Collections;
012: import java.util.List;
013: import junit.framework.TestCase;
014:
015: import org.netbeans.api.languages.ParseException;
016: import org.netbeans.modules.languages.parser.LLSyntaxAnalyser;
017:
018: /**
019: *
020: * @author Jan Jancura
021: */
022: public class NBSLanguageReaderTest extends TestCase {
023:
024: public NBSLanguageReaderTest(String testName) {
025: super (testName);
026: }
027:
028: public void testOK() throws ParseException, IOException {
029: NBSLanguageReader reader = NBSLanguageReader
030: .create(
031: "TOKEN:TAG:( '<' ['a'-'z']+ )\n"
032: + "TOKEN:SYMBOL:( '>' | '=')\n"
033: + "TOKEN:ENDTAG:( '</' ['a'-'z']+ )\n"
034: + "TOKEN:ATTRIBUTE:( ['a'-'z']+ )\n"
035: + "TOKEN:ATTR_VALUE:( '\\\"' [^ '\\n' '\\r' '\\\"' '\\uffff']+ '\\\"' )\n"
036: + "TOKEN:VALUE:( '\\\"' [^ '\\n' '\\r' '\\\"']+ '\\\"' )\n"
037: + "TOKEN:TEXT:( [^'<']+ )\n"
038: + "\n"
039: + "S = tags;\n"
040: + "tags = (startTag | endTag | etext)*;\n"
041: + "startTag = <TAG> (attribute)* ( <SYMBOL, '>'> | <SYMBOL, '/>'> );\n"
042: + "endTag = <ENDTAG> <SYMBOL, '>'>; \n"
043: + "attribute = <ATTRIBUTE>;\n"
044: + "attribute = <ATTR_VALUE>; \n"
045: + "attribute = <ATTRIBUTE> <SYMBOL,'='> <VALUE>; \n"
046: + "etext = (<TEXT>)*;\n", "test.nbs",
047: "text/x-test");
048: LanguageImpl language = new LanguageImpl("test/test", reader);
049: language.read();
050: assertEquals(21, reader.getRules(language).size());
051: }
052:
053: public void testUnexpectedToken() throws IOException {
054: try {
055: LanguageImpl language = TestUtils
056: .createLanguage("TOKEN:TAG:( '<' ['a'-'z']+ )\n"
057: + "TOKEN:SYMBOL:( '>' | '=')\n"
058: + "TOKEN:ENDTAG:( '</' ['a'-'z']+ )\n"
059: + "TOKEN:ATTRIBUTE:( ['a'-'z']+ )\n"
060: + "TOKEN:ATTR_VALUE:( '\\\"' [^ '\\n' '\\r' '\\\"']+ '\\\"' )\n"
061: + "TOKEN:VALUE:( '\\\"' [^ '\\n' '\\r' '\\\"']+ '\\\"' )\n"
062: + "TOKEN:TEXT:( [^'<']+ )\n"
063: + "\n"
064: + "S = tags;\n"
065: + "tags = (startTag | endTag | etext)*\n"
066: + "startTag = <TAG> (attribute)* ( <SYMBOL, '>'> | <SYMBOL, '/>'> );\n"
067: + "endTag = <ENDTAG> <SYMBOL, '>'>; \n"
068: + "attribute = <ATTRIBUTE>;\n"
069: + "attribute = <ATTR_VALUE>; \n"
070: + "attribute = <ATTRIBUTE> <SYMBOL,'='> <VALUE>; \n"
071: + "etext = (<TEXT>)*;\n");
072: language.read();
073: assert (false);
074: } catch (ParseException ex) {
075: assertEquals(
076: "test.nbs 11,10: Unexpected token <operator,'='>. Expecting <operator,';'>",
077: ex.getMessage());
078: }
079: }
080:
081: public void testUnexpectedCharacter() throws IOException {
082: try {
083: LanguageImpl language = TestUtils
084: .createLanguage("TOKEN:TAG:( '<' ['a'-'z']+ )\n"
085: + "TOKEN:SYMBOL:( '>' | '=')\n"
086: + "TOKEN:ENDTAG:( '</' ['a'-'z']+ )\n"
087: + "TOKEN:ATTRIBUTE:( ['a'-'z']+ )\n"
088: + "TOKEN:ATTR_VALUE:( '\\\"' [^ '\\nw' '\\r' '\\\"']+ '\\\"' )\n"
089: + "TOKEN:VALUE:( '\\\"' [^ '\\n' '\\r' '\\\"']+ '\\\"' )\n"
090: + "TOKEN:TEXT:( [^'<']+ )\n"
091: + "\n"
092: + "S = tags;\n"
093: + "tags = (startTag | endTag | etext)*;\n"
094: + "startTag = <TAG> (attribute)* ( <SYMBOL, '>'> | <SYMBOL, '/>'> );\n"
095: + "endTag = <ENDTAG> <SYMBOL, '>'>; \n"
096: + "attribute = <ATTRIBUTE>;\n"
097: + "attribute = <ATTR_VALUE>; \n"
098: + "attribute = <ATTRIBUTE> <SYMBOL,'='> <VALUE>; \n"
099: + "etext = (<TEXT>)*;\n");
100: language.read();
101: assert (false);
102: } catch (ParseException ex) {
103: assertEquals("test.nbs 5,29: Unexpected character 'w'.", ex
104: .getMessage());
105: }
106: }
107:
108: public void testNoRule() throws IOException {
109: try {
110: NBSLanguageReader reader = NBSLanguageReader
111: .create(
112: "TOKEN:TAG:( '<' ['a'-'z']+ )\n"
113: + "TOKEN:SYMBOL:( '>' | '=')\n"
114: + "TOKEN:ENDTAG:( '</' ['a'-'z']+ )\n"
115: + "TOKEN:ATTRIBUTE:( ['a'-'z']+ )\n"
116: + "TOKEN:ATTR_VALUE:( a '\\\"' [^ '\\n' '\\r' '\\\"']+ '\\\"' )\n"
117: + "TOKEN:VALUE:( '\\\"' [^ '\\n' '\\r' '\\\"']+ '\\\"' )\n"
118: + "TOKEN:TEXT:( [^'<']+ )\n"
119: + "\n"
120: + "S = tags;\n"
121: + "tags = (startTag | endTag | etext)*;\n"
122: + "startTag = <TAG> (attribute)* ( <SYMBOL, '>'> | <SYMBOL, '/>'> );\n"
123: + "endTag = <ENDTAG> <SYMBOL, '>'>; \n"
124: + "attribute = <ATTRIBUTE>;\n"
125: + "attribute = <ATTR_VALUE>; \n"
126: + "attribute = <ATTRIBUTE> <SYMBOL,'='> <VALUE>; \n"
127: + "etext = (<TEXT>)*;\n",
128: "test.nbs", "text/x-test");
129: reader.getTokenTypes();
130: assert (false);
131: } catch (ParseException ex) {
132: assertEquals(
133: "test.nbs 5,20: Syntax error (nt: rePart, tokens: <identifier,'a'> <whitespace,' '>.",
134: ex.getMessage());
135: }
136: }
137:
138: public void testUndefinedNT() throws ParseException, IOException {
139: NBSLanguageReader reader = NBSLanguageReader
140: .create(
141: "TOKEN:TAG:( '<' ['a'-'z']+ )\n"
142: + "TOKEN:SYMBOL:( '>' | '=')\n"
143: + "TOKEN:ENDTAG:( '</' ['a'-'z']+ )\n"
144: + "TOKEN:ATTRIBUTE:( ['a'-'z']+ )\n"
145: + "TOKEN:ATTR_VALUE:( '\\\"' [^ '\\n' '\\r' '\\\"']+ '\\\"' )\n"
146: + "TOKEN:VALUE:( '\\\"' [^ '\\n' '\\r' '\\\"']+ '\\\"' )\n"
147: + "TOKEN:TEXT:( [^'<']+ )\n"
148: + "\n"
149: + "S = tags;\n"
150: + "tags = (startTag | endTag | etext)*;\n"
151: + "startTag = <TAG> (attribute)* ( <SYMBOL, '>'> | <SYMBOL, '/>'> );\n"
152: + "attribute = <ATTRIBUTE>;\n"
153: + "attribute = <ATTR_VALUE>; \n"
154: + "attribute = <ATTRIBUTE> <SYMBOL,'='> <VALUE>; \n"
155: + "etext = (<TEXT>)*;\n", "test.nbs",
156: "text/x-test");
157: try {
158: List<TokenType> tokenTypes = reader.getTokenTypes();
159: assertEquals(10, tokenTypes.size());
160: assertEquals(0, reader.getFeatures().size());
161: LanguageImpl language = TestUtils.createLanguage(reader);
162: language.read();
163: List<Rule> grammarRules = reader.getRules(language);
164: assertEquals(20, grammarRules.size());
165: LLSyntaxAnalyser.create(language, grammarRules, Collections
166: .<Integer> emptySet());
167: assert (false);
168: } catch (ParseException ex) {
169: assertEquals("endTag grammar rule not defined!", ex
170: .getMessage());
171: }
172: }
173: }
|