blob: 5c532c8ef6a0017b5f780a5dd753c67ffd8c8e08 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2017 NumberFour AG and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* NumberFour AG - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.ui.tests.text;
import static org.eclipse.jface.text.rules.Token.UNDEFINED;
import static org.junit.Assert.assertEquals;
import org.eclipse.dltk.ui.text.rules.FloatNumberRule;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.rules.BufferedRuleBasedScanner;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.Token;
import org.junit.Test;
public class FloatNumberRuleTest {
static final IToken NUMBER = new Token("Number");
static class TestScanner extends BufferedRuleBasedScanner {
int getOffset() {
return fOffset;
}
}
private static class Value {
final IToken token;
final int length;
public Value(IToken token, int length) {
assert token == NUMBER || token == Token.UNDEFINED;
this.token = token;
this.length = length;
}
@Override
public String toString() {
return (token == NUMBER ? "NUMBER" : "UNDEFINED") + "," + length;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Value) {
final Value other = (Value) obj;
return token == other.token && length == other.length;
}
return false;
}
}
static Value value(IToken token, int offset) {
return new Value(token, offset);
}
private final FloatNumberRule rule = new FloatNumberRule(NUMBER, null, "L",
"F");
private Value evaluate(final String value) {
final TestScanner scanner = new TestScanner();
scanner.setRange(new Document(value), 0, value.length());
final IToken token = rule.evaluate(scanner);
return new Value(token, scanner.getOffset());
}
@Test
public void testDecimal() {
assertEquals(value(NUMBER, 3), evaluate("123"));
assertEquals(value(NUMBER, 3), evaluate("123,"));
}
@Test
public void testHex() {
assertEquals(value(NUMBER, 4), evaluate("0xFF"));
assertEquals(value(NUMBER, 4), evaluate("0xFF,"));
assertEquals(value(UNDEFINED, 0), evaluate("0x,"));
}
@Test
public void testFloat() {
assertEquals(value(NUMBER, 1), evaluate("1"));
assertEquals(value(NUMBER, 2), evaluate("1L"));
assertEquals(value(NUMBER, 2), evaluate("1F"));
assertEquals(value(NUMBER, 2), evaluate(".1"));
assertEquals(value(NUMBER, 4), evaluate(".1e1,"));
assertEquals(value(NUMBER, 2), evaluate(".1,"));
assertEquals(value(NUMBER, 3), evaluate("1.2"));
assertEquals(value(NUMBER, 3), evaluate("1.2,"));
assertEquals(value(NUMBER, 4), evaluate("1.2F"));
assertEquals(value(NUMBER, 4), evaluate("1.2F,"));
assertEquals(value(NUMBER, 5), evaluate("1.2e1"));
assertEquals(value(NUMBER, 5), evaluate("1.2e1,"));
assertEquals(value(NUMBER, 6), evaluate("1.2e1F,"));
assertEquals(value(NUMBER, 3), evaluate("1e1"));
assertEquals(value(NUMBER, 3), evaluate("1e1,"));
assertEquals(value(NUMBER, 4), evaluate("1e+1"));
assertEquals(value(NUMBER, 5), evaluate("1e+1F,"));
assertEquals(value(NUMBER, 4), evaluate("1e-1"));
assertEquals(value(UNDEFINED, 0), evaluate("1e+"));
}
@Test
public void testDot() {
assertEquals(value(UNDEFINED, 0), evaluate("."));
assertEquals(value(UNDEFINED, 0), evaluate("..1"));
assertEquals(value(UNDEFINED, 0), evaluate(".a"));
assertEquals(value(UNDEFINED, 0), evaluate(".x"));
assertEquals(value(UNDEFINED, 0), evaluate("a.x"));
}
}