/******************************************************************************* * 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; import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue; import org.junit.Test; import melnorme.lang.tooling.parser.TextBlocksReader.TextBlocksSubReader; import melnorme.lang.tooling.parser.TextBlocksReader.TokenKind; import melnorme.lang.utils.parse.StringCharSource; import melnorme.utilbox.core.CommonException; import melnorme.utilbox.tests.CommonTestUtils; public class TextBlocksReader_Test extends CommonTestUtils { protected TextBlocksReader createReader(String source) { return new TextBlocksReader(new StringCharSource(str(source))); } public static String str(String str) { return str.replace("|", "\""); } @Test public void test() throws Exception { test$(); } public void test$() throws Exception { assertEquals(createReader(" blah").consumeText(), "blah"); assertEquals(createReader(" ||").consumeText(), ""); assertEquals(createReader(" ||||").consumeText(), ""); assertEquals(createReader(" |\\\\|").consumeText(), "\\"); assertEquals(createReader(" ||blah").consumeText(), "blah"); final String seqA = "blah 1.0 |--\\|--| aa.-=+\"xx\\\"xx\"cc"; testReaderBasicSequenceA(createReader(seqA)); { TextBlocksReader reader = createReader(" {blah}{blah|}|}{xxx{ccc}}"); try(TextBlocksSubReader subReader = reader.enterBlock()) { assertEquals(subReader.consumeText(), "blah"); } assertTrue(reader.charSource.lookaheadChar() == '{'); try(TextBlocksSubReader subReader = reader.enterBlock()) { assertEquals(subReader.consumeText(), "blah}"); } try(TextBlocksSubReader subReader = reader.enterBlock()) { assertEquals(subReader.consumeText(), "xxx"); try(TextBlocksSubReader subReader2 = reader.enterBlock()) { assertEquals(subReader2.consumeText(), "ccc"); } } } { TextBlocksReader reader = createReader(" {" +seqA+ "} " + seqA + " { " +seqA+ " } "); reader.consumeBlock((subReader) -> testReaderBasicSequenceA(subReader)); testReaderBasicSequenceA(reader); reader.consumeBlock((subReader) -> testReaderBasicSequenceA(subReader)); assertTrue(reader.tokenAhead() == TokenKind.EOS); } { TextBlocksReader reader = createReader(" asfd|}| aaa {} bbb {" +seqA+ " { axdfxd } } ccc"); reader.skipNextElement(); assertEquals(reader.consumeText(), "aaa"); reader.skipNextElement(); assertEquals(reader.consumeText(), "bbb"); reader.skipNextElement(); assertEquals(reader.consumeText(), "ccc"); } testErrorCases(); } protected Void testReaderBasicSequenceA(TextBlocksReader reader) throws CommonException { assertTrue(reader.peekTokenStart() == 'b'); reader.expectText("blah"); reader.expectText("1.0"); reader.expectText("--\"--"); reader.expectText("aa.-=+xx\"xxcc"); assertTrue(createReader("").tokenAhead() == TokenKind.EOS); assertTrue(createReader(" ").tokenAhead() == TokenKind.EOS); assertTrue(createReader(" }").tokenAhead() == TokenKind.EOS); return null; } protected void testErrorCases() { verifyThrows(() -> createReader(" {").consumeText(), null, "Expected text, found `{`."); verifyThrows(() -> createReader(" \"abc").consumeText(), null, "Unterminated text `abc`."); verifyThrows(() -> createReader(" blah").expectText("xxx"), null, "Expected text `xxx`, found text `blah`."); verifyThrows(() -> createReader(" ( )").expectText("xxx"), null, "Expected text `xxx`, found `(`."); verifyThrows(() -> { try(TextBlocksSubReader subReader = createReader(" ( ").enterBlock()) { throw new CommonException("foo"); } }, null, "foo"); verifyThrows(() -> { try(TextBlocksSubReader subReader = createReader(" { ) ").enterBlock()) { } }, null, "Expected BLOCK_CLOSE `}`, found `)`"); verifyThrows(() -> { try(TextBlocksSubReader subReader = createReader(" { ").enterBlock()) { } }, null, "Expected BLOCK_CLOSE `}`, found EOS"); } }