| /* |
| * Copyright 2000-2013 JetBrains s.r.o. |
| * |
| * Licensed 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.jetbrains.lang.manifest; |
| |
| import com.intellij.psi.PsiFile; |
| import com.intellij.psi.impl.DebugUtil; |
| import com.intellij.testFramework.LightIdeaTestCase; |
| import com.intellij.testFramework.LightPlatformTestCase; |
| import junit.framework.Assert; |
| |
| /** |
| * @author Robert F. Beeger (robert@beeger.net) |
| */ |
| public class ManifestParserTest extends LightIdeaTestCase { |
| public void testEmpty() { |
| doTest("", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " <empty list>\n"); |
| } |
| |
| public void testSpaces() { |
| doTest(" ", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " PsiErrorElement:Header expected\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN(' ')\n"); |
| } |
| |
| public void testRandomText() { |
| doTest("some text\nmore text", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:some\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('some')\n" + |
| " PsiErrorElement:':' expected\n" + |
| " PsiElement(BAD_CHARACTER)(' ')\n" + |
| " PsiElement(BAD_CHARACTER)('t')\n" + |
| " PsiElement(BAD_CHARACTER)('e')\n" + |
| " PsiElement(BAD_CHARACTER)('x')\n" + |
| " PsiElement(BAD_CHARACTER)('t')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n" + |
| " Header:more\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('more')\n" + |
| " PsiErrorElement:':' expected\n" + |
| " PsiElement(BAD_CHARACTER)(' ')\n" + |
| " PsiElement(BAD_CHARACTER)('t')\n" + |
| " PsiElement(BAD_CHARACTER)('e')\n" + |
| " PsiElement(BAD_CHARACTER)('x')\n" + |
| " PsiElement(BAD_CHARACTER)('t')\n"); |
| } |
| |
| public void testNoHeader() { |
| doTest(" some text", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " PsiErrorElement:Header expected\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('some text')\n"); |
| } |
| |
| public void testBadHeaderStart() { |
| doTest("Name: ab;dir:\n" + |
| "=value;a:=b\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Name\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Name')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('ab')\n" + |
| " ManifestToken:SEMICOLON_TOKEN(';')\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('dir')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n" + |
| " PsiErrorElement:Header expected\n" + |
| " PsiElement(BAD_CHARACTER)('=')\n" + |
| " PsiElement(BAD_CHARACTER)('v')\n" + |
| " PsiElement(BAD_CHARACTER)('a')\n" + |
| " PsiElement(BAD_CHARACTER)('l')\n" + |
| " PsiElement(BAD_CHARACTER)('u')\n" + |
| " PsiElement(BAD_CHARACTER)('e')\n" + |
| " PsiElement(BAD_CHARACTER)(';')\n" + |
| " PsiElement(BAD_CHARACTER)('a')\n" + |
| " PsiElement(BAD_CHARACTER)(':')\n" + |
| " PsiElement(BAD_CHARACTER)('=')\n" + |
| " PsiElement(BAD_CHARACTER)('b')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n"); |
| } |
| |
| public void testNewLines() { |
| doTest("\n\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " ManifestToken:SECTION_END_TOKEN('\\n')\n" + |
| " Section\n" + |
| " ManifestToken:SECTION_END_TOKEN('\\n')\n"); |
| } |
| |
| public void testSimple() { |
| doTest("Manifest-Version: 1.0\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Manifest-Version\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Manifest-Version')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('1.0')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n"); |
| } |
| |
| public void testExtraSpaceInHeaderAssignment() { |
| doTest("Manifest-Version : 1.0\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Manifest-Version\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Manifest-Version')\n" + |
| " PsiErrorElement:Unexpected token\n" + |
| " PsiElement(BAD_CHARACTER)(' ')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('1.0')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n"); |
| } |
| |
| public void testMissingSpaceInHeaderAssignment() { |
| doTest("Specification-Vendor:name\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Specification-Vendor\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Specification-Vendor')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " PsiErrorElement:Whitespace expected\n" + |
| " <empty list>\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('name')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n"); |
| } |
| |
| public void testSimpleWithNewLines() { |
| doTest("Manifest-Version: 1.0\n\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Manifest-Version\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Manifest-Version')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('1.0')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n" + |
| " ManifestToken:SECTION_END_TOKEN('\\n')\n"); |
| } |
| |
| public void testSimpleIncomplete() { |
| doTest("Manifest-Version:", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Manifest-Version\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Manifest-Version')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " PsiErrorElement:Whitespace expected\n" + |
| " <empty list>\n" + |
| " HeaderValuePart\n" + |
| " <empty list>\n"); |
| } |
| |
| public void testSimpleIncompleteWithNewLine() { |
| doTest("Manifest-Version:\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Manifest-Version\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Manifest-Version')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " PsiErrorElement:Whitespace expected\n" + |
| " <empty list>\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n"); |
| } |
| |
| public void testSimpleIncompleteWithNewLines() { |
| doTest("Manifest-Version:\n\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Manifest-Version\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Manifest-Version')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " PsiErrorElement:Whitespace expected\n" + |
| " <empty list>\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n" + |
| " ManifestToken:SECTION_END_TOKEN('\\n')\n"); |
| } |
| |
| public void testSimpleWithContinuation() { |
| doTest("Specification-Vendor: Acme\n" + |
| " Company\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Specification-Vendor\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Specification-Vendor')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('Acme')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('Company')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n"); |
| } |
| |
| public void testSimpleWithQuotedValue() { |
| doTest("Implementation-Vendor: \"Apache Software Foundation\"\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Implementation-Vendor\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Implementation-Vendor')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:QUOTE_TOKEN('\"')\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('Apache Software Foundation')\n" + |
| " ManifestToken:QUOTE_TOKEN('\"')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n"); |
| } |
| |
| public void testSimpleHeaderValueStartsWithColon() { |
| doTest("Implementation-Vendor: :value\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Implementation-Vendor\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Implementation-Vendor')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('value')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n"); |
| } |
| |
| public void testSimpleHeaderValueStartsWithEquals() { |
| doTest("Implementation-Vendor: =value\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Implementation-Vendor\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Implementation-Vendor')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:EQUALS_TOKEN('=')\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('value')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n"); |
| } |
| |
| public void testSimpleHeaderValueStartsWithSemicolon() { |
| doTest("Implementation-Vendor: ;value\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Implementation-Vendor\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Implementation-Vendor')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:SEMICOLON_TOKEN(';')\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('value')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n"); |
| } |
| |
| public void testTwoHeaders() { |
| doTest("Manifest-Version: 1.0\n" + |
| "Ant-Version: Apache Ant 1.6.5\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Manifest-Version\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Manifest-Version')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('1.0')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n" + |
| " Header:Ant-Version\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Ant-Version')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('Apache Ant 1.6.5')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n"); |
| } |
| |
| public void testTwoSections() { |
| doTest("Manifest-Version: 1.0\n" + |
| "\n" + |
| "Ant-Version: Apache Ant 1.6.5\n\n", |
| |
| "ManifestFile:MANIFEST.MF\n" + |
| " Section\n" + |
| " Header:Manifest-Version\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Manifest-Version')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('1.0')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n" + |
| " ManifestToken:SECTION_END_TOKEN('\\n')\n" + |
| " Section\n" + |
| " Header:Ant-Version\n" + |
| " ManifestToken:HEADER_NAME_TOKEN('Ant-Version')\n" + |
| " ManifestToken:COLON_TOKEN(':')\n" + |
| " ManifestToken:SIGNIFICANT_SPACE_TOKEN(' ')\n" + |
| " HeaderValuePart\n" + |
| " ManifestToken:HEADER_VALUE_PART_TOKEN('Apache Ant 1.6.5')\n" + |
| " ManifestToken:NEWLINE_TOKEN('\\n')\n" + |
| " ManifestToken:SECTION_END_TOKEN('\\n')\n"); |
| } |
| |
| private static void doTest(String source, String expected) { |
| PsiFile file = LightPlatformTestCase.createLightFile("MANIFEST.MF", source); |
| Assert.assertEquals(expected, DebugUtil.psiToString(file, true)); |
| } |
| } |