/******************************************************************************* * Copyright (c) 2015 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * QNX Software Systems - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.qt.core.tests; import static org.junit.Assert.*; import java.io.ByteArrayInputStream; import java.io.InputStream; import org.eclipse.cdt.internal.qt.core.location.Position; import org.eclipse.cdt.qt.core.qmldir.QMLDirectoryLexer; import org.eclipse.cdt.qt.core.qmldir.QMLDirectoryLexer.Token; import org.eclipse.cdt.qt.core.qmldir.QMLDirectoryLexer.TokenType; import org.junit.Test; @SuppressWarnings("nls") public class QMLDirectoryLexerTests { private void assertToken(TokenType type, String text, int start, int end, Position locStart, Position locEnd, Token actual) { // Check token type and text assertEquals("Unexpected token type", type, actual.getType()); assertEquals("Unexpected token text", text, actual.getText()); // Check position offsets assertEquals("Unexpected start position", start, actual.getStart()); assertEquals("Unexpected end position", end, actual.getEnd()); // Check SourceLocation start assertEquals("Unexpected location start line", locStart.getLine(), actual.getLocation().getStart().getLine()); assertEquals("Unexpected location start column", locStart.getColumn(), actual.getLocation().getStart().getColumn()); // Check SourceLocation end assertEquals("Unexpected location end line", locEnd.getLine(), actual.getLocation().getEnd().getLine()); assertEquals("Unexpected location end column", locEnd.getColumn(), actual.getLocation().getEnd().getColumn()); } private InputStream createInputStream(String s) { return new ByteArrayInputStream(s.getBytes()); } @Test public void testCommentToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(new ByteArrayInputStream("# This is a comment".getBytes())); assertToken(TokenType.COMMENT, "# This is a comment", 0, 19, new Position(1, 0), new Position(1, 19), lexer.nextToken(false)); } @Test public void testMultipleCommentTokens() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("# This is a comment\n# This is another comment\n")); assertToken(TokenType.COMMENT, "# This is a comment", 0, 19, new Position(1, 0), new Position(1, 19), lexer.nextToken(false)); assertEquals(TokenType.COMMAND_END, lexer.nextToken(false).getType()); assertToken(TokenType.COMMENT, "# This is another comment", 20, 45, new Position(2, 0), new Position(2, 25), lexer.nextToken(false)); assertEquals(TokenType.COMMAND_END, lexer.nextToken(false).getType()); assertEquals(TokenType.EOF, lexer.nextToken(false).getType()); } @Test public void testModuleToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("module")); assertToken(TokenType.MODULE, "module", 0, 6, new Position(1, 0), new Position(1, 6), lexer.nextToken()); } @Test public void testTypeInfoToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("typeinfo")); assertToken(TokenType.TYPEINFO, "typeinfo", 0, 8, new Position(1, 0), new Position(1, 8), lexer.nextToken()); } @Test public void testSingletonToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("singleton")); assertToken(TokenType.SINGLETON, "singleton", 0, 9, new Position(1, 0), new Position(1, 9), lexer.nextToken()); } @Test public void testInternalToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("internal")); assertToken(TokenType.INTERNAL, "internal", 0, 8, new Position(1, 0), new Position(1, 8), lexer.nextToken()); } @Test public void testPluginToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("plugin")); assertToken(TokenType.PLUGIN, "plugin", 0, 6, new Position(1, 0), new Position(1, 6), lexer.nextToken()); } @Test public void testClassnameToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("classname")); assertToken(TokenType.CLASSNAME, "classname", 0, 9, new Position(1, 0), new Position(1, 9), lexer.nextToken()); } @Test public void testDependsToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("depends")); assertToken(TokenType.DEPENDS, "depends", 0, 7, new Position(1, 0), new Position(1, 7), lexer.nextToken()); } @Test public void testDesignerSupportedToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("designersupported")); assertToken(TokenType.DESIGNERSUPPORTED, "designersupported", 0, 17, new Position(1, 0), new Position(1, 17), lexer.nextToken()); } @Test public void testWordToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("QtQuick.Control")); assertToken(TokenType.WORD, "QtQuick.Control", 0, 15, new Position(1, 0), new Position(1, 15), lexer.nextToken()); } @Test public void testWordTokenContainsKeyword() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("plugins.test")); assertToken(TokenType.WORD, "plugins.test", 0, 12, new Position(1, 0), new Position(1, 12), lexer.nextToken()); } @Test public void testWordTokenAsRelativePath() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("./test/something/")); assertToken(TokenType.WORD, "./test/something/", 0, 17, new Position(1, 0), new Position(1, 17), lexer.nextToken()); } @Test public void testWordTokenAsAbsoluteWindowsPath() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("C:\\Users\\someone\\test\\something\\")); assertToken(TokenType.WORD, "C:\\Users\\someone\\test\\something\\", 0, 32, new Position(1, 0), new Position(1, 32), lexer.nextToken()); } @Test public void testWordTokenAsAbsoluteUnixPath() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("/usr/local/test/something/")); assertToken(TokenType.WORD, "/usr/local/test/something/", 0, 26, new Position(1, 0), new Position(1, 26), lexer.nextToken()); } @Test public void testDecimalToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("2.3")); assertToken(TokenType.DECIMAL, "2.3", 0, 3, new Position(1, 0), new Position(1, 3), lexer.nextToken()); } @Test public void testIntegerToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("3")); assertToken(TokenType.INTEGER, "3", 0, 1, new Position(1, 0), new Position(1, 1), lexer.nextToken()); } @Test public void testWhitespaceToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream(" \t\n")); assertToken(TokenType.WHITESPACE, " \t", 0, 2, new Position(1, 0), new Position(1, 2), lexer.nextToken(false)); } @Test public void testCommandEndToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("\n")); assertToken(TokenType.COMMAND_END, "\\n", 0, 1, new Position(1, 0), new Position(1, 1), lexer.nextToken()); } @Test public void testEOFToken() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("")); assertToken(TokenType.EOF, "", 0, 0, new Position(1, 0), new Position(1, 0), lexer.nextToken()); } @Test public void testEOFTokenAfterCommand() { QMLDirectoryLexer lexer = new QMLDirectoryLexer(); lexer.setInput(createInputStream("\n")); lexer.nextToken(); assertToken(TokenType.EOF, "", 1, 1, new Position(2, 0), new Position(2, 0), lexer.nextToken()); } }