package io.termd.core.readline; import org.junit.Assert; import org.junit.Test; import java.io.UnsupportedEncodingException; import java.util.LinkedList; import static org.junit.Assert.assertTrue; /** * @author <a href="mailto:julien@julienviet.com">Julien Viet</a> */ public class InputrcTest { static class FailingParser extends InputrcParser { @Override public void bindMacro(String keyName, String macro) { throw new AssertionError(); } @Override public void bindFunction(String keyName, String functionName) { throw new AssertionError(); } @Override public void bindMacro(int[] keySequence, String macro) { throw new AssertionError(); } @Override public void bindFunction(int[] keySequence, String functionName) { throw new AssertionError(); } } static class AssertingParser extends InputrcParser { @Override public void bindMacro(String keyName, String macro) { nextParser().bindMacro(keyName, macro); } @Override public void bindFunction(String keyName, String functionName) { nextParser().bindFunction(keyName, functionName); } @Override public void bindMacro(int[] keySequence, String macro) { nextParser().bindMacro(keySequence, macro); } @Override public void bindFunction(int[] keySequence, String functionName) { nextParser().bindFunction(keySequence, functionName); } private FailingParser nextParser() { assertTrue(asserts.size() > 0); return asserts.removeFirst(); } final LinkedList<FailingParser> asserts = new LinkedList<>(); void parse(String s) throws UnsupportedEncodingException { InputrcParser.parse(s, this); } AssertingParser append(FailingParser next) { asserts.add(next); return this; } AssertingParser assertBindMacro(final String keyName, final String macro) { return append(new FailingParser() { @Override public void bindMacro(String k, String m) { Assert.assertEquals(k, keyName); Assert.assertEquals(m, macro); } }); } AssertingParser assertBindMacro(final int[] keyName, final String macro) { return append(new FailingParser() { @Override public void bindMacro(int[] k, String m) { Assert.assertArrayEquals(k, keyName); Assert.assertEquals(m, macro); } }); } AssertingParser assertBindFunction(final String keyName, final String macro) { return append (new FailingParser() { @Override public void bindFunction(String k, String m) { Assert.assertEquals(k, keyName); Assert.assertEquals(m, macro); } }); } AssertingParser assertBindFunction(final int[] keySequence, final String macro) { return append(new FailingParser() { @Override public void bindFunction(int[] k, String m) { Assert.assertArrayEquals(k, keySequence); Assert.assertEquals(m, macro); } }); } } @Test public void testFoo() throws UnsupportedEncodingException { new AssertingParser() {}.assertBindFunction("a", "b").parse("a:b"); new AssertingParser() {}.assertBindMacro("a", "b").parse("a:\"b\""); new AssertingParser() {}.assertBindMacro("a", "b").parse("a:'b'"); new AssertingParser() {}.assertBindFunction(new int[]{64}, "b").parse("\"@\":b"); new AssertingParser() {}.assertBindFunction(new int[]{0}, "b").parse("\"\\C-@\":b"); new AssertingParser() {}.assertBindFunction(new int[]{8}, "b").parse("\"\\C-H\":b"); new AssertingParser() {}.assertBindFunction(new int[]{8}, "b").parse("\"\\C-h\":b"); new AssertingParser() {}.assertBindFunction(new int[]{127}, "b").parse("\"\\C-?\":b"); new AssertingParser() {}.assertBindFunction(new int[]{27,0}, "b").parse("\"\\M-@\":b"); new AssertingParser() {}.assertBindFunction(new int[]{27,8}, "b").parse("\"\\M-H\":b"); new AssertingParser() {}.assertBindFunction(new int[]{27,8}, "b").parse("\"\\M-h\":b"); new AssertingParser() {}.assertBindFunction(new int[]{27,127}, "b").parse("\"\\M-?\":b"); new AssertingParser() {}.assertBindFunction(new int[]{27}, "b").parse("\"\\e\":b"); new AssertingParser() {}.assertBindFunction(new int[]{92}, "b").parse("\"\\\\\":b"); new AssertingParser() {}.assertBindFunction(new int[]{34}, "b").parse("\"\\\"\":b"); new AssertingParser() {}.assertBindFunction(new int[]{39}, "b").parse("\"\\'\":b"); new AssertingParser() {}.assertBindFunction(new int[]{7}, "b").parse("\"\\a\":b"); new AssertingParser() {}.assertBindFunction(new int[]{127}, "b").parse("\"\\d\":b"); new AssertingParser() {}.assertBindFunction(new int[]{12}, "b").parse("\"\\f\":b"); new AssertingParser() {}.assertBindFunction(new int[]{10}, "b").parse("\"\\n\":b"); new AssertingParser() {}.assertBindFunction(new int[]{13}, "b").parse("\"\\r\":b"); new AssertingParser() {}.assertBindFunction(new int[]{9}, "b").parse("\"\\t\":b"); new AssertingParser() {}.assertBindFunction(new int[]{11}, "b").parse("\"\\v\":b"); new AssertingParser() {}.assertBindFunction(new int[]{0}, "b").parse("\"\\0\":b"); new AssertingParser() {}.assertBindFunction(new int[]{0}, "b").parse("\"\\00\":b"); new AssertingParser() {}.assertBindFunction(new int[]{0}, "b").parse("\"\\000\":b"); new AssertingParser() {}.assertBindFunction(new int[]{255}, "b").parse("\"\\377\":b"); new AssertingParser() {}.assertBindFunction(new int[]{0}, "b").parse("\"\\x0\":b"); new AssertingParser() {}.assertBindFunction(new int[]{255}, "b").parse("\"\\xFF\":b"); new AssertingParser() {}.assertBindFunction(new int[]{255}, "b").parse("\"\\xff\":b"); // Bind \ to \ new AssertingParser() {}.assertBindFunction(new int[]{27,'/'}, "\\").parse("\"\\e/\":\\"); /* InputrcParser.parse("#azefzef"); InputrcParser.parse("$abc"); InputrcParser.parse("set foo bar "); InputrcParser.parse("a:b"); InputrcParser.parse("a: b"); InputrcParser.parse("\"a\":b"); InputrcParser.parse("\"a\": b"); InputrcParser.parse("\"a\": 'b'"); InputrcParser.parse("\"a\": \"b\""); */ } }