/******************************************************************************* * Copyright (c) 2015 Bruno Medeiros and other Contributors. * 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: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.lang.tooling.parser.lexer; import org.junit.Test; import melnorme.lang.tooling.parser.lexer.IPredicateLexingRule; import melnorme.lang.tooling.parser.lexer.NumberLexingRule; import melnorme.lang.utils.parse.ICharacterReader; public class NumberRuleTest extends CommonLexerRuleTest { public NumberRuleTest() { super(); } @Override protected IPredicateLexingRule createLexingRule() { return new NumberLexingRule() { @Override protected boolean consumeIntSuffix(ICharacterReader reader) { return false; } @Override protected boolean consumeFloatSuffix(ICharacterReader reader) { return false; } }; } @Test public void test() throws Exception { test$(); } public void test$() throws Exception { testInteger(); testFloats(); } protected void testInteger() { testRule("", 0); testRule("xxx", 0); testRule("xxx123", 0); testRule("0", 1); testRule("2", 1); testRule("123", 3); testRule("12_3_", 5); testRule("10_20_30", 8); testRule("_", 0); testRule("123" + (char) ('9' + 1), 3); testRule("123" + (char) ('0' - 1), 3); // parse even the illegal suffixes testRule("123xxx", 3); testRule("123.4xxx", 5); testRule("0b_010", 6); testRule("0o7_17", 6); testRule("0xF1F_", 6); testRule("0b012", 4); testRule("0o718", 4); testRule("0xF1G", 4); } protected void testFloats() { // Floats testRule("123.0", 5); testRule("123.19", 6); testRule("123.", 4); testRule("123. a", 4); testRule("123.a", 3); testRule("123..", 3); testRule("123,", 3); testFractionalPartIfLiteralHasRadixPrefix(); testFloat_exponentPart(); } protected void testFractionalPartIfLiteralHasRadixPrefix() { testRule("0o0.11", 3); testRule("0b0.11", 3); testRule("0x0.11", 3); } protected void testFloat_exponentPart() { testRule("123.15E", 7); testRule("123.15e109", 10); testRule("123.15E+19", 10); testRule("123.15E-19", 10); testRule("123.E1", 3); // fractional part can't start with exponent testRule("123._E1", 3); // fractional part can't start with _ testRule("123.1_E1", 8); } }