// Copyright 2017-2020 The Verible Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "common/strings/patch.h"

#include <cstddef>
#include <initializer_list>
#include <sstream>
#include <string>
#include <utility>
#include <vector>

#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/match.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_join.h"
#include "absl/strings/string_view.h"
#include "common/strings/position.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"

namespace verible {

using ::testing::ElementsAre;
using ::testing::ElementsAreArray;

namespace internal {
namespace {

static std::vector<MarkedLine> MakeMarkedLines(
    const std::vector<absl::string_view> &lines) {
  std::vector<MarkedLine> result;
  result.reserve(lines.size());
  for (const auto &line : lines) {
    result.emplace_back(line);
  }
  return result;
}

TEST(MarkedLineConstructionTest, BadLine) {
  EXPECT_DEATH(MarkedLine(""), "must start with a marker");
  EXPECT_DEATH(MarkedLine("?"), "Unexpected marker '?'");
}

TEST(MarkedLineEquality, EqualityTests) {
  EXPECT_NE(MarkedLine(" "), MarkedLine("+"));
  EXPECT_NE(MarkedLine(" "), MarkedLine("-"));
  EXPECT_EQ(MarkedLine(" "), MarkedLine(" "));
  EXPECT_NE(MarkedLine(" "), MarkedLine("  "));
  EXPECT_NE(MarkedLine(" 1"), MarkedLine(" 2"));
}

TEST(MarkedLineParseTest, InvalidInputs) {
  constexpr absl::string_view kTestCases[] = {
      "", "x", "x213", "abc", "diff", "====",
  };
  for (const auto &test : kTestCases) {
    MarkedLine m;
    EXPECT_FALSE(m.Parse(test).ok()) << " input: \"" << test << '"';
  }
}

struct MarkedLineTestCase {
  absl::string_view input;
  char expected_mark;
  absl::string_view expected_text;
};

TEST(MarkedLineParseTest, ValidInputs) {
  constexpr MarkedLineTestCase kTestCases[] = {
      {" ", ' ', ""},         {" x", ' ', "x"},       {" x213", ' ', "x213"},
      {"  abc", ' ', " abc"}, {"-abc", '-', "abc"},   {"+abc", '+', "abc"},
      {"- abc", '-', " abc"}, {"+ abc", '+', " abc"}, {"---", '-', "--"},
      {"+++", '+', "++"},     {"-", '-', ""},         {"+", '+', ""},
  };
  for (const auto &test : kTestCases) {
    MarkedLine m;
    EXPECT_TRUE(m.Parse(test.input).ok()) << " input: \"" << test.input << '"';
    EXPECT_EQ(m.Marker(), test.expected_mark);
    EXPECT_EQ(m.Text(), test.expected_text);
  }
}

TEST(MarkedLinePrintTest, Print) {
  constexpr absl::string_view kTestCases[] = {
      " ", "+", "-", " 1 2 3", "-xyz", "+\tabc",
  };
  for (const auto &test : kTestCases) {
    MarkedLine m;
    const auto status = m.Parse(test);
    ASSERT_TRUE(status.ok()) << status.message();
    std::ostringstream stream;
    stream << m;
    EXPECT_EQ(stream.str(), test);
  }
}

TEST(HunkIndicesEqualityTest, Comparisons) {
  EXPECT_EQ((HunkIndices{1, 2}), (HunkIndices{1, 2}));
  EXPECT_NE((HunkIndices{1, 1}), (HunkIndices{1, 2}));
  EXPECT_NE((HunkIndices{1, 2}), (HunkIndices{1, 1}));
  EXPECT_NE((HunkIndices{1, 2}), (HunkIndices{2, 2}));
  EXPECT_NE((HunkIndices{3, 2}), (HunkIndices{1, 2}));
}

TEST(HunkIndicesParseTest, InvalidInputs) {
  constexpr absl::string_view kTestCases[] = {
      "", ",", "4,", ",5", "2,b", "x,2", "4,5,", "1,2,3",
  };
  for (const auto &test : kTestCases) {
    HunkIndices h;
    EXPECT_FALSE(h.Parse(test).ok()) << " input: \"" << test << '"';
  }
}

struct HunkIndicesTestCase {
  absl::string_view input;
  int expected_start;
  int expected_count;
};

TEST(HunkIndicesParseAndPrintTest, ValidInputs) {
  constexpr HunkIndicesTestCase kTestCases[] = {
      {"1,1", 1, 1},
      {"14,92", 14, 92},
  };
  for (const auto &test : kTestCases) {
    HunkIndices h;
    EXPECT_TRUE(h.Parse(test.input).ok()) << " input: \"" << test.input << '"';
    EXPECT_EQ(h.start, test.expected_start);
    EXPECT_EQ(h.count, test.expected_count);

    // Use same data to test printing
    std::ostringstream stream;
    stream << h;
    EXPECT_EQ(stream.str(), test.input);
  }
}

TEST(HunkHeaderEqualityTest, Comparisons) {
  EXPECT_EQ((HunkHeader{{1, 2}, {3, 4}, ""}), (HunkHeader{{1, 2}, {3, 4}, ""}));
  EXPECT_NE((HunkHeader{{1, 2}, {3, 4}, ""}), (HunkHeader{{2, 2}, {3, 4}, ""}));
  EXPECT_NE((HunkHeader{{1, 2}, {3, 4}, ""}), (HunkHeader{{1, 1}, {3, 4}, ""}));
  EXPECT_NE((HunkHeader{{1, 2}, {3, 4}, ""}), (HunkHeader{{1, 2}, {1, 4}, ""}));
  EXPECT_NE((HunkHeader{{1, 2}, {3, 4}, ""}), (HunkHeader{{1, 2}, {3, 5}, ""}));
  EXPECT_NE((HunkHeader{{1, 2}, {3, 4}, ""}),
            (HunkHeader{{1, 2}, {3, 4}, " "}));
}

TEST(HunkHeaderParseTest, InvalidInputs) {
  // If any one character is deleted from this example, it becomes invalid.
  constexpr absl::string_view kValidText = "@@ -4,8 +5,6 @@";

  for (size_t i = 0; i < kValidText.length(); ++i) {
    std::string deleted(kValidText);
    deleted.erase(i);
    HunkHeader h;
    EXPECT_FALSE(h.Parse(deleted).ok()) << " input: \"" << deleted << '"';
  }

  for (size_t i = 0; i < kValidText.length(); ++i) {
    absl::string_view deleted(kValidText.substr(0, i));
    HunkHeader h;
    EXPECT_FALSE(h.Parse(deleted).ok()) << " input: \"" << deleted << '"';
  }

  for (size_t i = 1; i < kValidText.length(); ++i) {
    absl::string_view deleted(kValidText.substr(i));
    HunkHeader h;
    EXPECT_FALSE(h.Parse(deleted).ok()) << " input: \"" << deleted << '"';
  }
}

TEST(HunkHeaderParseTest, MalformedOldRange) {
  constexpr absl::string_view kInvalidText = "@@ 4,8 +5,6 @@";
  HunkHeader h;
  const auto status = h.Parse(kInvalidText);
  EXPECT_FALSE(status.ok()) << " input: \"" << kInvalidText << '"';
  EXPECT_TRUE(absl::StrContains(status.message(),
                                "old-file range should start with '-'"))
      << " got: " << status.message();
}

TEST(HunkHeaderParseTest, MalformedNewRange) {
  constexpr absl::string_view kInvalidText = "@@ -4,8 5,6 @@";
  HunkHeader h;
  const auto status = h.Parse(kInvalidText);
  EXPECT_FALSE(status.ok()) << " input: \"" << kInvalidText << '"';
  EXPECT_TRUE(absl::StrContains(status.message(),
                                "new-file range should start with '+'"))
      << " got: " << status.message();
}

TEST(HunkHeaderParseAndPrintTest, ValidInput) {
  constexpr absl::string_view kValidText = "@@ -14,8 +5,16 @@";
  HunkHeader h;
  EXPECT_TRUE(h.Parse(kValidText).ok()) << " input: \"" << kValidText << '"';
  EXPECT_EQ(h.old_range.start, 14);
  EXPECT_EQ(h.old_range.count, 8);
  EXPECT_EQ(h.new_range.start, 5);
  EXPECT_EQ(h.new_range.count, 16);
  EXPECT_EQ(h.context, "");

  // Validate reversibility.
  std::ostringstream stream;
  stream << h;
  EXPECT_EQ(stream.str(), kValidText);
}

TEST(HunkHeaderParseAndPrintTest, ValidInputWithContext) {
  constexpr absl::string_view kValidText("@@ -4,28 +51,6 @@ void foo::bar() {");
  HunkHeader h;
  EXPECT_TRUE(h.Parse(kValidText).ok()) << " input: \"" << kValidText << '"';
  EXPECT_EQ(h.old_range.start, 4);
  EXPECT_EQ(h.old_range.count, 28);
  EXPECT_EQ(h.new_range.start, 51);
  EXPECT_EQ(h.new_range.count, 6);
  EXPECT_EQ(h.context, " void foo::bar() {");

  // Validate reversibility.
  std::ostringstream stream;
  stream << h;
  EXPECT_EQ(stream.str(), kValidText);
}

TEST(SourceInfoParseTest, InvalidInputs) {
  constexpr absl::string_view kTestCases[] = {
      "",  // path must be non-empty
  };
  for (const auto &test : kTestCases) {
    SourceInfo info;
    EXPECT_FALSE(info.Parse(test).ok()) << " input: \"" << test << '"';
  }
}

TEST(SourceInfoParseAndPrintTest, ValidInputsPathOnly) {
  constexpr absl::string_view kPaths[] = {
      "a.txt",
      "p/q/a.txt",
      "/p/q/a.txt",
  };
  for (const auto &path : kPaths) {
    SourceInfo info;
    EXPECT_TRUE(info.Parse(path).ok());
    EXPECT_EQ(info.path, path);
    EXPECT_TRUE(info.timestamp.empty());

    // Validate reversibility.
    std::ostringstream stream;
    stream << info;
    EXPECT_EQ(stream.str(), path);
  }
}

TEST(SourceInfoParseAndPrintTest, ValidInputsWithTimestamps) {
  constexpr absl::string_view kPaths[] = {
      "a.txt",
      "p/q/a.txt",
      "/p/q/a.txt",
  };
  constexpr absl::string_view kTimes[] = {
      "2020-02-02",
      "2020-02-02 20:22:02",
      "2020-02-02 20:22:02.000000",
      "2020-02-02 20:22:02.000000 -0700",
  };
  for (const auto &path : kPaths) {
    for (const auto &time : kTimes) {
      SourceInfo info;
      const std::string text(absl::StrCat(path, "\t", time));
      EXPECT_TRUE(info.Parse(text).ok());
      EXPECT_EQ(info.path, path);
      EXPECT_EQ(info.timestamp, time);

      // Validate reversibility.
      std::ostringstream stream;
      stream << info;
      EXPECT_EQ(stream.str(), text);
    }
  }
}

TEST(HunkEqualityTest, Comparisons) {
  const std::vector<absl::string_view> lines{
      " a",
      "-b",
      "+c",
      " d",
  };
  EXPECT_EQ(Hunk(1, 1, lines.begin(), lines.end()),  //
            Hunk(1, 1, lines.begin(), lines.end()));
  EXPECT_NE(Hunk(1, 1, lines.begin(), lines.end()),  //
            Hunk(2, 1, lines.begin(), lines.end()));
  EXPECT_NE(Hunk(1, 1, lines.begin(), lines.end()),  //
            Hunk(1, 3, lines.begin(), lines.end()));
  EXPECT_NE(Hunk(2, 4, lines.begin(), lines.end()),  //
            Hunk(2, 4, lines.begin() + 1, lines.end()));
  EXPECT_NE(Hunk(2, 4, lines.begin(), lines.end()),  //
            Hunk(2, 4, lines.begin(), lines.end() - 1));
}

TEST(HunkParseTest, InvalidInputs) {
  const std::vector<absl::string_view> kTestCases[] = {
      // malformed headers:
      {"@@ -1,0 +2,0 @"},
      {"@ -1,0 +2,0 @@"},
      {"@@ -1,0+2,0 @@"},
      // malformed MarkedLines:
      {"@@ -1,1 +2,1 @@", ""},  // missing marker character
      {"@@ -1,1 +2,1 @@", "missing leading marker character"},
      // inconsistent line counts:
      {"@@ -1,0 +2,0 @@", "-unexpected"},
      {"@@ -1,0 +2,0 @@", "+unexpected"},
      {"@@ -1,0 +2,0 @@", " unexpected"},
      {
          "@@ -1,1 +2,0 @@",
          // missing: "-..."
      },
      {
          "@@ -1,0 +2,1 @@",
          // missing: "+..."
      },
      {
          "@@ -1,1 +2,1 @@",
          // missing: " ..."
      },
  };
  for (const auto &lines : kTestCases) {
    Hunk hunk;
    const LineRange range(lines.begin(), lines.end());
    EXPECT_FALSE(hunk.Parse(range).ok());
  }
}

struct UpdateHeaderTestCase {
  absl::string_view fixed_header;
  std::vector<absl::string_view> payload;
};

TEST(HunkUpdateHeaderTest, Various) {
  constexpr absl::string_view kNonsenseHeader = "@@ -222,999 +333,999 @@";
  const UpdateHeaderTestCase kTestCases[] = {
      {"@@ -222,0 +333,0 @@", {/* empty lines */}},
      {"@@ -222,1 +333,0 @@",
       {
           "-removed",
       }},
      {"@@ -222,0 +333,1 @@",
       {
           "+added",
       }},
      {"@@ -222,1 +333,1 @@",
       {
           " common",
       }},
      {"@@ -222,4 +333,3 @@",
       {" common", "-removed", "-removed2", "+added", " common again"}},
  };
  for (const auto &test : kTestCases) {
    std::vector<absl::string_view> lines;
    lines.push_back(kNonsenseHeader);
    lines.insert(lines.end(), test.payload.begin(), test.payload.end());
    const LineRange range(lines.begin(), lines.end());

    Hunk hunk;
    EXPECT_FALSE(hunk.Parse(range).ok());
    hunk.UpdateHeader();
    const auto status = hunk.IsValid();
    EXPECT_TRUE(status.ok()) << status.message();

    std::ostringstream stream;
    stream << hunk.Header();
    EXPECT_EQ(stream.str(), test.fixed_header);
  }
}

struct AddedLinesTestCase {
  std::vector<absl::string_view> hunk_text;
  LineNumberSet expected_added_lines;
};

TEST(HunkAddedLinesTest, Various) {
  const AddedLinesTestCase kTestCases[] = {
      {
          {
              "@@ -7,1 +8,1 @@",
              " common line, not added",
          },
          {},
      },
      {
          {
              "@@ -7,2 +8,1 @@",
              "-deleted line",
              " common line, not added",
          },
          {},
      },
      {
          {"@@ -7,2 +8,1 @@", " common line, not added", "-deleted line"},
          {},
      },
      {
          {
              "@@ -7,4 +8,2 @@",
              " common line, not added",
              "-deleted line",
              "-deleted line 2",
              " common line, not added",
          },
          {},
      },
      {
          {
              "@@ -7,1 +8,2 @@",
              " common line, not added",
              "+added line",
          },
          {{9, 10}},
      },
      {
          {
              "@@ -7,1 +8,2 @@",
              "+added line",
              " common line, not added",
          },
          {{8, 9}},
      },
      {
          {
              "@@ -17,2 +28,4 @@",
              " common line, not added",
              "+added line",
              "+added line 2",
              " common line, not added",
          },
          {{29, 31}},
      },
      {
          {
              "@@ -7,3 +4,3 @@",
              " common line, not added",
              "-deleted line",
              "+added line",
              " common line, not added",
          },
          {{5, 6}},
      },
      {
          {
              "@@ -7,3 +4,3 @@",
              " common line, not added",
              "+added line",
              "-deleted line",
              " common line, not added",
          },
          {{5, 6}},
      },
      {
          {
              "@@ -380,8 +401,12 @@",
              " common line, not added",
              "+added line",
              "+added line 2",
              " nothing interesting",
              " ",
              "-delete me",
              "+replacement",
              " ",
              " nothing interesting",
              " ",
              "+added line",
              "+added line 2",
              " common line, not added",
          },
          {{402, 404}, {406, 407}, {410, 412}},
      },
  };
  for (const auto &test : kTestCases) {
    const LineRange range(test.hunk_text.begin(), test.hunk_text.end());
    Hunk hunk;
    const auto status = hunk.Parse(range);
    ASSERT_TRUE(status.ok()) << status.message();
    EXPECT_EQ(hunk.AddedLines(), test.expected_added_lines);
  }
}

TEST(HunkSplitTest, ExpectedSingletons) {
  const std::vector<absl::string_view> kTestCases[] = {
      {" no-change"},
      {"+one addition"},
      {"-one deletion"},
      {" no-change",  //
       " multi-no-change"},
      {" same",   //
       "+added",  //
       " same"},
      {" same",        //
       "+added",       //
       "+added more",  //
       " same"},
      {" same",     //
       "-removed",  //
       " same"},
      {" same",          //
       "-removed",       //
       "-removed more",  //
       " same"},
      {" same",          //
       "-replace this",  //
       "+with this",     //
       " same"},
      {" same",          //
       "-replace this",  //
       "-and this",      //
       "+with this",     //
       " same"},
      {" same",          //
       "-replace this",  //
       "+with this",     //
       "+and this",      //
       " same"},
      {" same",               //
       " same more context",  //
       "-replace this",       //
       "-and this",           //
       "+with this",          //
       "+and this",           //
       " same more context",  //
       " same"},
  };
  for (const auto &test : kTestCases) {
    const std::vector<MarkedLine> lines(MakeMarkedLines(test));
    // can pick any starting line numbers, doesn't matter
    const Hunk hunk(10, 12, lines.begin(), lines.end());
    const std::vector<Hunk> splits(hunk.Split());
    // expect returned list contains exactly the original hunk
    EXPECT_THAT(splits, ElementsAre(hunk));
  }
}

struct ExpectedHunk {
  int old_starting_line;
  int new_starting_line;
  std::pair<int, int> marked_line_offsets;
};

static std::vector<Hunk> MakeExpectedHunks(
    const Hunk &original, const std::vector<ExpectedHunk> &hunk_infos) {
  const auto &marked_lines = original.MarkedLines();
  std::vector<Hunk> results;
  results.reserve(hunk_infos.size());
  for (const auto &hunk_info : hunk_infos) {
    results.emplace_back(
        hunk_info.old_starting_line, hunk_info.new_starting_line,
        marked_lines.begin() + hunk_info.marked_line_offsets.first,
        marked_lines.begin() + hunk_info.marked_line_offsets.second);
  }
  return results;
}

struct HunkSplitTestCase {
  std::vector<MarkedLine> marked_lines;
  Hunk original_hunk;
  std::vector<Hunk> expected_sub_hunks;

