// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifdef V8_INTL_SUPPORT

#include <stdlib.h>

#include "include/v8.h"
#include "src/objects/objects-inl.h"
#include "test/cctest/cctest.h"
#include "unicode/locid.h"

namespace {
void CheckLocaleSpecificValues(const char* locale, const char* date,
                               const char* number) {
  CHECK(v8_str(locale)->StrictEquals(
      CompileRun("Intl.NumberFormat().resolvedOptions().locale")));
  CHECK(v8_str(date)->StrictEquals(
      CompileRun("new Date('02/14/2020 13:45').toLocaleString()")));
  CHECK(v8_str(number)->StrictEquals(
      CompileRun("Number(10000.3).toLocaleString()")));
}

void SetIcuLocale(const char* locale_name) {
  UErrorCode error_code = U_ZERO_ERROR;
  icu::Locale locale(locale_name);
  icu::Locale::setDefault(locale, error_code);
  CHECK(U_SUCCESS(error_code));
}
}  // namespace

TEST(LocaleConfigurationChangeNotification) {
  icu::Locale default_locale = icu::Locale::getDefault();

  LocalContext context;
  v8::Isolate* isolate = context->GetIsolate();
  v8::HandleScope scope(isolate);

  SetIcuLocale("en_US");
  isolate->LocaleConfigurationChangeNotification();
  CheckLocaleSpecificValues("en-US", "2/14/2020, 1:45:00 PM", "10,000.3");

  SetIcuLocale("ru_RU");
  isolate->LocaleConfigurationChangeNotification();
  CheckLocaleSpecificValues("ru-RU", "14.02.2020, 13:45:00", "10 000,3");

  SetIcuLocale("zh_CN");
  isolate->LocaleConfigurationChangeNotification();
  CheckLocaleSpecificValues("zh-CN", "2020/2/14下午1:45:00", "10,000.3");

  UErrorCode error_code = U_ZERO_ERROR;
  icu::Locale::setDefault(default_locale, error_code);
  CHECK(U_SUCCESS(error_code));
}

#endif  // V8_INTL_SUPPORT
