/* * #%~ * org.overture.ide.tests.ui * %% * Copyright (C) 2008 - 2014 Overture * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #~% */ package org.overture.ide.ui; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WordRule; import org.junit.Assert; import org.junit.Test; import org.overture.ide.ui.editor.syntax.MultipleWordsWordRule; import org.overture.ide.ui.editor.syntax.VdmWordDetector; public class MultipartScannerTest { public static final String[] multipleKeywords = { "is not yet specified", "for all", "in set", "be st", "not in set", "is subclass of", "instance variables", "is subclass responsibility" }; public class TestScanner implements ICharacterScanner { String data; public int index; public TestScanner(String data) { this.data = data; } @Override public char[][] getLegalLineDelimiters() { return null; } @Override public int getColumn() { return 0; } @Override public int read() { if (index > data.length()) { return -1;// EOF } return (int)data.codePointAt(index++); } @Override public void unread() { index--; } @Override public String toString() { return "Visible data : '" + data.substring(index) + "'\nScanned data : '" + data.substring(0, index) + "'\nFull data : '" + data + "'"; } } public WordRule getMultupartRule() { IToken other = new Token("other"); IToken keyword = new Token("kw"); MultipleWordsWordRule multipleWordRule = new MultipleWordsWordRule(new VdmWordDetector(), other, false); for (int i = 0; i < multipleKeywords.length; i++) { multipleWordRule.addWord(multipleKeywords[i], keyword); } return multipleWordRule; } public WordRule getWordRule() { IToken other = new Token("other"); IToken keyword = new Token("kw"); WordRule multipleWordRule = new WordRule(new VdmWordDetector(), other); for (int i = 0; i < new VdmPpKeywords().getAllSingleWordKeywords().length; i++) { multipleWordRule.addWord(new VdmPpKeywords().getAllSingleWordKeywords()[i], keyword); } return multipleWordRule; } @Test public void testforallScanner() { TestScanner scanner = new TestScanner("for all\n\nend Test"); IToken token = getMultupartRule().evaluate(scanner); System.out.println("Token : "+token.getData()); System.out.println(scanner); Assert.assertEquals("for all".length(), scanner.index);//7 for 'for all' } @Test public void testScanner() { TestScanner scanner = new TestScanner(" class Test \n\n\nend Test"); IToken token = getMultupartRule().evaluate(scanner); System.out.println("Token : "+token.getData()); System.out.println(scanner); Assert.assertEquals(0, scanner.index);//0 since ' class...' doesn't match a word } @Test public void testWordScanner() { TestScanner scanner = new TestScanner("class Test \n\n\nend Test"); IToken token = getWordRule().evaluate(scanner); System.out.println("Token : "+token.getData()); System.out.println(scanner); Assert.assertEquals("class".length(), scanner.index);//5 for 'class' } }