// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_FTP_FTP_DIRECTORY_LISTING_PARSER_UNITTEST_H_
#define NET_FTP_FTP_DIRECTORY_LISTING_PARSER_UNITTEST_H_

#include <vector>

#include "base/strings/utf_string_conversions.h"
#include "net/ftp/ftp_directory_listing_parser.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace net {

class FtpDirectoryListingParserTest : public testing::Test {
 public:
  struct SingleLineTestData {
    const char* input;
    FtpDirectoryListingEntry::Type type;
    const char* filename;
    int64 size;
    int year;
    int month;
    int day_of_month;
    int hour;
    int minute;
  };

 protected:
  FtpDirectoryListingParserTest() {}

  std::vector<base::string16> GetSingleLineTestCase(const std::string& text) {
    std::vector<base::string16> lines;
    lines.push_back(base::UTF8ToUTF16(text));
    return lines;
  }

  void VerifySingleLineTestCase(
      const SingleLineTestData& test_case,
      const std::vector<FtpDirectoryListingEntry>& entries) {
    ASSERT_FALSE(entries.empty());

    FtpDirectoryListingEntry entry = entries[0];
    EXPECT_EQ(test_case.type, entry.type);
    EXPECT_EQ(base::UTF8ToUTF16(test_case.filename), entry.name);
    EXPECT_EQ(test_case.size, entry.size);

    base::Time::Exploded time_exploded;
    entry.last_modified.LocalExplode(&time_exploded);

    // Only test members displayed on the directory listing.
    EXPECT_EQ(test_case.year, time_exploded.year);
    EXPECT_EQ(test_case.month, time_exploded.month);
    EXPECT_EQ(test_case.day_of_month, time_exploded.day_of_month);
    EXPECT_EQ(test_case.hour, time_exploded.hour);
    EXPECT_EQ(test_case.minute, time_exploded.minute);

    EXPECT_EQ(1U, entries.size());
  }

  base::Time GetMockCurrentTime() {
    base::Time::Exploded mock_current_time_exploded = { 0 };
    mock_current_time_exploded.year = 1994;
    mock_current_time_exploded.month = 11;
    mock_current_time_exploded.day_of_month = 15;
    mock_current_time_exploded.hour = 12;
    mock_current_time_exploded.minute = 45;
    return base::Time::FromLocalExploded(mock_current_time_exploded);
  }
};

}  // namespace net

#endif  // NET_FTP_FTP_DIRECTORY_LISTING_PARSER_UNITTEST_H_

