/*******************************************************************************
* Copyright (c) 2012 Sierra Wireless 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:
* Sierra Wireless - initial API and implementation
*******************************************************************************/
package org.eclipse.koneki.ldt.ui.tests.internal.rules;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.ITokenScanner;
import org.eclipse.jface.text.rules.RuleBasedScanner;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.koneki.ldt.ui.tests.internal.ScannerResult;
/**
* An abstract class to perform JUnit tests on rules
*/
public abstract class AbstractRuleTestCase extends TestCase {
protected abstract IRule createRule();
protected ITokenScanner createScanner(final IDocument doc) {
final IRule numberRule = createRule();
final RuleBasedScanner scanner = new RuleBasedScanner();
scanner.setRules(new IRule[] { numberRule });
scanner.setRange(doc, 0, doc.getLength());
return scanner;
}
public void assertTokenFound(final String inputString, final int expectedOffset, final int expectedLength, final IToken expectedToken) {
final IDocument doc = new Document(inputString);
ITokenScanner scanner = createScanner(doc);
boolean tokenFound = false;
List<ScannerResult> tokenList = new ArrayList<ScannerResult>();
for (IToken token = scanner.nextToken(); token != Token.EOF; token = scanner.nextToken()) {
if (token == expectedToken && scanner.getTokenOffset() == expectedOffset && scanner.getTokenLength() == expectedLength) {
tokenFound = true;
}
tokenList.add(new ScannerResult(token, scanner.getTokenOffset(), scanner.getTokenLength()));
}
if (!tokenFound) {
StringBuffer messageBuilder = new StringBuffer();
messageBuilder.append(MessageFormat.format("For input:\"{0}\" expected token is [-Token={1} -Offset={2} -Lenght={3}] ", //$NON-NLS-1$
inputString.replace("\n", "\\n"), expectedToken.getData(), expectedOffset, expectedLength)); //$NON-NLS-1$//$NON-NLS-2$
if (tokenList.isEmpty()) {
messageBuilder.append("but no token was found"); //$NON-NLS-1$
} else {
messageBuilder.append("\nbut token(s) found were:\n"); //$NON-NLS-1$
appendTokenList(tokenList, messageBuilder, inputString);
}
fail(messageBuilder.toString());
}
}
public void assertTokenNotFound(final String inputString, final IToken tokenNotExpected) {
final IDocument doc = new Document(inputString);
ITokenScanner scanner = createScanner(doc);
boolean tokenFound = false;
List<ScannerResult> tokenList = new ArrayList<ScannerResult>();
for (IToken token = scanner.nextToken(); token != Token.EOF; token = scanner.nextToken()) {
if (token == tokenNotExpected) {
tokenFound = true;
}
tokenList.add(new ScannerResult(token, scanner.getTokenOffset(), scanner.getTokenLength()));
}
if (tokenFound) {
StringBuffer messageBuilder = new StringBuffer();
messageBuilder.append(MessageFormat.format("For input:\"{0}\" the token not expected is [-Token={1}] ", inputString.replace("\n", "\\n"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
tokenNotExpected.getData()));
if (!tokenList.isEmpty()) {
messageBuilder.append("but following token(s) was found:\n"); //$NON-NLS-1$
appendTokenList(tokenList, messageBuilder, inputString);
}
fail(messageBuilder.toString());
}
}
protected void appendTokenList(final List<ScannerResult> tokenList, final StringBuffer messageBuilder, final String inputString) {
for (ScannerResult result : tokenList) {
StringBuilder inputWithStar = new StringBuilder(inputString);
inputWithStar.insert(result.getOffset(), '*');
inputWithStar.insert(result.getOffset() + result.getLenght() + 1, '*');
messageBuilder.append(MessageFormat.format(
"'{'-Token={0} -Offset={1} -Lenght={2} \"{3}\"'}'\n", result.getToken().getData(), result.getOffset(), //$NON-NLS-1$
result.getLenght(), inputWithStar.toString()));
}
}
}