From 9f47fe3fc853c85bddf5057f8fb51b377d6b381a Mon Sep 17 00:00:00 2001 From: Rudy Huyn Date: Tue, 14 May 2019 09:57:58 -0700 Subject: [PATCH] Fix unit tests to run on non-english devices (#289) * Force en-US for unit tests * fix some spacing issues after merge * remove default argument of LocalizationService to fix compilation issue in Release mode --- .../Common/LocalizationService.cpp | 50 ++++++++++++++----- .../Common/LocalizationService.h | 42 ++++++++-------- .../Common/LocalizationSettings.h | 10 ++-- .../DataLoaders/CurrencyDataLoader.cpp | 22 ++++++-- .../DataLoaders/CurrencyDataLoader.h | 2 +- src/CalcViewModel/DateCalculatorViewModel.cpp | 2 +- src/CalcViewModel/UnitConverterViewModel.cpp | 5 +- src/Calculator/Views/Calculator.xaml.cpp | 2 +- src/Calculator/Views/DateCalculator.xaml.cpp | 2 +- .../CurrencyConverterUnitTests.cpp | 33 ++++++------ src/CalculatorUnitTests/UnitTestApp.xaml.cpp | 4 ++ 11 files changed, 106 insertions(+), 68 deletions(-) diff --git a/src/CalcViewModel/Common/LocalizationService.cpp b/src/CalcViewModel/Common/LocalizationService.cpp index 848360ee..24354e4b 100644 --- a/src/CalcViewModel/Common/LocalizationService.cpp +++ b/src/CalcViewModel/Common/LocalizationService.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. #include "pch.h" @@ -49,17 +49,34 @@ LocalizationService ^ LocalizationService::GetInstance() if (s_singletonInstance == nullptr) { - s_singletonInstance = ref new LocalizationService(); + s_singletonInstance = ref new LocalizationService(nullptr); } } return s_singletonInstance; } -LocalizationService::LocalizationService() +/// +/// Replace (or create) the single instance of this singleton class by one with the language passed as parameter +/// +/// RFC-5646 identifier of the language to use +/// +/// Should only be used for test purpose +/// +void LocalizationService::OverrideWithLanguage(_In_ const wchar_t * const language) { - m_language = ApplicationLanguages::Languages->GetAt(0); - m_flowDirection = - ResourceContext::GetForCurrentView()->QualifierValues->Lookup(L"LayoutDirection") != L"LTR" ? FlowDirection::RightToLeft : FlowDirection::LeftToRight; + s_singletonInstance = ref new LocalizationService(language); +} + +/// +/// Constructor +/// +/// RFC-5646 identifier of the language to use, if null, will use the current language of the system +LocalizationService::LocalizationService(_In_ const wchar_t * const overridedLanguage) +{ + m_isLanguageOverrided = overridedLanguage != nullptr; + m_language = m_isLanguageOverrided ? ref new Platform::String(overridedLanguage) : ApplicationLanguages::Languages->GetAt(0); + m_flowDirection = ResourceContext::GetForCurrentView()->QualifierValues->Lookup(L"LayoutDirection") + != L"LTR" ? FlowDirection::RightToLeft : FlowDirection::LeftToRight; auto resourceLoader = AppResourceProvider::GetInstance(); m_fontFamilyOverride = resourceLoader.GetResourceString(L"LocalizedFontFamilyOverride"); @@ -339,7 +356,7 @@ void LocalizationService::UpdateFontFamilyAndSize(DependencyObject ^ target) // If successful, returns a formatter that respects the user's regional format settings, // as configured by running intl.cpl. -DecimalFormatter ^ LocalizationService::GetRegionalSettingsAwareDecimalFormatter() +DecimalFormatter ^ LocalizationService::GetRegionalSettingsAwareDecimalFormatter() const { IIterable ^ languageIdentifiers = LocalizationService::GetLanguageIdentifiers(); if (languageIdentifiers != nullptr) @@ -354,7 +371,7 @@ DecimalFormatter ^ LocalizationService::GetRegionalSettingsAwareDecimalFormatter // as configured by running intl.cpl. // // This helper function creates a DateTimeFormatter with a TwentyFour hour clock -DateTimeFormatter ^ LocalizationService::GetRegionalSettingsAwareDateTimeFormatter(_In_ String ^ format) +DateTimeFormatter ^ LocalizationService::GetRegionalSettingsAwareDateTimeFormatter(_In_ String^ format) const { IIterable ^ languageIdentifiers = LocalizationService::GetLanguageIdentifiers(); if (languageIdentifiers == nullptr) @@ -367,8 +384,7 @@ DateTimeFormatter ^ LocalizationService::GetRegionalSettingsAwareDateTimeFormatt // If successful, returns a formatter that respects the user's regional format settings, // as configured by running intl.cpl. -DateTimeFormatter - ^ LocalizationService::GetRegionalSettingsAwareDateTimeFormatter(_In_ String ^ format, _In_ String ^ calendarIdentifier, _In_ String ^ clockIdentifier) +DateTimeFormatter^ LocalizationService::GetRegionalSettingsAwareDateTimeFormatter(_In_ String ^ format, _In_ String ^ calendarIdentifier, _In_ String ^ clockIdentifier) const { IIterable ^ languageIdentifiers = LocalizationService::GetLanguageIdentifiers(); if (languageIdentifiers == nullptr) @@ -379,12 +395,12 @@ DateTimeFormatter return ref new DateTimeFormatter(format, languageIdentifiers, GlobalizationPreferences::HomeGeographicRegion, calendarIdentifier, clockIdentifier); } -CurrencyFormatter ^ LocalizationService::GetRegionalSettingsAwareCurrencyFormatter() +CurrencyFormatter ^ LocalizationService::GetRegionalSettingsAwareCurrencyFormatter() const { String ^ userCurrency = (GlobalizationPreferences::Currencies->Size > 0) ? GlobalizationPreferences::Currencies->GetAt(0) : StringReference(DefaultCurrencyCode.data()); - IIterable ^ languageIdentifiers = LocalizationService::GetLanguageIdentifiers(); + IIterable ^ languageIdentifiers = GetLanguageIdentifiers(); if (languageIdentifiers == nullptr) { languageIdentifiers = ApplicationLanguages::Languages; @@ -398,10 +414,18 @@ CurrencyFormatter ^ LocalizationService::GetRegionalSettingsAwareCurrencyFormatt return currencyFormatter; } -IIterable ^ LocalizationService::GetLanguageIdentifiers() +IIterable ^ LocalizationService::GetLanguageIdentifiers() const { WCHAR currentLocale[LOCALE_NAME_MAX_LENGTH] = {}; int result = GetUserDefaultLocaleName(currentLocale, LOCALE_NAME_MAX_LENGTH); + + if (m_isLanguageOverrided) + { + auto overridedLanguageList = ref new Vector(); + overridedLanguageList->Append(m_language); + return overridedLanguageList; + } + if (result != 0) { // GetUserDefaultLocaleName may return an invalid bcp47 language tag with trailing non-BCP47 friendly characters, diff --git a/src/CalcViewModel/Common/LocalizationService.h b/src/CalcViewModel/Common/LocalizationService.h index 73b088b5..736d5647 100644 --- a/src/CalcViewModel/Common/LocalizationService.h +++ b/src/CalcViewModel/Common/LocalizationService.h @@ -30,7 +30,9 @@ namespace CalculatorApp DEPENDENCY_PROPERTY_ATTACHED_WITH_DEFAULT_AND_CALLBACK(LanguageFontType, FontType, LanguageFontType::UIText); DEPENDENCY_PROPERTY_ATTACHED_WITH_CALLBACK(double, FontSize); - internal : static LocalizationService ^ GetInstance(); + internal: + static LocalizationService^ GetInstance(); + static void OverrideWithLanguage(_In_ const wchar_t * const language); Windows::UI::Xaml::FlowDirection GetFlowDirection(); bool IsRtlLayout(); @@ -41,24 +43,24 @@ namespace CalculatorApp Windows::UI::Text::FontWeight GetFontWeightOverride(); double GetFontScaleFactorOverride(LanguageFontType fontType); - static Windows::Globalization::NumberFormatting::DecimalFormatter ^ GetRegionalSettingsAwareDecimalFormatter(); - static Windows::Globalization::DateTimeFormatting::DateTimeFormatter ^ GetRegionalSettingsAwareDateTimeFormatter(_In_ Platform::String ^ format); - static Windows::Globalization::DateTimeFormatting::DateTimeFormatter - ^ GetRegionalSettingsAwareDateTimeFormatter( - _In_ Platform::String ^ format, - _In_ Platform::String ^ calendarIdentifier, - _In_ Platform::String ^ clockIdentifier); + Windows::Globalization::NumberFormatting::DecimalFormatter ^ GetRegionalSettingsAwareDecimalFormatter() const; + Windows::Globalization::DateTimeFormatting::DateTimeFormatter ^ GetRegionalSettingsAwareDateTimeFormatter(_In_ Platform::String ^ format) const; + Windows::Globalization::DateTimeFormatting::DateTimeFormatter ^ GetRegionalSettingsAwareDateTimeFormatter( + _In_ Platform::String ^ format, + _In_ Platform::String ^ calendarIdentifier, + _In_ Platform::String ^ clockIdentifier) const; - static Windows::Globalization::NumberFormatting::CurrencyFormatter ^ GetRegionalSettingsAwareCurrencyFormatter(); + Windows::Globalization::NumberFormatting::CurrencyFormatter ^ GetRegionalSettingsAwareCurrencyFormatter() const; static Platform::String ^ GetNarratorReadableToken(Platform::String ^ rawToken); static Platform::String ^ GetNarratorReadableString(Platform::String ^ rawString); private: + LocalizationService(_In_ const wchar_t* const overridedLanguage); Windows::Globalization::Fonts::LanguageFont ^ GetLanguageFont(LanguageFontType fontType); Windows::UI::Text::FontWeight ParseFontWeight(Platform::String ^ fontWeight); - static Windows::Foundation::Collections::IIterable ^ GetLanguageIdentifiers(); + Windows::Foundation::Collections::IIterable ^ GetLanguageIdentifiers() const; // Attached property callbacks static void OnFontTypePropertyChanged(Windows::UI::Xaml::DependencyObject ^ target, LanguageFontType oldValue, LanguageFontType newValue); @@ -72,19 +74,17 @@ namespace CalculatorApp static std::unordered_map GetTokenToReadableNameMap(); - private: - LocalizationService(); - static LocalizationService ^ s_singletonInstance; - Windows::Globalization::Fonts::LanguageFontGroup ^ m_fontGroup; - Platform::String ^ m_language; - Windows::UI::Xaml::FlowDirection m_flowDirection; - bool m_overrideFontApiValues; - Platform::String ^ m_fontFamilyOverride; - Windows::UI::Text::FontWeight m_fontWeightOverride; - double m_uiTextFontScaleFactorOverride; - double m_uiCaptionFontScaleFactorOverride; + Windows::Globalization::Fonts::LanguageFontGroup ^ m_fontGroup; + Platform::String ^ m_language; + Windows::UI::Xaml::FlowDirection m_flowDirection; + bool m_overrideFontApiValues; + Platform::String ^ m_fontFamilyOverride; + bool m_isLanguageOverrided; + Windows::UI::Text::FontWeight m_fontWeightOverride; + double m_uiTextFontScaleFactorOverride; + double m_uiCaptionFontScaleFactorOverride; }; } diff --git a/src/CalcViewModel/Common/LocalizationSettings.h b/src/CalcViewModel/Common/LocalizationSettings.h index 1b350154..addc0c39 100644 --- a/src/CalcViewModel/Common/LocalizationSettings.h +++ b/src/CalcViewModel/Common/LocalizationSettings.h @@ -19,7 +19,7 @@ namespace CalculatorApp // Use DecimalFormatter as it respects the locale and the user setting Windows::Globalization::NumberFormatting::DecimalFormatter ^ formatter; - formatter = CalculatorApp::Common::LocalizationService::GetRegionalSettingsAwareDecimalFormatter(); + formatter = LocalizationService::GetInstance()->GetRegionalSettingsAwareDecimalFormatter(); formatter->FractionDigits = 0; formatter->IsDecimalPointAlwaysDisplayed = false; @@ -61,7 +61,7 @@ namespace CalculatorApp // Get locale info for List Separator, eg. comma is used in many locales wchar_t listSeparatorString[4] = L""; result = ::GetLocaleInfoEx( - LOCALE_NAME_USER_DEFAULT, + m_resolvedName.c_str(), LOCALE_SLIST, listSeparatorString, static_cast(std::size(listSeparatorString))); // Max length of the expected return value is 4 @@ -85,7 +85,7 @@ namespace CalculatorApp // A value of 0 indicates the symbol follows the currency value. int currencySymbolPrecedence = 1; result = GetLocaleInfoEx( - LOCALE_NAME_USER_DEFAULT, + m_resolvedName.c_str(), LOCALE_IPOSSYMPRECEDES | LOCALE_RETURN_NUMBER, (LPWSTR)¤cySymbolPrecedence, sizeof(currencySymbolPrecedence) / sizeof(WCHAR)); @@ -104,14 +104,14 @@ namespace CalculatorApp // Note: This function returns 0 on failure. // We'll ignore the failure in that case and the CalendarIdentifier would get set to GregorianCalendar. CALID calId; - ::GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_ICALENDARTYPE | LOCALE_RETURN_NUMBER, reinterpret_cast(&calId), sizeof(calId)); + ::GetLocaleInfoEx(m_resolvedName.c_str(), LOCALE_ICALENDARTYPE | LOCALE_RETURN_NUMBER, reinterpret_cast(&calId), sizeof(calId)); m_calendarIdentifier = GetCalendarIdentifierFromCalid(calId); // Get FirstDayOfWeek Date and Time setting wchar_t day[80] = L""; ::GetLocaleInfoEx( - LOCALE_NAME_USER_DEFAULT, + m_resolvedName.c_str(), LOCALE_IFIRSTDAYOFWEEK, // The first day in a week reinterpret_cast(day), // Argument is of type PWSTR static_cast(std::size(day))); // Max return size are 80 characters diff --git a/src/CalcViewModel/DataLoaders/CurrencyDataLoader.cpp b/src/CalcViewModel/DataLoaders/CurrencyDataLoader.cpp index b2c68dcf..2fb8f0a6 100644 --- a/src/CalcViewModel/DataLoaders/CurrencyDataLoader.cpp +++ b/src/CalcViewModel/DataLoaders/CurrencyDataLoader.cpp @@ -87,7 +87,7 @@ namespace CalculatorApp } } -CurrencyDataLoader::CurrencyDataLoader(_In_ unique_ptr client) +CurrencyDataLoader::CurrencyDataLoader(_In_ unique_ptr client, const wchar_t * forcedResponseLanguage) : m_client(move(client)) , m_loadStatus(CurrencyLoadStatus::NotLoaded) , m_responseLanguage(L"en-US") @@ -96,9 +96,20 @@ CurrencyDataLoader::CurrencyDataLoader(_In_ unique_ptr clie , m_networkManager(ref new NetworkManager()) , m_meteredOverrideSet(false) { - if (GlobalizationPreferences::Languages->Size > 0) + if (forcedResponseLanguage != nullptr) { - m_responseLanguage = GlobalizationPreferences::Languages->GetAt(0); + m_responseLanguage = ref new Platform::String(forcedResponseLanguage); + } + else + { + if (GlobalizationPreferences::Languages->Size > 0) + { + m_responseLanguage = GlobalizationPreferences::Languages->GetAt(0); + } + else + { + m_responseLanguage = L"en-US"; + } } if (m_client != nullptr) @@ -107,13 +118,14 @@ CurrencyDataLoader::CurrencyDataLoader(_In_ unique_ptr clie m_client->SetResponseLanguage(m_responseLanguage); } + auto localizationService = LocalizationService::GetInstance(); if (CoreWindow::GetForCurrentThread() != nullptr) { // Must have a CoreWindow to access the resource context. - m_isRtlLanguage = LocalizationService::GetInstance()->IsRtlLayout(); + m_isRtlLanguage = localizationService->IsRtlLayout(); } - m_ratioFormatter = LocalizationService::GetRegionalSettingsAwareDecimalFormatter(); + m_ratioFormatter = localizationService->GetRegionalSettingsAwareDecimalFormatter(); m_ratioFormatter->IsGrouped = true; m_ratioFormatter->IsDecimalPointAlwaysDisplayed = true; m_ratioFormatter->FractionDigits = FORMATTER_DIGIT_COUNT; diff --git a/src/CalcViewModel/DataLoaders/CurrencyDataLoader.h b/src/CalcViewModel/DataLoaders/CurrencyDataLoader.h index 5221373a..1ec031d1 100644 --- a/src/CalcViewModel/DataLoaders/CurrencyDataLoader.h +++ b/src/CalcViewModel/DataLoaders/CurrencyDataLoader.h @@ -54,7 +54,7 @@ namespace CalculatorApp class CurrencyDataLoader : public UCM::IConverterDataLoader, public UCM::ICurrencyConverterDataLoader { public: - CurrencyDataLoader(_In_ std::unique_ptr client); + CurrencyDataLoader(_In_ std::unique_ptr client, const wchar_t* overrideLanguage = nullptr); ~CurrencyDataLoader(); bool LoadFinished(); diff --git a/src/CalcViewModel/DateCalculatorViewModel.cpp b/src/CalcViewModel/DateCalculatorViewModel.cpp index 164a9281..d81cd3b5 100644 --- a/src/CalcViewModel/DateCalculatorViewModel.cpp +++ b/src/CalcViewModel/DateCalculatorViewModel.cpp @@ -217,7 +217,7 @@ void DateCalculatorViewModel::UpdateStrDateResultAutomationName() void DateCalculatorViewModel::InitializeDateOutputFormats(_In_ String ^ calendarIdentifier) { // Format for Add/Subtract days - m_dateTimeFormatter = LocalizationService::GetRegionalSettingsAwareDateTimeFormatter( + m_dateTimeFormatter = LocalizationService::GetInstance()->GetRegionalSettingsAwareDateTimeFormatter( L"longdate", calendarIdentifier, ClockIdentifiers::TwentyFourHour); // Clock Identifier is not used diff --git a/src/CalcViewModel/UnitConverterViewModel.cpp b/src/CalcViewModel/UnitConverterViewModel.cpp index dea918e9..72d31464 100644 --- a/src/CalcViewModel/UnitConverterViewModel.cpp +++ b/src/CalcViewModel/UnitConverterViewModel.cpp @@ -122,14 +122,15 @@ UnitConverterViewModel::UnitConverterViewModel(const shared_ptrSetViewModelCallback(make_shared(this)); m_model->SetViewModelCurrencyCallback(make_shared(this)); - m_decimalFormatter = LocalizationService::GetRegionalSettingsAwareDecimalFormatter(); + m_decimalFormatter = localizationService->GetRegionalSettingsAwareDecimalFormatter(); m_decimalFormatter->FractionDigits = 0; m_decimalFormatter->IsGrouped = true; m_decimalSeparator = LocalizationSettings::GetInstance().GetDecimalSeparator(); - m_currencyFormatter = LocalizationService::GetRegionalSettingsAwareCurrencyFormatter(); + m_currencyFormatter = localizationService->GetRegionalSettingsAwareCurrencyFormatter(); m_currencyFormatter->IsGrouped = true; m_currencyFormatter->Mode = CurrencyFormatterMode::UseCurrencyCode; m_currencyFormatter->ApplyRoundingForCurrency(RoundingAlgorithm::RoundHalfDown); diff --git a/src/Calculator/Views/Calculator.xaml.cpp b/src/Calculator/Views/Calculator.xaml.cpp index 6f64b193..3a64988f 100644 --- a/src/Calculator/Views/Calculator.xaml.cpp +++ b/src/Calculator/Views/Calculator.xaml.cpp @@ -97,7 +97,7 @@ void Calculator::SetFontSizeResources() { L"Tibt", 104, 29.333, 20, 40, 56, 40, 56 }, { L"Default", 104, 29.333, 23, 40, 56, 40, 56 } }; - DecimalFormatter ^ formatter = LocalizationService::GetRegionalSettingsAwareDecimalFormatter(); + DecimalFormatter^ formatter = LocalizationService::GetInstance()->GetRegionalSettingsAwareDecimalFormatter(); const FontTable* currentItem = fontTables; while (currentItem->numericSystem.compare(std::wstring(L"Default")) != 0 && currentItem->numericSystem.compare(formatter->NumeralSystem->Data()) != 0) diff --git a/src/Calculator/Views/DateCalculator.xaml.cpp b/src/Calculator/Views/DateCalculator.xaml.cpp index b3a9dcdd..33ed3dc3 100644 --- a/src/Calculator/Views/DateCalculator.xaml.cpp +++ b/src/Calculator/Views/DateCalculator.xaml.cpp @@ -79,7 +79,7 @@ DateCalculator::DateCalculator() DateDiff_ToDate->MaxDate = maxYear; // Set the PlaceHolderText for CalendarDatePicker - DateTimeFormatter ^ dateTimeFormatter = LocalizationService::GetRegionalSettingsAwareDateTimeFormatter( + DateTimeFormatter^ dateTimeFormatter = LocalizationService::GetInstance()->GetRegionalSettingsAwareDateTimeFormatter( L"day month year", localizationSettings.GetCalendarIdentifier(), ClockIdentifiers::TwentyFourHour); // Clock Identifier is not used diff --git a/src/CalculatorUnitTests/CurrencyConverterUnitTests.cpp b/src/CalculatorUnitTests/CurrencyConverterUnitTests.cpp index b53e4209..9b20184a 100644 --- a/src/CalculatorUnitTests/CurrencyConverterUnitTests.cpp +++ b/src/CalculatorUnitTests/CurrencyConverterUnitTests.cpp @@ -205,8 +205,7 @@ namespace CalculatorUnitTests TEST_METHOD(LoadFromCache_Fail_NoCacheKey) { RemoveFromLocalSettings(CurrencyDataLoaderConstants::CacheTimestampKey); - - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); bool didLoad = loader.TryLoadDataFromCacheAsync().get(); @@ -224,7 +223,7 @@ TEST_METHOD(LoadFromCache_Fail_OlderThanADay) dayOld.UniversalTime = now.UniversalTime - CurrencyDataLoaderConstants::DayDuration - 1; InsertToLocalSettings(CurrencyDataLoaderConstants::CacheTimestampKey, dayOld); - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); bool didLoad = loader.TryLoadDataFromCacheAsync().get(); @@ -243,7 +242,7 @@ TEST_METHOD(LoadFromCache_Fail_StaticDataFileDoesNotExist) VERIFY_IS_TRUE(DeleteFileFromLocalCacheFolder(CurrencyDataLoaderConstants::StaticDataFilename)); VERIFY_IS_TRUE(WriteToFileInLocalCacheFolder(CurrencyDataLoaderConstants::AllRatiosDataFilename, CurrencyHttpClient::GetRawAllRatiosDataResponse())); - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); bool didLoad = loader.TryLoadDataFromCacheAsync().get(); @@ -262,7 +261,7 @@ TEST_METHOD(LoadFromCache_Fail_AllRatiosDataFileDoesNotExist) VERIFY_IS_TRUE(WriteToFileInLocalCacheFolder(CurrencyDataLoaderConstants::StaticDataFilename, CurrencyHttpClient::GetRawStaticDataResponse())); VERIFY_IS_TRUE(DeleteFileFromLocalCacheFolder(CurrencyDataLoaderConstants::AllRatiosDataFilename)); - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); bool didLoad = loader.TryLoadDataFromCacheAsync().get(); @@ -282,7 +281,7 @@ TEST_METHOD(LoadFromCache_Fail_ResponseLanguageChanged) VERIFY_IS_TRUE(WriteToFileInLocalCacheFolder(CurrencyDataLoaderConstants::StaticDataFilename, CurrencyHttpClient::GetRawStaticDataResponse())); VERIFY_IS_TRUE(DeleteFileFromLocalCacheFolder(CurrencyDataLoaderConstants::AllRatiosDataFilename)); - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); bool didLoad = loader.TryLoadDataFromCacheAsync().get(); @@ -295,7 +294,7 @@ TEST_METHOD(LoadFromCache_Success) { StandardCacheSetup(); - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); bool didLoad = loader.TryLoadDataFromCacheAsync().get(); @@ -306,7 +305,7 @@ TEST_METHOD(LoadFromCache_Success) TEST_METHOD(LoadFromWeb_Fail_ClientIsNullptr) { - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); bool didLoad = loader.TryLoadDataFromWebAsync().get(); @@ -317,7 +316,7 @@ TEST_METHOD(LoadFromWeb_Fail_ClientIsNullptr) TEST_METHOD(LoadFromWeb_Fail_WebException) { - CurrencyDataLoader loader{ make_unique() }; + CurrencyDataLoader loader(make_unique(), L"en-US"); bool didLoad = loader.TryLoadDataFromWebAsync().get(); @@ -342,8 +341,7 @@ TEST_METHOD(LoadFromWeb_Success) TEST_METHOD(Load_Success_LoadedFromCache) { StandardCacheSetup(); - - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); auto data_loaded_event = task_completion_event(); loader.SetViewModelCallback(make_shared(data_loaded_event)); @@ -391,8 +389,7 @@ TEST_CLASS(CurrencyConverterUnitTests){ const UCM::Unit GetUnit(const vector(); loader.SetViewModelCallback(make_shared(data_loaded_event)); @@ -422,7 +419,7 @@ TEST_METHOD(Loaded_LoadOrderedRatios) { StandardCacheSetup(); - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); auto data_loaded_event = task_completion_event(); loader.SetViewModelCallback(make_shared(data_loaded_event)); @@ -455,7 +452,7 @@ TEST_METHOD(Loaded_GetCurrencySymbols_Valid) { StandardCacheSetup(); - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); auto data_loaded_event = task_completion_event(); loader.SetViewModelCallback(make_shared(data_loaded_event)); @@ -484,7 +481,7 @@ TEST_METHOD(Loaded_GetCurrencySymbols_Invalid) { StandardCacheSetup(); - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); auto data_loaded_event = task_completion_event(); loader.SetViewModelCallback(make_shared(data_loaded_event)); @@ -527,7 +524,7 @@ TEST_METHOD(Loaded_GetCurrencyRatioEquality_Valid) { StandardCacheSetup(); - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); auto data_loaded_event = task_completion_event(); loader.SetViewModelCallback(make_shared(data_loaded_event)); @@ -556,7 +553,7 @@ TEST_METHOD(Loaded_GetCurrencyRatioEquality_Invalid) { StandardCacheSetup(); - CurrencyDataLoader loader{ nullptr }; + CurrencyDataLoader loader(nullptr, L"en-US"); auto data_loaded_event = task_completion_event(); loader.SetViewModelCallback(make_shared(data_loaded_event)); diff --git a/src/CalculatorUnitTests/UnitTestApp.xaml.cpp b/src/CalculatorUnitTests/UnitTestApp.xaml.cpp index e5b4eb67..8dbd5903 100644 --- a/src/CalculatorUnitTests/UnitTestApp.xaml.cpp +++ b/src/CalculatorUnitTests/UnitTestApp.xaml.cpp @@ -8,6 +8,7 @@ #include "pch.h" #include "UnitTestApp.xaml.h" +#include "Common/LocalizationService.h" using namespace CalculatorUnitTests; @@ -79,6 +80,9 @@ void App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEvent Window::Current->Activate(); + // Override the current locale to use English (US) to be compatible with all tests based on formatting + CalculatorApp::Common::LocalizationService::OverrideWithLanguage(L"en-US"); + Microsoft::VisualStudio::TestPlatform::TestExecutor::WinRTCore::UnitTestClient::Run(e->Arguments); }