18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (C) 2013, Opera Software ASA. All rights reserved.
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Redistribution and use in source and binary forms, with or without
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * modification, are permitted provided that the following conditions are
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * met:
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *     * Redistributions of source code must retain the above copyright
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * notice, this list of conditions and the following disclaimer.
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *     * Redistributions in binary form must reproduce the above
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * copyright notice, this list of conditions and the following disclaimer
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * in the documentation and/or other materials provided with the
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * distribution.
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *     * Neither the name of Google Inc. nor the names of its
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * contributors may be used to endorse or promote products derived from
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * this software without specific prior written permission.
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt */
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "config.h"
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "core/html/track/vtt/BufferedLineReader.h"
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wtf/text/CString.h"
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wtf/text/WTFString.h"
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wtf/unicode/CharacterNames.h"
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <gtest/gtest.h>
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing blink::BufferedLineReader;
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace {
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, Constructor)
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    BufferedLineReader reader;
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_FALSE(reader.isAtEndOfStream());
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    String line;
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_FALSE(reader.getLine(line));
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, EOSNoInput)
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    BufferedLineReader reader;
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    String line;
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_FALSE(reader.getLine(line));
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.setEndOfStream();
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // No input observed, so still no line.
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_FALSE(reader.getLine(line));
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, EOSInput)
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    BufferedLineReader reader;
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.append("A");
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.setEndOfStream();
67c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt    String line;
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "A");
70c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
71c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, EOSMultipleReads_1)
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    BufferedLineReader reader;
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.append("A");
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.setEndOfStream();
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    String line;
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "A");
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // No more lines returned.
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_FALSE(reader.getLine(line));
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_FALSE(reader.getLine(line));
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtTEST(BufferedLineReader, EOSMultipleReads_2)
86c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    BufferedLineReader reader;
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.append("A\n");
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.setEndOfStream();
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    String line;
9161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "A");
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // No more lines returned.
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_FALSE(reader.getLine(line));
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_FALSE(reader.getLine(line));
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingCR)
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    BufferedLineReader reader;
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.append("X\rY");
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.setEndOfStream();
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    String line;
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "X");
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "Y");
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingCR_EOS)
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    BufferedLineReader reader;
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.append("X\r");
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.setEndOfStream();
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    String line;
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "X");
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_FALSE(reader.getLine(line));
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingLF)
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    BufferedLineReader reader;
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.append("X\nY");
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.setEndOfStream();
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    String line;
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "X");
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "Y");
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingLF_EOS)
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    BufferedLineReader reader;
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.append("X\n");
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.setEndOfStream();
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    String line;
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "X");
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_FALSE(reader.getLine(line));
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingCRLF)
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    BufferedLineReader reader;
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.append("X\r\nY");
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.setEndOfStream();
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    String line;
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "X");
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "Y");
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingCRLF_EOS)
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    BufferedLineReader reader;
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.append("X\r\n");
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    reader.setEndOfStream();
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    String line;
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_TRUE(reader.getLine(line));
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_EQ(line, "X");
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASSERT_FALSE(reader.getLine(line));
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum LineBreakType {
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Cr,
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Lf,
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    CrLf
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtString LineBreakString(LineBreakType type)
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    static const char breakStrings[] = "\r\n";
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return String(type == Lf ? breakStrings + 1 : breakStrings, type == CrLf ? 2 : 1);
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtString MakeTestData(const char** lines, const LineBreakType* breaks, int count)
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    StringBuilder builder;
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    for (int i = 0; i < count; ++i) {
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        builder.append(lines[i]);
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        builder.append(LineBreakString(breaks[i]));
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    }
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return builder.toString();
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst size_t blockSizes[] = { 64, 32, 16, 8, 4, 2, 1, 3, 5, 7, 9, 11, 13, 17, 19, 23 };
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, BufferSizes)
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const char* lines[] = {
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "aaaaaaaaaaaaaaaa",
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "bbbbbbbbbb",
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "ccccccccccccc",
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "",
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "dddddd",
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "",
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "eeeeeeeeee"
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    };
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const LineBreakType breaks[] = { Lf, Lf, Lf, Lf, Lf, Lf, Lf };
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const size_t numTestLines = WTF_ARRAY_LENGTH(lines);
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    COMPILE_ASSERT(numTestLines == WTF_ARRAY_LENGTH(breaks), DifferentLengths_lines_and_breaks);
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    String data = MakeTestData(lines, breaks, numTestLines);
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    for (size_t k = 0; k < WTF_ARRAY_LENGTH(blockSizes); ++k) {
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        size_t lineCount = 0;
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        BufferedLineReader reader;
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        size_t blockSize = blockSizes[k];
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        for (size_t i = 0; i < data.length(); i += blockSize) {
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt            reader.append(data.substring(i, blockSize));
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt            String line;
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt            while (reader.getLine(line)) {
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                ASSERT_LT(lineCount, numTestLines);
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                ASSERT_EQ(line, lines[lineCount++]);
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt            }
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        }
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        ASSERT_EQ(lineCount, numTestLines);
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    }
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, BufferSizesMixedEndings)
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const char* lines[] = {
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "aaaaaaaaaaaaaaaa",
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "bbbbbbbbbb",
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "ccccccccccccc",
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "",
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "dddddd",
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "eeeeeeeeee",
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        "fffffffffffffffffff"
234    };
235    const LineBreakType breaks[] = { Cr, Lf, CrLf, Cr, Lf, CrLf, Lf };
236    const size_t numTestLines = WTF_ARRAY_LENGTH(lines);
237    COMPILE_ASSERT(numTestLines == WTF_ARRAY_LENGTH(breaks), DifferentLengths_lines_and_breaks);
238    String data = MakeTestData(lines, breaks, numTestLines);
239
240    for (size_t k = 0; k < WTF_ARRAY_LENGTH(blockSizes); ++k) {
241        size_t lineCount = 0;
242        BufferedLineReader reader;
243        size_t blockSize = blockSizes[k];
244        for (size_t i = 0; i < data.length(); i += blockSize) {
245            reader.append(data.substring(i, blockSize));
246
247            String line;
248            while (reader.getLine(line)) {
249                ASSERT_LT(lineCount, numTestLines);
250                ASSERT_EQ(line, lines[lineCount++]);
251            }
252        }
253        ASSERT_EQ(lineCount, numTestLines);
254    }
255}
256
257TEST(BufferedLineReader, BufferBoundaryInCRLF_1)
258{
259    BufferedLineReader reader;
260    reader.append("X\r");
261    String line;
262    ASSERT_TRUE(reader.getLine(line));
263    ASSERT_EQ(line, "X");
264    reader.append("\n");
265    ASSERT_FALSE(reader.getLine(line));
266}
267
268TEST(BufferedLineReader, BufferBoundaryInCRLF_2)
269{
270    BufferedLineReader reader;
271    reader.append("X\r");
272    String line;
273    ASSERT_TRUE(reader.getLine(line));
274    ASSERT_EQ(line, "X");
275    ASSERT_FALSE(reader.getLine(line));
276    reader.append("\n");
277    ASSERT_FALSE(reader.getLine(line));
278    reader.append("Y\n");
279    ASSERT_TRUE(reader.getLine(line));
280    ASSERT_EQ(line, "Y");
281}
282
283TEST(BufferedLineReader, NormalizedNUL)
284{
285    BufferedLineReader reader;
286    reader.append(String("X\0Y\n", 4));
287    String line;
288    ASSERT_TRUE(reader.getLine(line));
289    ASSERT_EQ(line[1], WTF::Unicode::replacementCharacter);
290}
291
292} // namespace
293