package org.rubypeople.rdt.internal.ui.text.ruby; import junit.framework.TestCase; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.Token; import org.rubypeople.rdt.internal.ui.RubyPlugin; import org.rubypeople.rdt.internal.ui.text.IRubyColorConstants; import org.rubypeople.rdt.internal.ui.text.RubyColorManager; public class TC_RubyTokenScanner extends TestCase { private RubyColoringTokenScanner fScanner; @Override protected void setUp() throws Exception { super.setUp(); RubyColorManager colorManager = new RubyColorManager(false); fScanner = new RubyColoringTokenScanner(colorManager, RubyPlugin.getDefault().getPreferenceStore()) { @Override public Token getToken(String key) { return new Token(key); } }; } private void setUpScanner(String code) { setUpScanner(code, 0, code.length()); } private void setUpScanner(String code, int offset, int length) { Document doc = new Document(code); fScanner.setRange(doc, offset, length); } private void assertToken(String color, int offset, int length) { IToken token = fScanner.nextToken(); assertEquals("Offsets don't match", offset, fScanner.getTokenOffset()); assertEquals("Lengths don't match", length, fScanner.getTokenLength()); assertEquals("Colors don't match", color, token.getData()); // call getToken so we bypass the scanner's overriding in doGetToken } public void testSimpleClassDefinition() { String code = "class Chris\nend\n"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_KEYWORD, 0, 5); assertToken(IRubyColorConstants.RUBY_DEFAULT, 5, 6); assertToken(IRubyColorConstants.RUBY_DEFAULT, 11, 1); assertToken(IRubyColorConstants.RUBY_KEYWORD, 12, 3); } public void testSymbolAtEndOfLine() { String code = " helper_method :logged_in?\n" + " def method\n" + " \n" + " end"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_DEFAULT, 0, 15); // ' helper_method' assertToken(IRubyColorConstants.RUBY_SYMBOL, 15, 2); // ' :' assertToken(IRubyColorConstants.RUBY_SYMBOL, 17, 10); // 'logged_in?' assertToken(IRubyColorConstants.RUBY_DEFAULT, 27, 1); // '\n' assertToken(IRubyColorConstants.RUBY_KEYWORD, 28, 5); // ' def' assertToken(IRubyColorConstants.RUBY_DEFAULT, 33, 7); // ' method' } public void testSymbolInsideBrackets() { String code = "test[:begin]"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_DEFAULT, 0, 4); // 'test' assertToken(IRubyColorConstants.RUBY_DEFAULT, 4, 1); // '[' assertToken(IRubyColorConstants.RUBY_SYMBOL, 5, 1); // ' :' assertToken(IRubyColorConstants.RUBY_SYMBOL, 6, 5); // 'begin' assertToken(IRubyColorConstants.RUBY_DEFAULT, 11, 1); // ']' } public void testSymbolInsideParentheses() { String code = "Object.const_defined?(:RedCloth)"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_DEFAULT, 0, 6); // 'Object' assertToken(IRubyColorConstants.RUBY_DEFAULT, 6, 1); // '.' assertToken(IRubyColorConstants.RUBY_DEFAULT, 7, 14); // 'const_define?' assertToken(IRubyColorConstants.RUBY_DEFAULT, 21, 1); // '(' assertToken(IRubyColorConstants.RUBY_SYMBOL, 22, 1); // ':' assertToken(IRubyColorConstants.RUBY_SYMBOL, 23, 8); // 'RedCloth' assertToken(IRubyColorConstants.RUBY_DEFAULT, 31, 1); // ')' } public void testAliasWithTwoSymbols() { String code = "alias :tsort_each_child :each_key"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_KEYWORD, 0, 5); // 'alias' assertToken(IRubyColorConstants.RUBY_SYMBOL, 5, 2); // ' :' assertToken(IRubyColorConstants.RUBY_SYMBOL, 7, 16); // 'tsort_each_child' assertToken(IRubyColorConstants.RUBY_SYMBOL, 23, 2); // ' :' assertToken(IRubyColorConstants.RUBY_SYMBOL, 25, 8); // 'each_key' } public void testSymbolInsideBracketsTwo() { String code = "@repository=params[:repository]"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_INSTANCE_VARIABLE, 0, 11); // '@repository' assertToken(IRubyColorConstants.RUBY_DEFAULT, 11, 1); // '=' assertToken(IRubyColorConstants.RUBY_DEFAULT, 12, 6); // 'params' assertToken(IRubyColorConstants.RUBY_DEFAULT, 18, 1); // '[' assertToken(IRubyColorConstants.RUBY_SYMBOL, 19, 1); // ':' assertToken(IRubyColorConstants.RUBY_SYMBOL, 20, 10); // 'repository' assertToken(IRubyColorConstants.RUBY_DEFAULT, 30, 1); // ']' } public void testTertiaryConditional() { String code = "multiparameter_name = true ? value.method : value"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_DEFAULT, 0, 19); // 'multiparameter_name' assertToken(IRubyColorConstants.RUBY_DEFAULT, 19, 2); // ' =' assertToken(IRubyColorConstants.RUBY_KEYWORD, 21, 5); // ' true' assertToken(IRubyColorConstants.RUBY_DEFAULT, 26, 2); // ' ?' assertToken(IRubyColorConstants.RUBY_DEFAULT, 28, 6); // ' value' assertToken(IRubyColorConstants.RUBY_DEFAULT, 34, 1); // '.' assertToken(IRubyColorConstants.RUBY_DEFAULT, 35, 6); // 'method' assertToken(IRubyColorConstants.RUBY_DEFAULT, 41, 2); // ' :' assertToken(IRubyColorConstants.RUBY_DEFAULT, 43, 6); // ' value' } public void testWhen() { String code = "case value\n" + "when FalseClass: 0\n" + "else value\n" + "end"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_KEYWORD, 0, 4); // 'case' assertToken(IRubyColorConstants.RUBY_DEFAULT, 4, 6); // ' value' assertToken(IRubyColorConstants.RUBY_DEFAULT, 10, 1); // '\n' assertToken(IRubyColorConstants.RUBY_KEYWORD, 11, 4); // 'when' assertToken(IRubyColorConstants.RUBY_DEFAULT, 15, 11); // ' FalseClass' assertToken(IRubyColorConstants.RUBY_DEFAULT, 26, 1); // ':' assertToken(IRubyColorConstants.RUBY_FIXNUM, 27, 2); // ' 0' } public void testAppendSymbol() { String code = "puts(:<<)"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_DEFAULT, 0, 4); // 'puts' assertToken(IRubyColorConstants.RUBY_DEFAULT, 4, 1); // '(' assertToken(IRubyColorConstants.RUBY_SYMBOL, 5, 1); // ':' assertToken(IRubyColorConstants.RUBY_SYMBOL, 6, 2); // '<<' assertToken(IRubyColorConstants.RUBY_DEFAULT, 8, 1); // ')' } public void testDollarDollarSymbol() { String code = "puts(:$$)"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_DEFAULT, 0, 4); // 'puts' assertToken(IRubyColorConstants.RUBY_DEFAULT, 4, 1); // '(' assertToken(IRubyColorConstants.RUBY_SYMBOL, 5, 1); // ':' assertToken(IRubyColorConstants.RUBY_SYMBOL, 6, 2); // '$$' assertToken(IRubyColorConstants.RUBY_DEFAULT, 8, 1); // ')' } public void testTertiaryConditionalWithNoSpaces() { String code = "puts(a?b:c)"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_DEFAULT, 0, 4); // 'puts' assertToken(IRubyColorConstants.RUBY_DEFAULT, 4, 1); // '(' assertToken(IRubyColorConstants.RUBY_DEFAULT, 5, 2); // 'a?' assertToken(IRubyColorConstants.RUBY_DEFAULT, 7, 1); // 'b' assertToken(IRubyColorConstants.RUBY_DEFAULT, 8, 1); // ':' assertToken(IRubyColorConstants.RUBY_DEFAULT, 9, 1); // 'c' assertToken(IRubyColorConstants.RUBY_DEFAULT, 10, 1); // ')' } public void testClassVariable() { String code = "@@var = 1"; setUpScanner(code); assertToken(IRubyColorConstants.RUBY_CLASS_VARIABLE, 0, 5); // '@@var' assertToken(IRubyColorConstants.RUBY_DEFAULT, 5, 2); // ' =' assertToken(IRubyColorConstants.RUBY_FIXNUM, 7, 2); // ' 1' } }