aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2025-01-08 19:14:03 +0000
committerMichael Williamson <mike@zwobble.org>2025-01-09 20:36:42 +0000
commit3666a4af2eb35177eecd557d2a75f4bac9da75b9 (patch)
treea85230de832bc7f970dd89aaa6bb2da6ea5875f4 /src/test/java
parent1e6e1f7bb8776fc013f76828ed8df3f9297d095b (diff)
Use source text to implement FileFragmentSource
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/config/BinConfigTests.java4
-rw-r--r--src/test/java/org/shedlang/compiler/config/GcConfigTests.java4
-rw-r--r--src/test/java/org/shedlang/compiler/config/GcMarkAndSweepConfigTests.java6
-rw-r--r--src/test/java/org/shedlang/compiler/config/ProfileConfigTests.java4
-rw-r--r--src/test/java/org/shedlang/compiler/config/ProjectConfigTests.java4
-rw-r--r--src/test/java/org/shedlang/compiler/config/json/Json5ObjectWithSourceTests.java4
-rw-r--r--src/test/java/org/shedlang/compiler/parser/ParserStringLiteralTests.java4
-rw-r--r--src/test/java/org/shedlang/compiler/parser/ParserTesting.java6
-rw-r--r--src/test/java/org/shedlang/compiler/parser/TokeniserTests.java10
-rw-r--r--src/test/java/org/shedlang/compiler/sources/FileFragmentSourceTests.java215
-rw-r--r--src/test/java/org/shedlang/compiler/tokeniser/RegexTokeniserTests.java81
-rw-r--r--src/test/java/org/shedlang/compiler/tokeniser/TokenIteratorTests.java160
12 files changed, 177 insertions, 325 deletions
diff --git a/src/test/java/org/shedlang/compiler/config/BinConfigTests.java b/src/test/java/org/shedlang/compiler/config/BinConfigTests.java
index b11562d5..fac051a5 100644
--- a/src/test/java/org/shedlang/compiler/config/BinConfigTests.java
+++ b/src/test/java/org/shedlang/compiler/config/BinConfigTests.java
@@ -3,8 +3,8 @@ package org.shedlang.compiler.config;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.config.errors.ConfigError;
import org.shedlang.compiler.config.json.Json5ObjectWithSource;
+import org.shedlang.compiler.sources.SourceTexts;
import org.shedlang.compiler.types.NamespaceName;
-import org.zwobble.sourcetext.SourceText;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.zwobble.precisely.AssertThat.assertThat;
@@ -56,7 +56,7 @@ public class BinConfigTests {
}
private BinConfig parseBinConfig(String text) {
- var sourceText = SourceText.fromString("<string>", text);
+ var sourceText = SourceTexts.string(text);
return BinConfig.fromJson5(Json5ObjectWithSource.parse(sourceText));
}
}
diff --git a/src/test/java/org/shedlang/compiler/config/GcConfigTests.java b/src/test/java/org/shedlang/compiler/config/GcConfigTests.java
index 1dfa27a4..064306c9 100644
--- a/src/test/java/org/shedlang/compiler/config/GcConfigTests.java
+++ b/src/test/java/org/shedlang/compiler/config/GcConfigTests.java
@@ -2,7 +2,7 @@ package org.shedlang.compiler.config;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.config.json.Json5ObjectWithSource;
-import org.zwobble.sourcetext.SourceText;
+import org.shedlang.compiler.sources.SourceTexts;
import java.util.OptionalLong;
@@ -71,7 +71,7 @@ public class GcConfigTests {
}
private GcConfig parseGcConfig(String text) {
- var sourceText = SourceText.fromString("<string>", text);
+ var sourceText = SourceTexts.string(text);
return GcConfig.fromJson5(Json5ObjectWithSource.parse(sourceText));
}
}
diff --git a/src/test/java/org/shedlang/compiler/config/GcMarkAndSweepConfigTests.java b/src/test/java/org/shedlang/compiler/config/GcMarkAndSweepConfigTests.java
index d867fd71..ee5dac09 100644
--- a/src/test/java/org/shedlang/compiler/config/GcMarkAndSweepConfigTests.java
+++ b/src/test/java/org/shedlang/compiler/config/GcMarkAndSweepConfigTests.java
@@ -2,7 +2,7 @@ package org.shedlang.compiler.config;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.config.json.Json5ObjectWithSource;
-import org.zwobble.sourcetext.SourceText;
+import org.shedlang.compiler.sources.SourceTexts;
import java.util.OptionalLong;
@@ -13,7 +13,7 @@ import static org.zwobble.precisely.Matchers.has;
public class GcMarkAndSweepConfigTests {
@Test
public void collectIntervalCanBeMissing() {
- var sourceText = SourceText.fromString("<string>", "{}");
+ var sourceText = SourceTexts.string("{}");
var config = GcMarkAndSweepConfig.fromJson5(Json5ObjectWithSource.parse(sourceText));
@@ -26,7 +26,7 @@ public class GcMarkAndSweepConfigTests {
@Test
public void additionalFieldsCanBeUsedBySpecificGcConfig() {
- var source = SourceText.fromString("<string>", """
+ var source = SourceTexts.string("""
{
name: "mark-and-sweep",
collectInterval: 10000,
diff --git a/src/test/java/org/shedlang/compiler/config/ProfileConfigTests.java b/src/test/java/org/shedlang/compiler/config/ProfileConfigTests.java
index c923e654..b43d7b34 100644
--- a/src/test/java/org/shedlang/compiler/config/ProfileConfigTests.java
+++ b/src/test/java/org/shedlang/compiler/config/ProfileConfigTests.java
@@ -2,7 +2,7 @@ package org.shedlang.compiler.config;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.config.json.Json5ObjectWithSource;
-import org.zwobble.sourcetext.SourceText;
+import org.shedlang.compiler.sources.SourceTexts;
import static org.zwobble.precisely.AssertThat.assertThat;
import static org.zwobble.precisely.Matchers.*;
@@ -55,7 +55,7 @@ public class ProfileConfigTests {
}
private ProfileConfig parseProfileConfig(String text) {
- var sourceText = SourceText.fromString("<string>", text);
+ var sourceText = SourceTexts.string(text);
return ProfileConfig.fromJson5(Json5ObjectWithSource.parse(sourceText));
}
}
diff --git a/src/test/java/org/shedlang/compiler/config/ProjectConfigTests.java b/src/test/java/org/shedlang/compiler/config/ProjectConfigTests.java
index 449dd9ff..e7059c34 100644
--- a/src/test/java/org/shedlang/compiler/config/ProjectConfigTests.java
+++ b/src/test/java/org/shedlang/compiler/config/ProjectConfigTests.java
@@ -3,8 +3,8 @@ package org.shedlang.compiler.config;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.config.errors.ConfigError;
import org.shedlang.compiler.config.errors.Json5SyntaxConfigError;
+import org.shedlang.compiler.sources.SourceTexts;
import org.shedlang.compiler.types.NamespaceName;
-import org.zwobble.sourcetext.SourceText;
import java.nio.file.Path;
@@ -252,7 +252,7 @@ public class ProjectConfigTests {
}
private ProjectConfig parseProjectConfig(String text) {
- var sourceText = SourceText.fromString("<string>", text);
+ var sourceText = SourceTexts.string(text);
return ProjectConfig.fromSourceText(PROJECT_PATH, sourceText);
}
}
diff --git a/src/test/java/org/shedlang/compiler/config/json/Json5ObjectWithSourceTests.java b/src/test/java/org/shedlang/compiler/config/json/Json5ObjectWithSourceTests.java
index 15946c26..35e97a48 100644
--- a/src/test/java/org/shedlang/compiler/config/json/Json5ObjectWithSourceTests.java
+++ b/src/test/java/org/shedlang/compiler/config/json/Json5ObjectWithSourceTests.java
@@ -2,7 +2,7 @@ package org.shedlang.compiler.config.json;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.config.errors.ConfigError;
-import org.zwobble.sourcetext.SourceText;
+import org.shedlang.compiler.sources.SourceTexts;
import java.util.Optional;
import java.util.OptionalLong;
@@ -405,7 +405,7 @@ public class Json5ObjectWithSourceTests {
}
private Json5ObjectWithSource parseJson5Object(String text) {
- var sourceText = SourceText.fromString("<string>", text);
+ var sourceText = SourceTexts.string(text);
return Json5ObjectWithSource.parse(sourceText);
}
}
diff --git a/src/test/java/org/shedlang/compiler/parser/ParserStringLiteralTests.java b/src/test/java/org/shedlang/compiler/parser/ParserStringLiteralTests.java
index 9f84c935..21c6a2ca 100644
--- a/src/test/java/org/shedlang/compiler/parser/ParserStringLiteralTests.java
+++ b/src/test/java/org/shedlang/compiler/parser/ParserStringLiteralTests.java
@@ -49,8 +49,8 @@ public class ParserStringLiteralTests {
assertThat(error.getMessage(), equalTo("Unrecognised escape sequence: \\a"));
assertThat(error.source(), instanceOf(FileFragmentSource.class, allOf(
- has("characterIndexStart", x -> x.characterIndexStart(), equalTo(1)),
- has("characterIndexEnd", x -> x.characterIndexEnd(), equalTo(3))
+ has("characterIndexStart", x -> x.sourceRange().start().characterIndex(), equalTo(2)),
+ has("characterIndexEnd", x -> x.sourceRange().end().characterIndex(), equalTo(4))
)));
}
}
diff --git a/src/test/java/org/shedlang/compiler/parser/ParserTesting.java b/src/test/java/org/shedlang/compiler/parser/ParserTesting.java
index fd420f73..1e4f202f 100644
--- a/src/test/java/org/shedlang/compiler/parser/ParserTesting.java
+++ b/src/test/java/org/shedlang/compiler/parser/ParserTesting.java
@@ -1,6 +1,6 @@
package org.shedlang.compiler.parser;
-import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.sources.SourceTexts;
import org.shedlang.compiler.tokeniser.TokenIterator;
import java.util.function.Function;
@@ -14,8 +14,8 @@ public class ParserTesting {
String sourceContents,
Function<TokenIterator<TokenType>, T> parseTokens
) {
- var source = Sources.file("<string>", sourceContents);
- var tokens = tokenise(source);
+ var sourceText = SourceTexts.string(sourceContents);
+ var tokens = tokenise(sourceText);
var result = parseTokens.apply(tokens);
assertThat(tokens.peek().tokenType(), equalTo(TokenType.END));
return result;
diff --git a/src/test/java/org/shedlang/compiler/parser/TokeniserTests.java b/src/test/java/org/shedlang/compiler/parser/TokeniserTests.java
index 69cfdae7..0dc9a560 100644
--- a/src/test/java/org/shedlang/compiler/parser/TokeniserTests.java
+++ b/src/test/java/org/shedlang/compiler/parser/TokeniserTests.java
@@ -1,7 +1,7 @@
package org.shedlang.compiler.parser;
import org.junit.jupiter.api.Test;
-import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.sources.SourceTexts;
import static org.zwobble.precisely.AssertThat.assertThat;
import static org.zwobble.precisely.Matchers.equalTo;
@@ -9,11 +9,11 @@ import static org.zwobble.precisely.Matchers.equalTo;
public class TokeniserTests {
@Test
public void whitespaceTokensAreIgnored() {
- var source = Sources.file("X.shed", """
+ var sourceText = SourceTexts.string("""
one two three
""");
- var result = Tokeniser.tokenise(source);
+ var result = Tokeniser.tokenise(sourceText);
assertThat(result.nextValue(TokenType.IDENTIFIER), equalTo("one"));
assertThat(result.nextValue(TokenType.IDENTIFIER), equalTo("two"));
@@ -23,14 +23,14 @@ public class TokeniserTests {
@Test
public void singleLineCommentsAreIgnored() {
- var source = Sources.file("X.shed", """
+ var sourceText = SourceTexts.string("""
// a
one
// b
two
""");
- var result = Tokeniser.tokenise(source);
+ var result = Tokeniser.tokenise(sourceText);
assertThat(result.nextValue(TokenType.IDENTIFIER), equalTo("one"));
assertThat(result.nextValue(TokenType.IDENTIFIER), equalTo("two"));
diff --git a/src/test/java/org/shedlang/compiler/sources/FileFragmentSourceTests.java b/src/test/java/org/shedlang/compiler/sources/FileFragmentSourceTests.java
deleted file mode 100644
index 0c1df6ac..00000000
--- a/src/test/java/org/shedlang/compiler/sources/FileFragmentSourceTests.java
+++ /dev/null
@@ -1,215 +0,0 @@
-package org.shedlang.compiler.sources;
-
-import org.junit.jupiter.api.DynamicTest;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestFactory;
-
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.zwobble.precisely.AssertThat.assertThat;
-import static org.zwobble.precisely.Matchers.equalTo;
-
-public class FileFragmentSourceTests {
- private record TestCase(
- String name,
- String contents,
- int characterIndexStart,
- String expectedContext
- ) {
- public int characterIndexEnd() {
- return characterIndexStart;
- }
- }
-
- @TestFactory
- public List<DynamicTest> sourceContextIsSourceLineWithPointer() {
- return Stream.of(
- new TestCase(
- "one line, first character",
- "abcd",
- 0,
- """
- <filename>:1:1
- abcd
- ^"""
- ),
- new TestCase(
- "one line, last character",
- "abcd",
- 3,
- """
- <filename>:1:4
- abcd
- ^"""
- ),
- new TestCase(
- "one line, end",
- "abcd",
- 4,
- """
- <filename>:1:5
- abcd
- ^"""
- ),
- new TestCase(
- "many lines, end",
- """
- abc
- def""",
- 7,
- """
- <filename>:2:4
- def
- ^"""
- ),
- new TestCase(
- "first line, first character",
- """
- abc
- def""",
- 0,
- """
- <filename>:1:1
- abc
- ^"""
- ),
- new TestCase(
- "first line, last character",
- """
- abc
- def""",
- 2,
- """
- <filename>:1:3
- abc
- ^"""
- ),
- new TestCase(
- "last line, first character",
- """
- abc
- def""",
- 4,
- """
- <filename>:2:1
- def
- ^"""
- )
- ).map(testCase -> DynamicTest.dynamicTest(testCase.name, () -> {
- var source = new FileFragmentSource(
- "<filename>",
- testCase.contents,
- testCase.characterIndexStart,
- testCase.characterIndexEnd()
- );
-
- assertThat(source.describe(), equalTo(testCase.expectedContext));
- })).collect(Collectors.toList());
- }
-
- @Test
- public void whenSourceIsZeroLengthThenPointerPointsToNextCharacter() {
- var source = new FileFragmentSource(
- "<filename>",
- """
- abcdef
- ghijkl
- mnopqr""",
- 9,
- 9
- );
-
- assertThat(source.describe(), equalTo("""
- <filename>:2:3
- ghijkl
- ^"""));
- }
-
- @Test
- public void whenSourceIsOneCharacterThenPointerPointsToCharacter() {
- var source = new FileFragmentSource(
- "<filename>",
- """
- abcdef
- ghijkl
- mnopqr""",
- 9,
- 9
- );
-
- assertThat(source.describe(), equalTo("""
- <filename>:2:3
- ghijkl
- ^"""));
- }
-
- @Test
- public void whenSourceIsMultipleCharactersOnSameLineThenPointerPointsToAllCharacters() {
- var source = new FileFragmentSource(
- "<filename>",
- """
- abcdef
- ghijkl
- mnopqr""",
- 9,
- 12
- );
-
- assertThat(source.describe(), equalTo("""
- <filename>:2:3
- ghijkl
- ^^^"""));
- }
-
- @Test
- public void whenSourceIsMultipleCharactersOnMultipleLinesThenPointerPointsToFirstCharacter() {
- // TODO: show multiple lines
- var source = new FileFragmentSource(
- "<filename>",
- """
- abcdef
- ghijkl
- mnopqr""",
- 9,
- 14
- );
-
- assertThat(source.describe(), equalTo("""
- <filename>:2:3
- ghijkl
- ^"""));
- }
-
- @Test
- public void atReturnsSubsectionOfCompleteSource() {
- var source = FileFragmentSource.file("<filename>", "abcdefg");
-
- var fragment = source.at(2, 5);
-
- assertThat(fragment, equalTo(new FileFragmentSource("<filename>", "abcdefg", 2, 5)));
- }
-
- @Test
- public void atReturnsSubsectionOfIncompleteSource() {
- var source = FileFragmentSource.file("<filename>", "abcdefg");
-
- var fragment = source.at(1, 6).at(1, 4);
-
- assertThat(fragment, equalTo(new FileFragmentSource("<filename>", "abcdefg", 2, 5)));
- }
-
- @Test
- public void whenAtIsCalledWithEndBeforeStartThenErrorIsThrown() {
- var source = FileFragmentSource.file("<filename>", "abcdefg");
-
- var error = assertThrows(
- IllegalArgumentException.class,
- () -> source.at(2, 1)
- );
-
- assertThat(error.getMessage(), equalTo("characterIndexStart > characterIndexEnd"));
- }
-}
diff --git a/src/test/java/org/shedlang/compiler/tokeniser/RegexTokeniserTests.java b/src/test/java/org/shedlang/compiler/tokeniser/RegexTokeniserTests.java
index 06989d4d..be47dda5 100644
--- a/src/test/java/org/shedlang/compiler/tokeniser/RegexTokeniserTests.java
+++ b/src/test/java/org/shedlang/compiler/tokeniser/RegexTokeniserTests.java
@@ -1,8 +1,7 @@
package org.shedlang.compiler.tokeniser;
import org.junit.jupiter.api.Test;
-import org.shedlang.compiler.sources.Source;
-import org.shedlang.compiler.sources.Sources;
+import org.zwobble.sourcetext.SourceText;
import java.util.List;
@@ -21,9 +20,9 @@ public class RegexTokeniserTests {
@Test
public void emptyStringIsTokenisedToNoTokens() {
var tokeniser = new RegexTokeniser<>(TokenType.UNKNOWN, List.of());
- var source = source("");
+ var sourceText = sourceText("");
- var result = tokeniser.tokenise(source);
+ var result = tokeniser.tokenise(sourceText);
assertThat(result, isSequence());
}
@@ -33,12 +32,16 @@ public class RegexTokeniserTests {
var tokeniser = new RegexTokeniser<>(TokenType.UNKNOWN, List.of(
RegexTokeniser.rule(TokenType.IDENTIFIER, "[A-Za-z0-9]+")
));
- var source = source("count");
+ var sourceText = sourceText("count");
- var result = tokeniser.tokenise(source);
+ var result = tokeniser.tokenise(sourceText);
assertThat(result, isSequence(
- equalTo(new Token<>(source.at(0, 5), TokenType.IDENTIFIER, "count"))
+ equalTo(new Token<>(
+ sourceText.characterPosition(0).to(sourceText.characterPosition(5)),
+ TokenType.IDENTIFIER,
+ "count"
+ ))
));
}
@@ -48,12 +51,16 @@ public class RegexTokeniserTests {
RegexTokeniser.rule(TokenType.KEYWORD, "if"),
RegexTokeniser.rule(TokenType.IDENTIFIER, "[A-Za-z0-9]+")
));
- var source = source("if");
+ var sourceText = sourceText("if");
- var result = tokeniser.tokenise(source);
+ var result = tokeniser.tokenise(sourceText);
assertThat(result, isSequence(
- equalTo(new Token<>(source.at(0, 2), TokenType.KEYWORD, "if"))
+ equalTo(new Token<>(
+ sourceText.characterPosition(0).to(sourceText.characterPosition(2)),
+ TokenType.KEYWORD,
+ "if"
+ ))
));
}
@@ -63,14 +70,26 @@ public class RegexTokeniserTests {
RegexTokeniser.rule(TokenType.IDENTIFIER, "[A-Za-z0-9]+"),
RegexTokeniser.rule(TokenType.WHITESPACE, "\\s")
));
- var source = source("one two");
+ var sourceText = sourceText("one two");
- var result = tokeniser.tokenise(source);
+ var result = tokeniser.tokenise(sourceText);
assertThat(result, isSequence(
- equalTo(new Token<>(source.at(0, 3), TokenType.IDENTIFIER, "one")),
- equalTo(new Token<>(source.at(3, 4), TokenType.WHITESPACE, " ")),
- equalTo(new Token<>(source.at(4, 7), TokenType.IDENTIFIER, "two"))
+ equalTo(new Token<>(
+ sourceText.characterPosition(0).to(sourceText.characterPosition(3)),
+ TokenType.IDENTIFIER,
+ "one"
+ )),
+ equalTo(new Token<>(
+ sourceText.characterPosition(3).to(sourceText.characterPosition(4)),
+ TokenType.WHITESPACE,
+ " "
+ )),
+ equalTo(new Token<>(
+ sourceText.characterPosition(4).to(sourceText.characterPosition(7)),
+ TokenType.IDENTIFIER,
+ "two"
+ ))
));
}
@@ -79,19 +98,35 @@ public class RegexTokeniserTests {
var tokeniser = new RegexTokeniser<>(TokenType.UNKNOWN, List.of(
RegexTokeniser.rule(TokenType.IDENTIFIER, "[A-Za-z0-9]+")
));
- var source = source("!!a!");
+ var sourceText = sourceText("!!a!");
- var result = tokeniser.tokenise(source);
+ var result = tokeniser.tokenise(sourceText);
assertThat(result, isSequence(
- equalTo(new Token<>(source.at(0, 1), TokenType.UNKNOWN, "!")),
- equalTo(new Token<>(source.at(1, 2), TokenType.UNKNOWN, "!")),
- equalTo(new Token<>(source.at(2, 3), TokenType.IDENTIFIER, "a")),
- equalTo(new Token<>(source.at(3, 4), TokenType.UNKNOWN, "!"))
+ equalTo(new Token<>(
+ sourceText.characterPosition(0).to(sourceText.characterPosition(1)),
+ TokenType.UNKNOWN,
+ "!"
+ )),
+ equalTo(new Token<>(
+ sourceText.characterPosition(1).to(sourceText.characterPosition(2)),
+ TokenType.UNKNOWN,
+ "!"
+ )),
+ equalTo(new Token<>(
+ sourceText.characterPosition(2).to(sourceText.characterPosition(3)),
+ TokenType.IDENTIFIER,
+ "a"
+ )),
+ equalTo(new Token<>(
+ sourceText.characterPosition(3).to(sourceText.characterPosition(4)),
+ TokenType.UNKNOWN,
+ "!"
+ ))
));
}
- private Source source(String sourceContents) {
- return Sources.file("<filename>", sourceContents);
+ private SourceText sourceText(String sourceContents) {
+ return SourceText.fromString("<filename>", sourceContents);
}
}
diff --git a/src/test/java/org/shedlang/compiler/tokeniser/TokenIteratorTests.java b/src/test/java/org/shedlang/compiler/tokeniser/TokenIteratorTests.java
index 52d036a8..dd22550f 100644
--- a/src/test/java/org/shedlang/compiler/tokeniser/TokenIteratorTests.java
+++ b/src/test/java/org/shedlang/compiler/tokeniser/TokenIteratorTests.java
@@ -1,7 +1,7 @@
package org.shedlang.compiler.tokeniser;
import org.junit.jupiter.api.Test;
-import org.shedlang.compiler.sources.Sources;
+import org.zwobble.sourcetext.SourceText;
import java.util.List;
@@ -18,13 +18,15 @@ public class TokenIteratorTests {
@Test
public void skipSucceedsWhenNextTokenHasMatchingTokenType() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
tokens.skip(TokenType.SYMBOL);
@@ -36,13 +38,15 @@ public class TokenIteratorTests {
@Test
public void skipFailsWhenNextTokenDoesNotHaveMatchingTokenType() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
tokens.skip(TokenType.SYMBOL);
@@ -57,13 +61,15 @@ public class TokenIteratorTests {
@Test
public void trySkipAdvancesIteratorAndReturnsTrueWhenNextTokenHasMatchingTokenType() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
assertThat(tokens.trySkip(TokenType.SYMBOL), equalTo(true));
@@ -75,13 +81,15 @@ public class TokenIteratorTests {
@Test
public void trySkipDoesNotAdvanceIteratorAndReturnsFalseWhenNextTokenDoesNotHaveMatchingTokenType() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
tokens.skip(TokenType.SYMBOL);
@@ -92,13 +100,15 @@ public class TokenIteratorTests {
@Test
public void nextValueReturnsValueWhenCurrentTokenHasMatchingTokenType() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
assertThat(tokens.nextValue(TokenType.SYMBOL), equalTo("!"));
@@ -107,13 +117,15 @@ public class TokenIteratorTests {
@Test
public void nextValueFailsWhenCurrentTokenDoesNotHaveMatchingTokenType() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
tokens.skip(TokenType.SYMBOL);
@@ -128,13 +140,15 @@ public class TokenIteratorTests {
@Test
public void isNextWithOneArgReturnsTrueIfNextTokenIsOfMatchingType() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
tokens.skip(TokenType.SYMBOL);
@@ -144,13 +158,15 @@ public class TokenIteratorTests {
@Test
public void isNextWithOneArgReturnsFalseIfNextTokenIsNotOfMatchingType() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
tokens.skip(TokenType.SYMBOL);
@@ -160,13 +176,15 @@ public class TokenIteratorTests {
@Test
public void isNextWithTwoArgReturnsTrueIfBothNextTokensMatchRespectiveTypes() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
tokens.skip(TokenType.SYMBOL);
@@ -176,13 +194,15 @@ public class TokenIteratorTests {
@Test
public void isNextWithTwoArgReturnsFalseIfFirstTokenDoesNotMatchRespectiveType() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
tokens.skip(TokenType.SYMBOL);
@@ -192,13 +212,15 @@ public class TokenIteratorTests {
@Test
public void isNextWithTwoArgReturnsFalseIfSecondTokenDoesNotMatchRespectiveType() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
tokens.skip(TokenType.SYMBOL);
@@ -208,42 +230,52 @@ public class TokenIteratorTests {
@Test
public void peekReturnsNextTokenWithoutAdvancing() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
- assertThat(tokens.peek(), equalTo(token(0, TokenType.SYMBOL, "!")));
- assertThat(tokens.peek(), equalTo(token(0, TokenType.SYMBOL, "!")));
+ assertThat(tokens.peek(), equalTo(token(sourceText, 0, TokenType.SYMBOL, "!")));
+ assertThat(tokens.peek(), equalTo(token(sourceText, 0, TokenType.SYMBOL, "!")));
tokens.skip(TokenType.SYMBOL);
- assertThat(tokens.peek(), equalTo(token(1, TokenType.IDENTIFIER, "x")));
+ assertThat(tokens.peek(), equalTo(token(sourceText, 1, TokenType.IDENTIFIER, "x")));
}
@Test
public void canPeekMultipleTokensAhead() {
+ var sourceText = SourceText.fromString("<filename>", "!x!");
+
var tokens = new TokenIterator<>(
List.of(
- token(0, TokenType.SYMBOL, "!"),
- token(1, TokenType.IDENTIFIER, "x"),
- token(2, TokenType.SYMBOL, "!")
+ token(sourceText, 0, TokenType.SYMBOL, "!"),
+ token(sourceText, 1, TokenType.IDENTIFIER, "x"),
+ token(sourceText, 2, TokenType.SYMBOL, "!")
),
- token(3, TokenType.END, "")
+ token(sourceText, 3, TokenType.END, "")
);
- assertThat(tokens.peek(0), equalTo(token(0, TokenType.SYMBOL, "!")));
- assertThat(tokens.peek(1), equalTo(token(1, TokenType.IDENTIFIER, "x")));
- assertThat(tokens.peek(2), equalTo(token(2, TokenType.SYMBOL, "!")));
+ assertThat(tokens.peek(0), equalTo(token(sourceText, 0, TokenType.SYMBOL, "!")));
+ assertThat(tokens.peek(1), equalTo(token(sourceText, 1, TokenType.IDENTIFIER, "x")));
+ assertThat(tokens.peek(2), equalTo(token(sourceText, 2, TokenType.SYMBOL, "!")));
tokens.skip(TokenType.SYMBOL);
- assertThat(tokens.peek(0), equalTo(token(1, TokenType.IDENTIFIER, "x")));
- assertThat(tokens.peek(1), equalTo(token(2, TokenType.SYMBOL, "!")));
- assertThat(tokens.peek(2), equalTo(token(3, TokenType.END, "")));
+ assertThat(tokens.peek(0), equalTo(token(sourceText, 1, TokenType.IDENTIFIER, "x")));
+ assertThat(tokens.peek(1), equalTo(token(sourceText, 2, TokenType.SYMBOL, "!")));
+ assertThat(tokens.peek(2), equalTo(token(sourceText, 3, TokenType.END, "")));
}
- private Token<TokenType> token(int characterIndex, TokenType tokenType, String value) {
- return new Token<>(Sources.NULL, tokenType, value);
+ private Token<TokenType> token(
+ SourceText sourceText,
+ int characterIndex,
+ TokenType tokenType,
+ String value
+ ) {
+ var sourcePosition = sourceText.characterPosition(characterIndex);
+ return new Token<>(sourcePosition.to(sourcePosition), tokenType, value);
}
}