diff --git a/src/main/java/kmql/CommandRegistry.java b/src/main/java/kmql/CommandRegistry.java index 5abf732..3628d2a 100644 --- a/src/main/java/kmql/CommandRegistry.java +++ b/src/main/java/kmql/CommandRegistry.java @@ -7,6 +7,7 @@ import java.util.concurrent.ConcurrentMap; import kmql.command.ExpireCommand; +import kmql.command.FormatCommand; import kmql.command.HelpCommand; /** @@ -18,6 +19,7 @@ public class CommandRegistry implements Iterable> { static { registerDefault("help", new HelpCommand()); registerDefault("expire", new ExpireCommand()); + registerDefault("format", new FormatCommand()); } private final ConcurrentMap commands; diff --git a/src/main/java/kmql/command/FormatCommand.java b/src/main/java/kmql/command/FormatCommand.java new file mode 100644 index 0000000..0addec1 --- /dev/null +++ b/src/main/java/kmql/command/FormatCommand.java @@ -0,0 +1,38 @@ +package kmql.command; + +import java.io.BufferedOutputStream; +import java.io.PrintWriter; +import java.util.List; + +import kmql.Command; +import kmql.Engine; + +/** + * Expire table caches. + */ +public class FormatCommand implements Command { + @Override + public String help() { + return ":format FORMAT - Set output format"; + } + + @Override + public void execute(List args, Engine engine, BufferedOutputStream output) { + PrintWriter pw = new PrintWriter(output); + try { + if (args.size() != 1) { + pw.println("Error usage: :format FORMAT"); + return; + } + String format = args.get(0); + try { + engine.setOutputFormat(format); + pw.printf("Output format set to '%s'\n", format); + } catch (IllegalArgumentException ignored) { + pw.printf("Error: no such format '%s'\n", format); + } + } finally { + pw.flush(); + } + } +} diff --git a/src/test/java/kmql/command/FormatCommandTest.java b/src/test/java/kmql/command/FormatCommandTest.java new file mode 100644 index 0000000..4adc45a --- /dev/null +++ b/src/test/java/kmql/command/FormatCommandTest.java @@ -0,0 +1,54 @@ +package kmql.command; + +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import java.io.BufferedOutputStream; +import java.sql.SQLException; +import java.util.Arrays; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import kmql.Database; +import kmql.Engine; + +public class FormatCommandTest { + @Rule + public MockitoRule rule = MockitoJUnit.rule(); + @Mock + private Database db; + @Mock + private Engine engine; + private final FormatCommand cmd = new FormatCommand(); + + @Before + public void setUp() { + doReturn(db).when(engine).db(); + } + + @Test + public void execute() throws SQLException { + cmd.execute(singletonList("json"), engine, mock(BufferedOutputStream.class)); + + verify(engine, times(1)).setOutputFormat("json"); + } + + @Test + public void executeInvalidArgs() throws SQLException { + cmd.execute(emptyList(), engine, mock(BufferedOutputStream.class)); + cmd.execute(Arrays.asList("json", "table"), engine, mock(BufferedOutputStream.class)); + + verify(engine, never()).setOutputFormat(any(String.class)); + } +}