// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "third_party/libaddressinput/chromium/addressinput_util.h"

#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h"

namespace autofill {
namespace addressinput {

using ::i18n::addressinput::AddressData;
using ::i18n::addressinput::AddressField;
using ::i18n::addressinput::AddressProblem;

TEST(AddressinputUtilTest, AddressRequiresRegionCode) {
  AddressData address;
  EXPECT_FALSE(HasAllRequiredFields(address));
}

TEST(AddressinputUtilTest, UsRequiresState) {
  AddressData address;
  address.region_code = "US";
  address.postal_code = "90291";
  // Leave state empty.
  address.locality = "Los Angeles";
  address.address_line.push_back("340 Main St.");
  EXPECT_FALSE(HasAllRequiredFields(address));
}

TEST(AddressinputUtilTest, CompleteAddressReturnsTrue) {
  AddressData address;
  address.region_code = "US";
  address.postal_code = "90291";
  address.administrative_area = "CA";
  address.locality = "Los Angeles";
  address.address_line.push_back("340 Main St.");
  EXPECT_TRUE(HasAllRequiredFields(address));
}

TEST(AddressinputUtilTest, MissingFieldsAreAddedToProblems) {
  AddressData address;
  address.region_code = "US";
  // Leave postal code empty.
  // Leave state empty.
  address.locality = "Los Angeles";
  address.address_line.push_back("340 Main St.");

  std::multimap<AddressField, AddressProblem> empty_filter;
  std::multimap<AddressField, AddressProblem> problems;

  ValidateRequiredFields(address, &empty_filter, &problems);
  EXPECT_EQ(problems.size(), 2);
}

TEST(AddressinputUtilTest, OnlyFieldsContainedInFilterAreAddedToProblems) {
  AddressData address;
  address.region_code = "US";
  // Leave postal code empty.
  // Leave state empty.
  address.locality = "Los Angeles";
  address.address_line.push_back("340 Main St.");

  std::multimap<AddressField, AddressProblem> include_postal_code_filter;
  include_postal_code_filter.insert(std::make_pair(
      AddressField::POSTAL_CODE, AddressProblem::MISSING_REQUIRED_FIELD));
  std::multimap<AddressField, AddressProblem> problems;

  ValidateRequiredFields(address, &include_postal_code_filter, &problems);
  ASSERT_EQ(problems.size(), 1);
  EXPECT_EQ(problems.begin()->first, AddressField::POSTAL_CODE);
  EXPECT_EQ(problems.begin()->second, AddressProblem::MISSING_REQUIRED_FIELD);
}

TEST(AddressinputUtilTest, AllMissingFieldsAreAddedToProblems) {
  AddressData address;
  address.region_code = "US";
  // Leave postal code empty.
  // Leave state empty.
  address.locality = "Los Angeles";
  address.address_line.push_back("340 Main St.");

  std::multimap<AddressField, AddressProblem> empty_filter;
  std::multimap<AddressField, AddressProblem> problems;

  ValidateRequiredFieldsExceptFilteredOut(address, &empty_filter, &problems);
  EXPECT_EQ(problems.size(), 2);
}

TEST(AddressinputUtilTest, FieldsContainedInFilterAreExcludedFromProblems) {
  AddressData address;
  address.region_code = "US";
  // Leave postal code empty.
  // Leave state empty.
  address.locality = "Los Angeles";
  address.address_line.push_back("340 Main St.");

  std::multimap<AddressField, AddressProblem> exclude_postal_code_filter;
  exclude_postal_code_filter.insert(std::make_pair(
      AddressField::POSTAL_CODE, AddressProblem::MISSING_REQUIRED_FIELD));
  std::multimap<AddressField, AddressProblem> problems;

  ValidateRequiredFieldsExceptFilteredOut(address, &exclude_postal_code_filter,
                                          &problems);
  ASSERT_EQ(problems.size(), 1);
  EXPECT_EQ(problems.begin()->first, AddressField::ADMIN_AREA);
  EXPECT_EQ(problems.begin()->second, AddressProblem::MISSING_REQUIRED_FIELD);
}

}  // namespace addressinput
}  // namespace autofill
