diff --git a/common/src/main/java/me/topchetoeu/j2s/common/parsing/ParseRes.java b/common/src/main/java/me/topchetoeu/j2s/common/parsing/ParseRes.java index 9d632cf..c8f22f3 100644 --- a/common/src/main/java/me/topchetoeu/j2s/common/parsing/ParseRes.java +++ b/common/src/main/java/me/topchetoeu/j2s/common/parsing/ParseRes.java @@ -33,19 +33,20 @@ public class ParseRes { if (!state.isSuccess()) return this; return new ParseRes<>(state, null, null, result, this.n + n); } + @SuppressWarnings("unchecked") public ParseRes chainError() { if (isSuccess()) throw new RuntimeException("Can't transform a ParseRes that hasn't failed"); - return new ParseRes<>(state, errorLocation, error, null, 0); + return (ParseRes)this; } @SuppressWarnings("unchecked") public ParseRes chainError(ParseRes other) { - if (!this.isError()) return other.chainError(); - return (ParseRes) this; + if (this.isError()) return other.chainError(); + return (ParseRes)this; } @SuppressWarnings("unchecked") public ParseRes chainError(Location loc, String error) { if (!this.isError()) return new ParseRes<>(State.ERROR, loc, error, null, 0); - return (ParseRes) this; + return (ParseRes)this; } public boolean isSuccess() { return state.isSuccess(); } @@ -63,7 +64,6 @@ public class ParseRes { return new ParseRes<>(State.SUCCESS, null, null, val, i); } - @SafeVarargs @SuppressWarnings("all") public static ParseRes first(Source src, int i, Parser ...parsers) { int n = Parsing.skipEmpty(src, i); diff --git a/common/src/test/java/me/topchetoeu/j2s/common/TestEnvironment.java b/common/src/test/java/me/topchetoeu/j2s/common/TestEnvironment.java index 242c0d2..6ecf487 100644 --- a/common/src/test/java/me/topchetoeu/j2s/common/TestEnvironment.java +++ b/common/src/test/java/me/topchetoeu/j2s/common/TestEnvironment.java @@ -1,7 +1,7 @@ package me.topchetoeu.j2s.common; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import org.junit.jupiter.api.Test; @@ -18,55 +18,55 @@ public class TestEnvironment { } @Test public void testShouldNotExist() { var env = new Environment(); - assertEquals(env.get(FOO), null); - assertEquals(env.has(FOO), false); + assertEquals(null, env.get(FOO)); + assertEquals(false, env.has(FOO)); } @Test public void testShouldAdd() { var env = new Environment(); env.add(FOO, "test"); - assertEquals(env.get(FOO), "test"); + assertEquals("test", env.get(FOO)); } @Test public void testShouldGetFromParent() { var parent = new Environment(); parent.add(FOO, "test"); var child = parent.child(); - assertEquals(child.get(FOO), "test"); - assertEquals(child.has(FOO), true); + assertEquals("test", child.get(FOO)); + assertEquals(true, child.has(FOO)); } @Test public void testShouldHideParent() { var parent = new Environment(); parent.add(FOO, "test"); var child = parent.child(); child.remove(FOO); - assertEquals(child.get(FOO), null); - assertEquals(child.has(FOO), false); + assertEquals(null, child.get(FOO)); + assertEquals(false, child.has(FOO)); } @Test public void testShouldAddMarker() { var env = new Environment(); env.add(MARKER); - assertEquals(env.has(MARKER), true); - assertEquals(env.hasNotNull(MARKER), false); + assertEquals(true, env.has(MARKER)); + assertEquals(false, env.hasNotNull(MARKER)); } @Test public void testShouldInitOnce() { var env = new Environment(); - assertEquals(env.init(FOO, "a"), "a"); - assertEquals(env.init(FOO, "b"), "a"); - assertEquals(env.get(FOO), "a"); + assertEquals("a", env.init(FOO, "a")); + assertEquals("a", env.init(FOO, "b")); + assertEquals("a", env.get(FOO)); } @Test public void testShouldInitOnceFrom() { var env = new Environment(); - assertEquals(env.initFrom(FOO, () -> "a"), "a"); - assertEquals(env.initFrom(FOO, () -> "b"), "a"); - assertEquals(env.get(FOO), "a"); + assertEquals("a", env.initFrom(FOO, () -> "a")); + assertEquals("a", env.initFrom(FOO, () -> "b")); + assertEquals("a", env.get(FOO)); } @Test public void testShouldWrap() { var env = new Environment(); - assertEquals(Environment.wrap(env), env); - assertNotEquals(Environment.wrap(null), null); + assertEquals(env, Environment.wrap(env)); + assertInstanceOf(Environment.class, Environment.wrap(null)); } } diff --git a/common/src/test/java/me/topchetoeu/j2s/common/TestLocation.java b/common/src/test/java/me/topchetoeu/j2s/common/TestLocation.java index af366ef..3de25cd 100644 --- a/common/src/test/java/me/topchetoeu/j2s/common/TestLocation.java +++ b/common/src/test/java/me/topchetoeu/j2s/common/TestLocation.java @@ -18,145 +18,145 @@ public class TestLocation { @Test public void testShouldGetNextLineLocation() { var loc = Location.of("test.txt:10:5"); var next = loc.nextLine(); - assertEquals(next.filename(), new Filename("file", "test.txt")); - assertEquals(next.line(), 10); - assertEquals(next.start(), 0); - assertEquals(loc.filename(), new Filename("file", "test.txt")); - assertEquals(loc.line(), 9); - assertEquals(loc.start(), 4); + assertEquals(new Filename("file", "test.txt"), next.filename()); + assertEquals(10, next.line()); + assertEquals(0, next.start()); + assertEquals(new Filename("file", "test.txt"), loc.filename()); + assertEquals(9, loc.line()); + assertEquals(4, loc.start()); } @Test public void testShouldGetNextNthLineLocation() { var loc = Location.of(new Filename("file", "test.txt"), 10, 5); var next = loc.nextLine(5); - assertEquals(next.line(), 15); - assertEquals(next.start(), 0); - assertEquals(loc.line(), 10); - assertEquals(loc.start(), 5); + assertEquals(15, next.line()); + assertEquals(0, next.start()); + assertEquals(10, loc.line()); + assertEquals(5, loc.start()); } @Test public void testShouldGetNextLocation() { var loc = Location.of("test:10:5"); var next = loc.add(10); - assertEquals(next.filename(), new Filename("file", "test")); - assertEquals(next.line(), 9); - assertEquals(next.start(), 14); - assertEquals(loc.filename(), new Filename("file", "test")); - assertEquals(loc.line(), 9); - assertEquals(loc.start(), 4); + assertEquals(new Filename("file", "test"), next.filename()); + assertEquals(9, next.line()); + assertEquals(14, next.start()); + assertEquals(new Filename("file", "test"), loc.filename()); + assertEquals(9, loc.line()); + assertEquals(4, loc.start()); } @Test public void testShouldParseLocation() { var loc = Location.of("test.txt:10:5"); - assertEquals(loc.filename(), new Filename("file", "test.txt")); - assertEquals(loc.line(), 9); - assertEquals(loc.start(), 4); + assertEquals(new Filename("file", "test.txt"), loc.filename()); + assertEquals(9, loc.line()); + assertEquals(4, loc.start()); } @Test public void testShouldParseComplexFilenameLocation() { var loc = Location.of("testificate://test.txt:10:5"); - assertEquals(loc.filename(), new Filename("testificate", "test.txt")); - assertEquals(loc.line(), 9); - assertEquals(loc.start(), 4); + assertEquals(new Filename("testificate", "test.txt"), loc.filename()); + assertEquals(9, loc.line()); + assertEquals(4, loc.start()); } @Test public void testShouldParseNoFilenameLocation() { var loc = Location.of("10:5"); - assertEquals(loc.filename(), null); - assertEquals(loc.line(), 9); - assertEquals(loc.start(), 4); + assertEquals(null, loc.filename()); + assertEquals(9, loc.line()); + assertEquals(4, loc.start()); } @Test public void testShouldParseNoStartLocationA() { var loc = Location.of("file://10:5"); - assertEquals(loc.filename(), new Filename("file", "10")); - assertEquals(loc.line(), 4); - assertEquals(loc.start(), -1); + assertEquals(new Filename("file", "10"), loc.filename()); + assertEquals(4, loc.line()); + assertEquals(-1, loc.start()); } @Test public void testShouldParseNoStartLocationB() { var loc = Location.of("file:5"); - assertEquals(loc.filename(), new Filename("file", "file")); - assertEquals(loc.line(), 4); - assertEquals(loc.start(), -1); + assertEquals(new Filename("file", "file"), loc.filename()); + assertEquals(4, loc.line()); + assertEquals(-1, loc.start()); } @Test public void testShouldParseOnlyFilenameLocationA() { var loc = Location.of("http://example.org/test.txt"); - assertEquals(loc.filename(), new Filename("http", "example.org/test.txt")); - assertEquals(loc.line(), -1); - assertEquals(loc.start(), -1); + assertEquals(new Filename("http", "example.org/test.txt"), loc.filename()); + assertEquals(-1, loc.line()); + assertEquals(-1, loc.start()); } @Test public void testShouldParseOnlyFilenameLocationB() { var loc = Location.of("test.txt"); - assertEquals(loc.filename(), new Filename("file", "test.txt")); - assertEquals(loc.line(), -1); - assertEquals(loc.start(), -1); + assertEquals(new Filename("file", "test.txt"), loc.filename()); + assertEquals(-1, loc.line()); + assertEquals(-1, loc.start()); } @Test public void testShouldParseOnlyFilenameWithColonLocation() { var loc = Location.of("my-file:bad-file"); - assertEquals(loc.filename(), new Filename("file", "my-file:bad-file")); - assertEquals(loc.line(), -1); - assertEquals(loc.start(), -1); + assertEquals(new Filename("file", "my-file:bad-file"), loc.filename()); + assertEquals(-1, loc.line()); + assertEquals(-1, loc.start()); } @Test public void testShouldParseOnlyFilenameWithTripleColonLocation() { var loc = Location.of("a:my-file:bad-file"); - assertEquals(loc.filename(), new Filename("file", "a:my-file:bad-file")); - assertEquals(loc.line(), -1); - assertEquals(loc.start(), -1); + assertEquals(new Filename("file", "a:my-file:bad-file"), loc.filename()); + assertEquals(-1, loc.line()); + assertEquals(-1, loc.start()); } @Test public void testCompareEqualLoc() { var locA = Location.of("test:10:5"); var locB = Location.of("test:10:5"); - assertEquals(locA.compareTo(locB), 0); - assertEquals(locB.compareTo(locA), 0); + assertEquals(0, locA.compareTo(locB)); + assertEquals(0, locB.compareTo(locA)); } @Test public void testCompareNoFileLoc() { var locA = Location.of("10:5"); var locB = Location.of("11:5"); - assertEquals(locA.compareTo(locB), -1); - assertEquals(locB.compareTo(locA), 1); + assertEquals(-1, locA.compareTo(locB)); + assertEquals(1, locB.compareTo(locA)); } @Test public void testCompareOneNoFileLoc() { var locA = Location.of("10:5"); var locB = Location.of("test:10:5"); - assertEquals(locA.compareTo(locB), -1); - assertEquals(locB.compareTo(locA), 1); + assertEquals(-1, locA.compareTo(locB)); + assertEquals(1, locB.compareTo(locA)); } @Test public void testCompareDiffFileLoc() { var locA = Location.of("a:10:5"); var locB = Location.of("b:10:5"); - assertEquals(locA.compareTo(locB), -1); - assertEquals(locB.compareTo(locA), 1); + assertEquals(-1, locA.compareTo(locB)); + assertEquals(1, locB.compareTo(locA)); } @Test public void testCompareDiffLineLoc() { var locA = Location.of("test:10:5"); var locB = Location.of("test:11:5"); - assertEquals(locA.compareTo(locB), -1); - assertEquals(locB.compareTo(locA), 1); + assertEquals(-1, locA.compareTo(locB)); + assertEquals(1, locB.compareTo(locA)); } @Test public void testCompareDiffStartLoc() { var locA = Location.of("test:10:5"); var locB = Location.of("test:10:10"); - assertEquals(locA.compareTo(locB), -1); - assertEquals(locB.compareTo(locA), 1); + assertEquals(-1, locA.compareTo(locB)); + assertEquals(1, locB.compareTo(locA)); } @Test public void testToStringAll() { var locA = Location.of("test:10:5"); - assertEquals(locA.toString(), "file://test:10:5"); + assertEquals("file://test:10:5", locA.toString()); } @Test public void testToStringNoFilename() { var locA = Location.of("10:5"); - assertEquals(locA.toString(), "10:5"); + assertEquals("10:5", locA.toString()); } @Test public void testToStringNoStart() { var locA = Location.of("file:5"); - assertEquals(locA.toString(), "file://file:5"); + assertEquals("file://file:5", locA.toString()); } @Test public void testToStringNoLoc() { var locA = Location.of("file"); - assertEquals(locA.toString(), "file://file"); + assertEquals("file://file", locA.toString()); } } diff --git a/common/src/test/java/me/topchetoeu/j2s/common/TestParseRes.java b/common/src/test/java/me/topchetoeu/j2s/common/TestParseRes.java new file mode 100644 index 0000000..a5ff158 --- /dev/null +++ b/common/src/test/java/me/topchetoeu/j2s/common/TestParseRes.java @@ -0,0 +1,98 @@ +package me.topchetoeu.j2s.common; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +import me.topchetoeu.j2s.common.parsing.Location; +import me.topchetoeu.j2s.common.parsing.ParseRes; + +public class TestParseRes { + @Test public void testCreateFailed() { + var res = ParseRes.failed(); + assertEquals(false, res.isSuccess()); + assertEquals(true, res.isFailed()); + assertEquals(false, res.isError()); + assertEquals(0, res.n); + assertEquals(null, res.result); + assertEquals(null, res.errorLocation); + assertEquals(null, res.error); + } + @Test public void testCreateError() { + var res = ParseRes.error(Location.of("test:10:5"), "test"); + assertEquals(false, res.isSuccess()); + assertEquals(false, res.isFailed()); + assertEquals(true, res.isError()); + assertEquals(0, res.n); + assertEquals(null, res.result); + assertEquals(Location.of("test:10:5"), res.errorLocation); + assertEquals("test", res.error); + } + @Test public void testCreateResult() { + var res = ParseRes.res("test", 10); + assertEquals(true, res.isSuccess()); + assertEquals(false, res.isFailed()); + assertEquals(false, res.isError()); + assertEquals(10, res.n); + assertEquals("test", res.result); + assertEquals(null, res.errorLocation); + assertEquals(null, res.error); + } + + @Test public void testChainFailed() { + var a = ParseRes.failed(); + + var b1 = a.chainError(); + assertEquals(a, b1); + + var b2 = a.chainError(Location.of("test:1:2"), "test"); + assertEquals(true, b2.isError()); + assertEquals("test", b2.error); + } + @Test public void testChainError() { + var a = ParseRes.error(Location.of("test:1:2"), "test"); + + var b1 = a.chainError(); + assertEquals(a, b1); + + var b2 = a.chainError(Location.of("test:1:2"), "test"); + assertEquals(a, b2); + } + @Test public void testChainResult() { + var a = ParseRes.res(10, 6); + + assertThrows(RuntimeException.class, () -> a.chainError()); + + var b1 = a.chainError(Location.of("test:1:2"), "test"); + assertEquals(true, b1.isError()); + assertEquals("test", b1.error); + } + + + @Test public void testShouldAdd5() { + var a = ParseRes.res("test", 6); + var b = a.addN(5); + + assertEquals(11, b.n); + } + @Test public void testShouldSet5() { + var a = ParseRes.res("test", 6); + var b = a.setN(5); + + assertEquals(5, b.n); + } + + @Test public void testShouldNotAdd() { + var a = ParseRes.failed(); + var b = a.addN(5); + + assertEquals(0, b.n); + } + @Test public void testShouldNotSet() { + var a = ParseRes.failed(); + var b = a.setN(5); + + assertEquals(0, b.n); + } +} diff --git a/common/src/test/java/me/topchetoeu/j2s/common/TestSource.java b/common/src/test/java/me/topchetoeu/j2s/common/TestSource.java new file mode 100644 index 0000000..b4112bf --- /dev/null +++ b/common/src/test/java/me/topchetoeu/j2s/common/TestSource.java @@ -0,0 +1,65 @@ +package me.topchetoeu.j2s.common; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +import me.topchetoeu.j2s.common.environment.Environment; +import me.topchetoeu.j2s.common.parsing.Filename; +import me.topchetoeu.j2s.common.parsing.Location; +import me.topchetoeu.j2s.common.parsing.Source; + +public class TestSource { + private Source mkSource(String src) { + return new Source(new Environment(), Filename.parse("test"), src); + } + + @Test public void testShouldCreate() { + new Source(new Environment(), Filename.parse("test"), "my little source :)"); + new Source(null, Filename.parse("test"), "my little source :)"); + new Source("my little source :)"); + } + + @Test public void testShouldGet() { + var src = mkSource("1234567890"); + assertEquals('1', src.at(0)); + assertEquals('6', src.at(5)); + } + @Test public void testShouldThrowOutOfRange() { + var src = mkSource("1234567890"); + assertThrows(IndexOutOfBoundsException.class, () -> src.at(-1)); + assertThrows(IndexOutOfBoundsException.class, () -> src.at(10)); + } + @Test public void testImmutableSrcLoc() { + var src = mkSource("1234567890"); + var loc = src.loc(5); + // kinda stupid + for (var i = 0; i < 1000; i++) { + assertEquals(5, loc.start()); + assertEquals(0, loc.line()); + assertEquals(Filename.parse("test"), loc.filename()); + } + } + @Test public void testSingleLineSourceLocation() { + var src = mkSource("1234567890"); + assertEquals(Location.of("test:1:1"), src.loc(-5)); + assertEquals(Location.of("test:1:1"), src.loc(0)); + assertEquals(Location.of("test:1:10"), src.loc(9)); + assertEquals(Location.of("test:1:11"), src.loc(14)); + } + @Test public void testMultilineSourceLocation() { + var src = mkSource("123\n456\n\n789\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assertEquals(Location.of("test:1:1"), src.loc(-5)); + assertEquals(Location.of("test:1:1"), src.loc(0)); + assertEquals(Location.of("test:1:4"), src.loc(3)); + assertEquals(Location.of("test:2:1"), src.loc(4)); + assertEquals(Location.of("test:2:4"), src.loc(7)); + assertEquals(Location.of("test:3:1"), src.loc(8)); + assertEquals(Location.of("test:4:1"), src.loc(9)); + assertEquals(Location.of("test:4:2"), src.loc(10)); + assertEquals(Location.of("test:4:4"), src.loc(12)); + assertEquals(Location.of("test:5:1"), src.loc(13)); + assertEquals(Location.of("test:19:1"), src.loc(50)); + } +}