/*******************************************************************************
* Copyright (c) 2006, 2012 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
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.ui.tests.text;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.RuleBasedScanner;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.cdt.internal.ui.text.CHeaderRule;
/**
* Tests to verify recognition of #include headers.
*/
public class CHeaderRuleTest extends TestCase {
private static final String HEADER = "header";
private IToken fToken;
private RuleBasedScanner fScanner;
private Document fDocument;
public CHeaderRuleTest(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
fToken = new Token(HEADER);
fScanner = new RuleBasedScanner();
fScanner.setRules(new IRule[] { new CHeaderRule(fToken) });
fDocument = new Document();
}
public static Test suite() {
return new TestSuite(CHeaderRuleTest.class);
}
public void testHeader() {
assertHeader("#include <foo.h>", "<foo.h>", 9);
}
public void testHeader2() {
assertHeader("#include <vector>", "<vector>", 9);
}
public void testHeaderNoSpaceBetween() {
assertHeader("#include<vector>", "<vector>", 8);
}
public void testHeaderExtraSpacesBetween() {
assertHeader("#include <foo.h>", "<foo.h>", 12);
}
public void testHeaderExtraSpacesBefore() {
assertHeader(" #include <foo.h>", "<foo.h>", 11);
}
public void testHeaderIncludeNext() {
assertHeader("#include_next<vector>", "<vector>", 13);
}
public void testBooleanLogic() {
assertNotHeader("if (x < 10 && x > 20) return false;", 6);
}
public void testVariableDeclaration() {
assertNotHeader("vector<int> foo;", 6);
}
/**
* Verifies that there is a header at the given character position.
* @param string String to check.
* @param header Expected header.
* @param position The location of the token which is expected to be a header.
*/
private void assertHeader(String string, String header, int position) {
fDocument.set(string);
fScanner.setRange(fDocument, 0, fDocument.getLength());
while (position > 0) {
fScanner.read();
position--;
}
IToken token = fScanner.nextToken();
assertSame(HEADER, token.getData());
assertEquals(header.length(), fScanner.getTokenLength());
assertEquals(string.indexOf(header), fScanner.getTokenOffset());
}
/**
* Verifies that string does not contain a header at the given position.
* @param string The String to check.
* @param position Offset where scanning should begin.
*/
private void assertNotHeader(String string, int position) {
fDocument.set(string);
fScanner.setRange(fDocument, 0, fDocument.getLength());
while (position > 0) {
fScanner.read();
position--;
}
IToken token = fScanner.nextToken();
assertNotSame(HEADER, token.getData());
}
}