blob: 6f5ecfd117f7e9a85c118ddd4534326a32cd141e [file] [log] [blame]
/*******************************************************************************
* 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);
}
}