|
7 | 7 |
|
8 | 8 | #include "flutter/fml/macros.h"
|
9 | 9 | #include "flutter/shell/platform/windows/system_utils.h"
|
| 10 | +#include "flutter/shell/platform/windows/testing/mock_windows_proc_table.h" |
10 | 11 | #include "gtest/gtest.h"
|
11 | 12 |
|
12 | 13 | namespace flutter {
|
13 | 14 | namespace testing {
|
14 | 15 |
|
15 |
| -class MockWindowsRegistry : public WindowsRegistry { |
16 |
| - public: |
17 |
| - MockWindowsRegistry() = default; |
18 |
| - virtual ~MockWindowsRegistry() = default; |
19 |
| - |
20 |
| - virtual LSTATUS GetRegistryValue(HKEY hkey, |
21 |
| - LPCWSTR key, |
22 |
| - LPCWSTR value, |
23 |
| - DWORD flags, |
24 |
| - LPDWORD type, |
25 |
| - PVOID data, |
26 |
| - LPDWORD data_size) const { |
27 |
| - using namespace std::string_literals; |
28 |
| - static const std::wstring locales = |
29 |
| - L"en-US\0zh-Hans-CN\0ja\0zh-Hant-TW\0he\0\0"s; |
30 |
| - static DWORD locales_len = locales.size() * sizeof(wchar_t); |
31 |
| - if (data != nullptr) { |
32 |
| - if (*data_size < locales_len) { |
33 |
| - return ERROR_MORE_DATA; |
34 |
| - } |
35 |
| - std::memcpy(data, locales.data(), locales_len); |
36 |
| - *data_size = locales_len; |
37 |
| - } else if (data_size != NULL) { |
38 |
| - *data_size = locales_len; |
39 |
| - } |
40 |
| - return ERROR_SUCCESS; |
41 |
| - } |
42 |
| - |
43 |
| - private: |
44 |
| - FML_DISALLOW_COPY_AND_ASSIGN(MockWindowsRegistry); |
45 |
| -}; |
46 |
| - |
47 | 16 | TEST(SystemUtils, GetPreferredLanguageInfo) {
|
48 |
| - WindowsRegistry registry; |
49 |
| - std::vector<LanguageInfo> languages = GetPreferredLanguageInfo(registry); |
| 17 | + WindowsProcTable proc_table; |
| 18 | + std::vector<LanguageInfo> languages = |
| 19 | + GetPreferredLanguageInfo(WindowsProcTable()); |
50 | 20 | // There should be at least one language.
|
51 | 21 | ASSERT_GE(languages.size(), 1);
|
52 | 22 | // The info should have a valid languge.
|
53 | 23 | EXPECT_GE(languages[0].language.size(), 2);
|
54 | 24 | }
|
55 | 25 |
|
56 | 26 | TEST(SystemUtils, GetPreferredLanguages) {
|
57 |
| - WindowsRegistry registry; |
58 |
| - std::vector<std::wstring> languages = GetPreferredLanguages(registry); |
| 27 | + MockWindowsProcTable proc_table; |
| 28 | + ON_CALL(proc_table, GetThreadPreferredUILanguages) |
| 29 | + .WillByDefault( |
| 30 | + [](DWORD flags, PULONG count, PZZWSTR languages, PULONG size) { |
| 31 | + // Languages string ends in a double-null. |
| 32 | + static const wchar_t lang[] = L"en-US\0"; |
| 33 | + static const size_t lang_len = sizeof(lang) / sizeof(wchar_t); |
| 34 | + static const int cnt = 1; |
| 35 | + if (languages == nullptr) { |
| 36 | + *size = lang_len; |
| 37 | + *count = cnt; |
| 38 | + } else if (*size >= lang_len) { |
| 39 | + memcpy(languages, lang, lang_len * sizeof(wchar_t)); |
| 40 | + } |
| 41 | + return TRUE; |
| 42 | + }); |
| 43 | + std::vector<std::wstring> languages = GetPreferredLanguages(proc_table); |
59 | 44 | // There should be at least one language.
|
60 | 45 | ASSERT_GE(languages.size(), 1);
|
61 | 46 | // The language should be non-empty.
|
62 | 47 | EXPECT_FALSE(languages[0].empty());
|
63 | 48 | // There should not be a trailing null from the parsing step.
|
64 | 49 | EXPECT_EQ(languages[0].size(), wcslen(languages[0].c_str()));
|
65 |
| - |
66 |
| - // Test mock results |
67 |
| - MockWindowsRegistry mock_registry; |
68 |
| - languages = GetPreferredLanguages(mock_registry); |
69 |
| - ASSERT_EQ(languages.size(), 5); |
70 |
| - ASSERT_EQ(languages[0], std::wstring(L"en-US")); |
71 |
| - ASSERT_EQ(languages[1], std::wstring(L"zh-Hans-CN")); |
72 |
| - ASSERT_EQ(languages[2], std::wstring(L"ja")); |
73 |
| - ASSERT_EQ(languages[3], std::wstring(L"zh-Hant-TW")); |
74 |
| - ASSERT_EQ(languages[4], std::wstring(L"he")); |
| 50 | + EXPECT_EQ(languages[0], L"en-US"); |
75 | 51 | }
|
76 | 52 |
|
77 | 53 | TEST(SystemUtils, ParseLanguageNameGeneric) {
|
|
0 commit comments