From 9276feddd4cb92525f4fe3194289371defdcd2db Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Wed, 26 Jul 2017 14:01:43 +0200 Subject: [PATCH] Ported new methods to StringReader from nbt parsing --- .../com/mojang/brigadier/StringReader.java | 18 ++++++ .../mojang/brigadier/StringReaderTest.java | 64 +++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/src/main/java/com/mojang/brigadier/StringReader.java b/src/main/java/com/mojang/brigadier/StringReader.java index 7a5f898..e902b9d 100644 --- a/src/main/java/com/mojang/brigadier/StringReader.java +++ b/src/main/java/com/mojang/brigadier/StringReader.java @@ -16,6 +16,7 @@ public class StringReader { public static final SimpleCommandExceptionType ERROR_EXPECTED_INT = new SimpleCommandExceptionType("parsing.int.expected", "Expected integer"); public static final ParameterizedCommandExceptionType ERROR_INVALID_DOUBLE = new ParameterizedCommandExceptionType("parsing.double.invalid", "Invalid double '${value}'", "value"); public static final SimpleCommandExceptionType ERROR_EXPECTED_DOUBLE = new SimpleCommandExceptionType("parsing.double.expected", "Expected double"); + public static final ParameterizedCommandExceptionType ERROR_EXPECTED_SYMBOL = new ParameterizedCommandExceptionType("parsing.expected", "Expected '${symbol}'", "symbol"); private final String string; private int cursor; @@ -64,6 +65,10 @@ public class StringReader { return string.charAt(cursor); } + public char peek(final int offset) { + return string.charAt(cursor + offset); + } + public char read() { return string.charAt(cursor++); } @@ -76,6 +81,12 @@ public class StringReader { return c >= '0' && c <= '9' || c == '.' || c == '-'; } + public void skipWhitespace() { + while (canRead() && Character.isWhitespace(peek())) { + skip(); + } + } + public int readInt() throws CommandException { final int start = cursor; while (canRead() && isAllowedNumber(peek())) { @@ -172,4 +183,11 @@ public class StringReader { throw ERROR_INVALID_BOOL.create(value); } } + + public void expect(final char c) throws CommandException { + if (!canRead() || peek() != c) { + throw ERROR_EXPECTED_SYMBOL.create(String.valueOf(c)); + } + skip(); + } } diff --git a/src/test/java/com/mojang/brigadier/StringReaderTest.java b/src/test/java/com/mojang/brigadier/StringReaderTest.java index b3e7a52..0001301 100644 --- a/src/test/java/com/mojang/brigadier/StringReaderTest.java +++ b/src/test/java/com/mojang/brigadier/StringReaderTest.java @@ -9,6 +9,7 @@ import java.util.Collections; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; public class StringReaderTest { @Test @@ -55,6 +56,17 @@ public class StringReaderTest { assertThat(reader.getCursor(), is(2)); } + @Test + public void peek_length() throws Exception { + final StringReader reader = new StringReader("abc"); + assertThat(reader.peek(0), is('a')); + assertThat(reader.peek(2), is('c')); + assertThat(reader.getCursor(), is(0)); + reader.setCursor(1); + assertThat(reader.peek(1), is('c')); + assertThat(reader.getCursor(), is(1)); + } + @Test public void read() throws Exception { final StringReader reader = new StringReader("abc"); @@ -91,6 +103,27 @@ public class StringReaderTest { assertThat(reader.getRead(), equalTo("Hello!")); } + @Test + public void skipWhitespace_none() throws Exception { + final StringReader reader = new StringReader("Hello!"); + reader.skipWhitespace(); + assertThat(reader.getCursor(), is(0)); + } + + @Test + public void skipWhitespace_mixed() throws Exception { + final StringReader reader = new StringReader(" \t \t\nHello!"); + reader.skipWhitespace(); + assertThat(reader.getCursor(), is(5)); + } + + @Test + public void skipWhitespace_empty() throws Exception { + final StringReader reader = new StringReader(""); + reader.skipWhitespace(); + assertThat(reader.getCursor(), is(0)); + } + @Test public void readUnquotedString() throws Exception { final StringReader reader = new StringReader("hello world"); @@ -320,4 +353,35 @@ public class StringReaderTest { assertThat(reader.getRead(), equalTo("12.34")); assertThat(reader.getRemaining(), equalTo("foo bar")); } + + @Test + public void expect_correct() throws Exception { + final StringReader reader = new StringReader("abc"); + reader.expect('a'); + assertThat(reader.getCursor(), is(1)); + } + + @Test + public void expect_incorrect() throws Exception { + final StringReader reader = new StringReader("bcd"); + try { + reader.expect('a'); + fail(); + } catch (final CommandException ex) { + assertThat(ex.getType(), is(StringReader.ERROR_EXPECTED_SYMBOL)); + assertThat(ex.getData(), equalTo(ImmutableMap.of("symbol", "a"))); + } + } + + @Test + public void expect_none() throws Exception { + final StringReader reader = new StringReader(""); + try { + reader.expect('a'); + fail(); + } catch (final CommandException ex) { + assertThat(ex.getType(), is(StringReader.ERROR_EXPECTED_SYMBOL)); + assertThat(ex.getData(), equalTo(ImmutableMap.of("symbol", "a"))); + } + } } \ No newline at end of file