  HunkSplitTestCase(int old_starting_line, int new_starting_line,
                    const std::vector<absl::string_view> &lines,
                    const std::vector<ExpectedHunk> &sub_hunks)
      : marked_lines(MakeMarkedLines(lines)),
        original_hunk(old_starting_line, new_starting_line,
                      marked_lines.begin(), marked_lines.end()),
        expected_sub_hunks(MakeExpectedHunks(original_hunk, sub_hunks)) {}
};

TEST(HunkSplitTest, MultipleSubHunks) {
  const HunkSplitTestCase kTestCases[] = {
      HunkSplitTestCase(4, 6,
                        {" no-change",  //
                         "-remove",     //
                         "+replace",    //
                         " no-change"},
                        {
                            // one hunk (no split)
                            {4, 6, {0, 4}},
                        }),
      HunkSplitTestCase(4, 5,
                        {"+insert",  //
                         " coins",   //
                         "+to continue"},
                        {
                            // two hunks
                            {4, 5, {0, 1}},
                            {4, 6, {1, 3}},
                        }),
      HunkSplitTestCase(4, 5,
                        {"+insert",  //
                         " more",    //
                         " coins",   //
                         "+to continue"},
                        {
                            // two hunks
                            {4, 5, {0, 1}},
                            {4, 6, {1, 4}},
                        }),
      HunkSplitTestCase(7, 7,
                        {"-insert",  //
                         " coins",   //
                         "-to continue"},
                        {
                            // two hunks
                            {7, 7, {0, 1}},
                            {8, 7, {1, 3}},
                        }),
      HunkSplitTestCase(7, 7,
                        {"-move",       //
                         "-these",      //
                         " untouched",  //
                         "+move", "+these"},
                        {
                            // two hunks
                            {7, 7, {0, 2}},
                            {9, 7, {2, 5}},
                        }),
      HunkSplitTestCase(2, 1,
                        {" context",  //
                         "-in",       //
                         "+space",    //
                         " no one",   //
                         "-can",      //
                         "-hear",     //
                         "+you",      //
                         "+scream"},
                        {
                            // two hunks
                            {2, 1, {0, 3}},
                            {4, 3, {3, 8}},
                        }),
      HunkSplitTestCase(3, 4,
                        {" delete",  //
                         "-every",   //
                         " other",   //
                         "-line",    //
                         " ",        //
                         "-delete",  //
                         " every",   //
                         "-other",   //
                         " line"},
                        {
                            // many hunks
                            {3, 4, {0, 2}},
                            {5, 5, {2, 4}},
                            {7, 6, {4, 6}},
                            {9, 7, {6, 9}},
                        }),
      HunkSplitTestCase(10, 10,
                        {" a",          //
                         "-long long",  //
                         "+time",       //
                         "-ago",        //
                         " in",         //
                         "+a",          //
                         "+galaxy",     //
                         " far",        //
                         "-far",        //
                         " away"},
                        {
                            // many hunks
                            {10, 10, {0, 4}},
                            {13, 12, {4, 7}},
                            {14, 15, {7, 10}},
                        }),
  };
  for (const auto &test : kTestCases) {
    EXPECT_THAT(test.original_hunk.Split(),
                ElementsAreArray(test.expected_sub_hunks));
  }
}

TEST(HunkParseAndPrintTest, ValidInputs) {
  const std::vector<absl::string_view> kTestCases[] = {
      {"@@ -1,0 +2,0 @@"},  // 0 line counts, technically consistent
      {"@@ -1,2 +2,2 @@",   // 2 lines of context, common to before/after
       " same1",            //
       " same2"},
      {"@@ -1,2 +2,2 @@ int foo(void) {",  // additional context
       " same1",                           //
       " same2"},
      {"@@ -1,2 +2,0 @@",  // only deletions, no context lines
       "-erase me",        //
       "-erase me too"},
      {"@@ -1,0 +2,2 @@",  // only additions, no context lines
       "+new line 1",      //
       "+new line 2"},
      {"@@ -1,1 +2,1 @@",            // 0 lines of context, 1 line changed
       "-at first I was like whoa",  //
       "+and then I was like WHOA"},
      {"@@ -1,3 +2,4 @@",            // with 1 line of surrounding context
       " common line1",              //
       "-at first I was like whoa",  //
       "+and then I was like WHOA",  //
       "+  and then like whoa",      //
       " common line2"},
  };
  for (const auto &lines : kTestCases) {
    Hunk hunk;
    const LineRange range(lines.begin(), lines.end());
    const auto status = hunk.Parse(range);
    EXPECT_TRUE(status.ok()) << status.message();

    // Validate reversibility.
    std::ostringstream stream;
    stream << hunk;
    EXPECT_EQ(stream.str(), absl::StrJoin(lines, "\n") + "\n");
  }
}

TEST(HunkVerifyAgainstOriginalLinesTest, LineNumberOutOfBounds) {
  const std::vector<absl::string_view> kHunkText = {
      {
          "@@ -2,3 +4,3 @@",  // dont' care about position in new-file
          " line2",           //
          "-line3",           //
          "+line pi",         //
          " line4",           // this line doesn't exist in original
      },
  };
  const std::vector<absl::string_view> kOriginal = {
      "line1", "line2", "line3",
      // no line4
  };
  Hunk hunk;
  {
    const LineRange range(kHunkText.begin(), kHunkText.end());
    const auto status = hunk.Parse(range);
    ASSERT_TRUE(status.ok()) << status.message();
  }
  {
    const auto status = hunk.VerifyAgainstOriginalLines(kOriginal);
    EXPECT_EQ(status.code(), absl::StatusCode::kOutOfRange);
    EXPECT_TRUE(absl::StrContains(status.message(), "references line 4"));
    EXPECT_TRUE(absl::StrContains(status.message(), "with only 3 lines"));
  }
}

TEST(HunkVerifyAgainstOriginalLinesTest, InconsistentRetainedLine) {
  const std::vector<absl::string_view> kHunkText = {
      {
          "@@ -2,2 +4,2 @@",
          " line2",    //
          "-line3",    //
          "+line pi",  //
      },
  };
  const std::vector<absl::string_view> kOriginal = {
      "line1",
      "line2 different",
      "line3",
  };
  Hunk hunk;
  {
    const LineRange range(kHunkText.begin(), kHunkText.end());
    const auto status = hunk.Parse(range);
    ASSERT_TRUE(status.ok()) << status.message();
  }
  {
    const auto status = hunk.VerifyAgainstOriginalLines(kOriginal);
    EXPECT_EQ(status.code(), absl::StatusCode::kDataLoss);
    EXPECT_TRUE(absl::StrContains(status.message(),
                                  "Patch is inconsistent with original file"));
  }
}

TEST(HunkVerifyAgainstOriginalLinesTest, InconsistentDeletedLine) {
  const std::vector<absl::string_view> kHunkText = {
      {
          "@@ -2,2 +4,2 @@",
          " line2",    //
          "-line3",    //
          "+line pi",  //
      },
  };
  const std::vector<absl::string_view> kOriginal = {
      "line1",
      "line2",
      "line3 different",
  };
  Hunk hunk;
  {
    const LineRange range(kHunkText.begin(), kHunkText.end());
    const auto status = hunk.Parse(range);
    ASSERT_TRUE(status.ok()) << status.message();
  }
  {
    const auto status = hunk.VerifyAgainstOriginalLines(kOriginal);
    EXPECT_EQ(status.code(), absl::StatusCode::kDataLoss);
    EXPECT_TRUE(absl::StrContains(status.message(),
                                  "Patch is inconsistent with original file"));
  }
}

TEST(FilePatchParseTest, InvalidInputs) {
  const std::vector<absl::string_view> kTestCases[] = {
      {},    // empty range is invalid
      {""},  // no "---" marker for source info
      {
          "--- /path/to/file.txt\t2020-03-30",  // no "+++" marker for source
                                                // info
      },
      {
          "--- /path/to/file.txt\t2020-03-29",
          "+++ /path/to/file.txt\t2020-03-30",
          "@@ -2,1 +3,1 @@",  // hunk line counts are inconsistent
      },
      {
          "--- /path/to/file.txt\t2020-03-29",
          "+++ /path/to/file.txt\t2020-03-30",
          "@@ -12,0 +13,0 @@",  // empty, but ok
          "@@ -42,1 +43,1 @@",  // hunk line counts are inconsistent
      },
      {
          "--- /path/to/file.txt\t2020-03-29",
          "+++ /path/to/file.txt\t2020-03-30",
          "@@ -2,1 +3,1 @@",
          "malformed line does not begin with [ -+]",
      },
  };
  for (const auto &lines : kTestCases) {
    const LineRange range(lines.begin(), lines.end());
    FilePatch file_patch;
    EXPECT_FALSE(file_patch.Parse(range).ok()) << "lines:\n"
                                               << absl::StrJoin(lines, "\n");
  }
}

TEST(FilePatchParseAndPrintTest, ValidInputs) {
  const std::vector<absl::string_view> kTestCases[] = {
      {
          "--- /path/to/file.txt\t2020-03-30",
          "+++ /path/to/file.txt\t2020-03-30",
          // no hunks, but still valid
      },
      {
          "--- /path/to/file.txt\t2020-03-30",
          "+++ /path/to/file.txt\t2020-03-30",
          "@@ -12,0 +13,0 @@",  // empty, but ok
      },
      {
          "--- /path/to/file.txt\t2020-03-30",
          "+++ /path/to/file.txt\t2020-03-30",
          "@@ -12,1 +13,1 @@",
          " no change here",
      },
      {
          "--- /path/to/file.txt\t2020-03-30",
          "+++ /path/to/file.txt\t2020-03-30",
          "@@ -12,3 +13,2 @@",
          " no change here",
          "-delete me",
          " no change here",
      },
      {
          "--- /path/to/file.txt\t2020-03-30",
          "+++ /path/to/file.txt\t2020-03-30",
          "@@ -12,2 +13,3 @@",
          " no change here",
          "+add me",
          " no change here",
      },
      {
          "--- /path/to/file.txt\t2020-03-30",
          "+++ /path/to/file.txt\t2020-03-30",
          "@@ -12,3 +13,2 @@",  // first hunk
          " no change here",
          "-delete me",
          " no change here",
          "@@ -52,2 +53,3 @@",  // second hunk
          " no change here",
          "+add me",
          " no change here",
      },
      {
          // one line of file metadata
          ("==== //depot/p4/style/path/to/file.txt#4 - local/path/to/file.txt "
           "===="),
          "--- /path/to/file.txt\t2020-03-30",
          "+++ /path/to/file.txt\t2020-03-30",
          "@@ -12,1 +13,1 @@",
          " no change here",
      },
      {
          // one line of file metadata
          "diff -u a/path/to/file.txt b/path/to/file.txt",
          "--- /path/to/file.txt\t2020-03-30",
          "+++ /path/to/file.txt\t2020-03-30",
          "@@ -12,1 +13,1 @@",
          " no change here",
      },
  };
  for (const auto &lines : kTestCases) {
    const LineRange range(lines.begin(), lines.end());
    FilePatch file_patch;
    const auto status = file_patch.Parse(range);
    EXPECT_TRUE(status.ok()) << status.message();

    // Validate reversibility.
    std::ostringstream stream;
    stream << file_patch;
    EXPECT_EQ(stream.str(), absl::StrJoin(lines, "\n") + "\n");
  }
}

TEST(FilePatchIsNewFileTest, NewFile) {
  const std::vector<absl::string_view> kInput = {
      "--- /dev/null\t2020-03-30",
      "+++ /path/to/file.txt\t2020-03-30",
      "@@ -0,0 +1,2 @@",
      "+new content 1",
      "+new content 2",
  };

  const LineRange range(kInput.begin(), kInput.end());
  FilePatch file_patch;
  const auto status = file_patch.Parse(range);
  EXPECT_TRUE(status.ok()) << status.message();
  EXPECT_TRUE(file_patch.IsNewFile());
}

TEST(FilePatchIsNewFileTest, ExistingFile) {
  const std::vector<absl::string_view> kInput = {
      "--- /path/to/file.txt\t2020-03-30",
      "+++ /path/to/file.txt\t2020-03-30",
      "@@ -12,1 +13,1 @@",
      " no change here",
  };

  const LineRange range(kInput.begin(), kInput.end());
  FilePatch file_patch;
  const auto status = file_patch.Parse(range);
  EXPECT_TRUE(status.ok()) << status.message();
  EXPECT_FALSE(file_patch.IsNewFile());
}

TEST(FilePatchIsDeletedFileTest, DeletedFile) {
  const std::vector<absl::string_view> kInput = {
      "--- /path/to/file.txt\t2020-03-30",
      "+++ /dev/null\t2020-03-30",
      "@@ -1,2 +0,0 @@",
      "-deleted content 1",
      "-deleted content 2",
  };

  const LineRange range(kInput.begin(), kInput.end());
  FilePatch file_patch;
  const auto status = file_patch.Parse(range);
  EXPECT_TRUE(status.ok()) << status.message();
  EXPECT_TRUE(file_patch.IsDeletedFile());
}

TEST(FilePatchIsDeletedFileTest, ExistingFile) {
  const std::vector<absl::string_view> kInput = {
      "--- /path/to/file.txt\t2020-03-30",
      "+++ /path/to/file.txt\t2020-03-30",
      "@@ -12,2 +13,2 @@",
      " no change here",
      "+you win some",
      "-you lose some",
  };

  const LineRange range(kInput.begin(), kInput.end());
  FilePatch file_patch;
  const auto status = file_patch.Parse(range);
  EXPECT_TRUE(status.ok()) << status.message();
  EXPECT_FALSE(file_patch.IsDeletedFile());
}

TEST(FilePatchAddedLinesTest, Various) {
  const AddedLinesTestCase kTestCases[] = {
      {
          {
              "--- /path/to/file.txt\t2019-12-01",
              "+++ /path/to/file.txt\t2019-12-31",
              "@@ -12,1 +13,1 @@",
              " no change here",
          },
          {},
      },
      {
          {
              "--- /path/to/file.txt\t2019-12-01",
              "+++ /path/to/file.txt\t2019-12-31",
              "@@ -12,1 +13,1 @@",
              " no change here",
              "@@ -21,3 +20,2 @@",
              " ",
              "-bye",
              " ",
              "@@ -31,2 +43,4 @@",
              " ",
              "+hello",  // line 45
              "+world",  // line 46
              " ",
              "@@ -61,3 +80,3 @@",
              " ",
              "-adios",
              "+hola",  // line 81
              " ",
          },
          {{44, 46}, {81, 82}},
      },
  };
  for (const auto &test : kTestCases) {
    const LineRange range(test.hunk_text.begin(), test.hunk_text.end());
    FilePatch file_patch;
    const auto status = file_patch.Parse(range);
    ASSERT_TRUE(status.ok()) << status.message();
    EXPECT_EQ(file_patch.AddedLines(), test.expected_added_lines);
  }
}

class FilePatchPickApplyTest : public FilePatch, public ::testing::Test {
 protected:
  absl::Status ParseLines(const std::vector<absl::string_view> &lines) {
    const LineRange range(lines.begin(), lines.end());
    return Parse(range);
  }

