/******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jface.text.tests.rules; import junit.framework.TestCase; import org.eclipse.swt.SWT; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.IWordDetector; import org.eclipse.jface.text.rules.PatternRule; import org.eclipse.jface.text.rules.RuleBasedScanner; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WordRule; /** * @since 3.3 */ public class WordRuleTest extends TestCase { private static class SimpleWordDetector implements IWordDetector { public boolean isWordStart(char c) { return !Character.isWhitespace(c); } public boolean isWordPart(char c) { return !Character.isWhitespace(c); } } /* * https://bugs.eclipse.org/bugs/show_bug.cgi?id=163116 */ public void testBug163116() throws Exception { IWordDetector detector= new IWordDetector() { public boolean isWordPart(char c) { return true; } public boolean isWordStart(char c) { return true; } }; WordRule rule= new WordRule(detector, new Token(this)); RuleBasedScanner scanner= new RuleBasedScanner(); scanner.setRules(new IRule[] { rule }); scanner.setRange(new Document(), 0, 0); IToken token= null; int i= 0; while (token != Token.EOF && i++ < 1000) token= scanner.nextToken(); assertTrue(i < 1000); } /* * https://bugs.eclipse.org/bugs/show_bug.cgi?id=144355 */ public void testBug144355() throws Exception { IWordDetector detector= new SimpleWordDetector(); String defaultTokenString= "defaultToken"; Token defaultToken= new Token(defaultTokenString); String testTokenStringNormal= "TestTokenString"; String testTokenStringDifferentCapitalization= "TestTOKENString"; String testTokenStringCompletelyDifferent= "XXX"; Token normalToken= new Token(testTokenStringNormal); WordRule rule= new WordRule(detector, defaultToken, true); rule.addWord(testTokenStringNormal, normalToken); // scenario 1 // pre: pass in a normal string ("TestTokenString") // post: expect the normal token to be returned RuleBasedScanner scanner= new RuleBasedScanner(); scanner.setRules(new IRule[] {rule}); scanner.setRange(new Document(testTokenStringNormal), 0, testTokenStringNormal.length()); assertTrue(scanner.nextToken().getData().equals(testTokenStringNormal)); // scenario 2 // pre: pass in a normal string but different capitalization ("TestTOKENString") // post: expect the normal token to be returned scanner= new RuleBasedScanner(); scanner.setRules(new IRule[] {rule}); scanner.setRange(new Document(testTokenStringDifferentCapitalization), 0, testTokenStringDifferentCapitalization.length()); assertTrue(scanner.nextToken().getData().equals(testTokenStringNormal)); // scenario 3 // pre: pass in a completely different string ("XXX") // post: expect the default token to be returned because the string can't be matched scanner= new RuleBasedScanner(); scanner.setRules(new IRule[] {rule}); scanner.setRange(new Document(testTokenStringCompletelyDifferent), 0, testTokenStringCompletelyDifferent.length()); assertTrue(scanner.nextToken().getData().equals(defaultTokenString)); WordRule ruleWithoutIgnoreCase= new WordRule(detector, defaultToken); ruleWithoutIgnoreCase.addWord(testTokenStringNormal, normalToken); // scenario 4 // pre: pass in a normal string ("TestTokenString") // post: expect the normal token to be returned scanner= new RuleBasedScanner(); scanner.setRules(new IRule[] {ruleWithoutIgnoreCase}); scanner.setRange(new Document(testTokenStringNormal), 0, testTokenStringNormal.length()); assertTrue(scanner.nextToken().getData().equals(testTokenStringNormal)); // scenario 5 // pre: pass in a normal string but different capitalization ("TestTOKENString") // post: expect the default token to be returned scanner= new RuleBasedScanner(); scanner.setRules(new IRule[] {ruleWithoutIgnoreCase}); scanner.setRange(new Document(testTokenStringDifferentCapitalization), 0, testTokenStringDifferentCapitalization.length()); assertTrue(scanner.nextToken().getData().equals(defaultTokenString)); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=175712 public void testBug175712_1() throws Exception { IRule[] rules= new IRule[2]; IToken stepToken= new Token(new TextAttribute(null, null, SWT.BOLD)); PatternRule stepRule= new PatternRule("(((", ")", stepToken, (char) 0,false); stepRule.setColumnConstraint(-1); rules[1]= stepRule; IToken titleToken= new Token(new TextAttribute(null, null, SWT.BOLD)); WordRule wordRule= new WordRule(new SimpleWordDetector()); wordRule.addWord("((", titleToken); rules[0]= wordRule; IDocument document= new Document("((( \n((\n- Cheese\n- Wine"); RuleBasedScanner scanner= new RuleBasedScanner(); scanner.setRules(rules); scanner.setRange(document, 0, document.getLength()); IToken defaultToken= new Token(this); scanner.setDefaultReturnToken(defaultToken); IToken token= scanner.nextToken(); assertSame(defaultToken, token); token= scanner.nextToken(); assertSame(defaultToken, token); token= scanner.nextToken(); assertSame(defaultToken, token); token= scanner.nextToken(); assertSame(titleToken, token); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=175712 public void testBug175712_2() throws Exception { IRule[] rules= new IRule[2]; IToken stepToken= new Token(new TextAttribute(null, null, SWT.BOLD)); PatternRule stepRule= new PatternRule("(((", ")", stepToken, (char) 0,false); stepRule.setColumnConstraint(-1); rules[1]= stepRule; IToken titleToken= new Token(new TextAttribute(null, null, SWT.BOLD)); WordRule wordRule= new WordRule(new SimpleWordDetector()); wordRule.addWord("((", titleToken); rules[0]= wordRule; IDocument document= new Document("((\n((\n- Cheese\n- Wine"); RuleBasedScanner scanner= new RuleBasedScanner(); scanner.setRules(rules); scanner.setRange(document, 0, document.getLength()); IToken defaultToken= new Token(this); scanner.setDefaultReturnToken(defaultToken); IToken token= scanner.nextToken(); assertSame(titleToken, token); } }