credit_card_unittest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/validation.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "grit/webkit_resources.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// From https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* const kValidNumbers[] = {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "378282246310005",
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3714 4963 5398 431",
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3787-3449-3671-000",
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5610591081018250",
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3056 9309 0259 04",
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3852-0000-0232-37",
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "6011111111111117",
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "6011 0009 9013 9424",
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3530-1113-3330-0000",
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3566002020360505",
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5555 5555 5555 4444",
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5105-1051-0510-5100",
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4111111111111111",
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4012 8888 8888 1881",
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4222-2222-2222-2",
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "5019717010103742",
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "6331101999990016",
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // A UnionPay card that doesn't pass the Luhn checksum
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  "6200000000000000",
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* const kInvalidNumbers[] = {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4111 1111 112", /* too short */
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "41111111111111111115", /* too long */
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "4111-1111-1111-1110", /* wrong Luhn checksum */
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "3056 9309 0259 04aa", /* non-digit characters */
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests credit card summary string generation.  This test simulates a variety
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of different possible summary strings.  Variations occur based on the
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// existence of credit card number, month, and year fields.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, PreviewSummaryAndObfuscatedNumberStrings) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 0: empty credit card.
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card0(base::GenerateGUID(), "https://www.example.com/");
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary0 = credit_card0.Label();
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), summary0);
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated0 = credit_card0.ObfuscatedNumber();
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), obfuscated0);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 00: Empty credit card with empty strings.
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card00(base::GenerateGUID(), "https://www.example.com/");
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&credit_card00,"John Dillinger", "", "", "");
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary00 = credit_card00.Label();
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(ASCIIToUTF16("John Dillinger")), summary00);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated00 = credit_card00.ObfuscatedNumber();
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), obfuscated00);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 1: No credit card number.
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card1(base::GenerateGUID(), "https://www.example.com/");
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&credit_card1,"John Dillinger", "", "01", "2010");
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary1 = credit_card1.Label();
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(ASCIIToUTF16("John Dillinger")), summary1);
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated1 = credit_card1.ObfuscatedNumber();
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), obfuscated1);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 2: No month.
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card2(base::GenerateGUID(), "https://www.example.com/");
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card2, "John Dillinger", "5105 1051 0510 5100", "", "2010");
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary2 = credit_card2.Label();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), summary2);
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated2 = credit_card2.ObfuscatedNumber();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated2);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 3: No year.
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card3(base::GenerateGUID(), "https://www.example.com/");
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card3, "John Dillinger", "5105 1051 0510 5100", "01", "");
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary3 = credit_card3.Label();
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), summary3);
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated3 = credit_card3.ObfuscatedNumber();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated3);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 4: Have everything.
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card4(base::GenerateGUID(), "https://www.example.com/");
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card4, "John Dillinger", "5105 1051 0510 5100", "01", "2010");
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary4 = credit_card4.Label();
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100, Exp: 01/2010"), summary4);
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated4 = credit_card4.ObfuscatedNumber();
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("************5100"), obfuscated4);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 5: Very long credit card
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card5(base::GenerateGUID(), "https://www.example.com/");
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &credit_card5,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "John Dillinger",
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "0123456789 0123456789 0123456789 5105 1051 0510 5100", "01", "2010");
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 summary5 = credit_card5.Label();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("********************5100, Exp: 01/2010"), summary5);
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 obfuscated5 = credit_card5.ObfuscatedNumber();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("********************5100"), obfuscated5);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, AssignmentOperator) {
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard a(base::GenerateGUID(), "some origin");
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test::SetCreditCardInfo(&a, "John Dillinger", "123456789012", "01", "2010");
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Result of assignment should be logically equal to the original profile.
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard b(base::GenerateGUID(), "some other origin");
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  b = a;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(a == b);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Assignment to self should not change the profile value.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  a = a;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(a == b);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(CreditCardTest, Copy) {
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard a(base::GenerateGUID(), "https://www.example.com");
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test::SetCreditCardInfo(&a, "John Dillinger", "123456789012", "01", "2010");
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Clone should be logically equal to the original.
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreditCard b(a);
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(a == b);
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(CreditCardTest, Compare) {
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard a(base::GenerateGUID(), std::string());
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard b(base::GenerateGUID(), std::string());
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Empty cards are the same.
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, a.Compare(b));
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GUIDs don't count.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  a.set_guid(base::GenerateGUID());
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  b.set_guid(base::GenerateGUID());
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, a.Compare(b));
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Origins don't count.
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  a.set_origin("apple");
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  b.set_origin("banana");
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, a.Compare(b));
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Different values produce non-zero results.
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&a, "Jimmy", NULL, NULL, NULL);
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&b, "Ringo", NULL, NULL, NULL);
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_GT(0, a.Compare(b));
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LT(0, b.Compare(a));
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test we get the correct icon for each card type.
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(CreditCardTest, IconResourceId) {
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_AMEX,
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kAmericanExpressCard));
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_DINERS,
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kDinersCard));
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_DISCOVER,
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kDiscoverCard));
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_JCB,
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kJCBCard));
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_MASTERCARD,
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kMasterCard));
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(IDR_AUTOFILL_CC_VISA,
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            CreditCard::IconResourceId(kVisaCard));
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(CreditCardTest, UpdateFromImportedCard) {
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CreditCard original_card(base::GenerateGUID(), "https://www.example.com");
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test::SetCreditCardInfo(
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      &original_card, "John Dillinger", "123456789012", "09", "2017");
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CreditCard a = original_card;
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The new card has a different name, expiration date, and origin.
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CreditCard b = a;
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_guid(base::GenerateGUID());
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_origin("https://www.example.org");
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("J. Dillinger"));
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("08"));
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2019"));
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("https://www.example.org", a.origin());
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with no name set for |b|.
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NAME, base::string16());
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("https://www.example.org", a.origin());
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("John Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with only the original card having a verified origin.
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // |a| should be unchanged.
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a.set_origin("Chrome settings");
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("J. Dillinger"));
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Chrome settings", a.origin());
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("John Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("09"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2017"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with only the new card having a verified origin.
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_origin("Chrome settings");
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Chrome settings", a.origin());
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, with both cards having a verified origin.
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a.set_origin("Chrome Autofill dialog");
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.set_origin("Chrome settings");
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(a.UpdateFromImportedCard(b, "en-US"));
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Chrome settings", a.origin());
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("J. Dillinger"), a.GetRawInfo(CREDIT_CARD_NAME));
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("08"), a.GetRawInfo(CREDIT_CARD_EXP_MONTH));
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("2019"), a.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Try again, but with |b| having a different card number.
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // |a| should be unchanged.
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  a = original_card;
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  b.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(a.UpdateFromImportedCard(b, "en-US"));
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(original_card, a);
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, IsComplete) {
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(card.IsComplete());
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Wally T. Walrus"));
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(card.IsComplete());
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(card.IsComplete());
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2014"));
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kValidNumbers); ++i) {
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(kValidNumbers[i]);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16(kValidNumbers[i]));
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(card.IsComplete());
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kInvalidNumbers); ++i) {
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(kInvalidNumbers[i]);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16(kInvalidNumbers[i]));
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(card.IsComplete());
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(CreditCardTest, IsValid) {
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CreditCard card;
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Invalid because expired
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("1"));
277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2010"));
278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(card.IsValid());
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Invalid because card number is not complete
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("12"));
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("9999"));
284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("41111"));
285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(card.IsValid());
286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Valid
288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("12"));
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("9999"));
290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(card.IsValid());
292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, InvalidMastercardNumber) {
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&card, "Baby Face Nelson",
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "5200000000000004", "01", "2010");
299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(kMasterCard, card.type());
300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(card.IsComplete());
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that we preserve exactly what the user typed for credit card numbers.
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, SetRawInfoCreditCardNumber) {
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(&card, "Bob Dylan",
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "4321-5432-6543-xxxx", "07", "2013");
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("4321-5432-6543-xxxx"),
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            card.GetRawInfo(CREDIT_CARD_NUMBER));
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that we can handle both numeric and named months.
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, SetExpirationMonth) {
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("05"));
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("05"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(5, card.expiration_month());
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("7"));
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("07"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(7, card.expiration_month());
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should fail, and preserve the previous value.
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("January"));
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("07"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(7, card.expiration_month());
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("January"), "en-US");
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("01"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, card.expiration_month());
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("Apr"), "en-US");
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("04"), card.GetRawInfo(CREDIT_CARD_EXP_MONTH));
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4, card.expiration_month());
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardType) {
34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The card type cannot be set directly.
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_TYPE, ASCIIToUTF16("Visa"));
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), card.GetRawInfo(CREDIT_CARD_TYPE));
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setting the number should implicitly set the type.
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111 1111 1111 1111"));
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Visa"), card.GetRawInfo(CREDIT_CARD_TYPE));
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardVerificationCode) {
35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard card(base::GenerateGUID(), "https://www.example.com/");
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The verification code cannot be set, as Chrome does not store this data.
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, ASCIIToUTF16("999"));
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardMonthExact) {
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kMonthsNumeric[] = {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12",
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kMonthsNumeric));
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kMonthsNumeric); ++i) {
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kMonthsNumeric[i]);
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, "en-US", &field);
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("01"), field.value);
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardMonthAbbreviated) {
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kMonthsAbbreviated[] = {
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kMonthsAbbreviated));
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kMonthsAbbreviated); ++i) {
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kMonthsAbbreviated[i]);
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
39590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, "en-US", &field);
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Jan"), field.value);
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardMonthFull) {
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kMonthsFull[] = {
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "January", "February", "March", "April", "May", "June",
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "July", "August", "September", "October", "November", "December",
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kMonthsFull));
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kMonthsFull); ++i) {
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kMonthsFull[i]);
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, "en-US", &field);
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("January"), field.value);
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardMonthNumeric) {
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kMonthsNumeric[] = {
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kMonthsNumeric));
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kMonthsNumeric); ++i) {
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kMonthsNumeric[i]);
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
43690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, "en-US", &field);
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("1"), field.value);
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardTwoDigitYear) {
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kYears[] = {
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "12", "13", "14", "15", "16", "17", "18", "19"
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kYears));
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kYears); ++i) {
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kYears[i]);
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2017"));
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  credit_card.FillSelectControl(CREDIT_CARD_EXP_4_DIGIT_YEAR, "en-US", &field);
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("17"), field.value);
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2017, credit_card.expiration_year());
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CreditCardTest, CreditCardTypeSelectControl) {
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* const kCreditCardTypes[] = {
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "Visa", "Master Card", "AmEx", "discover"
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> options(arraysize(kCreditCardTypes));
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kCreditCardTypes); ++i) {
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options[i] = ASCIIToUTF16(kCreditCardTypes[i]);
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "select-one";
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_values = options;
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.option_contents = options;
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Credit card types are inferred from the numbers, so we use test numbers for
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // each card type. Test card numbers are drawn from
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Normal case:
48390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ASCIIToUTF16("4111111111111111"));
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    credit_card.FillSelectControl(CREDIT_CARD_TYPE, "en-US", &field);
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Visa"), field.value);
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Filling should be able to handle intervening whitespace:
49290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ASCIIToUTF16("5105105105105100"));
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    credit_card.FillSelectControl(CREDIT_CARD_TYPE, "en-US", &field);
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Master Card"), field.value);
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // American Express is sometimes abbreviated as AmEx:
50190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credit_card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("371449635398431"));
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    credit_card.FillSelectControl(CREDIT_CARD_TYPE, "en-US", &field);
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("AmEx"), field.value);
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Case insensitivity:
50990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CreditCard credit_card(base::GenerateGUID(), "https://www.example.com/");
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ASCIIToUTF16("6011111111111117"));
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    credit_card.FillSelectControl(CREDIT_CARD_TYPE, "en-US", &field);
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("discover"), field.value);
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(CreditCardTest, GetCreditCardType) {
518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct {
519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string card_number;
520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string type;
521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool is_valid;
522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } test_cases[] = {
523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // The relevant sample numbers from
524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "378282246310005", kAmericanExpressCard, true },
526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "371449635398431", kAmericanExpressCard, true },
527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "378734493671000", kAmericanExpressCard, true },
528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "30569309025904", kDinersCard, true },
529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "38520000023237", kDinersCard, true },
530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011111111111117", kDiscoverCard, true },
531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000990139424", kDiscoverCard, true },
532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3530111333300000", kJCBCard, true },
533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3566002020360505", kJCBCard, true },
534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5555555555554444", kMasterCard, true },
535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5105105105105100", kMasterCard, true },
536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4111111111111111", kVisaCard, true },
537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4012888888881881", kVisaCard, true },
538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4222222222222", kVisaCard, true },
539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // The relevant sample numbers from
541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // http://auricsystems.com/support-center/sample-credit-card-numbers/
542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "343434343434343", kAmericanExpressCard, true },
543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "371144371144376", kAmericanExpressCard, true },
544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "341134113411347", kAmericanExpressCard, true },
545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36438936438936", kDinersCard, true },
546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36110361103612", kDinersCard, true },
547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36111111111111", kDinersCard, true },
548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011016011016011", kDiscoverCard, true },
549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000990139424", kDiscoverCard, true },
550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000000000004", kDiscoverCard, true },
551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011000995500000", kDiscoverCard, true },
552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6500000000000002", kDiscoverCard, true },
553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3566002020360505", kJCBCard, true },
554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3528000000000007", kJCBCard, true },
555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5500005555555559", kMasterCard, true },
556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5555555555555557", kMasterCard, true },
557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5454545454545454", kMasterCard, true },
558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5555515555555551", kMasterCard, true },
559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5405222222222226", kMasterCard, true },
560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5478050000000007", kMasterCard, true },
561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5111005111051128", kMasterCard, true },
562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5112345112345114", kMasterCard, true },
563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5115915115915118", kMasterCard, true },
564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // A UnionPay card that doesn't pass the Luhn checksum
5667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    { "6200000000000000", kUnionPay, true },
5677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Empty string
569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { std::string(), kGenericCard, false },
570eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Non-numeric
572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "garbage", kGenericCard, false },
573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4garbage", kVisaCard, false },
574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Fails Luhn check.
576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4111111111111112", kVisaCard, false },
577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Invalid length.
579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3434343434343434", kAmericanExpressCard, false },
580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "411111111111116", kVisaCard, false },
581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Issuer Identification Numbers (IINs) that Chrome recognizes.
583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "4", kVisaCard, false },
584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "34", kAmericanExpressCard, false },
585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "37", kAmericanExpressCard, false },
586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "300", kDinersCard, false },
587eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "301", kDinersCard, false },
588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "302", kDinersCard, false },
589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "303", kDinersCard, false },
590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "304", kDinersCard, false },
591eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "305", kDinersCard, false },
592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3095", kDinersCard, false },
593eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "36", kDinersCard, false },
594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "38", kDinersCard, false },
595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "39", kDinersCard, false },
596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6011", kDiscoverCard, false },
597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "644", kDiscoverCard, false },
598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "645", kDiscoverCard, false },
599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "646", kDiscoverCard, false },
600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "647", kDiscoverCard, false },
601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "648", kDiscoverCard, false },
602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "649", kDiscoverCard, false },
603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "65", kDiscoverCard, false },
604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3528", kJCBCard, false },
605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3531", kJCBCard, false },
606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3589", kJCBCard, false },
607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "51", kMasterCard, false },
608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "52", kMasterCard, false },
609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "53", kMasterCard, false },
610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "54", kMasterCard, false },
611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "55", kMasterCard, false },
6127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    { "62", kUnionPay, false },
613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Not enough data to determine an IIN uniquely.
615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3", kGenericCard, false },
616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "30", kGenericCard, false },
617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "309", kGenericCard, false },
618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "35", kGenericCard, false },
619eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "5", kGenericCard, false },
620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "6", kGenericCard, false },
621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "60", kGenericCard, false },
622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "601", kGenericCard, false },
623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "64", kGenericCard, false },
624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Unknown IINs.
626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "0", kGenericCard, false },
627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "1", kGenericCard, false },
628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "2", kGenericCard, false },
629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "306", kGenericCard, false },
630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "307", kGenericCard, false },
631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "308", kGenericCard, false },
632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3091", kGenericCard, false },
633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3094", kGenericCard, false },
634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3096", kGenericCard, false },
635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "31", kGenericCard, false },
636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "32", kGenericCard, false },
637eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "33", kGenericCard, false },
638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "351", kGenericCard, false },
639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "3527", kGenericCard, false },
640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "359", kGenericCard, false },
641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "50", kGenericCard, false },
642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "56", kGenericCard, false },
643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "57", kGenericCard, false },
644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "58", kGenericCard, false },
645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "59", kGenericCard, false },
646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "600", kGenericCard, false },
647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "602", kGenericCard, false },
648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "603", kGenericCard, false },
649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "604", kGenericCard, false },
650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "605", kGenericCard, false },
651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "606", kGenericCard, false },
652eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "607", kGenericCard, false },
653eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "608", kGenericCard, false },
654eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "609", kGenericCard, false },
655eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "61", kGenericCard, false },
656eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "63", kGenericCard, false },
657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "640", kGenericCard, false },
658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "641", kGenericCard, false },
659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "642", kGenericCard, false },
660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "643", kGenericCard, false },
661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "66", kGenericCard, false },
662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "67", kGenericCard, false },
663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "68", kGenericCard, false },
664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "69", kGenericCard, false },
665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "7", kGenericCard, false },
666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "8", kGenericCard, false },
667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "9", kGenericCard, false },
668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Oddball case: Unknown issuer, but valid Luhn check and plausible length.
670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { "7000700070007000", kGenericCard, true },
671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 card_number = ASCIIToUTF16(test_cases[i].card_number);
675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE(card_number);
676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(test_cases[i].type, CreditCard::GetCreditCardType(card_number));
677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(test_cases[i].is_valid, IsValidCreditCardNumber(card_number));
678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
682