  static absl::StatusOr<std::string> NullFileReader(
      absl::string_view filename) {
    return "";
  }

  static absl::Status NullFileWriter(absl::string_view filename,
                                     absl::string_view contents) {
    return absl::OkStatus();
  }
};

// Takes the place of a real file on the filesystem.
// TODO(fangism): move this to a "file_test_util" library.
struct StringFile {
  const absl::string_view path;
  const absl::string_view contents;
};

class StringFileSequence {
 public:
  explicit StringFileSequence(const std::vector<StringFile> &files)
      : files_(files) {}
  StringFileSequence(std::initializer_list<StringFile> files) : files_(files) {}

 protected:
  const std::vector<StringFile> files_;
  // stateful value needed inside std::function to emulate a sequence of calls
  size_t index_ = 0;
};

// Functor that can mimic a sequence of calls to file::GetContents()
// Can be passed anywhere that takes a FileReaderFunction.
// TODO(fangism): move this to a "file_test_util" library.
struct ReadStringFileSequence : public StringFileSequence {
  explicit ReadStringFileSequence(const std::vector<StringFile> &files)
      : StringFileSequence(files) {}
  ReadStringFileSequence(std::initializer_list<StringFile> files)
      : StringFileSequence(files) {}

  // like file::GetContentAsString()
  absl::StatusOr<std::string> operator()(absl::string_view filename) {
    // ASSERT_LT(i, files_.size());  // can't use ASSERT_* which returns void
    if (index_ >= files_.size()) {
      return absl::OutOfRangeError(
          absl::StrCat("No more files to read beyond index=", index_));
    }
    const auto &file = files_[index_];
    EXPECT_EQ(filename, file.path) << " at index " << index_;
    ++index_;
    return std::string{file.contents};
  }
};

// Functor that can mimic a sequence of calls to file::SetContents()
// Can be passed anywhere that takes a FileWriterFunction.
// TODO(fangism): move this to a "file_test_util" library.
struct ExpectStringFileSequence : public StringFileSequence {
  explicit ExpectStringFileSequence(const std::vector<StringFile> &files)
      : StringFileSequence(files) {}
  ExpectStringFileSequence(std::initializer_list<StringFile> files)
      : StringFileSequence(files) {}

