/*
* Copyright (c) 2007-2009, Osmorc Development Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice, this list
* of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
* * Neither the name of 'Osmorc Development Team' nor the names of its contributors may be
* used to endorse or promote products derived from this software without specific
* prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.osmorc.manifest.lang;
import com.intellij.lang.ASTNode;
import com.intellij.lang.LanguageParserDefinitions;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.impl.PsiBuilderImpl;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.psi.TokenType;
import com.intellij.psi.tree.IElementType;
import com.intellij.testFramework.fixtures.IdeaProjectTestFixture;
import com.intellij.testFramework.fixtures.JavaTestFixtureFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.osmorc.SwingRunner;
import org.osmorc.manifest.lang.headerparser.HeaderParserRepository;
import org.osmorc.manifest.lang.psi.ManifestStubElementTypes;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
/**
*/
@RunWith(SwingRunner.class)
public class ManifestParserTest {
private ManifestParser testObject;
private IdeaProjectTestFixture fixture;
private ManifestLexer lexer;
@Before
public void setUp() throws Exception {
fixture = JavaTestFixtureFactory.createFixtureBuilder().getFixture();
fixture.setUp();
lexer = new ManifestLexer();
testObject = new ManifestParser(ServiceManager.getService(HeaderParserRepository.class));
}
@After
public void tearDown() throws Exception {
fixture.tearDown();
}
@Test
public void testSimple() {
PsiBuilder builder = createBuilder("Manifest-Version: 2\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testSimpleWithSpaceInHeaderAssignment() {
PsiBuilder builder = createBuilder("Manifest-Version : 2\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
TokenType.BAD_CHARACTER,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[4];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testSimpleMissingSpaceAfterHeaderAssignment1() {
PsiBuilder builder = createBuilder("Manifest-Version:2\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
TokenType.BAD_CHARACTER,
ManifestTokenType.NEWLINE);
}
@Test
public void testSimpleMissingSpaceAfterHeaderAssignment2() {
PsiBuilder builder = createBuilder("Bundle-Name:name\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
TokenType.BAD_CHARACTER,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testSimpleWithContinuation() {
PsiBuilder builder = createBuilder("Bundle-Vendor: Acme\n Company\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testAttribute() {
PsiBuilder builder = createBuilder("Import-Package: com.acme;version=\"1.0.0\"\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.ATTRIBUTE);
node = node.getChildren(null)[2];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testAttributeWithoutName() {
PsiBuilder builder = createBuilder("Import-Package: com.acme;=\"1.0.0\"\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.ATTRIBUTE);
node = node.getChildren(null)[2];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testAttributeWithoutNameOutsideParameter() {
PsiBuilder builder = createBuilder("Import-Package: =\"1.0.0\"\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.ATTRIBUTE);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testParameterWithoutParametrized() {
PsiBuilder builder = createBuilder("Import-Package: ;version=\"1.0.0\"\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.ATTRIBUTE);
node = node.getChildren(null)[2];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testDirective() {
PsiBuilder builder = createBuilder("Import-Package: com.acme;resolution:=optional\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.DIRECTIVE);
node = node.getChildren(null)[2];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.COLON,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testDirectiveWithoutName() {
PsiBuilder builder = createBuilder("Import-Package: com.acme;:=optional\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.DIRECTIVE);
node = node.getChildren(null)[2];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.COLON,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testDirectiveWithoutNameOutsideParameter() {
PsiBuilder builder = createBuilder("Import-Package: :=optional\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.DIRECTIVE);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.COLON,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testDirectiveInvalidAssignmentTokens() {
PsiBuilder builder = createBuilder("Import-Package: com.acme;resolution: =optional\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.DIRECTIVE);
node = node.getChildren(null)[2];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.COLON,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testSplitDirectiveAtColon() {
PsiBuilder builder = createBuilder("Import-Package: com.acme;resolution:\n =optional\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.DIRECTIVE);
node = node.getChildren(null)[2];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.COLON,
ManifestTokenType.NEWLINE,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testAttributeAndDirective() {
PsiBuilder builder = createBuilder("Import-Package: com.acme;version=\"1.0.0\";resolution:=optional\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.ATTRIBUTE,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.DIRECTIVE);
checkContainsNodes(node.getChildren(null)[2],
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
checkContainsNodes(node.getChildren(null)[4],
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.COLON,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testAttributeAndDirectiveWithContinuationBeforeSemicolon() {
PsiBuilder builder = createBuilder("Import-Package: com.acme;version=\"1.0.0\"\n ;resolution:=optional\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.ATTRIBUTE,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.DIRECTIVE);
checkContainsNodes(node.getChildren(null)[2],
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
checkContainsNodes(node.getChildren(null)[4],
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.COLON,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testAttributeAndDirectiveWithContinuationAfterSemicolon() {
PsiBuilder builder = createBuilder("Import-Package: com.acme;version=\"1.0.0\";\n resolution:=optional\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.ATTRIBUTE,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.DIRECTIVE);
checkContainsNodes(node.getChildren(null)[2],
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
checkContainsNodes(node.getChildren(null)[4],
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.COLON,
ManifestTokenType.EQUALS,
ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testAttributeAndDirectiveWithBadContinuationAfterAttributeName() {
PsiBuilder builder = createBuilder("Import-Package: com.acme;att\n=attvlue;dir:=dirvalue\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER, ManifestElementTypes.HEADER);
ASTNode section = node;
node = section.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node,
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.HEADER_VALUE_PART);
node = section.getChildren(null)[1];
checkContainsNodes(node,
TokenType.BAD_CHARACTER,
TokenType.BAD_CHARACTER,
TokenType.BAD_CHARACTER,
TokenType.BAD_CHARACTER,
TokenType.BAD_CHARACTER,
TokenType.BAD_CHARACTER,
TokenType.BAD_CHARACTER,
TokenType.BAD_CHARACTER,
TokenType.BAD_CHARACTER,
TokenType.BAD_CHARACTER,
TokenType.BAD_CHARACTER,
TokenType.BAD_CHARACTER,
ManifestTokenType.COLON,
TokenType.BAD_CHARACTER,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[14];
checkContainsNodes(node, ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testTwoHeadersAndASecondSection() {
PsiBuilder builder = createBuilder("Bundle-SymbolicName: com.acme\n" +
"Bundle-Activator: com.acme.Activator\n" +
"\n" +
"Name: otherSection\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION, ManifestTokenType.SECTION_END, ManifestElementTypes.SECTION);
ASTNode fileNode = node;
node = fileNode.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER, ManifestElementTypes.HEADER);
ASTNode sectionNode = node;
node = sectionNode.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node, ManifestElementTypes.HEADER_VALUE_PART);
node = sectionNode.getChildren(null)[1];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node, ManifestElementTypes.HEADER_VALUE_PART);
node = fileNode.getChildren(null)[2];
checkContainsNodes(node, ManifestElementTypes.HEADER);
sectionNode = node;
node = sectionNode.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node, ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testSimpleHeaderValueStartsWithQuote() {
PsiBuilder builder = createBuilder("Implementation-Vendor: \"Apache Software Foundation\"\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
ASTNode fileNode = node;
node = fileNode.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node, ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testSimpleHeaderValueStartsWithColon() {
PsiBuilder builder = createBuilder("simpleHeader: :value\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
ASTNode fileNode = node;
node = fileNode.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node, ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testSimpleHeaderValueStartsWithEquals() {
PsiBuilder builder = createBuilder("simpleHeader: =value\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
ASTNode fileNode = node;
node = fileNode.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node, ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testSimpleHeaderValueStartsWithSemicolon() {
PsiBuilder builder = createBuilder("simpleHeader: ;value\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
ASTNode fileNode = node;
node = fileNode.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE);
node = node.getChildren(null)[3];
checkContainsNodes(node, ManifestElementTypes.HEADER_VALUE_PART);
}
@Test
public void testEmptyClause() {
PsiBuilder builder = createBuilder("Import-Package: ,com.acme\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE,
ManifestTokenType.COMMA,
ManifestElementTypes.CLAUSE
);
checkContainsNodes(node.getChildren(null)[3],
ManifestElementTypes.HEADER_VALUE_PART);
checkContainsNodes(node.getChildren(null)[5],
ManifestElementTypes.HEADER_VALUE_PART);
}
private PsiBuilderImpl createBuilder(String text) {
return new PsiBuilderImpl(fixture.getProject(), null, LanguageParserDefinitions.INSTANCE.forLanguage(ManifestLanguage.INSTANCE), lexer, null, text, null, null);
}
@Test
public void testTwoClauses() {
PsiBuilder builder = createBuilder("Import-Package: com.acme.p;a=b,com.acme\n");
ASTNode node = testObject.parse(ManifestStubElementTypes.FILE, builder);
assertThat(node.getElementType(), sameInstance((IElementType) ManifestStubElementTypes.FILE));
checkContainsNodes(node, ManifestElementTypes.SECTION);
node = node.getChildren(null)[0];
checkContainsNodes(node, ManifestElementTypes.HEADER);
node = node.getChildren(null)[0];
checkContainsNodes(node,
ManifestTokenType.HEADER_NAME,
ManifestTokenType.COLON,
ManifestTokenType.SIGNIFICANT_SPACE,
ManifestElementTypes.CLAUSE,
ManifestTokenType.COMMA,
ManifestElementTypes.CLAUSE
);
checkContainsNodes(node.getChildren(null)[3],
ManifestElementTypes.HEADER_VALUE_PART,
ManifestTokenType.SEMICOLON,
ManifestElementTypes.ATTRIBUTE);
checkContainsNodes(node.getChildren(null)[5],
ManifestElementTypes.HEADER_VALUE_PART);
}
private void checkContainsNodes(ASTNode node, IElementType... types) {
ASTNode[] astNodes = node.getChildren(null);
assertThat(astNodes, notNullValue());
assertThat(astNodes.length, equalTo(types.length));
for (int i = 0; i < types.length; i++) {
assertThat(astNodes[i].getElementType(), equalTo(types[i]));
}
}
}