summaryrefslogtreecommitdiffstats
path: root/chromeos/settings/timezone_settings_unittest.cc
blob: d8b5b5f8b92d65458c8b67280a7123d8e09d0696 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/memory/scoped_ptr.h"
#include "base/stl_util.h"
#include "chromeos/settings/timezone_settings_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/icu/source/common/unicode/unistr.h"
#include "third_party/icu/source/i18n/unicode/timezone.h"

namespace chromeos {
namespace system {

using icu::TimeZone;
using icu::UnicodeString;

const char* kTimeZones[] = {
    "America/Los_Angeles",
    "America/Vancouver",
    "America/Chicago",
    "America/Winnipeg",
    "America/Mexico_City",
    "America/Buenos_Aires",
    "Asia/Ho_Chi_Minh",
    "Asia/Seoul",
    "Europe/Athens",
    "Asia/Ulaanbaatar",
};

class KnownTimeZoneTest : public testing::Test {
 public:
  KnownTimeZoneTest() {}
  ~KnownTimeZoneTest() override {}

  void SetUp() override {
    for (const char* id : kTimeZones) {
      timezones_.push_back(TimeZone::createTimeZone(UnicodeString(id)));
    }
  }

  void TearDown() override { STLDeleteElements(&timezones_); }

 protected:
  std::vector<TimeZone*> timezones_;
};

TEST_F(KnownTimeZoneTest, IdMatch) {
  static struct {
    const char* id;
    const char* matched;
  } timezone_match_list[] = {
      // Self matches
      {"America/Los_Angeles", "America/Los_Angeles"},
      {"America/Vancouver", "America/Vancouver"},  // Should not be Los_Angeles
      {"America/Winnipeg", "America/Winnipeg"},
      {"Asia/Seoul", "Asia/Seoul"},
      // Canonical ID matches
      {"Canada/Pacific", "America/Vancouver"},
      {"US/Pacific", "America/Los_Angeles"},
      {"US/Central", "America/Chicago"},
      {"Mexico/General", "America/Mexico_City"},
      {"Asia/Ulan_Bator", "Asia/Ulaanbaatar"},
      // Asia/Saigon is canonical, but the list has Asia/Ho_Chi_Minh
      {"Asia/Saigon", "Asia/Ho_Chi_Minh"},
  };

  for (const auto& pair : timezone_match_list) {
    scoped_ptr<TimeZone> input(
        TimeZone::createTimeZone(UnicodeString(pair.id)));
    scoped_ptr<TimeZone> expected(
        TimeZone::createTimeZone(UnicodeString(pair.matched)));
    const TimeZone* actual = GetKnownTimezoneOrNull(*input, timezones_);
    EXPECT_NE(nullptr, actual) << "input=" << pair.id;
    if (actual == nullptr)
      continue;
    UnicodeString actual_id;
    actual->getID(actual_id);
    std::string actual_id_str;
    actual_id.toUTF8String(actual_id_str);
    EXPECT_EQ(*expected, *actual) << "input=" << pair.id << ", "
                                  << "expected=" << pair.matched << ", "
                                  << "actual=" << actual_id_str;
  }
}

TEST_F(KnownTimeZoneTest, NoMatch) {
  static const char* no_match_list[] = {
      "Africa/Juba",                // Not in the list
      "Africa/Tripoli",             //  UTC+2 with no DST != Europe/Athens
      "America/Tijuana",            // Historically != America/Los_Angeles
      "Europe/Sofia",               // Historically != Europe/Athens
      "America/Argentina/Cordoba",  // Historically != America/Buenos_Aires
      "Asia/Tokyo",                 // Historically != Asia/Seoul
  };
  for (const char* id : no_match_list) {
    scoped_ptr<TimeZone> input(TimeZone::createTimeZone(UnicodeString(id)));
    EXPECT_EQ(NULL, GetKnownTimezoneOrNull(*input, timezones_))
        << "input=" << id;
  }
}

}  // namespace system
}  // namespace chromeos