| /******************************************************************************* |
| * Copyright (c) 2012, 2017 NumberFour AG 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: |
| * 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")); |
| } |
| |
| } |