13c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller/*
23c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * Copyright (C) 2014 Square, Inc.
33c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller *
43c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * Licensed under the Apache License, Version 2.0 (the "License");
53c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * you may not use this file except in compliance with the License.
63c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * You may obtain a copy of the License at
73c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller *
83c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller *      http://www.apache.org/licenses/LICENSE-2.0
93c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller *
103c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * Unless required by applicable law or agreed to in writing, software
113c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * distributed under the License is distributed on an "AS IS" BASIS,
123c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * See the License for the specific language governing permissions and
143c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * limitations under the License.
153c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller */
163c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerpackage okio;
173c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
183c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.io.EOFException;
193c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.io.IOException;
203c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport org.junit.Test;
213c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
223c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport static org.junit.Assert.assertEquals;
233c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport static org.junit.Assert.assertTrue;
243c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport static org.junit.Assert.fail;
253c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
263c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerpublic abstract class ReadUtf8LineTest {
273c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  protected abstract BufferedSource newSource(String s);
283c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
293c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  @Test public void readLines() throws IOException {
303c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    BufferedSource source = newSource("abc\ndef\n");
31c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("abc", source.readUtf8LineStrict());
32c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("def", source.readUtf8LineStrict());
333c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    try {
34c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller      source.readUtf8LineStrict();
353c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller      fail();
363c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    } catch (EOFException expected) {
373c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    }
383c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
393c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
403c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  @Test public void emptyLines() throws IOException {
413c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    BufferedSource source = newSource("\n\n\n");
42c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("", source.readUtf8LineStrict());
43c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("", source.readUtf8LineStrict());
44c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("", source.readUtf8LineStrict());
453c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertTrue(source.exhausted());
463c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
473c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
483c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  @Test public void crDroppedPrecedingLf() throws IOException {
493c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    BufferedSource source = newSource("abc\r\ndef\r\nghi\rjkl\r\n");
50c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("abc", source.readUtf8LineStrict());
51c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("def", source.readUtf8LineStrict());
52c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("ghi\rjkl", source.readUtf8LineStrict());
533c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
543c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
553c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  @Test public void bufferedReaderCompatible() throws IOException {
563c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    BufferedSource source = newSource("abc\ndef");
57c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("abc", source.readUtf8Line());
58c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("def", source.readUtf8Line());
59c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals(null, source.readUtf8Line());
603c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
613c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
623c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  @Test public void bufferedReaderCompatibleWithTrailingNewline() throws IOException {
633c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    BufferedSource source = newSource("abc\ndef\n");
64c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("abc", source.readUtf8Line());
65c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals("def", source.readUtf8Line());
66c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals(null, source.readUtf8Line());
673c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
683c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller}
69