  // like file::SetContents()
  absl::Status operator()(absl::string_view filename, absl::string_view src) {
    // ASSERT_LT(i, files_.size());  // can't use ASSERT_* which returns void
    if (index_ >= files_.size()) {
      return absl::OutOfRangeError(
          absl::StrCat("No more files to compare beyond index=", index_));
    }
    const auto &file = files_[index_];
    EXPECT_EQ(filename, file.path) << " at index " << index_;
    EXPECT_EQ(file.contents, src) << " at index " << index_;
    ++index_;
    return absl::OkStatus();  // "file" is successfully written
  }
};

TEST_F(FilePatchPickApplyTest, ErrorReadingFile) {
  std::istringstream ins;
  std::ostringstream outs;
  constexpr absl::string_view kErrorMessage = "File not found.";
  auto error_file_reader = [=](absl::string_view filename) {
    return absl::StatusOr<std::string>(absl::NotFoundError(kErrorMessage));
  };
  const auto status = PickApply(ins, outs, error_file_reader, &NullFileWriter);
  EXPECT_FALSE(status.ok());
  EXPECT_EQ(status.message(), kErrorMessage);
  EXPECT_TRUE(outs.str().empty()) << "Unexpected: " << outs.str();
}

TEST_F(FilePatchPickApplyTest, IgnoreNewFile) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- /dev/null\t2012-01-01",
        "+++ foo.txt\t2012-01-01",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }
  std::istringstream ins;
  std::ostringstream outs;
  const auto status = PickApply(ins, outs, &NullFileReader, &NullFileWriter);
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_TRUE(outs.str().empty()) << "Unexpected: " << outs.str();
}

TEST_F(FilePatchPickApplyTest, IgnoreDeletedFile) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- bar.txt\t2012-01-01",
        "+++ /dev/null\t2012-01-01",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }
  std::istringstream ins;
  std::ostringstream outs;
  const auto status = PickApply(ins, outs, &NullFileReader, &NullFileWriter);
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_TRUE(outs.str().empty()) << "Unexpected: " << outs.str();
}

