credit_card_unittest.cc revision 3240926e260ce088908e02ac07a6cf7b0c0cbf44
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/guid.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_common_test.h"
93240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "components/autofill/core/browser/autofill_type.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/validation.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "grit/webkit_resources.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// From https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* const kValidNumbers[] = {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "378282246310005",
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3714 4963 5398 431",
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3787-3449-3671-000",
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5610591081018250",
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3056 9309 0259 04",
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3852-0000-0232-37",
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "6011111111111117",
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "6011 0009 9013 9424",
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3530-1113-3330-0000",
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3566002020360505",
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5555 5555 5555 4444",
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5105-1051-0510-5100",
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4111111111111111",
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4012 8888 8888 1881",
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4222-2222-2222-2",
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5019717010103742",
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "6331101999990016",
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // A UnionPay card that doesn't pass the Luhn checksum
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  "6200000000000000",
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* const kInvalidNumbers[] = {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4111 1111 112", /* too short */
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "41111111111111111115", /* too long */
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4111-1111-1111-1110", /* wrong Luhn checksum */
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3056 9309 0259 04aa", /* non-digit characters */
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests credit card summary string generation.  This test simulates a variety
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of different possible summary strings.  Variations occur based on the
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// existence of credit card number, month, and year fields.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, PreviewSummaryAndObfuscatedNumberStrings) {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 0: empty credit card.
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card0(base::GenerateGUID(), "https://www.example.com/");
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary0 = credit_card0.Label();
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), summary0);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated0 = credit_card0.ObfuscatedNumber();
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), obfuscated0);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 00: Empty credit card with empty strings.
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card00(base::GenerateGUID(), "https://www.example.com/");
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&credit_card00,"John Dillinger", "", "", "");
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary00 = credit_card00.Label();
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(ASCIIToUTF16("John Dillinger")), summary00);
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated00 = credit_card00.ObfuscatedNumber();
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), obfuscated00);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 1: No credit card number.
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card1(base::GenerateGUID(), "https://www.example.com/");
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&credit_card1,"John Dillinger", "", "01", "2010");
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary1 = credit_card1.Label();
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(ASCIIToUTF16("John Dillinger")), summary1);
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated1 = credit_card1.ObfuscatedNumber();
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), obfuscated1);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 2: No month.
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card2(base::GenerateGUID(), "https://www.example.com/");
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card2, "John Dillinger", "5105 1051 0510 5100", "", "2010");
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary2 = credit_card2.Label();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), summary2);
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated2 = credit_card2.ObfuscatedNumber();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated2);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 3: No year.
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card3(base::GenerateGUID(), "https://www.example.com/");
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card3, "John Dillinger", "5105 1051 0510 5100", "01", "");
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary3 = credit_card3.Label();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), summary3);
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated3 = credit_card3.ObfuscatedNumber();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated3);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 4: Have everything.
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card4(base::GenerateGUID(), "https://www.example.com/");
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card4, "John Dillinger", "5105 1051 0510 5100", "01", "2010");
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary4 = credit_card4.Label();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100, Exp: 01/2010"), summary4);
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated4 = credit_card4.ObfuscatedNumber();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated4);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 5: Very long credit card
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card5(base::GenerateGUID(), "https://www.example.com/");
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card5,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "John Dillinger",
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "0123456789 0123456789 0123456789 5105 1051 0510 5100", "01", "2010");
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary5 = credit_card5.Label();
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("********************5100, Exp: 01/2010"), summary5);
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated5 = credit_card5.ObfuscatedNumber();
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("********************5100"), obfuscated5);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, AssignmentOperator) {
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard a(base::GenerateGUID(), "some origin");
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test::SetCreditCardInfo(&a, "John Dillinger", "123456789012", "01", "2010");
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Result of assignment should be logically equal to the original profile.
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard b(base::GenerateGUID(), "some other origin");
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  b = a;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(a == b);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Assignment to self should not change the profile value.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  a = a;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(a == b);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(CreditCardTest, Copy) {
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard a(base::GenerateGUID(), "https://www.example.com");
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test::SetCreditCardInfo(&a, "John Dillinger", "123456789012", "01", "2010");
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Clone should be logically equal to the original.
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreditCard b(a);
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(a == b);
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(CreditCardTest, Compare) {
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard a(base::GenerateGUID(), std::string());
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard b(base::GenerateGUID(), std::string());
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Empty cards are the same.
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, a.Compare(b));
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GUIDs don't count.
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  a.set_guid(base::GenerateGUID());
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  b.set_guid(base::GenerateGUID());
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, a.Compare(b));
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Origins don't count.
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  a.set_origin("apple");
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  b.set_origin("banana");
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, a.Compare(b));
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Different values produce non-zero results.
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&a, "Jimmy", NULL, NULL, NULL);
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&b, "Ringo", NULL, NULL, NULL);
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_GT(0, a.Compare(b));
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LT(0, b.Compare(a));
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test we get the correct icon for each card type.
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(CreditCardTest, IconResourceId) {
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_AMEX,
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kAmericanExpressCard));
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_DINERS,
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kDinersCard));
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_DISCOVER,
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kDiscoverCard));
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_JCB,
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kJCBCard));
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_MASTERCARD,
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kMasterCard));
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_VISA,
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kVisaCard));
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(CreditCardTest, UpdateFromImportedCard) {
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CreditCard original_card(base::GenerateGUID(), "https://www.example.com");
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test::SetCreditCardInfo(
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      &original_card, "John Dillinger", "123456789012", "09", "2017");
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CreditCard a = original_card;
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The new card has a different name, expiration date, and origin.
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CreditCard b = a;
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_guid(base::GenerateGUID());
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_origin("https://www.example.org");
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("J. Dillinger"));
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("08"));
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2019"));
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("https://www.example.org", a.origin());
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with no name set for |b|.
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NAME, base::string16());
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("https://www.example.org", a.origin());
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("John Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with only the original card having a verified origin.
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // |a| should be unchanged.
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a.set_origin("Chrome settings");
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("J. Dillinger"));
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Chrome settings", a.origin());
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("John Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("09"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2017"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with only the new card having a verified origin.
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_origin("Chrome settings");
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Chrome settings", a.origin());
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, with both cards having a verified origin.
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a.set_origin("Chrome Autofill dialog");
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_origin("Chrome settings");
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Chrome settings", a.origin());
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with |b| having a different card number.
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // |a| should be unchanged.
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(a.UpdateFromImportedCard(b, "en-US"));
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(original_card, a);
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, IsComplete) {
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(card.IsComplete());
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Wally T. Walrus"));
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(card.IsComplete());
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(card.IsComplete());
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2014"));
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kValidNumbers); ++i) {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(kValidNumbers[i]);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16(kValidNumbers[i]));
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(card.IsComplete());
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kInvalidNumbers); ++i) {
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(kInvalidNumbers[i]);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16(kInvalidNumbers[i]));
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(card.IsComplete());
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(CreditCardTest, IsValid) {
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CreditCard card;
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Invalid because expired
277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("1"));
278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2010"));
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(card.IsValid());
281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Invalid because card number is not complete
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("12"));
284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("9999"));
285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("41111"));
286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(card.IsValid());
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Valid
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("12"));
290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("9999"));
291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(card.IsValid());
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, InvalidMastercardNumber) {
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&card, "Baby Face Nelson",
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "5200000000000004", "01", "2010");
300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(kMasterCard, card.type());
301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(card.IsComplete());
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that we preserve exactly what the user typed for credit card numbers.
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, SetRawInfoCreditCardNumber) {
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&card, "Bob Dylan",
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "4321-5432-6543-xxxx", "07", "2013");
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("4321-5432-6543-xxxx"),
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            card.GetRawInfo(CREDIT_CARD_NUMBER));
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that we can handle both numeric and named months.
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, SetExpirationMonth) {
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("05"));
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("05"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(5, card.expiration_month());
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("7"));
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("07"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(7, card.expiration_month());
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should fail, and preserve the previous value.
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("January"));
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("07"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(7, card.expiration_month());
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  card.SetInfo(
3323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      AutofillType(CREDIT_CARD_EXP_MONTH), ASCIIToUTF16("January"), "en-US");
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("01"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, card.expiration_month());
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  card.SetInfo(
3373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      AutofillType(CREDIT_CARD_EXP_MONTH), ASCIIToUTF16("Apr"), "en-US");
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("04"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4, card.expiration_month());
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardType) {
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The card type cannot be set directly.
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_TYPE, ASCIIToUTF16("Visa"));
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), card.GetRawInfo(CREDIT_CARD_TYPE));
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setting the number should implicitly set the type.
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111 1111 1111 1111"));
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Visa"), card.GetRawInfo(CREDIT_CARD_TYPE));
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardVerificationCode) {
35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The verification code cannot be set, as Chrome does not store this data.
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, ASCIIToUTF16("999"));
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardMonthExact) {
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kMonthsNumeric[] = {
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12",
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kMonthsNumeric));
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kMonthsNumeric); ++i) {
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kMonthsNumeric[i]);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
3793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  credit_card.FillSelectControl(
3803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      AutofillType(CREDIT_CARD_EXP_MONTH), "en-US", &field);
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("01"), field.value);
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardMonthAbbreviated) {
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kMonthsAbbreviated[] = {
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kMonthsAbbreviated));
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kMonthsAbbreviated); ++i) {
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kMonthsAbbreviated[i]);
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
39990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
4013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  credit_card.FillSelectControl(
4023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      AutofillType(CREDIT_CARD_EXP_MONTH), "en-US", &field);
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Jan"), field.value);
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardMonthFull) {
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kMonthsFull[] = {
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "January", "February", "March", "April", "May", "June",
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "July", "August", "September", "October", "November", "December",
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kMonthsFull));
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kMonthsFull); ++i) {
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kMonthsFull[i]);
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
4233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  credit_card.FillSelectControl(
4243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      AutofillType(CREDIT_CARD_EXP_MONTH), "en-US", &field);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("January"), field.value);
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardMonthNumeric) {
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kMonthsNumeric[] = {
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kMonthsNumeric));
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kMonthsNumeric); ++i) {
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kMonthsNumeric[i]);
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
4443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  credit_card.FillSelectControl(
4453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      AutofillType(CREDIT_CARD_EXP_MONTH), "en-US", &field);
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("1"), field.value);
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardTwoDigitYear) {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kYears[] = {
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "12", "13", "14", "15", "16", "17", "18", "19"
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kYears));
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kYears); ++i) {
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kYears[i]);
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
46390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2017"));
4653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  credit_card.FillSelectControl(
4663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), "en-US", &field);
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("17"), field.value);
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2017, credit_card.expiration_year());
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardTypeSelectControl) {
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kCreditCardTypes[] = {
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "Visa", "Master Card", "AmEx", "discover"
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kCreditCardTypes));
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kCreditCardTypes); ++i) {
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kCreditCardTypes[i]);
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Credit card types are inferred from the numbers, so we use test numbers for
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // each card type. Test card numbers are drawn from
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Normal case:
49190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ASCIIToUTF16("4111111111111111"));
4943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    credit_card.FillSelectControl(
4953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        AutofillType(CREDIT_CARD_TYPE), "en-US", &field);
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Visa"), field.value);
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Filling should be able to handle intervening whitespace:
50190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ASCIIToUTF16("5105105105105100"));
5043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    credit_card.FillSelectControl(
5053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        AutofillType(CREDIT_CARD_TYPE), "en-US", &field);
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Master Card"), field.value);
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // American Express is sometimes abbreviated as AmEx:
51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credit_card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("371449635398431"));
5133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    credit_card.FillSelectControl(
5143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        AutofillType(CREDIT_CARD_TYPE), "en-US", &field);
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("AmEx"), field.value);
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Case insensitivity:
52090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ASCIIToUTF16("6011111111111117"));
5233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    credit_card.FillSelectControl(
5243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        AutofillType(CREDIT_CARD_TYPE), "en-US", &field);
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("discover"), field.value);
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(CreditCardTest, GetCreditCardType) {
530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct {
531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string card_number;
532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string type;
533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool is_valid;
534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } test_cases[] = {
535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // The relevant sample numbers from
536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "378282246310005", kAmericanExpressCard, true },
538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "371449635398431", kAmericanExpressCard, true },
539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "378734493671000", kAmericanExpressCard, true },
540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "30569309025904", kDinersCard, true },
541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "38520000023237", kDinersCard, true },
542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011111111111117", kDiscoverCard, true },
543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000990139424", kDiscoverCard, true },
544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3530111333300000", kJCBCard, true },
545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3566002020360505", kJCBCard, true },
546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5555555555554444", kMasterCard, true },
547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5105105105105100", kMasterCard, true },
548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4111111111111111", kVisaCard, true },
549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4012888888881881", kVisaCard, true },
550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4222222222222", kVisaCard, true },
551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // The relevant sample numbers from
553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // http://auricsystems.com/support-center/sample-credit-card-numbers/
554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "343434343434343", kAmericanExpressCard, true },
555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "371144371144376", kAmericanExpressCard, true },
556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "341134113411347", kAmericanExpressCard, true },
557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36438936438936", kDinersCard, true },
558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36110361103612", kDinersCard, true },
559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36111111111111", kDinersCard, true },
560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011016011016011", kDiscoverCard, true },
561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000990139424", kDiscoverCard, true },
562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000000000004", kDiscoverCard, true },
563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000995500000", kDiscoverCard, true },
564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6500000000000002", kDiscoverCard, true },
565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3566002020360505", kJCBCard, true },
566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3528000000000007", kJCBCard, true },
567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5500005555555559", kMasterCard, true },
568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5555555555555557", kMasterCard, true },
569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5454545454545454", kMasterCard, true },
570eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5555515555555551", kMasterCard, true },
571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5405222222222226", kMasterCard, true },
572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5478050000000007", kMasterCard, true },
573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5111005111051128", kMasterCard, true },
574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5112345112345114", kMasterCard, true },
575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5115915115915118", kMasterCard, true },
576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // A UnionPay card that doesn't pass the Luhn checksum
5787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    { "6200000000000000", kUnionPay, true },
5797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Empty string
581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { std::string(), kGenericCard, false },
582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Non-numeric
584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "garbage", kGenericCard, false },
585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4garbage", kVisaCard, false },
586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
587eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Fails Luhn check.
588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4111111111111112", kVisaCard, false },
589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Invalid length.
591eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3434343434343434", kAmericanExpressCard, false },
592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "411111111111116", kVisaCard, false },
593eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Issuer Identification Numbers (IINs) that Chrome recognizes.
595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4", kVisaCard, false },
596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "34", kAmericanExpressCard, false },
597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "37", kAmericanExpressCard, false },
598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "300", kDinersCard, false },
599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "301", kDinersCard, false },
600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "302", kDinersCard, false },
601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "303", kDinersCard, false },
602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "304", kDinersCard, false },
603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "305", kDinersCard, false },
604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3095", kDinersCard, false },
605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36", kDinersCard, false },
606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "38", kDinersCard, false },
607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "39", kDinersCard, false },
608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011", kDiscoverCard, false },
609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "644", kDiscoverCard, false },
610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "645", kDiscoverCard, false },
611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "646", kDiscoverCard, false },
612eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "647", kDiscoverCard, false },
613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "648", kDiscoverCard, false },
614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "649", kDiscoverCard, false },
615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "65", kDiscoverCard, false },
616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3528", kJCBCard, false },
617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3531", kJCBCard, false },
618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3589", kJCBCard, false },
619eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "51", kMasterCard, false },
620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "52", kMasterCard, false },
621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "53", kMasterCard, false },
622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "54", kMasterCard, false },
623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "55", kMasterCard, false },
6247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    { "62", kUnionPay, false },
625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Not enough data to determine an IIN uniquely.
627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3", kGenericCard, false },
628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "30", kGenericCard, false },
629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "309", kGenericCard, false },
630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "35", kGenericCard, false },
631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5", kGenericCard, false },
632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6", kGenericCard, false },
633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "60", kGenericCard, false },
634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "601", kGenericCard, false },
635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "64", kGenericCard, false },
636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
637eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Unknown IINs.
638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "0", kGenericCard, false },
639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "1", kGenericCard, false },
640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "2", kGenericCard, false },
641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "306", kGenericCard, false },
642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "307", kGenericCard, false },
643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "308", kGenericCard, false },
644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3091", kGenericCard, false },
645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3094", kGenericCard, false },
646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3096", kGenericCard, false },
647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "31", kGenericCard, false },
648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "32", kGenericCard, false },
649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "33", kGenericCard, false },
650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "351", kGenericCard, false },
651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3527", kGenericCard, false },
652eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "359", kGenericCard, false },
653eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "50", kGenericCard, false },
654eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "56", kGenericCard, false },
655eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "57", kGenericCard, false },
656eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "58", kGenericCard, false },
657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "59", kGenericCard, false },
658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "600", kGenericCard, false },
659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "602", kGenericCard, false },
660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "603", kGenericCard, false },
661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "604", kGenericCard, false },
662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "605", kGenericCard, false },
663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "606", kGenericCard, false },
664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "607", kGenericCard, false },
665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "608", kGenericCard, false },
666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "609", kGenericCard, false },
667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "61", kGenericCard, false },
668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "63", kGenericCard, false },
669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "640", kGenericCard, false },
670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "641", kGenericCard, false },
671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "642", kGenericCard, false },
672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "643", kGenericCard, false },
673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "66", kGenericCard, false },
674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "67", kGenericCard, false },
675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "68", kGenericCard, false },
676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "69", kGenericCard, false },
677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "7", kGenericCard, false },
678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "8", kGenericCard, false },
679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "9", kGenericCard, false },
680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Oddball case: Unknown issuer, but valid Luhn check and plausible length.
682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "7000700070007000", kGenericCard, true },
683eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
684eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
685eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
686eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 card_number = ASCIIToUTF16(test_cases[i].card_number);
687eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE(card_number);
688eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(test_cases[i].type, CreditCard::GetCreditCardType(card_number));
689eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(test_cases[i].is_valid, IsValidCreditCardNumber(card_number));
690eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
692eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
694