/* Copyright 2017 Google Inc. All Rights Reserved.

   Distributed under MIT license.
   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/

package org.brotli.wrapper.dec;

import static org.junit.Assert.assertEquals;

import org.brotli.integration.BrotliJniTestBase;
import java.io.IOException;
import java.io.InputStream;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/** Tests for {@link org.brotli.wrapper.dec.BrotliInputStream}. */
@RunWith(JUnit4.class)
public class EagerStreamTest extends BrotliJniTestBase {

  @Test
  public void testEagerReading() throws IOException {
    final StringBuilder log = new StringBuilder();
    final byte[] data = {0, 0, 16, 42, 3};
    InputStream source = new InputStream() {
      int index;

      @Override
      public int read() {
        if (index < data.length) {
          log.append("<").append(index);
          return data[index++];
        } else {
          log.append("<#");
          return -1;
        }
      }

      @Override
      public int read(byte[] b) throws IOException {
        return read(b, 0, b.length);
      }

      @Override
      public int read(byte[] b, int off, int len) throws IOException {
        if (len < 1) {
          return 0;
        }
        int d = read();
        if (d == -1) {
          return 0;
        }
        b[off] = (byte) d;
        return 1;
      }
    };
    BrotliInputStream reader = new BrotliInputStream(source);
    reader.enableEagerOutput();
    int count = 0;
    while (true) {
      log.append("^").append(count);
      int b = reader.read();
      if (b == -1) {
        log.append(">#");
        break;
      } else {
        log.append(">").append(count++);
      }
    }
    // Lazy log:  ^0<0<1<2<3<4>0^1>#
    assertEquals("^0<0<1<2<3>0^1<4>#", log.toString());
  }

}