TEST_F(FilePatchPickApplyTest, EmptyPatchNoPrompt) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins;
  std::ostringstream outs;

  constexpr absl::string_view kOriginal = "aaa\nbbb\nccc\n";
  constexpr absl::string_view kExpected = kOriginal;  // no change

  const auto status =
      PickApply(ins, outs,  //
                internal::ReadStringFileSequence({{"foo.txt", kOriginal}}),
                internal::ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_TRUE(outs.str().empty()) << "Unexpected: " << outs.str();
}

TEST_F(FilePatchPickApplyTest, ErrorWritingFileInPlace) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins;
  std::ostringstream outs;

  constexpr absl::string_view kOriginal = "aaa\nbbb\nccc\n";
  constexpr absl::string_view kErrorMessage = "Cannot write file.";

  auto error_file_writer = [=](absl::string_view, absl::string_view) {
    return absl::PermissionDeniedError(kErrorMessage);
  };

  const auto status = PickApply(
      ins, outs,  //
      ReadStringFileSequence({{"foo.txt", kOriginal}}), error_file_writer);
  EXPECT_FALSE(status.ok());
  EXPECT_EQ(status.message(), kErrorMessage);
  EXPECT_TRUE(outs.str().empty()) << "Unexpected: " << outs.str();
}

