diff --git a/lib/src/main/java/com/uwyn/urlencoder/UrlEncoder.java b/lib/src/main/java/com/uwyn/urlencoder/UrlEncoder.java index c5aff0a..984349f 100644 --- a/lib/src/main/java/com/uwyn/urlencoder/UrlEncoder.java +++ b/lib/src/main/java/com/uwyn/urlencoder/UrlEncoder.java @@ -214,27 +214,26 @@ public final class UrlEncoder { out = new StringBuilder(source.length()); out.append(source, 0, i); } - if (spaceToPlus && ch == ' ') { - out.append('+'); - i += 1; - } else { - var cp = source.codePointAt(i); - if (cp < 0x80) { + var cp = source.codePointAt(i); + if (cp < 0x80) { + if (spaceToPlus && ch == ' ') { + out.append('+'); + } else { appendUrlEncodedByte(out, cp); - i += 1; - } else if (Character.isBmpCodePoint(cp)) { - for (var b : Character.toString(ch).getBytes(StandardCharsets.UTF_8)) { - appendUrlEncodedByte(out, b); - } - i += 1; - } else if (Character.isSupplementaryCodePoint(cp)) { - var high = Character.highSurrogate(cp); - var low = Character.lowSurrogate(cp); - for (var b : new String(new char[]{high, low}).getBytes(StandardCharsets.UTF_8)) { - appendUrlEncodedByte(out, b); - } - i += 2; } + i += 1; + } else if (Character.isBmpCodePoint(cp)) { + for (var b : Character.toString(ch).getBytes(StandardCharsets.UTF_8)) { + appendUrlEncodedByte(out, b); + } + i += 1; + } else if (Character.isSupplementaryCodePoint(cp)) { + var high = Character.highSurrogate(cp); + var low = Character.lowSurrogate(cp); + for (var b : new String(new char[]{high, low}).getBytes(StandardCharsets.UTF_8)) { + appendUrlEncodedByte(out, b); + } + i += 2; } } } diff --git a/lib/src/test/java/com/uwyn/urlencoder/UrlEncoderTest.java b/lib/src/test/java/com/uwyn/urlencoder/UrlEncoderTest.java index 62e1db5..1a7d25d 100644 --- a/lib/src/test/java/com/uwyn/urlencoder/UrlEncoderTest.java +++ b/lib/src/test/java/com/uwyn/urlencoder/UrlEncoderTest.java @@ -104,7 +104,7 @@ class UrlEncoderTest { @ParameterizedTest(name = "processMain(-d {1}) should be {0}") @MethodSource("validMap") void testMainDecode(String expected, String source) { - var result = UrlEncoder.processMain(new String[]{"-d", source}); + var result = UrlEncoder.processMain("-d", source); assertEquals(expected, result.output); assertEquals(0, result.status, "processMain(-d " + source + ").status"); } @@ -112,7 +112,7 @@ class UrlEncoderTest { @ParameterizedTest(name = "processMain(-e {0})") @MethodSource("validMap") void testMainEncode(String source, String expected) { - var result = UrlEncoder.processMain(new String[]{source}); + var result = UrlEncoder.processMain(source); assertEquals(expected, result.output); assertEquals(0, result.status, "processMain(-e " + source + ").status"); } @@ -120,20 +120,20 @@ class UrlEncoderTest { @ParameterizedTest(name = "processMain(-d {0})") @MethodSource("invalid") void testMainEncodeWithExceptions(String source) { - assertThrows(IllegalArgumentException.class, () -> UrlEncoder.processMain(new String[]{"-d", source}), source); + assertThrows(IllegalArgumentException.class, () -> UrlEncoder.processMain("-d", source), source); } @Test void testMainTooManyArgs() { - assertTrue(UrlEncoder.processMain(new String[]{"foo", "bar", "test"}).output.contains("Usage :"), "too many args"); + assertTrue(UrlEncoder.processMain("foo", "bar", "test").output.contains("Usage :"), "too many args"); } @Test void testMainWithEmptyArgs() { - assertTrue(UrlEncoder.processMain(new String[]{" ", " "}).output.contains("Usage :"), "processMain(' ', ' ')"); - assertTrue(UrlEncoder.processMain(new String[]{"foo", " "}).output.contains("Usage :"), "processMain('foo', ' ')"); - assertTrue(UrlEncoder.processMain(new String[]{" ", "foo"}).output.contains("Usage :"), "processMain(' ', 'foo')"); - assertTrue(UrlEncoder.processMain(new String[]{"-d ", ""}).output.contains("Usage :"), "processMain('-d', '')"); + assertTrue(UrlEncoder.processMain(" ", " ").output.contains("Usage :"), "processMain(' ', ' ')"); + assertTrue(UrlEncoder.processMain("foo", " ").output.contains("Usage :"), "processMain('foo', ' ')"); + assertTrue(UrlEncoder.processMain(" ", "foo").output.contains("Usage :"), "processMain(' ', 'foo')"); + assertTrue(UrlEncoder.processMain("-d ", "").output.contains("Usage :"), "processMain('-d', '')"); assertEquals("%20", UrlEncoder.processMain(new String[]{"-e", " "}).output, "processMain('-e', ' ')"); assertEquals(" ", UrlEncoder.processMain(new String[]{"-d", " "}).output, "processMain('-d', ' ')"); } @@ -141,7 +141,7 @@ class UrlEncoderTest { @ParameterizedTest @ValueSource(strings = {"", "-d", "-e"}) void testMainWithInvalidArgs(String arg) { - var result = UrlEncoder.processMain(new String[]{arg}); + var result = UrlEncoder.processMain(arg); assertTrue(result.output.contains("Usage :"), "processMain('" + arg + "')"); assertEquals(1, result.status, "processMain('" + arg + "').status"); } @@ -149,14 +149,14 @@ class UrlEncoderTest { @ParameterizedTest(name = "processMain(-e {0})") @MethodSource("validMap") void testMainWithOption(String source, String expected) { - var result = UrlEncoder.processMain(new String[]{"-e", source}); + var result = UrlEncoder.processMain("-e", source); assertEquals(expected, result.output); assertEquals(0, result.status, "processMain(-e " + source + ").status"); } @Test void testMainWithUnknownOptions() { - assertTrue(UrlEncoder.processMain(new String[]{"-p"}).output.contains("Usage :"), "processMain(-p)"); - assertTrue(UrlEncoder.processMain(new String[]{"-"}).output.contains("Usage :"), "processMain(-)"); + assertTrue(UrlEncoder.processMain("-p").output.contains("Usage :"), "processMain(-p)"); + assertTrue(UrlEncoder.processMain("-").output.contains("Usage :"), "processMain(-)"); } } \ No newline at end of file