/*******************************************************************************
* Copyright (c) 2006, 2012 Wind River Systems, Inc. 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:
* Anton Leherbauer - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.tests.text;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.internal.ui.text.NumberRule;
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;
/**
* Testing the NumberRule matching integers and floats.
*/
public class NumberRuleTest extends TestCase {
private static final Object NUMBER = "number";
private RuleBasedScanner fScanner;
private Document fDocument;
/**
* @param name
*/
public NumberRuleTest(String name) {
super(name);
}
public static Test suite() {
return new TestSuite(NumberRuleTest.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
fScanner = new RuleBasedScanner() {};
fScanner.setRules(new IRule[] {
new NumberRule(new Token(NUMBER))
});
fDocument = new Document();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testIntegers() {
// decimal numbers
assertNumber("0");
assertNumber("-1");
assertNumber("+1");
assertNumber("123456789");
assertNumber("-123456789");
assertNumber("+123456789");
// hex numbers
assertNumber("0xaffe");
assertNumber("-0xaffe");
assertNumber("+0xaffe");
assertNumber("0Xaffe");
assertNumber("+0XaFFe");
assertNumber("0xabcdefABCDEF");
assertNumber("0x0123456789");
}
public void testFloats() {
assertNumber("0.");
assertNumber(".0");
assertNumber("-.0");
assertNumber("+.0");
assertNumber("-0.");
assertNumber("+0.");
assertNumber("0.123456789");
assertNumber("-0.123456789");
assertNumber("+12345.6789");
assertNumber("1e5");
assertNumber("1E5");
assertNumber("1.e5");
assertNumber("-1e5");
assertNumber("-.1e5");
assertNumber("1e-5");
assertNumber("1e+55");
}
public void testNonNumbers() {
// test pathological cases
assertNoNumber("-");
assertNoNumber("+");
assertNoNumber(".");
assertNoNumber("-.");
assertNoNumber("+.");
assertNoNumber("x");
assertNoNumber(".x");
assertNoNumber("-x");
assertNoNumber("e");
assertNoNumber(".e");
assertNoNumber("-e");
assertNoNumber("+e");
// false positives:
// assertNoNumber("0x");
// assertNoNumber("1e");
// assertNoNumber("1e+");
}
public void testBug163691() {
assertNoNumber("+x1");
assertNoNumber("-z0");
assertNoNumber("- 0");
assertNoNumber("+ 9");
}
/**
* Validate that given string is recognized as a number.
* @param string
*/
private void assertNumber(String string) {
fDocument.set(string);
fScanner.setRange(fDocument, 0, fDocument.getLength());
IToken token = fScanner.nextToken();
assertSame(NUMBER, token.getData());
assertEquals(string.length(), fScanner.getTokenLength());
}
/**
* Validate that given string is not recognized as a number.
* @param string
*/
private void assertNoNumber(String string) {
fDocument.set(string);
fScanner.setRange(fDocument, 0, fDocument.getLength());
IToken token = fScanner.nextToken();
assertNotSame(NUMBER, token.getData());
}
}