TEST_F(FilePatchPickApplyTest, OneHunkNotApplied) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,2 @@",
        " bbb",
        "-ccc",  // patch proposes to delete this line
        " ddd",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("n\n");  // user declines patch hunk
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"
      "ddd\n"
      "eee\n";
  constexpr absl::string_view kExpected = kOriginal;

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, PatchInconsistentWithOriginalText) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,2 @@",
        " bbb",  // inconsistent with original
        "-ccc",  // patch proposes to delete this line
        " ddd",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("y\n");  // user accepts hunk
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb-different\n"  // inconsistent with patch
      "ccc\n"            // deleted by hunk
      "ddd\n"
      "eee\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "ddd\n"
      "eee\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_EQ(status.code(), absl::StatusCode::kDataLoss);
}

TEST_F(FilePatchPickApplyTest, OneDeletionAccepted) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,2 @@",
        " bbb",
        "-ccc",  // patch proposes to delete this line
        " ddd",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("y\n");  // user accepts hunk
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"  // deleted by hunk
      "ddd\n"
      "eee\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "ddd\n"
      "eee\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, OneInsertionAccepted) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,2 +2,3 @@",
        " bbb",
        "+bbb.5",  // patch proposes to insert this line
        " ccc",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("y\n");  // user accepts hunk
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"
      "ddd\n"
      "eee\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "bbb.5\n"  // inserted
      "ccc\n"
      "ddd\n"
      "eee\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, OneReplacementAccepted) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,3 @@",
        " bbb",
        "-ccc",  // patch proposes to replace this line
        "+C++",  // with this line
        " ddd",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("y\n");  // user accepts hunk
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"  // replaced
      "ddd\n"
      "eee\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "C++\n"  // replaced
      "ddd\n"
      "eee\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, HelpFirstThenAcceptHunk) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,3 @@",
        " bbb",
        "-ccc",  // patch proposes to replace this line
        "+C++",  // with this line
        " ddd",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("?\ny\n");  // help, accept
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"  // replaced
      "ddd\n"
      "eee\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "C++\n"  // replaced
      "ddd\n"
      "eee\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
  EXPECT_TRUE(absl::StrContains(outs.str(), "print this help"));
}

TEST_F(FilePatchPickApplyTest, HunksOutOfOrder) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -5,3 +5,3 @@",
        " eee",
        "-fff",
        "+fangism",
        " ggg",
        "@@ -2,3 +2,3 @@",  // bad ordering
        " bbb",
        "-ccc",  // patch proposes to replace this line
        "+C++",  // with this line
        " ddd",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("y\nn\n");  // accept, reject
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"  // replaced
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "C++\n"  // replaced
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_FALSE(status.ok());
  EXPECT_TRUE(absl::StrContains(status.message(), "not properly ordered"));
}

