diff --git a/src/CalcViewModel/Common/NavCategory.cpp b/src/CalcViewModel/Common/NavCategory.cpp index 85731eb2..51cb8dc7 100644 --- a/src/CalcViewModel/Common/NavCategory.cpp +++ b/src/CalcViewModel/Common/NavCategory.cpp @@ -47,23 +47,11 @@ static constexpr int CURRENCY_ID = 16; static constexpr int GRAPHING_ID = 17; // ^^^ THESE CONSTANTS SHOULD NEVER CHANGE ^^^ -namespace +namespace // put the utils within this TU { Platform::Agile CurrentUser; std::mutex GraphingModeCheckMutex; - wchar_t* towchar_t(int number) - { - auto wstr = std::to_wstring(number); - return _wcsdup(wstr.c_str()); - } - - bool IsGraphingModeAvailable() - { - static bool supportGraph = Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath"); - return supportGraph; - } - bool IsGraphingModeEnabled() { static bool isChecked = false; @@ -76,218 +64,183 @@ namespace } else { - if (IsGraphingModeAvailable()) - { - auto namedPolicyData = NamedPolicy::GetPolicyFromPathForUser( - CurrentUser.Get(), - L"Education", - L"AllowGraphingCalculator"); - isEnabled = namedPolicyData->GetBoolean(); - } - else - { - isEnabled = false; - } + auto namedPolicyData = NamedPolicy::GetPolicyFromPathForUser( + CurrentUser.Get(), + L"Education", + L"AllowGraphingCalculator"); + isEnabled = namedPolicyData->GetBoolean(); isChecked = true; return isEnabled; } } -} + // The order of items in this list determines the order of items in the menu. + const std::vector s_categoryManifest { + NavCategoryInitializer{ ViewMode::Standard, + STANDARD_ID, + L"Standard", + L"StandardMode", + L"\uE8EF", + CategoryGroupType::Calculator, + MyVirtualKey::Number1, + L"1", + SUPPORTS_ALL }, + NavCategoryInitializer{ ViewMode::Scientific, + SCIENTIFIC_ID, + L"Scientific", + L"ScientificMode", + L"\uF196", + CategoryGroupType::Calculator, + MyVirtualKey::Number2, + L"2", + SUPPORTS_ALL }, + NavCategoryInitializer{ ViewMode::Graphing, + GRAPHING_ID, + L"Graphing", + L"GraphingCalculatorMode", + L"\uF770", + CategoryGroupType::Calculator, + MyVirtualKey::Number3, + L"3", + SUPPORTS_ALL }, + NavCategoryInitializer{ ViewMode::Programmer, + PROGRAMMER_ID, + L"Programmer", + L"ProgrammerMode", + L"\uECCE", + CategoryGroupType::Calculator, + MyVirtualKey::Number4, + L"4", + SUPPORTS_ALL }, + NavCategoryInitializer{ ViewMode::Date, + DATE_ID, + L"Date", + L"DateCalculationMode", + L"\uE787", + CategoryGroupType::Calculator, + MyVirtualKey::Number5, + L"5", + SUPPORTS_ALL }, + NavCategoryInitializer{ ViewMode::Currency, + CURRENCY_ID, + L"Currency", + L"CategoryName_Currency", + L"\uEB0D", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + POSITIVE_ONLY }, + NavCategoryInitializer{ ViewMode::Volume, + VOLUME_ID, + L"Volume", + L"CategoryName_Volume", + L"\uF1AA", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + POSITIVE_ONLY }, + NavCategoryInitializer{ ViewMode::Length, + LENGTH_ID, + L"Length", + L"CategoryName_Length", + L"\uECC6", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + POSITIVE_ONLY }, + NavCategoryInitializer{ ViewMode::Weight, + WEIGHT_ID, + L"Weight and Mass", + L"CategoryName_Weight", + L"\uF4C1", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + POSITIVE_ONLY }, + NavCategoryInitializer{ ViewMode::Temperature, + TEMPERATURE_ID, + L"Temperature", + L"CategoryName_Temperature", + L"\uE7A3", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + SUPPORTS_NEGATIVE }, + NavCategoryInitializer{ ViewMode::Energy, + ENERGY_ID, + L"Energy", + L"CategoryName_Energy", + L"\uECAD", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + POSITIVE_ONLY }, + NavCategoryInitializer{ ViewMode::Area, + AREA_ID, + L"Area", + L"CategoryName_Area", + L"\uE809", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + POSITIVE_ONLY }, + NavCategoryInitializer{ ViewMode::Speed, + SPEED_ID, + L"Speed", + L"CategoryName_Speed", + L"\uEADA", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + POSITIVE_ONLY }, + NavCategoryInitializer{ ViewMode::Time, + TIME_ID, + L"Time", + L"CategoryName_Time", + L"\uE917", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + POSITIVE_ONLY }, + NavCategoryInitializer{ ViewMode::Power, + POWER_ID, + L"Power", + L"CategoryName_Power", + L"\uE945", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + SUPPORTS_NEGATIVE }, + NavCategoryInitializer{ ViewMode::Data, + DATA_ID, + L"Data", + L"CategoryName_Data", + L"\uF20F", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + POSITIVE_ONLY }, + NavCategoryInitializer{ ViewMode::Pressure, + PRESSURE_ID, + L"Pressure", + L"CategoryName_Pressure", + L"\uEC4A", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + POSITIVE_ONLY }, + NavCategoryInitializer{ ViewMode::Angle, + ANGLE_ID, + L"Angle", + L"CategoryName_Angle", + L"\uF515", + CategoryGroupType::Converter, + MyVirtualKey::None, + std::nullopt, + SUPPORTS_NEGATIVE }, + }; +} // namespace unnamed -// The order of items in this list determines the order of items in the menu. -static std::vector s_categoryManifest = [] { - auto res = std::vector{ NavCategoryInitializer{ ViewMode::Standard, - STANDARD_ID, - L"Standard", - L"StandardMode", - L"\uE8EF", - CategoryGroupType::Calculator, - MyVirtualKey::Number1, - L"1", - SUPPORTS_ALL, - true }, - NavCategoryInitializer{ ViewMode::Scientific, - SCIENTIFIC_ID, - L"Scientific", - L"ScientificMode", - L"\uF196", - CategoryGroupType::Calculator, - MyVirtualKey::Number2, - L"2", - SUPPORTS_ALL, - true } }; - - int currentIndex = 3; - bool supportGraphingCalculator = IsGraphingModeAvailable(); - if (supportGraphingCalculator) - { - res.emplace_back(NavCategoryInitializer{ ViewMode::Graphing, - GRAPHING_ID, - L"Graphing", - L"GraphingCalculatorMode", - L"\uF770", - CategoryGroupType::Calculator, - MyVirtualKey::Number3, - L"3", - SUPPORTS_ALL, - false}); - ++currentIndex; - } - res.insert( - res.cend(), - { NavCategoryInitializer{ ViewMode::Programmer, - PROGRAMMER_ID, - L"Programmer", - L"ProgrammerMode", - L"\uECCE", - CategoryGroupType::Calculator, - supportGraphingCalculator ? MyVirtualKey::Number4 : MyVirtualKey::Number3, - towchar_t(currentIndex++), - SUPPORTS_ALL, - true }, - NavCategoryInitializer{ ViewMode::Date, - DATE_ID, - L"Date", - L"DateCalculationMode", - L"\uE787", - CategoryGroupType::Calculator, - supportGraphingCalculator ? MyVirtualKey::Number5 : MyVirtualKey::Number4, - towchar_t(currentIndex++), - SUPPORTS_ALL, - true }, - NavCategoryInitializer{ ViewMode::Currency, - CURRENCY_ID, - L"Currency", - L"CategoryName_Currency", - L"\uEB0D", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - POSITIVE_ONLY, - true }, - NavCategoryInitializer{ ViewMode::Volume, - VOLUME_ID, - L"Volume", - L"CategoryName_Volume", - L"\uF1AA", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - POSITIVE_ONLY, - true }, - NavCategoryInitializer{ ViewMode::Length, - LENGTH_ID, - L"Length", - L"CategoryName_Length", - L"\uECC6", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - POSITIVE_ONLY, - true }, - NavCategoryInitializer{ ViewMode::Weight, - WEIGHT_ID, - L"Weight and Mass", - L"CategoryName_Weight", - L"\uF4C1", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - POSITIVE_ONLY, - true }, - NavCategoryInitializer{ ViewMode::Temperature, - TEMPERATURE_ID, - L"Temperature", - L"CategoryName_Temperature", - L"\uE7A3", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - SUPPORTS_NEGATIVE, - true }, - NavCategoryInitializer{ ViewMode::Energy, - ENERGY_ID, - L"Energy", - L"CategoryName_Energy", - L"\uECAD", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - POSITIVE_ONLY, - true }, - NavCategoryInitializer{ ViewMode::Area, - AREA_ID, - L"Area", - L"CategoryName_Area", - L"\uE809", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - POSITIVE_ONLY, - true }, - NavCategoryInitializer{ ViewMode::Speed, - SPEED_ID, - L"Speed", - L"CategoryName_Speed", - L"\uEADA", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - POSITIVE_ONLY, - true }, - NavCategoryInitializer{ ViewMode::Time, - TIME_ID, - L"Time", - L"CategoryName_Time", - L"\uE917", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - POSITIVE_ONLY, - true }, - NavCategoryInitializer{ ViewMode::Power, - POWER_ID, - L"Power", - L"CategoryName_Power", - L"\uE945", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - SUPPORTS_NEGATIVE, - true }, - NavCategoryInitializer{ ViewMode::Data, - DATA_ID, - L"Data", - L"CategoryName_Data", - L"\uF20F", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - POSITIVE_ONLY, - true }, - NavCategoryInitializer{ ViewMode::Pressure, - PRESSURE_ID, - L"Pressure", - L"CategoryName_Pressure", - L"\uEC4A", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - POSITIVE_ONLY, - true }, - NavCategoryInitializer{ ViewMode::Angle, - ANGLE_ID, - L"Angle", - L"CategoryName_Angle", - L"\uF515", - CategoryGroupType::Converter, - MyVirtualKey::None, - nullptr, - SUPPORTS_NEGATIVE, - true } }); - return res; -}(); bool NavCategory::IsCalculatorViewMode(ViewModeType mode) { @@ -347,12 +300,12 @@ NavCategoryGroup::NavCategoryGroup(const NavCategoryGroupInitializer& groupIniti categoryName, categoryAutomationName, StringReference(categoryInitializer.glyph), - categoryInitializer.accessKey != nullptr ? ref new String(categoryInitializer.accessKey) + categoryInitializer.accessKey.has_value() ? ref new String(categoryInitializer.accessKey->c_str()) : resProvider->GetResourceString(nameResourceKey + "AccessKey"), groupMode, categoryInitializer.viewMode, categoryInitializer.supportsNegative, - categoryInitializer.isEnabled)); + categoryInitializer.viewMode != ViewMode::Graphing)); } } } @@ -559,16 +512,13 @@ bool NavCategoryStates::IsValidViewMode(ViewMode mode) bool NavCategoryStates::IsViewModeEnabled(ViewMode mode) { - if (mode == ViewMode::Graphing) + if (mode != ViewMode::Graphing) { - return IsGraphingModeEnabled(); + return true; } else { - return std::any_of( - s_categoryManifest.cbegin(), - s_categoryManifest.cend(), - [mode](const auto& initializer) { return initializer.viewMode == mode && initializer.isEnabled; }); + return IsGraphingModeEnabled(); } } diff --git a/src/CalcViewModel/Common/NavCategory.h b/src/CalcViewModel/Common/NavCategory.h index 1c91bde8..997acb29 100644 --- a/src/CalcViewModel/Common/NavCategory.h +++ b/src/CalcViewModel/Common/NavCategory.h @@ -66,9 +66,8 @@ namespace CalculatorApp::ViewModel const wchar_t* glyph; CategoryGroupType groupType; MyVirtualKey virtualKey; - const wchar_t* accessKey; + std::optional accessKey; bool supportsNegative; - bool isEnabled; }; private diff --git a/src/CalculatorUnitTests/NavCategoryUnitTests.cpp b/src/CalculatorUnitTests/NavCategoryUnitTests.cpp index 2f05de1b..912a622d 100644 --- a/src/CalculatorUnitTests/NavCategoryUnitTests.cpp +++ b/src/CalculatorUnitTests/NavCategoryUnitTests.cpp @@ -17,136 +17,11 @@ namespace CalculatorUnitTests TEST_CLASS(NavCategoryUnitTests) { public: - TEST_METHOD(Serialize); - TEST_METHOD(Deserialize_AllValid); - TEST_METHOD(Deserialize_AllInvalid); - - TEST_METHOD(IsValidViewMode_AllValid); - TEST_METHOD(IsValidViewMode_AllInvalid); - TEST_METHOD(IsCalculatorViewMode); TEST_METHOD(IsDateCalculatorViewMode); TEST_METHOD(IsConverterViewMode); - - TEST_METHOD(GetFriendlyName); - TEST_METHOD(GetGroupType); - TEST_METHOD(GetIndex); - TEST_METHOD(GetPosition); - TEST_METHOD(GetIndex_GetPosition_Relationship); - TEST_METHOD(GetIndexInGroup); - - TEST_METHOD(GetViewModeForVirtualKey); }; - void NavCategoryUnitTests::Serialize() - { - // While values in other tests may change (for example, the order - // of a navigation item might change), these values should NEVER - // change. We are validating the unique ID for each mode, not - // it's position or index. - VERIFY_ARE_EQUAL(0, NavCategoryStates::Serialize(ViewMode::Standard)); - VERIFY_ARE_EQUAL(1, NavCategoryStates::Serialize(ViewMode::Scientific)); - VERIFY_ARE_EQUAL(2, NavCategoryStates::Serialize(ViewMode::Programmer)); - VERIFY_ARE_EQUAL(3, NavCategoryStates::Serialize(ViewMode::Date)); - VERIFY_ARE_EQUAL(16, NavCategoryStates::Serialize(ViewMode::Currency)); - VERIFY_ARE_EQUAL(4, NavCategoryStates::Serialize(ViewMode::Volume)); - VERIFY_ARE_EQUAL(5, NavCategoryStates::Serialize(ViewMode::Length)); - VERIFY_ARE_EQUAL(6, NavCategoryStates::Serialize(ViewMode::Weight)); - VERIFY_ARE_EQUAL(7, NavCategoryStates::Serialize(ViewMode::Temperature)); - VERIFY_ARE_EQUAL(8, NavCategoryStates::Serialize(ViewMode::Energy)); - VERIFY_ARE_EQUAL(9, NavCategoryStates::Serialize(ViewMode::Area)); - VERIFY_ARE_EQUAL(10, NavCategoryStates::Serialize(ViewMode::Speed)); - VERIFY_ARE_EQUAL(11, NavCategoryStates::Serialize(ViewMode::Time)); - VERIFY_ARE_EQUAL(12, NavCategoryStates::Serialize(ViewMode::Power)); - VERIFY_ARE_EQUAL(13, NavCategoryStates::Serialize(ViewMode::Data)); - VERIFY_ARE_EQUAL(14, NavCategoryStates::Serialize(ViewMode::Pressure)); - VERIFY_ARE_EQUAL(15, NavCategoryStates::Serialize(ViewMode::Angle)); - - VERIFY_ARE_EQUAL(-1, NavCategoryStates::Serialize(ViewMode::None)); - } - - void NavCategoryUnitTests::Deserialize_AllValid() - { - // While values in other tests may change (for example, the order - // of a navigation item might change), these values should NEVER - // change. We are validating the unique ID for each mode, not - // it's position or index. - VERIFY_ARE_EQUAL(ViewMode::Standard, NavCategoryStates::Deserialize(ref new Box(0))); - VERIFY_ARE_EQUAL(ViewMode::Scientific, NavCategoryStates::Deserialize(ref new Box(1))); - VERIFY_ARE_EQUAL(ViewMode::Programmer, NavCategoryStates::Deserialize(ref new Box(2))); - VERIFY_ARE_EQUAL(ViewMode::Date, NavCategoryStates::Deserialize(ref new Box(3))); - VERIFY_ARE_EQUAL(ViewMode::Currency, NavCategoryStates::Deserialize(ref new Box(16))); - VERIFY_ARE_EQUAL(ViewMode::Volume, NavCategoryStates::Deserialize(ref new Box(4))); - VERIFY_ARE_EQUAL(ViewMode::Length, NavCategoryStates::Deserialize(ref new Box(5))); - VERIFY_ARE_EQUAL(ViewMode::Weight, NavCategoryStates::Deserialize(ref new Box(6))); - VERIFY_ARE_EQUAL(ViewMode::Temperature, NavCategoryStates::Deserialize(ref new Box(7))); - VERIFY_ARE_EQUAL(ViewMode::Energy, NavCategoryStates::Deserialize(ref new Box(8))); - VERIFY_ARE_EQUAL(ViewMode::Area, NavCategoryStates::Deserialize(ref new Box(9))); - VERIFY_ARE_EQUAL(ViewMode::Speed, NavCategoryStates::Deserialize(ref new Box(10))); - VERIFY_ARE_EQUAL(ViewMode::Time, NavCategoryStates::Deserialize(ref new Box(11))); - VERIFY_ARE_EQUAL(ViewMode::Power, NavCategoryStates::Deserialize(ref new Box(12))); - VERIFY_ARE_EQUAL(ViewMode::Data, NavCategoryStates::Deserialize(ref new Box(13))); - VERIFY_ARE_EQUAL(ViewMode::Pressure, NavCategoryStates::Deserialize(ref new Box(14))); - VERIFY_ARE_EQUAL(ViewMode::Angle, NavCategoryStates::Deserialize(ref new Box(15))); - } - - void NavCategoryUnitTests::Deserialize_AllInvalid() - { - VERIFY_ARE_EQUAL(ViewMode::None, NavCategoryStates::Deserialize(nullptr)); - VERIFY_ARE_EQUAL(ViewMode::None, NavCategoryStates::Deserialize(ref new String(L"fail"))); - - // Boundary testing - VERIFY_ARE_EQUAL(ViewMode::None, NavCategoryStates::Deserialize(ref new Box(-1))); - VERIFY_ARE_EQUAL(ViewMode::None, NavCategoryStates::Deserialize(ref new Box(18))); - } - - void NavCategoryUnitTests::IsValidViewMode_AllValid() - { - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Standard)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Scientific)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Programmer)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Date)); - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) - { - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Graphing)); - } - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Currency)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Volume)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Length)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Weight)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Temperature)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Energy)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Area)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Speed)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Time)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Power)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Data)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Pressure)); - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Angle)); - } - - void NavCategoryUnitTests::IsValidViewMode_AllInvalid() - { - VERIFY_IS_FALSE(NavCategoryStates::IsValidViewMode(ViewMode::None)); - - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) - { - // There are 18 total options so int 18 should be the first invalid - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(static_cast(17))); - VERIFY_IS_FALSE(NavCategoryStates::IsValidViewMode(static_cast(18))); - } - else - { - // There are 17 total options when graphing calculator is not present, so int 17 should be the first invalid - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(static_cast(16))); - VERIFY_IS_FALSE(NavCategoryStates::IsValidViewMode(static_cast(17))); - } - - // Also verify the lower bound - VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(static_cast(0))); - VERIFY_IS_FALSE(NavCategoryStates::IsValidViewMode(static_cast(-1))); - } - void NavCategoryUnitTests::IsCalculatorViewMode() { VERIFY_IS_TRUE(NavCategory::IsCalculatorViewMode(ViewMode::Standard)); @@ -154,10 +29,7 @@ namespace CalculatorUnitTests VERIFY_IS_TRUE(NavCategory::IsCalculatorViewMode(ViewMode::Programmer)); VERIFY_IS_FALSE(NavCategory::IsCalculatorViewMode(ViewMode::Date)); - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) - { - VERIFY_IS_FALSE(NavCategory::IsCalculatorViewMode(ViewMode::Graphing)); - } + VERIFY_IS_FALSE(NavCategory::IsCalculatorViewMode(ViewMode::Graphing)); VERIFY_IS_FALSE(NavCategory::IsCalculatorViewMode(ViewMode::Currency)); VERIFY_IS_FALSE(NavCategory::IsCalculatorViewMode(ViewMode::Volume)); @@ -181,10 +53,7 @@ namespace CalculatorUnitTests VERIFY_IS_FALSE(NavCategory::IsDateCalculatorViewMode(ViewMode::Programmer)); VERIFY_IS_TRUE(NavCategory::IsDateCalculatorViewMode(ViewMode::Date)); - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) - { - VERIFY_IS_FALSE(NavCategory::IsDateCalculatorViewMode(ViewMode::Graphing)); - } + VERIFY_IS_FALSE(NavCategory::IsDateCalculatorViewMode(ViewMode::Graphing)); VERIFY_IS_FALSE(NavCategory::IsDateCalculatorViewMode(ViewMode::Currency)); VERIFY_IS_FALSE(NavCategory::IsDateCalculatorViewMode(ViewMode::Volume)); @@ -207,10 +76,7 @@ namespace CalculatorUnitTests VERIFY_IS_FALSE(NavCategory::IsConverterViewMode(ViewMode::Scientific)); VERIFY_IS_FALSE(NavCategory::IsConverterViewMode(ViewMode::Programmer)); VERIFY_IS_FALSE(NavCategory::IsConverterViewMode(ViewMode::Date)); - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) - { - VERIFY_IS_FALSE(NavCategory::IsConverterViewMode(ViewMode::Graphing)); - } + VERIFY_IS_FALSE(NavCategory::IsConverterViewMode(ViewMode::Graphing)); VERIFY_IS_TRUE(NavCategory::IsConverterViewMode(ViewMode::Currency)); VERIFY_IS_TRUE(NavCategory::IsConverterViewMode(ViewMode::Volume)); @@ -227,178 +93,45 @@ namespace CalculatorUnitTests VERIFY_IS_TRUE(NavCategory::IsConverterViewMode(ViewMode::Angle)); } - void NavCategoryUnitTests::GetFriendlyName() - { - VERIFY_ARE_EQUAL(StringReference(L"Standard"), NavCategoryStates::GetFriendlyName(ViewMode::Standard)); - VERIFY_ARE_EQUAL(StringReference(L"Scientific"), NavCategoryStates::GetFriendlyName(ViewMode::Scientific)); - VERIFY_ARE_EQUAL(StringReference(L"Programmer"), NavCategoryStates::GetFriendlyName(ViewMode::Programmer)); - VERIFY_ARE_EQUAL(StringReference(L"Date"), NavCategoryStates::GetFriendlyName(ViewMode::Date)); - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) - { - VERIFY_ARE_EQUAL(StringReference(L"Graphing"), NavCategoryStates::GetFriendlyName(ViewMode::Graphing)); - } - VERIFY_ARE_EQUAL(StringReference(L"Currency"), NavCategoryStates::GetFriendlyName(ViewMode::Currency)); - VERIFY_ARE_EQUAL(StringReference(L"Volume"), NavCategoryStates::GetFriendlyName(ViewMode::Volume)); - VERIFY_ARE_EQUAL(StringReference(L"Length"), NavCategoryStates::GetFriendlyName(ViewMode::Length)); - VERIFY_ARE_EQUAL(StringReference(L"Weight and Mass"), NavCategoryStates::GetFriendlyName(ViewMode::Weight)); - VERIFY_ARE_EQUAL(StringReference(L"Temperature"), NavCategoryStates::GetFriendlyName(ViewMode::Temperature)); - VERIFY_ARE_EQUAL(StringReference(L"Energy"), NavCategoryStates::GetFriendlyName(ViewMode::Energy)); - VERIFY_ARE_EQUAL(StringReference(L"Area"), NavCategoryStates::GetFriendlyName(ViewMode::Area)); - VERIFY_ARE_EQUAL(StringReference(L"Speed"), NavCategoryStates::GetFriendlyName(ViewMode::Speed)); - VERIFY_ARE_EQUAL(StringReference(L"Time"), NavCategoryStates::GetFriendlyName(ViewMode::Time)); - VERIFY_ARE_EQUAL(StringReference(L"Power"), NavCategoryStates::GetFriendlyName(ViewMode::Power)); - VERIFY_ARE_EQUAL(StringReference(L"Data"), NavCategoryStates::GetFriendlyName(ViewMode::Data)); - VERIFY_ARE_EQUAL(StringReference(L"Pressure"), NavCategoryStates::GetFriendlyName(ViewMode::Pressure)); - VERIFY_ARE_EQUAL(StringReference(L"Angle"), NavCategoryStates::GetFriendlyName(ViewMode::Angle)); - - VERIFY_ARE_EQUAL(StringReference(L"None"), NavCategoryStates::GetFriendlyName(ViewMode::None)); - } - - void NavCategoryUnitTests::GetGroupType() - { - VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, NavCategoryStates::GetGroupType(ViewMode::Standard)); - VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, NavCategoryStates::GetGroupType(ViewMode::Scientific)); - VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, NavCategoryStates::GetGroupType(ViewMode::Programmer)); - VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, NavCategoryStates::GetGroupType(ViewMode::Date)); - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) - { - VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, NavCategoryStates::GetGroupType(ViewMode::Graphing)); - } - - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Currency)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Volume)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Length)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Weight)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Temperature)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Energy)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Area)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Speed)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Time)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Power)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Data)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Pressure)); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Angle)); - } - - void NavCategoryUnitTests::GetIndex() - { - // Index is the 0-based ordering of modes - vector orderedModes; - - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) - { - orderedModes = { ViewMode::Standard, ViewMode::Scientific, ViewMode::Graphing, ViewMode::Programmer, ViewMode::Date, ViewMode::Currency, - ViewMode::Volume, ViewMode::Length, ViewMode::Weight, ViewMode::Temperature, ViewMode::Energy, ViewMode::Area, - ViewMode::Speed, ViewMode::Time, ViewMode::Power, ViewMode::Data, ViewMode::Pressure, ViewMode::Angle }; - } - else - { - orderedModes = { ViewMode::Standard, ViewMode::Scientific, ViewMode::Programmer, ViewMode::Date, ViewMode::Currency, ViewMode::Volume, - ViewMode::Length, ViewMode::Weight, ViewMode::Temperature, ViewMode::Energy, ViewMode::Area, ViewMode::Speed, - ViewMode::Time, ViewMode::Power, ViewMode::Data, ViewMode::Pressure, ViewMode::Angle }; - } - - auto orderedModesSize = size(orderedModes); - for (size_t index = 0; index < orderedModesSize; index++) - { - ViewMode mode = orderedModes[index]; - VERIFY_ARE_EQUAL(index, (size_t)NavCategoryStates::GetIndex(mode)); - } - - VERIFY_ARE_EQUAL(-1, NavCategoryStates::GetIndex(ViewMode::None)); - } - - void NavCategoryUnitTests::GetPosition() - { - // Position is the 1-based ordering of modes - vector orderedModes; - - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) - { - orderedModes = { ViewMode::Standard, ViewMode::Scientific, ViewMode::Graphing, ViewMode::Programmer, ViewMode::Date, ViewMode::Currency, - ViewMode::Volume, ViewMode::Length, ViewMode::Weight, ViewMode::Temperature, ViewMode::Energy, ViewMode::Area, - ViewMode::Speed, ViewMode::Time, ViewMode::Power, ViewMode::Data, ViewMode::Pressure, ViewMode::Angle }; - } - else - { - orderedModes = { ViewMode::Standard, ViewMode::Scientific, ViewMode::Programmer, ViewMode::Date, ViewMode::Currency, ViewMode::Volume, - ViewMode::Length, ViewMode::Weight, ViewMode::Temperature, ViewMode::Energy, ViewMode::Area, ViewMode::Speed, - ViewMode::Time, ViewMode::Power, ViewMode::Data, ViewMode::Pressure, ViewMode::Angle }; - } - - auto orderedModesSize = size(orderedModes); - for (size_t pos = 1; pos <= orderedModesSize; pos++) - { - ViewMode mode = orderedModes[pos - 1]; - VERIFY_ARE_EQUAL(pos, (size_t)NavCategoryStates::GetPosition(mode)); - } - - VERIFY_ARE_EQUAL(-1, NavCategoryStates::GetPosition(ViewMode::None)); - } - - void NavCategoryUnitTests::GetIndex_GetPosition_Relationship() - { - // Index should be 1 less than Position. - // The other checks verify the order of Index and Position. - // Just verify the relationship here. - VERIFY_ARE_EQUAL(NavCategoryStates::GetIndex(ViewMode::Standard) + 1, NavCategoryStates::GetPosition(ViewMode::Standard)); - VERIFY_ARE_EQUAL(NavCategoryStates::GetPosition(ViewMode::Volume) - 1, NavCategoryStates::GetIndex(ViewMode::Volume)); - } - - void NavCategoryUnitTests::GetIndexInGroup() - { - VERIFY_ARE_EQUAL(0, NavCategoryStates::GetIndexInGroup(ViewMode::Standard, CategoryGroupType::Calculator)); - VERIFY_ARE_EQUAL(1, NavCategoryStates::GetIndexInGroup(ViewMode::Scientific, CategoryGroupType::Calculator)); - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) - { - VERIFY_ARE_EQUAL(2, NavCategoryStates::GetIndexInGroup(ViewMode::Graphing, CategoryGroupType::Calculator)); - VERIFY_ARE_EQUAL(3, NavCategoryStates::GetIndexInGroup(ViewMode::Programmer, CategoryGroupType::Calculator)); - VERIFY_ARE_EQUAL(4, NavCategoryStates::GetIndexInGroup(ViewMode::Date, CategoryGroupType::Calculator)); - } - else - { - VERIFY_ARE_EQUAL(2, NavCategoryStates::GetIndexInGroup(ViewMode::Programmer, CategoryGroupType::Calculator)); - VERIFY_ARE_EQUAL(3, NavCategoryStates::GetIndexInGroup(ViewMode::Date, CategoryGroupType::Calculator)); - } - VERIFY_ARE_EQUAL(0, NavCategoryStates::GetIndexInGroup(ViewMode::Currency, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(1, NavCategoryStates::GetIndexInGroup(ViewMode::Volume, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(2, NavCategoryStates::GetIndexInGroup(ViewMode::Length, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(3, NavCategoryStates::GetIndexInGroup(ViewMode::Weight, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(4, NavCategoryStates::GetIndexInGroup(ViewMode::Temperature, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(5, NavCategoryStates::GetIndexInGroup(ViewMode::Energy, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(6, NavCategoryStates::GetIndexInGroup(ViewMode::Area, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(7, NavCategoryStates::GetIndexInGroup(ViewMode::Speed, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(8, NavCategoryStates::GetIndexInGroup(ViewMode::Time, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(9, NavCategoryStates::GetIndexInGroup(ViewMode::Power, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(10, NavCategoryStates::GetIndexInGroup(ViewMode::Data, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(11, NavCategoryStates::GetIndexInGroup(ViewMode::Pressure, CategoryGroupType::Converter)); - VERIFY_ARE_EQUAL(12, NavCategoryStates::GetIndexInGroup(ViewMode::Angle, CategoryGroupType::Converter)); - - VERIFY_ARE_EQUAL(-1, NavCategoryStates::GetIndexInGroup(ViewMode::None, CategoryGroupType::Calculator)); - VERIFY_ARE_EQUAL(-1, NavCategoryStates::GetIndexInGroup(ViewMode::None, CategoryGroupType::Converter)); - } - - void NavCategoryUnitTests::GetViewModeForVirtualKey() - { - VERIFY_ARE_EQUAL(ViewMode::Standard, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number1)); - VERIFY_ARE_EQUAL(ViewMode::Scientific, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number2)); - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) - { - VERIFY_ARE_EQUAL(ViewMode::Graphing, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number3)); - VERIFY_ARE_EQUAL(ViewMode::Programmer, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number4)); - VERIFY_ARE_EQUAL(ViewMode::Date, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number5)); - } - else - { - VERIFY_ARE_EQUAL(ViewMode::Programmer, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number3)); - VERIFY_ARE_EQUAL(ViewMode::Date, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number4)); - } - } - TEST_CLASS(NavCategoryGroupUnitTests) { public: - TEST_METHOD(CreateNavCategoryGroup); + TEST_METHOD(CreateNavCategoryGroup) + { + IObservableVector ^ menuOptions = NavCategoryStates::CreateMenuOptions(); + + VERIFY_ARE_EQUAL(2, menuOptions->Size); + + NavCategoryGroup ^ calculatorGroup = menuOptions->GetAt(0); + VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, calculatorGroup->GroupType); + + IObservableVector ^ calculatorCategories = calculatorGroup->Categories; + ValidateNavCategory(calculatorCategories, 0u, ViewMode::Standard); + ValidateNavCategory(calculatorCategories, 1u, ViewMode::Scientific); + ValidateNavCategory(calculatorCategories, 2u, ViewMode::Graphing); + ValidateNavCategory(calculatorCategories, 3u, ViewMode::Programmer); + ValidateNavCategory(calculatorCategories, 4u, ViewMode::Date); + VERIFY_ARE_EQUAL(5, calculatorCategories->Size); + + NavCategoryGroup ^ converterGroup = menuOptions->GetAt(1); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, converterGroup->GroupType); + + IObservableVector ^ converterCategories = converterGroup->Categories; + VERIFY_ARE_EQUAL(13, converterCategories->Size); + ValidateNavCategory(converterCategories, 0u, ViewMode::Currency); + ValidateNavCategory(converterCategories, 1u, ViewMode::Volume); + ValidateNavCategory(converterCategories, 2u, ViewMode::Length); + ValidateNavCategory(converterCategories, 3u, ViewMode::Weight); + ValidateNavCategory(converterCategories, 4u, ViewMode::Temperature); + ValidateNavCategory(converterCategories, 5u, ViewMode::Energy); + ValidateNavCategory(converterCategories, 6u, ViewMode::Area); + ValidateNavCategory(converterCategories, 7u, ViewMode::Speed); + ValidateNavCategory(converterCategories, 8u, ViewMode::Time); + ValidateNavCategory(converterCategories, 9u, ViewMode::Power); + ValidateNavCategory(converterCategories, 10u, ViewMode::Data); + ValidateNavCategory(converterCategories, 11u, ViewMode::Pressure); + ValidateNavCategory(converterCategories, 12u, ViewMode::Angle); + } private: void ValidateNavCategory(IObservableVector ^ categories, unsigned int index, ViewMode expectedMode) @@ -408,52 +141,239 @@ namespace CalculatorUnitTests NavCategory ^ category = categories->GetAt(index); VERIFY_ARE_EQUAL(expectedMode, category->ViewMode); + VERIFY_ARE_EQUAL(category->IsEnabled, (expectedMode != ViewMode::Graphing) ? true : false); } }; - void NavCategoryGroupUnitTests::CreateNavCategoryGroup() + TEST_CLASS(NavCategoryStatesUnitTests) { - IObservableVector ^ menuOptions = NavCategoryStates::CreateMenuOptions(); - - VERIFY_ARE_EQUAL(2, menuOptions->Size); - - NavCategoryGroup ^ calculatorGroup = menuOptions->GetAt(0); - VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, calculatorGroup->GroupType); - - IObservableVector ^ calculatorCategories = calculatorGroup->Categories; - ValidateNavCategory(calculatorCategories, 0u, ViewMode::Standard); - ValidateNavCategory(calculatorCategories, 1u, ViewMode::Scientific); - if (Windows::Foundation::Metadata::ApiInformation::IsMethodPresent("Windows.UI.Text.RichEditTextDocument", "GetMath")) + public: + TEST_METHOD(Serialize) { - ValidateNavCategory(calculatorCategories, 2u, ViewMode::Graphing); - ValidateNavCategory(calculatorCategories, 3u, ViewMode::Programmer); - ValidateNavCategory(calculatorCategories, 4u, ViewMode::Date); - VERIFY_ARE_EQUAL(5, calculatorCategories->Size); - } - else - { - ValidateNavCategory(calculatorCategories, 2u, ViewMode::Programmer); - ValidateNavCategory(calculatorCategories, 3u, ViewMode::Date); - VERIFY_ARE_EQUAL(4, calculatorCategories->Size); + // While values in other tests may change (for example, the order + // of a navigation item might change), these values should NEVER + // change. We are validating the unique ID for each mode, not + // it's position or index. + VERIFY_ARE_EQUAL(0, NavCategoryStates::Serialize(ViewMode::Standard)); + VERIFY_ARE_EQUAL(1, NavCategoryStates::Serialize(ViewMode::Scientific)); + VERIFY_ARE_EQUAL(2, NavCategoryStates::Serialize(ViewMode::Programmer)); + VERIFY_ARE_EQUAL(3, NavCategoryStates::Serialize(ViewMode::Date)); + VERIFY_ARE_EQUAL(16, NavCategoryStates::Serialize(ViewMode::Currency)); + VERIFY_ARE_EQUAL(4, NavCategoryStates::Serialize(ViewMode::Volume)); + VERIFY_ARE_EQUAL(5, NavCategoryStates::Serialize(ViewMode::Length)); + VERIFY_ARE_EQUAL(6, NavCategoryStates::Serialize(ViewMode::Weight)); + VERIFY_ARE_EQUAL(7, NavCategoryStates::Serialize(ViewMode::Temperature)); + VERIFY_ARE_EQUAL(8, NavCategoryStates::Serialize(ViewMode::Energy)); + VERIFY_ARE_EQUAL(9, NavCategoryStates::Serialize(ViewMode::Area)); + VERIFY_ARE_EQUAL(10, NavCategoryStates::Serialize(ViewMode::Speed)); + VERIFY_ARE_EQUAL(11, NavCategoryStates::Serialize(ViewMode::Time)); + VERIFY_ARE_EQUAL(12, NavCategoryStates::Serialize(ViewMode::Power)); + VERIFY_ARE_EQUAL(13, NavCategoryStates::Serialize(ViewMode::Data)); + VERIFY_ARE_EQUAL(14, NavCategoryStates::Serialize(ViewMode::Pressure)); + VERIFY_ARE_EQUAL(15, NavCategoryStates::Serialize(ViewMode::Angle)); + + VERIFY_ARE_EQUAL(-1, NavCategoryStates::Serialize(ViewMode::None)); } - NavCategoryGroup ^ converterGroup = menuOptions->GetAt(1); - VERIFY_ARE_EQUAL(CategoryGroupType::Converter, converterGroup->GroupType); + TEST_METHOD(Deserialize_AllValid) + { + // While values in other tests may change (for example, the order + // of a navigation item might change), these values should NEVER + // change. We are validating the unique ID for each mode, not + // it's position or index. + VERIFY_ARE_EQUAL(ViewMode::Standard, NavCategoryStates::Deserialize(ref new Box(0))); + VERIFY_ARE_EQUAL(ViewMode::Scientific, NavCategoryStates::Deserialize(ref new Box(1))); + VERIFY_ARE_EQUAL(ViewMode::Programmer, NavCategoryStates::Deserialize(ref new Box(2))); + VERIFY_ARE_EQUAL(ViewMode::Date, NavCategoryStates::Deserialize(ref new Box(3))); + VERIFY_ARE_EQUAL(ViewMode::Currency, NavCategoryStates::Deserialize(ref new Box(16))); + VERIFY_ARE_EQUAL(ViewMode::Volume, NavCategoryStates::Deserialize(ref new Box(4))); + VERIFY_ARE_EQUAL(ViewMode::Length, NavCategoryStates::Deserialize(ref new Box(5))); + VERIFY_ARE_EQUAL(ViewMode::Weight, NavCategoryStates::Deserialize(ref new Box(6))); + VERIFY_ARE_EQUAL(ViewMode::Temperature, NavCategoryStates::Deserialize(ref new Box(7))); + VERIFY_ARE_EQUAL(ViewMode::Energy, NavCategoryStates::Deserialize(ref new Box(8))); + VERIFY_ARE_EQUAL(ViewMode::Area, NavCategoryStates::Deserialize(ref new Box(9))); + VERIFY_ARE_EQUAL(ViewMode::Speed, NavCategoryStates::Deserialize(ref new Box(10))); + VERIFY_ARE_EQUAL(ViewMode::Time, NavCategoryStates::Deserialize(ref new Box(11))); + VERIFY_ARE_EQUAL(ViewMode::Power, NavCategoryStates::Deserialize(ref new Box(12))); + VERIFY_ARE_EQUAL(ViewMode::Data, NavCategoryStates::Deserialize(ref new Box(13))); + VERIFY_ARE_EQUAL(ViewMode::Pressure, NavCategoryStates::Deserialize(ref new Box(14))); + VERIFY_ARE_EQUAL(ViewMode::Angle, NavCategoryStates::Deserialize(ref new Box(15))); + } - IObservableVector ^ converterCategories = converterGroup->Categories; - VERIFY_ARE_EQUAL(13, converterCategories->Size); - ValidateNavCategory(converterCategories, 0u, ViewMode::Currency); - ValidateNavCategory(converterCategories, 1u, ViewMode::Volume); - ValidateNavCategory(converterCategories, 2u, ViewMode::Length); - ValidateNavCategory(converterCategories, 3u, ViewMode::Weight); - ValidateNavCategory(converterCategories, 4u, ViewMode::Temperature); - ValidateNavCategory(converterCategories, 5u, ViewMode::Energy); - ValidateNavCategory(converterCategories, 6u, ViewMode::Area); - ValidateNavCategory(converterCategories, 7u, ViewMode::Speed); - ValidateNavCategory(converterCategories, 8u, ViewMode::Time); - ValidateNavCategory(converterCategories, 9u, ViewMode::Power); - ValidateNavCategory(converterCategories, 10u, ViewMode::Data); - ValidateNavCategory(converterCategories, 11u, ViewMode::Pressure); - ValidateNavCategory(converterCategories, 12u, ViewMode::Angle); - } + TEST_METHOD(Deserialize_AllInvalid) + { + VERIFY_ARE_EQUAL(ViewMode::None, NavCategoryStates::Deserialize(nullptr)); + VERIFY_ARE_EQUAL(ViewMode::None, NavCategoryStates::Deserialize(ref new String(L"fail"))); + + // Boundary testing + VERIFY_ARE_EQUAL(ViewMode::None, NavCategoryStates::Deserialize(ref new Box(-1))); + VERIFY_ARE_EQUAL(ViewMode::None, NavCategoryStates::Deserialize(ref new Box(18))); + } + + TEST_METHOD(IsValidViewMode_AllValid) + { + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Standard)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Scientific)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Programmer)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Date)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Graphing)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Currency)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Volume)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Length)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Weight)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Temperature)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Energy)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Area)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Speed)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Time)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Power)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Data)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Pressure)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(ViewMode::Angle)); + } + + TEST_METHOD(IsValidViewMode_AllInvalid) + { + VERIFY_IS_FALSE(NavCategoryStates::IsValidViewMode(ViewMode::None)); + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(static_cast(17))); + VERIFY_IS_FALSE(NavCategoryStates::IsValidViewMode(static_cast(18))); + + // Also verify the lower bound + VERIFY_IS_TRUE(NavCategoryStates::IsValidViewMode(static_cast(0))); + VERIFY_IS_FALSE(NavCategoryStates::IsValidViewMode(static_cast(-1))); + } + + TEST_METHOD(GetFriendlyName) + { + VERIFY_ARE_EQUAL(StringReference(L"Standard"), NavCategoryStates::GetFriendlyName(ViewMode::Standard)); + VERIFY_ARE_EQUAL(StringReference(L"Scientific"), NavCategoryStates::GetFriendlyName(ViewMode::Scientific)); + VERIFY_ARE_EQUAL(StringReference(L"Programmer"), NavCategoryStates::GetFriendlyName(ViewMode::Programmer)); + VERIFY_ARE_EQUAL(StringReference(L"Date"), NavCategoryStates::GetFriendlyName(ViewMode::Date)); + VERIFY_ARE_EQUAL(StringReference(L"Graphing"), NavCategoryStates::GetFriendlyName(ViewMode::Graphing)); + VERIFY_ARE_EQUAL(StringReference(L"Currency"), NavCategoryStates::GetFriendlyName(ViewMode::Currency)); + VERIFY_ARE_EQUAL(StringReference(L"Volume"), NavCategoryStates::GetFriendlyName(ViewMode::Volume)); + VERIFY_ARE_EQUAL(StringReference(L"Length"), NavCategoryStates::GetFriendlyName(ViewMode::Length)); + VERIFY_ARE_EQUAL(StringReference(L"Weight and Mass"), NavCategoryStates::GetFriendlyName(ViewMode::Weight)); + VERIFY_ARE_EQUAL(StringReference(L"Temperature"), NavCategoryStates::GetFriendlyName(ViewMode::Temperature)); + VERIFY_ARE_EQUAL(StringReference(L"Energy"), NavCategoryStates::GetFriendlyName(ViewMode::Energy)); + VERIFY_ARE_EQUAL(StringReference(L"Area"), NavCategoryStates::GetFriendlyName(ViewMode::Area)); + VERIFY_ARE_EQUAL(StringReference(L"Speed"), NavCategoryStates::GetFriendlyName(ViewMode::Speed)); + VERIFY_ARE_EQUAL(StringReference(L"Time"), NavCategoryStates::GetFriendlyName(ViewMode::Time)); + VERIFY_ARE_EQUAL(StringReference(L"Power"), NavCategoryStates::GetFriendlyName(ViewMode::Power)); + VERIFY_ARE_EQUAL(StringReference(L"Data"), NavCategoryStates::GetFriendlyName(ViewMode::Data)); + VERIFY_ARE_EQUAL(StringReference(L"Pressure"), NavCategoryStates::GetFriendlyName(ViewMode::Pressure)); + VERIFY_ARE_EQUAL(StringReference(L"Angle"), NavCategoryStates::GetFriendlyName(ViewMode::Angle)); + + VERIFY_ARE_EQUAL(StringReference(L"None"), NavCategoryStates::GetFriendlyName(ViewMode::None)); + } + + TEST_METHOD(GetGroupType) + { + VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, NavCategoryStates::GetGroupType(ViewMode::Standard)); + VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, NavCategoryStates::GetGroupType(ViewMode::Scientific)); + VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, NavCategoryStates::GetGroupType(ViewMode::Programmer)); + VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, NavCategoryStates::GetGroupType(ViewMode::Date)); + VERIFY_ARE_EQUAL(CategoryGroupType::Calculator, NavCategoryStates::GetGroupType(ViewMode::Graphing)); + + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Currency)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Volume)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Length)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Weight)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Temperature)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Energy)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Area)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Speed)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Time)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Power)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Data)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Pressure)); + VERIFY_ARE_EQUAL(CategoryGroupType::Converter, NavCategoryStates::GetGroupType(ViewMode::Angle)); + } + + TEST_METHOD(GetIndex) + { + // Index is the 0-based ordering of modes + const auto orderedModesSize = _orderedModes.size(); + for (size_t index = 0; index < orderedModesSize; index++) + { + ViewMode mode = _orderedModes[index]; + VERIFY_ARE_EQUAL(index, (size_t)NavCategoryStates::GetIndex(mode)); + } + + VERIFY_ARE_EQUAL(-1, NavCategoryStates::GetIndex(ViewMode::None)); + } + + TEST_METHOD(GetPosition) + { + // Position is the 1-based ordering of modes + const auto orderedModesSize = _orderedModes.size(); + for (size_t pos = 1; pos <= orderedModesSize; pos++) + { + ViewMode mode = _orderedModes[pos - 1]; + VERIFY_ARE_EQUAL(pos, (size_t)NavCategoryStates::GetPosition(mode)); + } + + VERIFY_ARE_EQUAL(-1, NavCategoryStates::GetPosition(ViewMode::None)); + } + + TEST_METHOD(GetIndex_GetPosition_Relationship) + { + // Index should be 1 less than Position. + // The other checks verify the order of Index and Position. + // Just verify the relationship here. + VERIFY_ARE_EQUAL(NavCategoryStates::GetIndex(ViewMode::Standard) + 1, NavCategoryStates::GetPosition(ViewMode::Standard)); + VERIFY_ARE_EQUAL(NavCategoryStates::GetPosition(ViewMode::Volume) - 1, NavCategoryStates::GetIndex(ViewMode::Volume)); + } + + TEST_METHOD(GetIndexInGroup) + { + VERIFY_ARE_EQUAL(0, NavCategoryStates::GetIndexInGroup(ViewMode::Standard, CategoryGroupType::Calculator)); + VERIFY_ARE_EQUAL(1, NavCategoryStates::GetIndexInGroup(ViewMode::Scientific, CategoryGroupType::Calculator)); + VERIFY_ARE_EQUAL(2, NavCategoryStates::GetIndexInGroup(ViewMode::Graphing, CategoryGroupType::Calculator)); + VERIFY_ARE_EQUAL(3, NavCategoryStates::GetIndexInGroup(ViewMode::Programmer, CategoryGroupType::Calculator)); + VERIFY_ARE_EQUAL(4, NavCategoryStates::GetIndexInGroup(ViewMode::Date, CategoryGroupType::Calculator)); + VERIFY_ARE_EQUAL(0, NavCategoryStates::GetIndexInGroup(ViewMode::Currency, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(1, NavCategoryStates::GetIndexInGroup(ViewMode::Volume, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(2, NavCategoryStates::GetIndexInGroup(ViewMode::Length, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(3, NavCategoryStates::GetIndexInGroup(ViewMode::Weight, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(4, NavCategoryStates::GetIndexInGroup(ViewMode::Temperature, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(5, NavCategoryStates::GetIndexInGroup(ViewMode::Energy, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(6, NavCategoryStates::GetIndexInGroup(ViewMode::Area, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(7, NavCategoryStates::GetIndexInGroup(ViewMode::Speed, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(8, NavCategoryStates::GetIndexInGroup(ViewMode::Time, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(9, NavCategoryStates::GetIndexInGroup(ViewMode::Power, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(10, NavCategoryStates::GetIndexInGroup(ViewMode::Data, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(11, NavCategoryStates::GetIndexInGroup(ViewMode::Pressure, CategoryGroupType::Converter)); + VERIFY_ARE_EQUAL(12, NavCategoryStates::GetIndexInGroup(ViewMode::Angle, CategoryGroupType::Converter)); + + VERIFY_ARE_EQUAL(-1, NavCategoryStates::GetIndexInGroup(ViewMode::None, CategoryGroupType::Calculator)); + VERIFY_ARE_EQUAL(-1, NavCategoryStates::GetIndexInGroup(ViewMode::None, CategoryGroupType::Converter)); + } + + TEST_METHOD(GetViewModeForVirtualKey) + { + VERIFY_ARE_EQUAL(ViewMode::Standard, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number1)); + VERIFY_ARE_EQUAL(ViewMode::Scientific, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number2)); + VERIFY_ARE_EQUAL(ViewMode::Graphing, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number3)); + VERIFY_ARE_EQUAL(ViewMode::Programmer, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number4)); + VERIFY_ARE_EQUAL(ViewMode::Date, NavCategoryStates::GetViewModeForVirtualKey(MyVirtualKey::Number5)); + } + + TEST_METHOD(IsViewModeEnabled_ShouldBeTrue_ExceptGraphingMode) + { + for (const auto& mode : _orderedModes) + { + if (mode != ViewMode::Graphing) + { + VERIFY_IS_TRUE(NavCategoryStates::IsViewModeEnabled(mode)); + } + } + } + + private: + const static inline std::vector _orderedModes { + ViewMode::Standard, ViewMode::Scientific, ViewMode::Graphing, ViewMode::Programmer, ViewMode::Date, ViewMode::Currency, + ViewMode::Volume, ViewMode::Length, ViewMode::Weight, ViewMode::Temperature, ViewMode::Energy, ViewMode::Area, + ViewMode::Speed, ViewMode::Time, ViewMode::Power, ViewMode::Data, ViewMode::Pressure, ViewMode::Angle }; + }; }