1d627b357c2a63b003869de40221c02b04d0eb663Julien Massenetpackage com.beust.jcommander.internal;
2d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet
3d627b357c2a63b003869de40221c02b04d0eb663Julien Massenetimport java.io.IOException;
4d627b357c2a63b003869de40221c02b04d0eb663Julien Massenetimport java.io.InputStream;
5d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet
6d627b357c2a63b003869de40221c02b04d0eb663Julien Massenetimport org.testng.Assert;
7d627b357c2a63b003869de40221c02b04d0eb663Julien Massenetimport org.testng.annotations.Test;
8d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet
9d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet@Test
10d627b357c2a63b003869de40221c02b04d0eb663Julien Massenetpublic class DefaultConsoleTest {
11d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet  public void readPasswordCanBeCalledMultipleTimes() {
12d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    final InputStream inBackup = System.in;
13d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    try {
14d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      final StringInputStream in = new StringInputStream();
15d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      System.setIn(in);
16d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      final Console console = new DefaultConsole();
17d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet
18d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      in.setData("password1\n");
19d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      char[] password = console.readPassword(false);
20d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      Assert.assertEquals(password, "password1".toCharArray());
21d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      Assert.assertFalse(in.isClosedCalled(), "System.in stream shouldn't be closed");
22d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet
23d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      in.setData("password2\n");
24d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      password = console.readPassword(false);
25d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      Assert.assertEquals(password, "password2".toCharArray());
26d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      Assert.assertFalse(in.isClosedCalled(), "System.in stream shouldn't be closed");
27d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    } finally {
28d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      System.setIn(inBackup);
29d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    }
30d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet  }
31d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet
32d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet  private static class StringInputStream extends InputStream {
33d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    private byte[] data = new byte[0];
34d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    private int offset = 0;
35d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    private boolean closedCalled;
36d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet
37d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    StringInputStream() {
38d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      super();
39d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    }
40d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet
41d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    void setData(final String strData) {
42d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      data = strData.getBytes();
43d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      offset = 0;
44d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    }
45d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet
46d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    boolean isClosedCalled() {
47d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      return closedCalled;
48d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    }
49d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet
50d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    @Override
51d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    public int read() throws IOException {
52d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      if (offset >= data.length) {
53d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet        return -1;
54d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      }
55d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      return 0xFFFF & data[offset++];
56d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    }
57d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet
58d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    @Override
59d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    public void close() throws IOException {
60d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      closedCalled = true;
61d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet      super.close();
62d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet    }
63d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet  }
64d627b357c2a63b003869de40221c02b04d0eb663Julien Massenet}
65