TEST_F(FilePatchPickApplyTest, AcceptOnlyFirstOfTwoHunks) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,3 @@",
        " bbb",
        "-ccc",  // patch proposes to replace this line
        "+C++",  // with this line
        " ddd",
        "@@ -5,3 +5,3 @@",
        " eee",
        "-fff",
        "+fangism",
        " ggg",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("y\nn\n");  // accept, reject
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"  // replaced
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "C++\n"  // replaced
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, AcceptOnlySecondOfTwoHunks) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,3 @@",
        " bbb",
        "-ccc",  // patch proposes to replace this line
        "+C++",  // with this line
        " ddd",
        "@@ -5,3 +5,3 @@",
        " eee",
        "-fff",
        "+fangism",
        " ggg",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("n\ny\n");  // reject, accept
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"  // kept
      "ddd\n"
      "eee\n"
      "fff\n"  // changed
      "ggg\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "ccc\n"  // kept
      "ddd\n"
      "eee\n"
      "fangism\n"  // changed
      "ggg\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, SplitThenAcceptOnlyFirstOfTwoHunks) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,6 +2,6 @@",  // one large splittable hunk
        " bbb",
        "-ccc",  // elect to apply
        "+C++",  // this change
        " ddd",
        " eee",
        "-fff",      // but not
        "+fangism",  // this change
        " ggg",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("s\ny\nn\n");  // split, accept, reject
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"  // replaced
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "C++\n"  // replaced
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, SplitThenAcceptOnlySecondOfTwoHunks) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,6 +2,6 @@",  // one large splittable hunk
        " bbb",
        "-ccc",  // elect to reject
        "+C++",  // this change
        " ddd",
        " eee",
        "-fff",      // but accept
        "+fangism",  // this change
        " ggg",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("s\nn\ny\n");  // split, reject, accept
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"  // kept
      "ddd\n"
      "eee\n"
      "fff\n"  // replaced
      "ggg\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "ccc\n"  // kept
      "ddd\n"
      "eee\n"
      "fangism\n"  // replaced
      "ggg\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, AbortRightAway) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,3 @@",
        " bbb",
        "-ccc",  // patch proposes to replace this line
        "+C++",  // with this line
        " ddd",
        "@@ -5,3 +5,3 @@",
        " eee",
        "-fff",
        "+fangism",
        " ggg",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("q\n");  // quit (abandon)
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n";
  constexpr absl::string_view kExpected = kOriginal;

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, TreatEndOfUserInputAsAbort) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,3 @@",
        " bbb",
        "-ccc",  // patch proposes to replace this line
        "+C++",  // with this line
        " ddd",
        "@@ -5,3 +5,3 @@",
        " eee",
        "-fff",
        "+fangism",
        " ggg",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins;  // empty, end of user input
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n";
  constexpr absl::string_view kExpected = kOriginal;

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, AbortFileAfterAcceptingOneHunk) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,3 @@",
        " bbb",
        "-ccc",  // patch proposes to replace this line
        "+C++",  // with this line
        " ddd",
        "@@ -5,3 +5,3 @@",
        " eee",
        "-fff",
        "+fangism",
        " ggg",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("y\nq\n");  // accept, quit (abandon)
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"  // replaced
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n";
  constexpr absl::string_view kExpected = kOriginal;

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, AcceptTwoDeletions) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,2 @@",
        " bbb",
        "-ccc",  // delete this line
        " ddd",
        "@@ -6,3 +5,2 @@",
        " fff",
        "-ggg",  // delete this line
        " hhh",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("y\ny\n");  // accept, accept
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n"
      "hhh\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "hhh\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, AcceptAllDeletions) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,2 @@",
        " bbb",
        "-ccc",  // delete this line
        " ddd",
        "@@ -6,3 +5,2 @@",
        " fff",
        "-ggg",  // delete this line
        " hhh",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("a\n");  // accept all
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n"
      "hhh\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "hhh\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, RejectAllDeletions) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,3 +2,2 @@",
        " bbb",
        "-ccc",  // delete this line
        " ddd",
        "@@ -6,3 +5,2 @@",
        " fff",
        "-ggg",  // delete this line
        " hhh",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("d\n");  // accept all
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ccc\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n"
      "hhh\n";
  constexpr absl::string_view kExpected = kOriginal;  // no changes

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, AcceptTwoInsertions) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,2 +2,3 @@",
        " bbb",
        "+ccc",  // delete this line
        " ddd",
        "@@ -5,2 +6,3 @@",
        " fff",
        "+ggg",  // delete this line
        " hhh",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("y\ny\n");  // accept, accept
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "hhh\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "ccc\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n"
      "hhh\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, AcceptAllInsertions) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,2 +2,3 @@",
        " bbb",
        "+ccc",  // delete this line
        " ddd",
        "@@ -5,2 +6,3 @@",
        " fff",
        "+ggg",  // delete this line
        " hhh",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("a\n");  // accept all
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "hhh\n";
  constexpr absl::string_view kExpected =
      "aaa\n"
      "bbb\n"
      "ccc\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "ggg\n"
      "hhh\n";

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(FilePatchPickApplyTest, RejectAllInsertions) {
  {
    const std::vector<absl::string_view> kHunkText{
        "--- foo.txt\t2012-01-01",
        "+++ foo-formatted.txt\t2012-01-01",
        "@@ -2,2 +2,3 @@",
        " bbb",
        "+ccc",  // delete this line
        " ddd",
        "@@ -5,2 +6,3 @@",
        " fff",
        "+ggg",  // delete this line
        " hhh",
    };
    const auto status = ParseLines(kHunkText);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("d\n");  // reject all
  std::ostringstream outs;

  constexpr absl::string_view kOriginal =
      "aaa\n"
      "bbb\n"
      "ddd\n"
      "eee\n"
      "fff\n"
      "hhh\n";
  constexpr absl::string_view kExpected = kOriginal;

  const auto status =
      PickApply(ins, outs,  //
                ReadStringFileSequence({{"foo.txt", kOriginal}}),
                ExpectStringFileSequence({{"foo.txt", kExpected}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

}  // namespace
}  // namespace internal

namespace {
// public interface tests

TEST(PatchSetParseTest, InvalidInputs) {
  constexpr absl::string_view kTestCases[] = {
      // no "+++" marker for source
      "--- /path/to/file.txt\t2020-03-30\n",
      // hunk line counts are inconsistent
      "--- /path/to/file.txt\t2020-03-29\n"
      "+++ /path/to/file.txt\t2020-03-30\n"
      "@@ -2,1 +3,1 @@\n",
      // second hunk line counts are inconsistent
      "--- /path/to/file.txt\t2020-03-29\n"
      "+++ /path/to/file.txt\t2020-03-30\n"
      "@@ -12,0 +13,0 @@\n"
      "@@ -42,1 +43,1 @@\n",
      // malformed hunk marked-line
      "--- /path/to/file.txt\t2020-03-29\n"
      "+++ /path/to/file.txt\t2020-03-30\n"
      "@@ -2,1 +3,1 @@\n"
      "malformed line does not begin with [ -+]",
  };
  for (const auto &patch_contents : kTestCases) {
    PatchSet patch_set;
    EXPECT_FALSE(patch_set.Parse(patch_contents).ok()) << "contents:\n"
                                                       << patch_contents;
  }
}

TEST(PatchSetParseAndPrintTest, ValidInputs) {
  constexpr absl::string_view kTestCases[] = {
      // no metadata here
      "--- /path/to/file.txt\t2020-03-30\n"
      "+++ /path/to/file.txt\t2020-03-30\n"
      "@@ -12,3 +13,2 @@\n"
      " no change here\n"
      "-delete me\n"
      " no change here\n"
      "@@ -52,2 +53,3 @@\n"
      " no change here\n"
      "+add me\n"
      " no change here\n",
      // with patchset metadata here
      "metadata\n"
      "From: hobbit@fryingpan.org\n"
      "To: hobbit@fire.org\n"
      "metadata\n"
      "\n"
      "--- /path/to/file.txt\t2020-03-30\n"
      "+++ /path/to/file.txt\t2020-03-30\n"
      "@@ -12,3 +13,2 @@\n"
      " no change here\n"
      "-delete me\n"
      " no change here\n"
      "@@ -52,2 +53,3 @@\n"
      " no change here\n"
      "+add me\n"
      " no change here\n",
      // with file metadata in two files
      "diff -u /path/to/file1.txt local/path/to/file1.txt\n"
      "--- /path/to/file1.txt\t2020-03-30\n"
      "+++ /path/to/file1.txt\t2020-03-30\n"
      "@@ -12,3 +13,2 @@\n"
      " no change here\n"
      "-delete me\n"
      " no change here\n"
      "diff -u /path/to/file2.txt local/path/to/file2.txt\n"
      "--- /path/to/file2.txt\t2020-03-30\n"
      "+++ /path/to/file2.txt\t2020-03-30\n"
      "@@ -52,2 +53,3 @@\n"
      " no change here\n"
      "+add me\n"
      " no change here\n",
      // with patchset metadata and file metadata in two files
      "From: author@fryingpan.org\n"
      "To: reviewer@fire.org\n"
      "\n"
      "diff -u /path/to/file1.txt local/path/to/file1.txt\n"
      "--- /path/to/file1.txt\t2020-03-30\n"
      "+++ /path/to/file1.txt\t2020-03-30\n"
      "@@ -12,3 +13,2 @@\n"
      " no change here\n"
      "-delete me\n"
      " no change here\n"
      "diff -u /path/to/file2.txt local/path/to/file2.txt\n"
      "--- /path/to/file2.txt\t2020-03-30\n"
      "+++ /path/to/file2.txt\t2020-03-30\n"
      "@@ -52,2 +53,3 @@\n"
      " no change here\n"
      "+add me\n"
      " no change here\n",
  };

  for (const auto &patch_contents : kTestCases) {
    PatchSet patch_set;
    const auto status = patch_set.Parse(patch_contents);
    EXPECT_TRUE(status.ok()) << status.message();

    // Validate reversibility.
    std::ostringstream stream;
    stream << patch_set;
    EXPECT_EQ(stream.str(), patch_contents);
  }
}

TEST(PatchSetAddedLinesMapTest, NewAndExistingFile) {
  constexpr absl::string_view patch_contents =  //
      "diff -u /dev/null local/path/to/file1.txt\n"
      "--- /dev/null\t2020-03-30\n"
      "+++ /path/to/file1.txt\t2020-03-30\n"  // new file
      "@@ -0,0 +1,2 @@\n"
      "+add me\n"
      "+add me too\n"
      "--- /path/to/file2.txt\t2020-03-30\n"
      "+++ /path/to/file2.txt\t2020-03-30\n"  // existing file
      "@@ -52,2 +53,4 @@\n"
      " no change here\n"
      "+add me\n"
      "+add me too\n"
      " no change here\n"
      "diff -u local/path/to/file3.txt /dev/null\n"
      "--- /path/to/file3.txt\t2020-03-30\n"  // deleted file
      "+++ /dev/null\t2020-03-30\n"
      "@@ -1,2 +0,0 @@\n"
      "-bye\n"
      "-bye\n";
  PatchSet patch_set;
  const auto status = patch_set.Parse(patch_contents);
  ASSERT_TRUE(status.ok()) << status.message();

  using P = FileLineNumbersMap::value_type;
  EXPECT_THAT(patch_set.AddedLinesMap(false),
              ElementsAre(P{"/path/to/file1.txt", {}},
                          P{"/path/to/file2.txt", {{54, 56}}}));
  EXPECT_THAT(patch_set.AddedLinesMap(true),
              ElementsAre(P{"/path/to/file1.txt", {{1, 3}}},
                          P{"/path/to/file2.txt", {{54, 56}}}));
  // Neither case should include deleted files like file3.txt
}

class PatchSetPickApplyTest : public PatchSet, public ::testing::Test {};

TEST_F(PatchSetPickApplyTest, EmptyFilePatchHunks) {
  {
    constexpr absl::string_view patch_contents =  //
        "diff -u /dev/null local/path/to/file1.txt\n"
        "--- foo/bar.txt\t2020-03-30\n"
        "+++ foo/bar-formatted.txt\t2020-03-30\n";
    const auto status = Parse(patch_contents);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins;
  std::ostringstream outs;
  // No file I/O or prompting because patch is empty.
  const auto status = PickApply(
      ins, outs,  //
      internal::ReadStringFileSequence({{"foo/bar.txt", "don't care\n"}}),
      internal::ExpectStringFileSequence({{"foo/bar.txt", "don't care\n"}}));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_TRUE(outs.str().empty()) << "Unexpected: " << outs.str();
}

TEST_F(PatchSetPickApplyTest, MultipleEmptyFilePatchHunks) {
  {
    constexpr absl::string_view patch_contents =  //
        "diff -u /dev/null local/path/to/file1.txt\n"
        "--- foo/bar.txt\t2020-03-30\n"
        "+++ foo/bar-formatted.txt\t2020-03-30\n"
        "--- bar/foo.txt\t2020-03-30\n"
        "+++ bar/foo-formatted.txt\t2020-03-30\n";
    const auto status = Parse(patch_contents);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins;
  std::ostringstream outs;
  // No file I/O or prompting because patches are empty.
  const auto status = PickApply(ins, outs,  //
                                internal::ReadStringFileSequence({
                                    {"foo/bar.txt", "don't care\n"},
                                    {"bar/foo.txt", "don't care\n"},
                                }),
                                internal::ExpectStringFileSequence({
                                    {"foo/bar.txt", "don't care\n"},
                                    {"bar/foo.txt", "don't care\n"},
                                }));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_TRUE(outs.str().empty()) << "Unexpected: " << outs.str();
}

TEST_F(PatchSetPickApplyTest, MultipleNonEmptyFilePatchHunks) {
  {
    constexpr absl::string_view patch_contents =  //
        "diff -u /dev/null local/path/to/file1.txt\n"
        "--- foo/bar.txt\t2020-03-30\n"
        "+++ foo/bar-formatted.txt\t2020-03-30\n"
        "@@ -1,3 +1,2 @@\n"
        " you\n"
        "-lose\n"
        " some\n"
        "--- bar/foo.txt\t2020-03-30\n"
        "+++ bar/foo-formatted.txt\t2020-03-30\n"
        "@@ -1,2 +1,3 @@\n"
        " you\n"
        "+win\n"
        " some\n";
    const auto status = Parse(patch_contents);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("y\ny\n");  // accept one hunk in each file
  std::ostringstream outs;
  // No file I/O or prompting because patches are empty.
  const auto status = PickApply(ins, outs,  //
                                internal::ReadStringFileSequence({
                                    {"foo/bar.txt", "you\nlose\nsome\n"},
                                    {"bar/foo.txt", "you\nsome\n"},
                                }),
                                internal::ExpectStringFileSequence({
                                    {"foo/bar.txt", "you\nsome\n"},
                                    {"bar/foo.txt", "you\nwin\nsome\n"},
                                }));
  EXPECT_TRUE(status.ok()) << "Got: " << status.message();
  EXPECT_FALSE(outs.str().empty());
}

TEST_F(PatchSetPickApplyTest, FirstFilePatchOutOfOrder) {
  {
    constexpr absl::string_view patch_contents =  //
        "diff -u /dev/null local/path/to/file1.txt\n"
        "--- foo/bar.txt\t2020-03-30\n"
        "+++ foo/bar-formatted.txt\t2020-03-30\n"
        "@@ -4,3 +3,2 @@\n"  // out-of-order
        " out\n"
        "-of\n"
        " order\n"
        "@@ -1,3 +1,2 @@\n"
        " you\n"
        "-lose\n"
        " some\n"
        "--- bar/foo.txt\t2020-03-30\n"
        "+++ bar/foo-formatted.txt\t2020-03-30\n"
        "@@ -1,2 +1,3 @@\n"
        " you\n"
        "+win\n"
        " some\n";
    const auto status = Parse(patch_contents);
    ASSERT_TRUE(status.ok()) << status.message();
  }

  std::istringstream ins("y\ny\n");  // accept
  std::ostringstream outs;
  // No file I/O or prompting because patches are empty.
  const auto status =
      PickApply(ins, outs,  //
                internal::ReadStringFileSequence({
                    {"foo/bar.txt", "you\nlose\nsome\nout\nof\norder"},
                    {"bar/foo.txt", "you\nsome\n"},
                }),
                internal::ExpectStringFileSequence({
                    {"foo/bar.txt", "you\nsome\n"},
                    {"bar/foo.txt", "you\nwin\nsome\n"},
                }));
  EXPECT_FALSE(status.ok());
  EXPECT_TRUE(absl::StrContains(status.message(), "not properly ordered"));
}

}  // namespace
}  // namespace verible
