|
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