Reworked main method for testability.

This commit is contained in:
Geert Bevin 2023-01-01 03:27:11 -05:00
parent 0f12ed90cc
commit f3c7853d02
2 changed files with 90 additions and 15 deletions

View file

@ -67,7 +67,7 @@ public final class UrlEncoder {
byte[] bytes_buffer = null;
var bytes_pos = 0;
var i = 0;
while(i < length) {
while (i < length) {
ch = source.charAt(i);
if (ch == '%') {
@ -137,7 +137,7 @@ public final class UrlEncoder {
* @since 1.0
*/
public static String encode(String source) {
return encode(source, (String)null);
return encode(source, (String) null);
}
/**
@ -174,7 +174,7 @@ public final class UrlEncoder {
StringBuilder out = null;
char ch;
var i = 0;
while(i < source.length()) {
while (i < source.length()) {
ch = source.charAt(i);
if (isUnreservedUriChar(ch) || (allow != null && allow.indexOf(ch) != -1)) {
if (out != null) {
@ -219,7 +219,17 @@ public final class UrlEncoder {
return ch <= '~' && UNRESERVED_URI_CHARS.get(ch);
}
public static void main(String[] arguments) {
static class MainResult {
final String output;
final int status;
public MainResult(String output, int status) {
this.output = output;
this.status = status;
}
}
static MainResult handleMain(String[] arguments) {
var valid_arguments = true;
if (arguments.length < 1 ||
arguments.length > 2) {
@ -236,22 +246,32 @@ public final class UrlEncoder {
}
if (!valid_arguments) {
System.err.println("Usage : java " + UrlEncoder.class.getName() + " [-ed] text");
System.err.println("Encode and decode URL parameters.");
System.err.println(" -e encode (default)");
System.err.println(" -d decode");
System.exit(1);
return new MainResult("Usage : java " + UrlEncoder.class.getName() + " [-ed] text" + System.lineSeparator() +
"Encode and decode URL parameters." + System.lineSeparator() +
" -e encode (default)" + System.lineSeparator() +
" -d decode" + System.lineSeparator(), 1);
}
if (1 == arguments.length) {
System.out.println(UrlEncoder.encode(arguments[0]));
System.exit(0);
return new MainResult(UrlEncoder.encode(arguments[0]), 0);
} else if (arguments[0].equals("-e")) {
System.out.println(UrlEncoder.encode(arguments[1]));
System.exit(0);
return new MainResult(UrlEncoder.encode(arguments[1]), 0);
}
System.out.println(UrlEncoder.decode(arguments[1]));
System.exit(0);
return new MainResult(UrlEncoder.decode(arguments[1]), 0);
}
public static void main(String[] arguments) {
var result = handleMain(arguments);
switch (result.status) {
case 0: {
System.out.println(result.output);
System.exit(0);
}
case 1: {
System.err.println(result.output);
System.exit(1);
}
}
}
}

View file

@ -43,4 +43,59 @@ class UrlEncoderTest {
assertEquals("?test=a%20test", UrlEncoder.encode("?test=a test", '?', '='));
assertEquals("aaa", UrlEncoder.encode("aaa", 'a'));
}
@Test
void testMainNoArgs() {
var result = UrlEncoder.handleMain(new String[0]);
assertEquals(1, result.status);
assertTrue(result.output.contains(UrlEncoder.class.getName()));
}
@Test
void testMainTooManyArgs() {
var result = UrlEncoder.handleMain(new String[] {"-x", "-g", "f"});
assertEquals(1, result.status);
assertTrue(result.output.contains(UrlEncoder.class.getName()));
}
@Test
void testMainWrongArgs2() {
var result = UrlEncoder.handleMain(new String[] {"-x", "txt"});
assertEquals(1, result.status);
assertTrue(result.output.contains(UrlEncoder.class.getName()));
}
@Test
void testMainWrongArgs1() {
var result = UrlEncoder.handleMain(new String[] {"-p"});
assertEquals(1, result.status);
assertTrue(result.output.contains(UrlEncoder.class.getName()));
}
@Test
void testDecodeMainOption() {
validMap.forEach((expected, source) -> {
var result = UrlEncoder.handleMain(new String[] {"-d", source});
assertEquals(0, result.status);
assertEquals(expected, result.output);
});
}
@Test
void testEncodeMainDefault() {
validMap.forEach((source, expected) -> {
var result = UrlEncoder.handleMain(new String[] {source});
assertEquals(0, result.status);
assertEquals(expected, result.output);
});
}
@Test
void testEncodeMainOption() {
validMap.forEach((source, expected) -> {
var result = UrlEncoder.handleMain(new String[] {"-e", source});
assertEquals(0, result.status);
assertEquals(expected, result.output);
});
}
}