diff --git a/src/.clang-format b/.clang-format similarity index 100% rename from src/.clang-format rename to .clang-format diff --git a/src/clang-format-all.sh b/Tools/Scripts/clang-format/clang-format-all.sh similarity index 67% rename from src/clang-format-all.sh rename to Tools/Scripts/clang-format/clang-format-all.sh index 943251ec..b54fe6e2 100644 --- a/src/clang-format-all.sh +++ b/Tools/Scripts/clang-format/clang-format-all.sh @@ -5,10 +5,6 @@ function usage { exit 1 } -if [ $# -eq 0 ]; then - usage -fi - # Variable that will hold the name of the clang-format command FMT="" @@ -29,33 +25,22 @@ if [ -z "$FMT" ]; then exit 1 fi +SRC_PATH="$@" +if [ -z "$SRC_PATH" ]; then + SRC_PATH="../../../src" +fi + # Check all of the arguments first to make sure they're all directories -for dir in "$@"; do +for dir in "$SRC_PATH"; do if [ ! -d "${dir}" ]; then echo "${dir} is not a directory" usage fi done -# Find a dominating file, starting from a given directory and going up. -find-dominating-file() { - if [ -r "$1"/"$2" ]; then - return 0 - fi - if [ "$1" = "/" ]; then - return 1 - fi - find-dominating-file "$(realpath "$1"/..)" "$2" - return $? -} - # Run clang-format -i on all of the things -for dir in "$@"; do +for dir in "$SRC_PATH"; do pushd "${dir}" &>/dev/null - if ! find-dominating-file . .clang-format; then - echo "Failed to find dominating .clang-format starting at $PWD" - continue - fi find . \ \( -name '*.c' \ -o -name '*.cc' \ @@ -63,6 +48,6 @@ for dir in "$@"; do -o -name '*.h' \ -o -name '*.hh' \ -o -name '*.hpp' \) \ - -exec "${FMT}" -i '{}' \; + -exec "${FMT}" -style=file -i '{}' \; popd &>/dev/null done diff --git a/src/CalcViewModel/Common/CopyPasteManager.cpp b/src/CalcViewModel/Common/CopyPasteManager.cpp index 6d6807ba..4325cad4 100644 --- a/src/CalcViewModel/Common/CopyPasteManager.cpp +++ b/src/CalcViewModel/Common/CopyPasteManager.cpp @@ -15,10 +15,7 @@ using namespace Windows::Foundation; using namespace Windows::System; using namespace Windows::ApplicationModel::DataTransfer; -String^ CopyPasteManager::supportedFormats[] = -{ - StandardDataFormats::Text -}; +String ^ CopyPasteManager::supportedFormats[] = { StandardDataFormats::Text }; static constexpr wstring_view c_validCharacterSet{ L"0123456789()+-*/.abcdefABCDEF" }; @@ -40,43 +37,26 @@ static const wstring c_binProgrammerChars = L"[0-1]+((_|'|`)[0-1]+)*"; static const wstring c_uIntSuffixes = L"[uU]?[lL]{0,2}"; // RegEx Patterns used by various modes -static const array standardModePatterns = -{ - wregex(c_wspc + c_signedDecFloat + c_wspc) -}; -static const array scientificModePatterns = -{ - wregex(L"(" + c_wspc + L"[-+]?)|(" + c_wspcLParenSigned + L")" + c_signedDecFloat + c_wspcRParens), - wregex(L"(" + c_wspc + L"[-+]?)|(" + c_wspcLParenSigned + L")" + c_signedDecFloat + L"[e]([+]|[-])+\\d+" + c_wspcRParens) -}; -static const array, 4> programmerModePatterns = -{ { - // Hex numbers like 5F, 4A0C, 0xa9, 0xFFull, 47CDh - { - wregex(c_wspcLParens + L"(0[xX])?" + c_hexProgrammerChars + c_uIntSuffixes + c_wspcRParens), - wregex(c_wspcLParens + c_hexProgrammerChars + L"[hH]?" + c_wspcRParens) - }, - // Decimal numbers like -145, 145, 0n145, 123ull etc - { - wregex(c_wspcLParens + L"[-+]?" + c_decProgrammerChars + L"[lL]{0,2}" +c_wspcRParens), - wregex(c_wspcLParens + L"(0[nN])?" + c_decProgrammerChars + c_uIntSuffixes + c_wspcRParens) - }, - // Octal numbers like 06, 010, 0t77, 0o77, 077ull etc - { - wregex(c_wspcLParens + L"(0[otOT])?" + c_octProgrammerChars + c_uIntSuffixes + c_wspcRParens) - }, - // Binary numbers like 011010110, 0010110, 10101001, 1001b, 0b1001, 0y1001, 0b1001ull - { - wregex(c_wspcLParens + L"(0[byBY])?" + c_binProgrammerChars + c_uIntSuffixes + c_wspcRParens), - wregex(c_wspcLParens + c_binProgrammerChars + L"[bB]?" + c_wspcRParens) - } - } }; -static const array unitConverterPatterns = -{ - wregex(c_wspc + L"[-+]?\\d*[.]?\\d*" + c_wspc) +static const array standardModePatterns = { wregex(c_wspc + c_signedDecFloat + c_wspc) }; +static const array scientificModePatterns = { wregex(L"(" + c_wspc + L"[-+]?)|(" + c_wspcLParenSigned + L")" + c_signedDecFloat + c_wspcRParens), + wregex(L"(" + c_wspc + L"[-+]?)|(" + c_wspcLParenSigned + L")" + c_signedDecFloat + + L"[e]([+]|[-])+\\d+" + c_wspcRParens) }; +static const array, 4> programmerModePatterns = { + { // Hex numbers like 5F, 4A0C, 0xa9, 0xFFull, 47CDh + { wregex(c_wspcLParens + L"(0[xX])?" + c_hexProgrammerChars + c_uIntSuffixes + c_wspcRParens), + wregex(c_wspcLParens + c_hexProgrammerChars + L"[hH]?" + c_wspcRParens) }, + // Decimal numbers like -145, 145, 0n145, 123ull etc + { wregex(c_wspcLParens + L"[-+]?" + c_decProgrammerChars + L"[lL]{0,2}" + c_wspcRParens), + wregex(c_wspcLParens + L"(0[nN])?" + c_decProgrammerChars + c_uIntSuffixes + c_wspcRParens) }, + // Octal numbers like 06, 010, 0t77, 0o77, 077ull etc + { wregex(c_wspcLParens + L"(0[otOT])?" + c_octProgrammerChars + c_uIntSuffixes + c_wspcRParens) }, + // Binary numbers like 011010110, 0010110, 10101001, 1001b, 0b1001, 0y1001, 0b1001ull + { wregex(c_wspcLParens + L"(0[byBY])?" + c_binProgrammerChars + c_uIntSuffixes + c_wspcRParens), + wregex(c_wspcLParens + c_binProgrammerChars + L"[bB]?" + c_wspcRParens) } } }; +static const array unitConverterPatterns = { wregex(c_wspc + L"[-+]?\\d*[.]?\\d*" + c_wspc) }; -void CopyPasteManager::CopyToClipboard(String^ stringToCopy) +void CopyPasteManager::CopyToClipboard(String ^ stringToCopy) { // Copy the string to the clipboard auto dataPackage = ref new DataPackage(); @@ -84,7 +64,7 @@ void CopyPasteManager::CopyToClipboard(String^ stringToCopy) Clipboard::SetContent(dataPackage); } -task CopyPasteManager::GetStringToPaste(ViewMode mode, CategoryGroupType modeType, int programmerNumberBase, int bitLengthType) +task CopyPasteManager::GetStringToPaste(ViewMode mode, CategoryGroupType modeType, int programmerNumberBase, int bitLengthType) { // Retrieve the text in the clipboard auto dataPackageView = Clipboard::GetContent(); @@ -95,11 +75,9 @@ task CopyPasteManager::GetStringToPaste(ViewMode mode, CategoryGroupTyp //-- add support to allow pasting for expressions like 1.3e12(as of now we allow 1.3e+12) return create_task((dataPackageView->GetTextAsync(::StandardDataFormats::Text))) - .then([mode, modeType, programmerNumberBase, bitLengthType](String^ pastedText) - { - return ValidatePasteExpression(pastedText, mode, modeType, programmerNumberBase, bitLengthType); - } - , task_continuation_context::use_arbitrary()); + .then([mode, modeType, programmerNumberBase, + bitLengthType](String ^ pastedText) { return ValidatePasteExpression(pastedText, mode, modeType, programmerNumberBase, bitLengthType); }, + task_continuation_context::use_arbitrary()); } int CopyPasteManager::ClipboardTextFormat() @@ -116,14 +94,14 @@ int CopyPasteManager::ClipboardTextFormat() return -1; } -String^ CopyPasteManager::ValidatePasteExpression(String^ pastedText, ViewMode mode, int programmerNumberBase, int bitLengthType) +String ^ CopyPasteManager::ValidatePasteExpression(String ^ pastedText, ViewMode mode, int programmerNumberBase, int bitLengthType) { return CopyPasteManager::ValidatePasteExpression(pastedText, mode, NavCategory::GetGroupType(mode), programmerNumberBase, bitLengthType); } // return "NoOp" if pastedText is invalid else return pastedText -String^ CopyPasteManager::ValidatePasteExpression(String^ pastedText, ViewMode mode, CategoryGroupType modeType, int programmerNumberBase, int bitLengthType) +String ^ CopyPasteManager::ValidatePasteExpression(String ^ pastedText, ViewMode mode, CategoryGroupType modeType, int programmerNumberBase, int bitLengthType) { if (pastedText->Length() > MaxPasteableLength) { @@ -135,7 +113,7 @@ String^ CopyPasteManager::ValidatePasteExpression(String^ pastedText, ViewMode m wstring pasteExpression = pastedText->Data(); // Get english translated expression - String^ englishString = LocalizationSettings::GetInstance().GetEnglishValueFromLocalizedDigits(pasteExpression); + String ^ englishString = LocalizationSettings::GetInstance().GetEnglishValueFromLocalizedDigits(pasteExpression); // Removing the spaces, comma separator from the pasteExpression to allow pasting of expressions like 1 + 2+1,333 pasteExpression = RemoveUnwantedCharsFromWstring(englishString->Data()); @@ -223,7 +201,8 @@ vector CopyPasteManager::ExtractOperands(const wstring& pasteExpression if ((pasteExpression.at(i) == L'+') || (pasteExpression.at(i) == L'-')) { // don't break the expression into operands if the encountered character corresponds to sign command(+-) - if (isPreviousOpenParen || startOfExpression || isPreviousOperator || ((mode != ViewMode::Programmer) && !((i != 0) && (pasteExpression.at(i - 1) != L'e')))) + if (isPreviousOpenParen || startOfExpression || isPreviousOperator + || ((mode != ViewMode::Programmer) && !((i != 0) && (pasteExpression.at(i - 1) != L'e')))) { isPreviousOperator = false; continue; @@ -267,7 +246,7 @@ bool CopyPasteManager::ExpressionRegExMatch(vector operands, ViewMode m } vector patterns{}; - + if (mode == ViewMode::Standard) { patterns.assign(standardModePatterns.begin(), standardModePatterns.end()); @@ -339,7 +318,7 @@ pair CopyPasteManager::GetMaxOperandLengthAndValue(ViewMode mo { constexpr size_t defaultMaxOperandLength = 0; constexpr uint64_t defaultMaxValue = 0; - + if (mode == ViewMode::Standard) { return make_pair(MaxStandardOperandLength, defaultMaxValue); @@ -452,26 +431,28 @@ bool CopyPasteManager::TryOperandToULL(const wstring& operand, int numberBase, u } size_t CopyPasteManager::OperandLength(const wstring& operand, ViewMode mode, CategoryGroupType modeType, int programmerNumberBase) -{ - if (modeType == CategoryGroupType::Converter) { +{ + if (modeType == CategoryGroupType::Converter) + { return operand.length(); } - switch(mode) { - case ViewMode::Standard: - case ViewMode::Scientific: - return StandardScientificOperandLength(operand); + switch (mode) + { + case ViewMode::Standard: + case ViewMode::Scientific: + return StandardScientificOperandLength(operand); - case ViewMode::Programmer: - return ProgrammerOperandLength(operand, programmerNumberBase); + case ViewMode::Programmer: + return ProgrammerOperandLength(operand, programmerNumberBase); - default: - return 0; + default: + return 0; } } size_t CopyPasteManager::StandardScientificOperandLength(const wstring& operand) -{ +{ const bool hasDecimal = operand.find('.') != wstring::npos; if (hasDecimal) @@ -494,7 +475,6 @@ size_t CopyPasteManager::StandardScientificOperandLength(const wstring& operand) size_t CopyPasteManager::ProgrammerOperandLength(const wstring& operand, int numberBase) { - vector prefixes{}; vector suffixes{}; switch (numberBase) @@ -515,7 +495,7 @@ size_t CopyPasteManager::ProgrammerOperandLength(const wstring& operand, int num break; default: // No defined prefixes/suffixes - return 0; + return 0; } // UInt suffixes are common across all modes diff --git a/src/CalcViewModel/Common/CopyPasteManager.h b/src/CalcViewModel/Common/CopyPasteManager.h index 9d6fd669..e4aa9a74 100644 --- a/src/CalcViewModel/Common/CopyPasteManager.h +++ b/src/CalcViewModel/Common/CopyPasteManager.h @@ -25,8 +25,9 @@ namespace CalculatorApp class CopyPasteManager { public: - static void CopyToClipboard(Platform::String^ stringToCopy); - static concurrency::task GetStringToPaste(CalculatorApp::Common::ViewMode mode, CalculatorApp::Common::CategoryGroupType modeType, int programmerNumberBase = -1, int bitLengthType = -1); + static void CopyToClipboard(Platform::String ^ stringToCopy); + static concurrency::task GetStringToPaste(CalculatorApp::Common::ViewMode mode, CalculatorApp::Common::CategoryGroupType modeType, + int programmerNumberBase = -1, int bitLengthType = -1); static bool HasStringToPaste() { return ClipboardTextFormat() >= 0; @@ -36,25 +37,23 @@ namespace CalculatorApp private: static int ClipboardTextFormat(); - static Platform::String^ ValidatePasteExpression( - Platform::String^ pastedText, - CalculatorApp::Common::ViewMode mode, - int programmerNumberBase, - int bitLengthType); - static Platform::String^ ValidatePasteExpression( - Platform::String^ pastedText, - CalculatorApp::Common::ViewMode mode, - CalculatorApp::Common::CategoryGroupType modeType, - int programmerNumberBase, - int bitLengthType); + static Platform::String + ^ ValidatePasteExpression(Platform::String ^ pastedText, CalculatorApp::Common::ViewMode mode, int programmerNumberBase, int bitLengthType); + static Platform::String + ^ ValidatePasteExpression(Platform::String ^ pastedText, CalculatorApp::Common::ViewMode mode, CalculatorApp::Common::CategoryGroupType modeType, + int programmerNumberBase, int bitLengthType); - static std::vector ExtractOperands(const std::wstring& pasteExpression, CalculatorApp::Common::ViewMode mode, int programmerNumberBase = -1, int bitLengthType = -1); - static bool ExpressionRegExMatch(std::vector operands, CalculatorApp::Common::ViewMode mode, CalculatorApp::Common::CategoryGroupType modeType, int programmerNumberBase = -1, int bitLengthType = -1); + static std::vector ExtractOperands(const std::wstring& pasteExpression, CalculatorApp::Common::ViewMode mode, + int programmerNumberBase = -1, int bitLengthType = -1); + static bool ExpressionRegExMatch(std::vector operands, CalculatorApp::Common::ViewMode mode, + CalculatorApp::Common::CategoryGroupType modeType, int programmerNumberBase = -1, int bitLengthType = -1); - static std::pair GetMaxOperandLengthAndValue(CalculatorApp::Common::ViewMode mode, CalculatorApp::Common::CategoryGroupType modeType, int programmerNumberBase = -1, int bitLengthType = -1); + static std::pair GetMaxOperandLengthAndValue(CalculatorApp::Common::ViewMode mode, CalculatorApp::Common::CategoryGroupType modeType, + int programmerNumberBase = -1, int bitLengthType = -1); static std::wstring SanitizeOperand(const std::wstring& operand); static bool TryOperandToULL(const std::wstring& operand, int numberBase, unsigned long long int& result); - static size_t OperandLength(const std::wstring& operand, CalculatorApp::Common::ViewMode mode, CalculatorApp::Common::CategoryGroupType modeType, int programmerNumberBase = -1); + static size_t OperandLength(const std::wstring& operand, CalculatorApp::Common::ViewMode mode, CalculatorApp::Common::CategoryGroupType modeType, + int programmerNumberBase = -1); static size_t StandardScientificOperandLength(const std::wstring& operand); static size_t ProgrammerOperandLength(const std::wstring& operand, int numberBase); static std::wstring RemoveUnwantedCharsFromWstring(const std::wstring& input); @@ -67,7 +66,7 @@ namespace CalculatorApp static constexpr size_t MaxExponentLength = 4; static constexpr size_t MaxProgrammerBitLength = 64; - static Platform::String^ supportedFormats[]; + static Platform::String ^ supportedFormats[]; friend class CalculatorUnitTests::CopyPasteManagerTest; }; diff --git a/src/CalcViewModel/Common/DateCalculator.cpp b/src/CalcViewModel/Common/DateCalculator.cpp index de42fbe9..9c5d5e0a 100644 --- a/src/CalcViewModel/Common/DateCalculator.cpp +++ b/src/CalcViewModel/Common/DateCalculator.cpp @@ -30,9 +30,10 @@ bool DateCalculationEngine::AddDuration(_In_ DateTime startDate, _In_ const Date { // The Japanese Era system can have multiple year partitions within the same year. // For example, April 30, 2019 is denoted April 30, Heisei 31; May 1, 2019 is denoted as May 1, Reiwa 1. - // The Calendar treats Heisei 31 and Reiwa 1 as separate years, which results in some unexpected behaviors where subtracting a year from Reiwa 1 results in a date in Heisei 31. - // To provide the expected result across era boundaries, we first convert the Japanese era system to a Gregorian system, do date math, and then convert back to the Japanese era system. - // This works because the Japanese era system maintains the same year/month boundaries and durations as the Gregorian system and is only different in display value. + // The Calendar treats Heisei 31 and Reiwa 1 as separate years, which results in some unexpected behaviors where subtracting a year from Reiwa 1 + // results in a date in Heisei 31. To provide the expected result across era boundaries, we first convert the Japanese era system to a Gregorian + // system, do date math, and then convert back to the Japanese era system. This works because the Japanese era system maintains the same year/month + // boundaries and durations as the Gregorian system and is only different in display value. if (currentCalendarSystem == CalendarIdentifiers::Japanese) { m_calendar->ChangeCalendarSystem(CalendarIdentifiers::Gregorian); @@ -89,9 +90,10 @@ bool DateCalculationEngine::SubtractDuration(_In_ DateTime startDate, _In_ const { // The Japanese Era system can have multiple year partitions within the same year. // For example, April 30, 2019 is denoted April 30, Heisei 31; May 1, 2019 is denoted as May 1, Reiwa 1. - // The Calendar treats Heisei 31 and Reiwa 1 as separate years, which results in some unexpected behaviors where subtracting a year from Reiwa 1 results in a date in Heisei 31. - // To provide the expected result across era boundaries, we first convert the Japanese era system to a Gregorian system, do date math, and then convert back to the Japanese era system. - // This works because the Japanese era system maintains the same year/month boundaries and durations as the Gregorian system and is only different in display value. + // The Calendar treats Heisei 31 and Reiwa 1 as separate years, which results in some unexpected behaviors where subtracting a year from Reiwa 1 + // results in a date in Heisei 31. To provide the expected result across era boundaries, we first convert the Japanese era system to a Gregorian + // system, do date math, and then convert back to the Japanese era system. This works because the Japanese era system maintains the same year/month + // boundaries and durations as the Gregorian system and is only different in display value. if (currentCalendarSystem == CalendarIdentifiers::Japanese) { m_calendar->ChangeCalendarSystem(CalendarIdentifiers::Gregorian); diff --git a/src/CalcViewModel/Common/Utils.h b/src/CalcViewModel/Common/Utils.h index 9c33f3f3..4aefcc36 100644 --- a/src/CalcViewModel/Common/Utils.h +++ b/src/CalcViewModel/Common/Utils.h @@ -23,8 +23,10 @@ m_##n = value; \ } \ } \ + \ private: \ t m_##n; \ + \ public: #define PROPERTY_RW(t, n) \ @@ -39,8 +41,10 @@ public: m_##n = value; \ } \ } \ + \ private: \ t m_##n; \ + \ public: #define OBSERVABLE_PROPERTY_R(t, n) \ @@ -61,8 +65,10 @@ public: } \ } \ } \ + \ private: \ t m_##n; \ + \ public: #define OBSERVABLE_PROPERTY_RW(t, n) \ @@ -81,8 +87,10 @@ public: } \ } \ } \ + \ private: \ t m_##n; \ + \ public: #define OBSERVABLE_NAMED_PROPERTY_R(t, n) \ @@ -92,6 +100,7 @@ public: { \ Platform::String ^ get() { return Platform::StringReference(L#n); } \ } \ + \ public: #define OBSERVABLE_NAMED_PROPERTY_RW(t, n) \ @@ -101,6 +110,7 @@ public: { \ Platform::String ^ get() { return Platform::StringReference(L#n); } \ } \ + \ public: #define OBSERVABLE_PROPERTY_FIELD(n) m_##n @@ -114,6 +124,7 @@ public: { \ PropertyChanged(this, ref new Windows::UI::Xaml::Data::PropertyChangedEventArgs(p)); \ } \ + \ public: #else #define OBSERVABLE_OBJECT() \ @@ -122,6 +133,7 @@ public: void RaisePropertyChanged(Platform::String ^ p) \ { \ } \ + \ public: #endif @@ -136,6 +148,7 @@ public: PropertyChanged(this, ref new Windows::UI::Xaml::Data::PropertyChangedEventArgs(p)); \ c(p); \ } \ + \ public: #else #define OBSERVABLE_OBJECT_CALLBACK(c) \ @@ -145,6 +158,7 @@ public: { \ c(p); \ } \ + \ public: #endif @@ -156,6 +170,7 @@ public: if (!donotuse_##p) {\ donotuse_##p = CalculatorApp::Common::MakeDelegate(this, &m);\ } return donotuse_##p; }} private: Windows::UI::Xaml::Input::ICommand^ donotuse_##p; \ + \ public: #define DEPENDENCY_PROPERTY_DECLARATION(t, n) \ @@ -173,6 +188,7 @@ public: \ private: \ static Windows::UI::Xaml::DependencyProperty ^ s_##n##Property; \ + \ public: // Utilities for DependencyProperties @@ -387,6 +403,7 @@ namespace Utils #define DEPENDENCY_PROPERTY_OWNER(owner) \ private: \ typedef owner DependencyPropertiesOwner; \ + \ public: // Normal DependencyProperty @@ -402,6 +419,7 @@ public: SetValue(s_##name##Property, value); \ } \ } \ + \ private: \ static Windows::UI::Xaml::DependencyProperty ^ s_##name##Property; \ \ @@ -419,6 +437,7 @@ private: { \ return Utils::RegisterDependencyProperty(L#name); \ } \ + \ public: #define DEPENDENCY_PROPERTY_WITH_DEFAULT(type, name, defaultValue) \ @@ -433,6 +452,7 @@ public: SetValue(s_##name##Property, value); \ } \ } \ + \ private: \ static Windows::UI::Xaml::DependencyProperty ^ s_##name##Property; \ \ @@ -450,6 +470,7 @@ private: { \ return Utils::RegisterDependencyProperty(L#name, defaultValue); \ } \ + \ public: #define DEPENDENCY_PROPERTY_WITH_CALLBACK(type, name) \ @@ -464,6 +485,7 @@ public: SetValue(s_##name##Property, value); \ } \ } \ + \ private: \ static Windows::UI::Xaml::DependencyProperty ^ s_##name##Property; \ \ @@ -486,6 +508,7 @@ private: auto self = safe_cast(sender); \ self->On##name##PropertyChanged(safe_cast(args->OldValue), safe_cast(args->NewValue)); \ } \ + \ public: #define DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(type, name, defaultValue) \ @@ -500,6 +523,7 @@ public: SetValue(s_##name##Property, value); \ } \ } \ + \ private: \ static Windows::UI::Xaml::DependencyProperty ^ s_##name##Property; \ \ @@ -522,6 +546,7 @@ private: auto self = safe_cast(sender); \ self->On##name##PropertyChanged(safe_cast(args->OldValue), safe_cast(args->NewValue)); \ } \ + \ public: // Attached DependencyProperty @@ -552,6 +577,7 @@ private: { \ return Utils::RegisterDependencyPropertyAttached(L#name); \ } \ + \ public: #define DEPENDENCY_PROPERTY_ATTACHED_WITH_DEFAULT(type, name, defaultValue) \ @@ -581,6 +607,7 @@ private: { \ return Utils::RegisterDependencyPropertyAttached(L#name, defaultValue); \ } \ + \ public: #define DEPENDENCY_PROPERTY_ATTACHED_WITH_CALLBACK(type, name) \ @@ -614,6 +641,7 @@ private: { \ On##name##PropertyChanged(sender, safe_cast(args->OldValue), safe_cast(args->NewValue)); \ } \ + \ public: #define DEPENDENCY_PROPERTY_ATTACHED_WITH_DEFAULT_AND_CALLBACK(type, name, defaultValue) \ @@ -647,6 +675,7 @@ private: { \ On##name##PropertyChanged(sender, safe_cast(args->OldValue), safe_cast(args->NewValue)); \ } \ + \ public: // This goes into the cpp to initialize the static variable diff --git a/src/Calculator/Converters/BitFlipAutomationNameConverter.cpp b/src/Calculator/Converters/BitFlipAutomationNameConverter.cpp index 2a355ef6..6059ef0d 100644 --- a/src/Calculator/Converters/BitFlipAutomationNameConverter.cpp +++ b/src/Calculator/Converters/BitFlipAutomationNameConverter.cpp @@ -43,16 +43,16 @@ Object ^ BitFlipAutomationNameConverter::Convert(_In_ Object ^ value, TypeName t // remove all the characters except 0 and 1 from the array. for (wchar_t bit : binaryDisplay) + { + if ((bit == ch1) || (bit == ch0)) { - if ((bit == ch1) || (bit == ch0)) - { - updatedBinaryDisplay[binaryLength++] = bit; - } - if (binaryLength == 63) - { - break; - } + updatedBinaryDisplay[binaryLength++] = bit; } + if (binaryLength == 63) + { + break; + } + } // return if binaryDisplay is empty if (binaryLength == 0) diff --git a/src/CalculatorUnitTests/DateCalculatorUnitTests.cpp b/src/CalculatorUnitTests/DateCalculatorUnitTests.cpp index 0318f152..28ff47e5 100644 --- a/src/CalculatorUnitTests/DateCalculatorUnitTests.cpp +++ b/src/CalculatorUnitTests/DateCalculatorUnitTests.cpp @@ -44,677 +44,966 @@ namespace DateCalculationUnitTests DateTimeTestCase datetimeAddCase[c_addCases]; DateTimeTestCase datetimeSubtractCase[c_subtractCases]; - // Test Class - TEST_CLASS(DateCalculatorUnitTests) - { - public: - TEST_CLASS_INITIALIZE(TestClassSetup) - { - /* Test Case Data */ - - // Dates - DD.MM.YYYY - /*31.12.9999*/ date[0].wYear = 9999; date[0].wMonth = 12; date[0].wDayOfWeek = 5; date[0].wDay = 31; date[0].wHour = 0; date[0].wMinute = 0; date[0].wSecond = 0; date[0].wMilliseconds = 0; - /*30.12.9999*/ date[1].wYear = 9999; date[1].wMonth = 12; date[1].wDayOfWeek = 4; date[1].wDay = 30; date[1].wHour = 0; date[1].wMinute = 0; date[1].wSecond = 0; date[1].wMilliseconds = 0; - /*31.12.9998*/ date[2].wYear = 9998; date[2].wMonth = 12; date[2].wDayOfWeek = 4; date[2].wDay = 31; date[2].wHour = 0; date[2].wMinute = 0; date[2].wSecond = 0; date[2].wMilliseconds = 0; - /*01.01.1601*/ date[3].wYear = 1601; date[3].wMonth = 1; date[3].wDayOfWeek = 1; date[3].wDay = 1; date[3].wHour = 0; date[3].wMinute = 0; date[3].wSecond = 0; date[3].wMilliseconds = 0; - /*02.01.1601*/ date[4].wYear = 1601; date[4].wMonth = 1; date[4].wDayOfWeek = 2; date[4].wDay = 2; date[4].wHour = 0; date[4].wMinute = 0; date[4].wSecond = 0; date[4].wMilliseconds = 0; - /*10.05.2008*/ date[5].wYear = 2008; date[5].wMonth = 5; date[5].wDayOfWeek = 6; date[5].wDay = 10; date[5].wHour = 0; date[5].wMinute = 0; date[5].wSecond = 0; date[5].wMilliseconds = 0; - /*10.03.2008*/ date[6].wYear = 2008; date[6].wMonth = 3; date[6].wDayOfWeek = 1; date[6].wDay = 10; date[6].wHour = 0; date[6].wMinute = 0; date[6].wSecond = 0; date[6].wMilliseconds = 0; - /*29.02.2008*/ date[7].wYear = 2008; date[7].wMonth = 2; date[7].wDayOfWeek = 5; date[7].wDay = 29; date[7].wHour = 0; date[7].wMinute = 0; date[7].wSecond = 0; date[7].wMilliseconds = 0; - /*28.02.2007*/ date[8].wYear = 2007; date[8].wMonth = 2; date[8].wDayOfWeek = 3; date[8].wDay = 28; date[8].wHour = 0; date[8].wMinute = 0; date[8].wSecond = 0; date[8].wMilliseconds = 0; - /*10.03.2007*/ date[9].wYear = 2007; date[9].wMonth = 3; date[9].wDayOfWeek = 6; date[9].wDay = 10; date[9].wHour = 0; date[9].wMinute = 0; date[9].wSecond = 0; date[9].wMilliseconds = 0; - /*10.05.2007*/ date[10].wYear = 2007; date[10].wMonth = 5; date[10].wDayOfWeek = 4; date[10].wDay = 10; date[10].wHour = 0; date[10].wMinute = 0; date[10].wSecond = 0; date[10].wMilliseconds = 0; - /*29.01.2008*/ date[11].wYear = 2008; date[11].wMonth = 1; date[11].wDayOfWeek = 2; date[11].wDay = 29; date[11].wHour = 0; date[11].wMinute = 0; date[11].wSecond = 0; date[11].wMilliseconds = 0; - /*28.01.2007*/ date[12].wYear = 2007; date[12].wMonth = 1; date[12].wDayOfWeek = 0; date[12].wDay = 28; date[12].wHour = 0; date[12].wMinute = 0; date[12].wSecond = 0; date[12].wMilliseconds = 0; - /*31.01.2008*/ date[13].wYear = 2008; date[13].wMonth = 1; date[13].wDayOfWeek = 4; date[13].wDay = 31; date[13].wHour = 0; date[13].wMinute = 0; date[13].wSecond = 0; date[13].wMilliseconds = 0; - /*31.03.2008*/ date[14].wYear = 2008; date[14].wMonth = 3; date[14].wDayOfWeek = 1; date[14].wDay = 31; date[14].wHour = 0; date[14].wMinute = 0; date[14].wSecond = 0; date[14].wMilliseconds = 0; - - // Date Differences - dateDifference[0].year = 1; dateDifference[0].month = 1; - dateDifference[1].month = 1; dateDifference[1].day = 10; - dateDifference[2].day = 2; - /*date[2]-[0]*/ dateDifference[3].week = 52; dateDifference[3].day = 1; - /*date[2]-[0]*/ dateDifference[4].year = 1; - dateDifference[5].day = 365; - dateDifference[6].month = 1; - dateDifference[7].month = 1; dateDifference[7].day = 2; - dateDifference[8].day = 31; - dateDifference[9].month = 11; dateDifference[9].day = 1; - dateDifference[10].year = 8398; dateDifference[10].month = 11; dateDifference[10].day = 30; - dateDifference[11].year = 2008; - dateDifference[12].year = 7991; dateDifference[12].month = 11; - dateDifference[13].week = 416998; dateDifference[13].day = 1; - - - - /* Test Cases */ - - // Date Difference test cases - datetimeDifftest[0].startDate = date[0]; datetimeDifftest[0].endDate = date[3]; datetimeDifftest[0].dateDiff = dateDifference[10]; - datetimeDifftest[1].startDate = date[0]; datetimeDifftest[1].endDate = date[2]; datetimeDifftest[1].dateDiff = dateDifference[5]; - datetimeDifftest[2].startDate = date[0]; datetimeDifftest[2].endDate = date[2]; datetimeDifftest[2].dateDiff = dateDifference[4]; - datetimeDifftest[3].startDate = date[0]; datetimeDifftest[3].endDate = date[2]; datetimeDifftest[3].dateDiff = dateDifference[3]; - datetimeDifftest[4].startDate = date[14]; datetimeDifftest[4].endDate = date[7]; datetimeDifftest[4].dateDiff = dateDifference[7]; - datetimeDifftest[5].startDate = date[14]; datetimeDifftest[5].endDate = date[7]; datetimeDifftest[5].dateDiff = dateDifference[8]; - datetimeDifftest[6].startDate = date[11]; datetimeDifftest[6].endDate = date[8]; datetimeDifftest[6].dateDiff = dateDifference[9]; - datetimeDifftest[7].startDate = date[13]; datetimeDifftest[7].endDate = date[0]; datetimeDifftest[7].dateDiff = dateDifference[12]; - datetimeDifftest[8].startDate = date[13]; datetimeDifftest[8].endDate = date[0]; datetimeDifftest[8].dateDiff = dateDifference[13]; - - // Date Add Out of Bound test cases (Negative tests) - /*OutofBound*/ datetimeBoundAdd[0].startDate = date[1]; datetimeBoundAdd[0].endDate = date[0]; datetimeBoundAdd[0].dateDiff = dateDifference[2]; // on Add date[0] not used - /*OutofBound*/ datetimeBoundAdd[1].startDate = date[2]; datetimeBoundAdd[1].endDate = date[0]; datetimeBoundAdd[1].dateDiff = dateDifference[11]; // on Add date[0] not used - - // Date Subtract Out of Bound test cases (Negative tests) - /*OutofBound*/ datetimeBoundSubtract[0].startDate = date[3]; datetimeBoundSubtract[0].endDate = date[0]; datetimeBoundSubtract[0].dateDiff = dateDifference[2]; // on subtract date[0] not used - /*OutofBound*/ datetimeBoundSubtract[1].startDate = date[14]; datetimeBoundSubtract[1].endDate = date[0]; datetimeBoundSubtract[1].dateDiff = dateDifference[11]; // on subtract date[0] not used - - // Date Add test cases (Positive tests) - datetimeAddCase[0].startDate = date[13]; datetimeAddCase[0].endDate = date[7]; datetimeAddCase[0].dateDiff = dateDifference[6];// add - datetimeAddCase[1].startDate = date[14]; datetimeAddCase[1].endDate = date[5]; datetimeAddCase[1].dateDiff = dateDifference[1];// add - datetimeAddCase[2].startDate = date[13]; datetimeAddCase[2].endDate = date[6]; datetimeAddCase[2].dateDiff = dateDifference[1];// add - - // Date Subtract test cases (Positive tests) - datetimeSubtractCase[0].startDate = date[14]; datetimeSubtractCase[0].endDate = date[7]; datetimeSubtractCase[0].dateDiff = dateDifference[6];// subtract - datetimeSubtractCase[1].startDate = date[6]; datetimeSubtractCase[1].endDate = date[11]; datetimeSubtractCase[1].dateDiff = dateDifference[1];// subtract - datetimeSubtractCase[2].startDate = date[9]; datetimeSubtractCase[2].endDate = date[12]; datetimeSubtractCase[2].dateDiff = dateDifference[1];// subtract - } - - - /* Duration Between Two Date Tests -- Timediff obtained after calculation should be checked to be identical */ - TEST_METHOD(TestDateDiff) - { - // TODO - MSFT 10331900, fix this test - - //for (int testIndex = 0; testIndex < c_diffTestCase; testIndex++) - //{ - // DateDifference diff; - // DateUnit dateOutputFormat; - - // switch (testIndex) - // { - // case 0: - // case 2: - // dateOutputFormat = DateUnit::Year | DateUnit::Month | DateUnit::Day; - // break; - // case 1: - // dateOutputFormat = DateUnit::Day; - // break; - // case 3: - // case 8: - // dateOutputFormat = DateUnit::Week | DateUnit::Day; - // break; - // case 7: - // dateOutputFormat = DateUnit::Year | DateUnit::Month | DateUnit::Day; - // break; - // case 4: - // case 6: - // dateOutputFormat = DateUnit::Month | DateUnit::Day; - // break; - // case 5: - // dateOutputFormat = DateUnit::Day; - // break; - // } - - // // Calculate the difference - // m_DateCalcEngine.GetDateDifference(DateUtils::SystemTimeToDateTime(datetimeDifftest[testIndex].startDate), DateUtils::SystemTimeToDateTime(datetimeDifftest[testIndex].endDate), dateOutputFormat, &diff); - - // // Assert for the result - // bool areIdentical = true; - // if (diff.year != datetimeDifftest[testIndex].dateDiff.year || - // diff.month != datetimeDifftest[testIndex].dateDiff.month || - // diff.week != datetimeDifftest[testIndex].dateDiff.week || - // diff.day != datetimeDifftest[testIndex].dateDiff.day) - // { - // areIdentical = false; - // } - - // VERIFY_IS_TRUE(areIdentical); - //} - } - - /*Add Out of bound Tests*/ - TEST_METHOD(TestAddOob) - { - // TODO - MSFT 10331900, fix this test - - //for (int testIndex = 0; testIndex< c_numAddOobDate; testIndex++) - //{ - // DateTime endDate; - - // // Add Duration - // bool isValid = m_DateCalcEngine.AddDuration(DateUtils::SystemTimeToDateTime(datetimeBoundAdd[testIndex].startDate), datetimeBoundAdd[testIndex].dateDiff, &endDate); - - // // Assert for the result - // VERIFY_IS_FALSE(isValid); - //} - } - - /*Subtract Out of bound Tests*/ - TEST_METHOD(TestSubtractOob) - { - for (int testIndex = 0; testIndex< c_numSubtractOobDate; testIndex++) - { - DateTime endDate; - - // Subtract Duration - bool isValid = m_DateCalcEngine.SubtractDuration(DateUtils::SystemTimeToDateTime(datetimeBoundSubtract[testIndex].startDate), datetimeBoundSubtract[testIndex].dateDiff, &endDate); - - // Assert for the result - VERIFY_IS_FALSE(isValid); - } - } - - // Add Tests - TEST_METHOD(TestAddition) - { - // TODO - MSFT 10331900, fix this test - - //for (int testIndex = 0; testIndex < c_addCases; testIndex++) - //{ - // DateTime endDate; - - // // Add Duration - // bool isValid = m_DateCalcEngine.AddDuration(DateUtils::SystemTimeToDateTime(datetimeAddCase[testIndex].startDate), datetimeAddCase[testIndex].dateDiff, &endDate); - - // // Assert for the result - // VERIFY_IS_TRUE(isValid); - - // SYSTEMTIME systemTime = DateUtils::DateTimeToSystemTime(endDate); - // if (systemTime.wYear != datetimeAddCase[testIndex].endDate.wYear || - // systemTime.wMonth != datetimeAddCase[testIndex].endDate.wMonth || - // systemTime.wDay != datetimeAddCase[testIndex].endDate.wDay || - // systemTime.wDayOfWeek != datetimeAddCase[testIndex].endDate.wDayOfWeek) - // { - // isValid = false; - // } - - // VERIFY_IS_TRUE(isValid); - //} - } - - // Subtract Tests - TEST_METHOD(TestSubtraction) - { - // TODO - MSFT 10331900, fix this test - - //for (int testIndex = 0; testIndex < c_subtractCases; testIndex++) - //{ - // DateTime endDate; - - // // Subtract Duration - // bool isValid = m_DateCalcEngine.SubtractDuration(DateUtils::SystemTimeToDateTime(datetimeSubtractCase[testIndex].startDate), datetimeSubtractCase[testIndex].dateDiff, &endDate); - - // // assert for the result - // VERIFY_IS_TRUE(isValid); - - // SYSTEMTIME systemTime = DateUtils::DateTimeToSystemTime(endDate); - // if (systemTime.wYear != datetimeSubtractCase[testIndex].endDate.wYear || - // systemTime.wMonth != datetimeSubtractCase[testIndex].endDate.wMonth || - // systemTime.wDay != datetimeSubtractCase[testIndex].endDate.wDay || - // systemTime.wDayOfWeek != datetimeSubtractCase[testIndex].endDate.wDayOfWeek) - // { - // isValid = false; - // } - - // VERIFY_IS_TRUE(isValid); - //} - } - - private: - - }; - - TEST_CLASS(DateCalculatorViewModelTests) - { - public: - TEST_CLASS_INITIALIZE(TestClassSetup) - { - /* Test Case Data */ - - // Dates - DD.MM.YYYY - /*31.12.9999*/ date[0].wYear = 9999; date[0].wMonth = 12; date[0].wDayOfWeek = 5; date[0].wDay = 31; date[0].wHour = 0; date[0].wMinute = 0; date[0].wSecond = 0; date[0].wMilliseconds = 0; - /*30.12.9999*/ date[1].wYear = 9999; date[1].wMonth = 12; date[1].wDayOfWeek = 4; date[1].wDay = 30; date[1].wHour = 0; date[1].wMinute = 0; date[1].wSecond = 0; date[1].wMilliseconds = 0; - /*31.12.9998*/ date[2].wYear = 9998; date[2].wMonth = 12; date[2].wDayOfWeek = 4; date[2].wDay = 31; date[2].wHour = 0; date[2].wMinute = 0; date[2].wSecond = 0; date[2].wMilliseconds = 0; - /*01.01.1601*/ date[3].wYear = 1601; date[3].wMonth = 1; date[3].wDayOfWeek = 1; date[3].wDay = 1; date[3].wHour = 0; date[3].wMinute = 0; date[3].wSecond = 0; date[3].wMilliseconds = 0; - /*02.01.1601*/ date[4].wYear = 1601; date[4].wMonth = 1; date[4].wDayOfWeek = 2; date[4].wDay = 2; date[4].wHour = 0; date[4].wMinute = 0; date[4].wSecond = 0; date[4].wMilliseconds = 0; - /*10.05.2008*/ date[5].wYear = 2008; date[5].wMonth = 5; date[5].wDayOfWeek = 6; date[5].wDay = 10; date[5].wHour = 0; date[5].wMinute = 0; date[5].wSecond = 0; date[5].wMilliseconds = 0; - /*10.03.2008*/ date[6].wYear = 2008; date[6].wMonth = 3; date[6].wDayOfWeek = 1; date[6].wDay = 10; date[6].wHour = 0; date[6].wMinute = 0; date[6].wSecond = 0; date[6].wMilliseconds = 0; - /*29.02.2008*/ date[7].wYear = 2008; date[7].wMonth = 2; date[7].wDayOfWeek = 5; date[7].wDay = 29; date[7].wHour = 0; date[7].wMinute = 0; date[7].wSecond = 0; date[7].wMilliseconds = 0; - /*28.02.2007*/ date[8].wYear = 2007; date[8].wMonth = 2; date[8].wDayOfWeek = 3; date[8].wDay = 28; date[8].wHour = 0; date[8].wMinute = 0; date[8].wSecond = 0; date[8].wMilliseconds = 0; - /*10.03.2007*/ date[9].wYear = 2007; date[9].wMonth = 3; date[9].wDayOfWeek = 6; date[9].wDay = 10; date[9].wHour = 0; date[9].wMinute = 0; date[9].wSecond = 0; date[9].wMilliseconds = 0; - /*10.05.2007*/ date[10].wYear = 2007; date[10].wMonth = 5; date[10].wDayOfWeek = 4; date[10].wDay = 10; date[10].wHour = 0; date[10].wMinute = 0; date[10].wSecond = 0; date[10].wMilliseconds = 0; - /*29.01.2008*/ date[11].wYear = 2008; date[11].wMonth = 1; date[11].wDayOfWeek = 2; date[11].wDay = 29; date[11].wHour = 0; date[11].wMinute = 0; date[11].wSecond = 0; date[11].wMilliseconds = 0; - /*28.01.2007*/ date[12].wYear = 2007; date[12].wMonth = 1; date[12].wDayOfWeek = 0; date[12].wDay = 28; date[12].wHour = 0; date[12].wMinute = 0; date[12].wSecond = 0; date[12].wMilliseconds = 0; - /*31.01.2008*/ date[13].wYear = 2008; date[13].wMonth = 1; date[13].wDayOfWeek = 4; date[13].wDay = 31; date[13].wHour = 0; date[13].wMinute = 0; date[13].wSecond = 0; date[13].wMilliseconds = 0; - /*31.03.2008*/ date[14].wYear = 2008; date[14].wMonth = 3; date[14].wDayOfWeek = 1; date[14].wDay = 31; date[14].wHour = 0; date[14].wMinute = 0; date[14].wSecond = 0; date[14].wMilliseconds = 0; - - // Date Differences - dateDifference[0].year = 1; dateDifference[0].month = 1; - dateDifference[1].month = 1; dateDifference[1].day = 10; - dateDifference[2].day = 2; - /*date[2]-[0]*/ dateDifference[3].week = 52; dateDifference[3].day = 1; - /*date[2]-[0]*/ dateDifference[4].year = 1; - dateDifference[5].day = 365; - dateDifference[6].month = 1; - dateDifference[7].month = 1; dateDifference[7].day = 2; - dateDifference[8].day = 31; - dateDifference[9].month = 11; dateDifference[9].day = 1; - dateDifference[10].year = 8398; dateDifference[10].month = 11; dateDifference[10].day = 30; - dateDifference[11].year = 2008; - dateDifference[12].year = 7991; dateDifference[12].month = 11; - dateDifference[13].week = 416998; dateDifference[13].day = 1; - - - - /* Test Cases */ - - // Date Difference test cases - datetimeDifftest[0].startDate = date[0]; datetimeDifftest[0].endDate = date[3]; datetimeDifftest[0].dateDiff = dateDifference[10]; - datetimeDifftest[1].startDate = date[0]; datetimeDifftest[1].endDate = date[2]; datetimeDifftest[1].dateDiff = dateDifference[5]; - datetimeDifftest[2].startDate = date[0]; datetimeDifftest[2].endDate = date[2]; datetimeDifftest[2].dateDiff = dateDifference[4]; - datetimeDifftest[3].startDate = date[0]; datetimeDifftest[3].endDate = date[2]; datetimeDifftest[3].dateDiff = dateDifference[3]; - datetimeDifftest[4].startDate = date[14]; datetimeDifftest[4].endDate = date[7]; datetimeDifftest[4].dateDiff = dateDifference[7]; - datetimeDifftest[5].startDate = date[14]; datetimeDifftest[5].endDate = date[7]; datetimeDifftest[5].dateDiff = dateDifference[8]; - datetimeDifftest[6].startDate = date[11]; datetimeDifftest[6].endDate = date[8]; datetimeDifftest[6].dateDiff = dateDifference[9]; - datetimeDifftest[7].startDate = date[13]; datetimeDifftest[7].endDate = date[0]; datetimeDifftest[7].dateDiff = dateDifference[12]; - datetimeDifftest[8].startDate = date[13]; datetimeDifftest[8].endDate = date[0]; datetimeDifftest[8].dateDiff = dateDifference[13]; - - // Date Add Out of Bound test cases (Negative tests) - /*OutofBound*/ datetimeBoundAdd[0].startDate = date[1]; datetimeBoundAdd[0].endDate = date[0]; datetimeBoundAdd[0].dateDiff = dateDifference[2]; // on Add date[0] not used - /*OutofBound*/ datetimeBoundAdd[1].startDate = date[2]; datetimeBoundAdd[1].endDate = date[0]; datetimeBoundAdd[1].dateDiff = dateDifference[11]; // on Add date[0] not used - - // Date Subtract Out of Bound test cases (Negative tests) - /*OutofBound*/ datetimeBoundSubtract[0].startDate = date[3]; datetimeBoundSubtract[0].endDate = date[0]; datetimeBoundSubtract[0].dateDiff = dateDifference[2]; // on subtract date[0] not used - /*OutofBound*/ datetimeBoundSubtract[1].startDate = date[14]; datetimeBoundSubtract[1].endDate = date[0]; datetimeBoundSubtract[1].dateDiff = dateDifference[11]; // on subtract date[0] not used - - // Date Add test cases (Positive tests) - datetimeAddCase[0].startDate = date[13]; datetimeAddCase[0].endDate = date[7]; datetimeAddCase[0].dateDiff = dateDifference[6];// add - datetimeAddCase[1].startDate = date[14]; datetimeAddCase[1].endDate = date[5]; datetimeAddCase[1].dateDiff = dateDifference[1];// add - datetimeAddCase[2].startDate = date[13]; datetimeAddCase[2].endDate = date[6]; datetimeAddCase[2].dateDiff = dateDifference[1];// add - - // Date Subtract test cases (Positive tests) - datetimeSubtractCase[0].startDate = date[14]; datetimeSubtractCase[0].endDate = date[7]; datetimeSubtractCase[0].dateDiff = dateDifference[6];// subtract - datetimeSubtractCase[1].startDate = date[6]; datetimeSubtractCase[1].endDate = date[11]; datetimeSubtractCase[1].dateDiff = dateDifference[1];// subtract - datetimeSubtractCase[2].startDate = date[9]; datetimeSubtractCase[2].endDate = date[12]; datetimeSubtractCase[2].dateDiff = dateDifference[1];// subtract - } - - TEST_METHOD(DateCalcViewModelInitializationTest) - { - auto viewModel = ref new DateCalculatorViewModel(); - - // Check for the initialized values - VERIFY_IS_TRUE(viewModel->IsDateDiffMode); - VERIFY_IS_TRUE(viewModel->IsAddMode); - - VERIFY_IS_TRUE(0 != viewModel->FromDate.UniversalTime); - VERIFY_IS_TRUE(0 != viewModel->ToDate.UniversalTime); - VERIFY_IS_TRUE(0 != viewModel->StartDate.UniversalTime); - - VERIFY_ARE_EQUAL(0, viewModel->DaysOffset); - VERIFY_ARE_EQUAL(0, viewModel->MonthsOffset); - VERIFY_ARE_EQUAL(0, viewModel->YearsOffset); - - VERIFY_IS_TRUE(viewModel->IsDiffInDays); - VERIFY_ARE_EQUAL(StringReference(L"Same dates"), viewModel->StrDateDiffResult); - VERIFY_IS_NULL(viewModel->StrDateDiffResultInDays); - - VERIFY_IS_NULL(viewModel->StrDateResult); - } - - TEST_METHOD(DateCalcViewModelAddSubtractInitTest) - { - auto viewModel = ref new DateCalculatorViewModel(); - viewModel->IsDateDiffMode = false; - - // Check for the initialized values - VERIFY_IS_FALSE(viewModel->IsDateDiffMode); - VERIFY_IS_TRUE(viewModel->IsAddMode); - - VERIFY_IS_TRUE(0 != viewModel->FromDate.UniversalTime); - VERIFY_IS_TRUE(0 != viewModel->ToDate.UniversalTime); - VERIFY_IS_TRUE(0 != viewModel->StartDate.UniversalTime); - - VERIFY_ARE_EQUAL(0, viewModel->DaysOffset); - VERIFY_ARE_EQUAL(0, viewModel->MonthsOffset); - VERIFY_ARE_EQUAL(0, viewModel->YearsOffset); - - VERIFY_IS_TRUE(viewModel->IsDiffInDays); - VERIFY_ARE_EQUAL(StringReference(L"Same dates"), viewModel->StrDateDiffResult); - VERIFY_IS_NULL(viewModel->StrDateDiffResultInDays); - - VERIFY_IS_NOT_NULL(viewModel->StrDateResult); - VERIFY_IS_TRUE(StringReference(L"") != viewModel->StrDateResult); - } - - TEST_METHOD(DateCalcViewModelDateDiffDaylightSavingTimeTest) - { - auto viewModel = ref new DateCalculatorViewModel(); - - viewModel->IsDateDiffMode = true; - VERIFY_IS_TRUE(viewModel->IsDateDiffMode); - - // 29.02.2008 - viewModel->FromDate = DateUtils::SystemTimeToDateTime(datetimeDifftest[5].startDate); - // 31.03.2008 - viewModel->ToDate = DateUtils::SystemTimeToDateTime(datetimeDifftest[5].endDate); - - //// Assert for the result - VERIFY_IS_FALSE(viewModel->IsDiffInDays); - VERIFY_ARE_EQUAL(StringReference(L"31 days"), viewModel->StrDateDiffResultInDays); - VERIFY_ARE_EQUAL(StringReference(L"1 month, 2 days"), viewModel->StrDateDiffResult); - - // Daylight Saving Time - Clock Forward - // 10.03.2019 - SYSTEMTIME startDate; - startDate.wYear = 2019; - startDate.wMonth = 03; - startDate.wDay = 10; - startDate.wDayOfWeek = 0; - startDate.wHour = startDate.wMinute = 0; - startDate.wSecond = startDate.wMilliseconds = 0; - viewModel->FromDate = DateUtils::SystemTimeToDateTime(startDate); - // 11.03.2019 - SYSTEMTIME endDate; - endDate.wYear = 2019; - endDate.wMonth = 03; - endDate.wDay = 11; - endDate.wDayOfWeek = 0; - endDate.wHour = endDate.wMinute = 0; - endDate.wSecond = endDate.wMilliseconds = 0; - viewModel->ToDate = DateUtils::SystemTimeToDateTime(endDate); - VERIFY_IS_TRUE(viewModel->IsDiffInDays); - VERIFY_ARE_EQUAL(StringReference(L"1 day"), viewModel->StrDateDiffResult); - - endDate.wDay += 6; - viewModel->ToDate = DateUtils::SystemTimeToDateTime(endDate); - VERIFY_IS_FALSE(viewModel->IsDiffInDays); - VERIFY_ARE_EQUAL(StringReference(L"1 week"), viewModel->StrDateDiffResult); - - // Daylight Saving Time - Clock Backward - // 03.11.2019 - startDate.wMonth = 11; - startDate.wDay = 03; - viewModel->FromDate = DateUtils::SystemTimeToDateTime(startDate); - // 04.11.2019 - endDate.wMonth = 11; - endDate.wDay = 04; - viewModel->ToDate = DateUtils::SystemTimeToDateTime(endDate); - VERIFY_IS_TRUE(viewModel->IsDiffInDays); - VERIFY_ARE_EQUAL(StringReference(L"1 day"), viewModel->StrDateDiffResult); - } - - TEST_METHOD(DateCalcViewModelAddTest) - { - // TODO - MSFT 10331900, fix this test - // A few issues to be investigated.. - // The date returned by DateUtils::GetLongDate can be a different string than expected - // based on the values of date[7]. This is because date[7] is in UTC but GetLongDate - // doesn't format according to UTC. If it did, the test would still be incorrect because - // the ViewModel is not necessarily in UTC. - // - // The DateTime value assigned to StartDate after the conversion SystemTimeToDateTime is not - // the same DateTime value as if the user were to select the same date from the CalendarDatePicker. - // This means testing a specific date here, is *not* the same as selecting that date in the app. - - //auto viewModel = ref new DateCalculatorViewModel(); - //viewModel->Initialize(); - - //viewModel->IsDateDiffMode = false; - //viewModel->IsAddMode = true; - //VERIFY_IS_FALSE(viewModel->IsDateDiffMode); - //VERIFY_IS_TRUE(viewModel->IsAddMode); - - //viewModel->StartDate = DateUtils::SystemTimeToDateTime(datetimeAddCase[0].startDate); - //viewModel->DaysOffset = datetimeAddCase[0].dateDiff.day; - //viewModel->MonthsOffset = datetimeAddCase[0].dateDiff.month; - //viewModel->YearsOffset = datetimeAddCase[0].dateDiff.year; - - //// Assert for the result - //VERIFY_ARE_EQUAL(DateUtils::GetLongDate(date[7]), viewModel->StrDateResult); - } - - TEST_METHOD(DateCalcViewModelSubtractTest) - { - // TODO - MSFT 10331900, fix this test - // A few issues to be investigated.. - // The date returned by DateUtils::GetLongDate can be a different string than expected - // based on the values of date[7]. This is because date[7] is in UTC but GetLongDate - // doesn't format according to UTC. If it did, the test would still be incorrect because - // the ViewModel is not necessarily in UTC. - // - // The DateTime value assigned to StartDate after the conversion SystemTimeToDateTime is not - // the same DateTime value as if the user were to select the same date from the CalendarDatePicker. - // This means testing a specific date here, is *not* the same as selecting that date in the app. - - //auto viewModel = ref new DateCalculatorViewModel(); - //viewModel->Initialize(); - - //viewModel->IsDateDiffMode = false; - //viewModel->IsAddMode = false; - //VERIFY_IS_FALSE(viewModel->IsDateDiffMode); - //VERIFY_IS_FALSE(viewModel->IsAddMode); - - //viewModel->StartDate = DateUtils::SystemTimeToDateTime(datetimeSubtractCase[0].startDate); - //viewModel->DaysOffset = datetimeSubtractCase[0].dateDiff.day; - //viewModel->MonthsOffset = datetimeSubtractCase[0].dateDiff.month; - //viewModel->YearsOffset = datetimeSubtractCase[0].dateDiff.year; - - //// Assert for the result - //VERIFY_ARE_EQUAL(DateUtils::GetLongDate(date[7]), viewModel->StrDateResult); - } - - TEST_METHOD(DateCalcViewModelAddOobTest) - { - // TODO - MSFT 10331900, fix this test - // Curiously enough, this test fails because it fails to go Oob. - // Possibly need to update test to use a new max date. - - //auto viewModel = ref new DateCalculatorViewModel(); - //viewModel->Initialize(); - - //viewModel->IsDateDiffMode = false; - //viewModel->IsAddMode = true; - //VERIFY_IS_FALSE(viewModel->IsDateDiffMode); - //VERIFY_IS_TRUE(viewModel->IsAddMode); - - //for (int testIndex = 0; testIndex< c_numAddOobDate; testIndex++) - //{ - // viewModel->StartDate = DateUtils::SystemTimeToDateTime(datetimeBoundAdd[testIndex].startDate); - // viewModel->DaysOffset = datetimeBoundAdd[testIndex].dateDiff.day; - // viewModel->MonthsOffset = datetimeBoundAdd[testIndex].dateDiff.month; - // viewModel->YearsOffset = datetimeBoundAdd[testIndex].dateDiff.year; - - // // Assert for the result - // VERIFY_ARE_EQUAL(StringReference(L"Date out of Bound"), viewModel->StrDateResult); - //} - } - - TEST_METHOD(DateCalcViewModelSubtractOobTest) - { - auto viewModel = ref new DateCalculatorViewModel(); - - viewModel->IsDateDiffMode = false; - viewModel->IsAddMode = false; - VERIFY_IS_FALSE(viewModel->IsDateDiffMode); - VERIFY_IS_FALSE(viewModel->IsAddMode); - - for (int testIndex = 0; testIndex < c_numSubtractOobDate; testIndex++) - { - viewModel->StartDate = DateUtils::SystemTimeToDateTime(datetimeBoundSubtract[testIndex].startDate); - viewModel->DaysOffset = datetimeBoundSubtract[testIndex].dateDiff.day; - viewModel->MonthsOffset = datetimeBoundSubtract[testIndex].dateDiff.month; - viewModel->YearsOffset = datetimeBoundSubtract[testIndex].dateDiff.year; - - // Assert for the result - VERIFY_ARE_EQUAL(StringReference(L"Date out of Bound"), viewModel->StrDateResult); - } - } - - TEST_METHOD(DateCalcViewModelDateDiffIgnoreSignTest) - { - auto viewModel = ref new DateCalculatorViewModel(); - - viewModel->IsDateDiffMode = true; - VERIFY_IS_TRUE(viewModel->IsDateDiffMode); - - viewModel->FromDate = DateUtils::SystemTimeToDateTime(date[10]); - viewModel->ToDate = DateUtils::SystemTimeToDateTime(date[6]); - - VERIFY_IS_FALSE(viewModel->IsDiffInDays); - VERIFY_ARE_EQUAL(StringReference(L"305 days"), viewModel->StrDateDiffResultInDays); - VERIFY_ARE_EQUAL(StringReference(L"10 months"), viewModel->StrDateDiffResult); - viewModel->FromDate = DateUtils::SystemTimeToDateTime(date[6]); - viewModel->ToDate = DateUtils::SystemTimeToDateTime(date[10]); - VERIFY_IS_FALSE(viewModel->IsDiffInDays); - VERIFY_ARE_EQUAL(StringReference(L"305 days"), viewModel->StrDateDiffResultInDays); - VERIFY_ARE_EQUAL(StringReference(L"10 months"), viewModel->StrDateDiffResult); - } - - TEST_METHOD(DateCalcViewModelDateDiffTest) - { - // TODO - MSFT 10331900, fix this test - // The last VERIFY checks with expected value "8398 years, 11 months, 4 weeks, 2 days" - // The viewmodel result is something like "8398 years, 12 months, 6568892 weeks, 1 day", - // which shows there is a problem with the viewmodel's reduction algorithm. - - //auto viewModel = ref new DateCalculatorViewModel(); - //viewModel->Initialize(); - - //viewModel->IsDateDiffMode = true; - //VERIFY_IS_TRUE(viewModel->IsDateDiffMode); - - //viewModel->FromDate = DateUtils::SystemTimeToDateTime(datetimeDifftest[0].startDate); - //viewModel->ToDate = DateUtils::SystemTimeToDateTime(datetimeDifftest[0].endDate); - - //// Assert for the result - //VERIFY_IS_FALSE(viewModel->IsDiffInDays); - //VERIFY_ARE_EQUAL(StringReference(L"3067670 days"), viewModel->StrDateDiffResultInDays); - //VERIFY_ARE_EQUAL(StringReference(L"8398 years, 11 months, 4 weeks, 2 days"), viewModel->StrDateDiffResult); - } - - TEST_METHOD(DateCalcViewModelDateDiffResultInPositiveDaysTest) - { - auto viewModel = ref new DateCalculatorViewModel(); - - viewModel->IsDateDiffMode = true; - VERIFY_IS_TRUE(viewModel->IsDateDiffMode); - - viewModel->FromDate = DateUtils::SystemTimeToDateTime(date[1]); - viewModel->ToDate = DateUtils::SystemTimeToDateTime(date[0]); - - // Assert for the result - VERIFY_IS_TRUE(viewModel->IsDiffInDays); - VERIFY_ARE_EQUAL(StringReference(L"1 day"), viewModel->StrDateDiffResult); - VERIFY_IS_NULL(viewModel->StrDateDiffResultInDays); - } - - TEST_METHOD(DateCalcViewModelDateDiffFromDateHigherThanToDate) - { - auto viewModel = ref new DateCalculatorViewModel(); - - viewModel->IsDateDiffMode = true; - VERIFY_IS_TRUE(viewModel->IsDateDiffMode); - - viewModel->FromDate = DateUtils::SystemTimeToDateTime(date[0]); - viewModel->ToDate = DateUtils::SystemTimeToDateTime(date[1]); - - // Assert for the result - VERIFY_IS_TRUE(viewModel->IsDiffInDays); - VERIFY_ARE_EQUAL(StringReference(L"1 day"), viewModel->StrDateDiffResult); - VERIFY_IS_NULL(viewModel->StrDateDiffResultInDays); - } - - // Tests that the automation name for the resulting date in Add Mode - // contains the DayOfWeek, Day, Month, and Year - TEST_METHOD(DateCalcViewModelAddSubtractResultAutomationNameTest) - { - auto viewModel = ref new DateCalculatorViewModel(); - - auto cal = ref new Calendar(); - cal->Year = 2007; - cal->Month = 5; - cal->Day = 10; - cal->Hour = 12; - cal->Period = 2; - cal->Nanosecond = 0; - cal->Second = 0; - - DateTime startDate = cal->GetDateTime(); - viewModel->StartDate = startDate; - - viewModel->IsDateDiffMode = false; - viewModel->IsAddMode = true; - - wstring actualValue = viewModel->StrDateResultAutomationName->Data(); - - // Verify each component is present in the result - wstring components[] = { - L"dayofweek.full", - L"month.full", - L"year.full", - L"day" - }; - - for (const wstring &component : components) - { - auto formatter = ref new DateTimeFormatter(ref new String(component.c_str())); - wstring expectedValue = formatter->Format(startDate)->Data(); - wstring message = L"Verifying " + component + L" is present in the result"; - VERIFY_IS_TRUE(actualValue.find(expectedValue) != wstring::npos, message.c_str()); - } - } - - TEST_METHOD(JaEraTransitionAddition) - { - auto viewModel = make_unique(CalendarIdentifiers::Japanese); - auto cal = ref new Calendar(); - - // Showa period ended in Jan 1989. - cal->Year = 1989; - cal->Month = 1; - cal->Day = 1; - auto startTime = cal->GetDateTime(); - - cal->Year = 1990; - cal->Month = 1; - cal->Day = 1; - - // Expect that adding a year across boundaries adds the equivalent in the Gregorian calendar. - auto expectedResult = cal->GetDateTime(); - DateDifference duration; - duration.year = 1; - - DateTime actualResult; - viewModel->AddDuration(startTime, duration, &actualResult); - - VERIFY_ARE_EQUAL(expectedResult.UniversalTime, actualResult.UniversalTime); - } - - TEST_METHOD(JaEraTransitionSubtraction) - { - auto viewModel = make_unique(CalendarIdentifiers::Japanese); - auto cal = ref new Calendar(); - - // Showa period ended in Jan 1989. - cal->Year = 1990; - cal->Month = 1; - cal->Day = 1; - auto startTime = cal->GetDateTime(); - - cal->Year = 1989; - cal->Month = 1; - cal->Day = 1; - - // Expect that adding a year across boundaries adds the equivalent in the Gregorian calendar. - auto expectedResult = cal->GetDateTime(); - DateDifference duration; - duration.year = 1; - - DateTime actualResult; - viewModel->SubtractDuration(startTime, duration, &actualResult); - - VERIFY_ARE_EQUAL(expectedResult.UniversalTime, actualResult.UniversalTime); - } - }; + TEST_CLASS(DateCalculatorUnitTests){ public: TEST_CLASS_INITIALIZE(TestClassSetup){ /* Test Case Data */ + + // Dates - DD.MM.YYYY + /*31.12.9999*/ date[0].wYear = 9999; + date[0].wMonth = 12; + date[0].wDayOfWeek = 5; + date[0].wDay = 31; + date[0].wHour = 0; + date[0].wMinute = 0; + date[0].wSecond = 0; + date[0].wMilliseconds = 0; + /*30.12.9999*/ date[1].wYear = 9999; + date[1].wMonth = 12; + date[1].wDayOfWeek = 4; + date[1].wDay = 30; + date[1].wHour = 0; + date[1].wMinute = 0; + date[1].wSecond = 0; + date[1].wMilliseconds = 0; + /*31.12.9998*/ date[2].wYear = 9998; + date[2].wMonth = 12; + date[2].wDayOfWeek = 4; + date[2].wDay = 31; + date[2].wHour = 0; + date[2].wMinute = 0; + date[2].wSecond = 0; + date[2].wMilliseconds = 0; + /*01.01.1601*/ date[3].wYear = 1601; + date[3].wMonth = 1; + date[3].wDayOfWeek = 1; + date[3].wDay = 1; + date[3].wHour = 0; + date[3].wMinute = 0; + date[3].wSecond = 0; + date[3].wMilliseconds = 0; + /*02.01.1601*/ date[4].wYear = 1601; + date[4].wMonth = 1; + date[4].wDayOfWeek = 2; + date[4].wDay = 2; + date[4].wHour = 0; + date[4].wMinute = 0; + date[4].wSecond = 0; + date[4].wMilliseconds = 0; + /*10.05.2008*/ date[5].wYear = 2008; + date[5].wMonth = 5; + date[5].wDayOfWeek = 6; + date[5].wDay = 10; + date[5].wHour = 0; + date[5].wMinute = 0; + date[5].wSecond = 0; + date[5].wMilliseconds = 0; + /*10.03.2008*/ date[6].wYear = 2008; + date[6].wMonth = 3; + date[6].wDayOfWeek = 1; + date[6].wDay = 10; + date[6].wHour = 0; + date[6].wMinute = 0; + date[6].wSecond = 0; + date[6].wMilliseconds = 0; + /*29.02.2008*/ date[7].wYear = 2008; + date[7].wMonth = 2; + date[7].wDayOfWeek = 5; + date[7].wDay = 29; + date[7].wHour = 0; + date[7].wMinute = 0; + date[7].wSecond = 0; + date[7].wMilliseconds = 0; + /*28.02.2007*/ date[8].wYear = 2007; + date[8].wMonth = 2; + date[8].wDayOfWeek = 3; + date[8].wDay = 28; + date[8].wHour = 0; + date[8].wMinute = 0; + date[8].wSecond = 0; + date[8].wMilliseconds = 0; + /*10.03.2007*/ date[9].wYear = 2007; + date[9].wMonth = 3; + date[9].wDayOfWeek = 6; + date[9].wDay = 10; + date[9].wHour = 0; + date[9].wMinute = 0; + date[9].wSecond = 0; + date[9].wMilliseconds = 0; + /*10.05.2007*/ date[10].wYear = 2007; + date[10].wMonth = 5; + date[10].wDayOfWeek = 4; + date[10].wDay = 10; + date[10].wHour = 0; + date[10].wMinute = 0; + date[10].wSecond = 0; + date[10].wMilliseconds = 0; + /*29.01.2008*/ date[11].wYear = 2008; + date[11].wMonth = 1; + date[11].wDayOfWeek = 2; + date[11].wDay = 29; + date[11].wHour = 0; + date[11].wMinute = 0; + date[11].wSecond = 0; + date[11].wMilliseconds = 0; + /*28.01.2007*/ date[12].wYear = 2007; + date[12].wMonth = 1; + date[12].wDayOfWeek = 0; + date[12].wDay = 28; + date[12].wHour = 0; + date[12].wMinute = 0; + date[12].wSecond = 0; + date[12].wMilliseconds = 0; + /*31.01.2008*/ date[13].wYear = 2008; + date[13].wMonth = 1; + date[13].wDayOfWeek = 4; + date[13].wDay = 31; + date[13].wHour = 0; + date[13].wMinute = 0; + date[13].wSecond = 0; + date[13].wMilliseconds = 0; + /*31.03.2008*/ date[14].wYear = 2008; + date[14].wMonth = 3; + date[14].wDayOfWeek = 1; + date[14].wDay = 31; + date[14].wHour = 0; + date[14].wMinute = 0; + date[14].wSecond = 0; + date[14].wMilliseconds = 0; + + // Date Differences + dateDifference[0].year = 1; + dateDifference[0].month = 1; + dateDifference[1].month = 1; + dateDifference[1].day = 10; + dateDifference[2].day = 2; + /*date[2]-[0]*/ dateDifference[3].week = 52; + dateDifference[3].day = 1; + /*date[2]-[0]*/ dateDifference[4].year = 1; + dateDifference[5].day = 365; + dateDifference[6].month = 1; + dateDifference[7].month = 1; + dateDifference[7].day = 2; + dateDifference[8].day = 31; + dateDifference[9].month = 11; + dateDifference[9].day = 1; + dateDifference[10].year = 8398; + dateDifference[10].month = 11; + dateDifference[10].day = 30; + dateDifference[11].year = 2008; + dateDifference[12].year = 7991; + dateDifference[12].month = 11; + dateDifference[13].week = 416998; + dateDifference[13].day = 1; + + /* Test Cases */ + + // Date Difference test cases + datetimeDifftest[0].startDate = date[0]; + datetimeDifftest[0].endDate = date[3]; + datetimeDifftest[0].dateDiff = dateDifference[10]; + datetimeDifftest[1].startDate = date[0]; + datetimeDifftest[1].endDate = date[2]; + datetimeDifftest[1].dateDiff = dateDifference[5]; + datetimeDifftest[2].startDate = date[0]; + datetimeDifftest[2].endDate = date[2]; + datetimeDifftest[2].dateDiff = dateDifference[4]; + datetimeDifftest[3].startDate = date[0]; + datetimeDifftest[3].endDate = date[2]; + datetimeDifftest[3].dateDiff = dateDifference[3]; + datetimeDifftest[4].startDate = date[14]; + datetimeDifftest[4].endDate = date[7]; + datetimeDifftest[4].dateDiff = dateDifference[7]; + datetimeDifftest[5].startDate = date[14]; + datetimeDifftest[5].endDate = date[7]; + datetimeDifftest[5].dateDiff = dateDifference[8]; + datetimeDifftest[6].startDate = date[11]; + datetimeDifftest[6].endDate = date[8]; + datetimeDifftest[6].dateDiff = dateDifference[9]; + datetimeDifftest[7].startDate = date[13]; + datetimeDifftest[7].endDate = date[0]; + datetimeDifftest[7].dateDiff = dateDifference[12]; + datetimeDifftest[8].startDate = date[13]; + datetimeDifftest[8].endDate = date[0]; + datetimeDifftest[8].dateDiff = dateDifference[13]; + + // Date Add Out of Bound test cases (Negative tests) + /*OutofBound*/ datetimeBoundAdd[0].startDate = date[1]; + datetimeBoundAdd[0].endDate = date[0]; + datetimeBoundAdd[0].dateDiff = dateDifference[2]; // on Add date[0] not used + /*OutofBound*/ datetimeBoundAdd[1].startDate = date[2]; + datetimeBoundAdd[1].endDate = date[0]; + datetimeBoundAdd[1].dateDiff = dateDifference[11]; // on Add date[0] not used + + // Date Subtract Out of Bound test cases (Negative tests) + /*OutofBound*/ datetimeBoundSubtract[0].startDate = date[3]; + datetimeBoundSubtract[0].endDate = date[0]; + datetimeBoundSubtract[0].dateDiff = dateDifference[2]; // on subtract date[0] not used + /*OutofBound*/ datetimeBoundSubtract[1].startDate = date[14]; + datetimeBoundSubtract[1].endDate = date[0]; + datetimeBoundSubtract[1].dateDiff = dateDifference[11]; // on subtract date[0] not used + + // Date Add test cases (Positive tests) + datetimeAddCase[0].startDate = date[13]; + datetimeAddCase[0].endDate = date[7]; + datetimeAddCase[0].dateDiff = dateDifference[6]; // add + datetimeAddCase[1].startDate = date[14]; + datetimeAddCase[1].endDate = date[5]; + datetimeAddCase[1].dateDiff = dateDifference[1]; // add + datetimeAddCase[2].startDate = date[13]; + datetimeAddCase[2].endDate = date[6]; + datetimeAddCase[2].dateDiff = dateDifference[1]; // add + + // Date Subtract test cases (Positive tests) + datetimeSubtractCase[0].startDate = date[14]; + datetimeSubtractCase[0].endDate = date[7]; + datetimeSubtractCase[0].dateDiff = dateDifference[6]; // subtract + datetimeSubtractCase[1].startDate = date[6]; + datetimeSubtractCase[1].endDate = date[11]; + datetimeSubtractCase[1].dateDiff = dateDifference[1]; // subtract + datetimeSubtractCase[2].startDate = date[9]; + datetimeSubtractCase[2].endDate = date[12]; + datetimeSubtractCase[2].dateDiff = dateDifference[1]; // subtract +} + +/* Duration Between Two Date Tests -- Timediff obtained after calculation should be checked to be identical */ +TEST_METHOD(TestDateDiff) +{ + // TODO - MSFT 10331900, fix this test + + // for (int testIndex = 0; testIndex < c_diffTestCase; testIndex++) + //{ + // DateDifference diff; + // DateUnit dateOutputFormat; + + // switch (testIndex) + // { + // case 0: + // case 2: + // dateOutputFormat = DateUnit::Year | DateUnit::Month | DateUnit::Day; + // break; + // case 1: + // dateOutputFormat = DateUnit::Day; + // break; + // case 3: + // case 8: + // dateOutputFormat = DateUnit::Week | DateUnit::Day; + // break; + // case 7: + // dateOutputFormat = DateUnit::Year | DateUnit::Month | DateUnit::Day; + // break; + // case 4: + // case 6: + // dateOutputFormat = DateUnit::Month | DateUnit::Day; + // break; + // case 5: + // dateOutputFormat = DateUnit::Day; + // break; + // } + + // // Calculate the difference + // m_DateCalcEngine.GetDateDifference(DateUtils::SystemTimeToDateTime(datetimeDifftest[testIndex].startDate), + // DateUtils::SystemTimeToDateTime(datetimeDifftest[testIndex].endDate), dateOutputFormat, &diff); + + // // Assert for the result + // bool areIdentical = true; + // if (diff.year != datetimeDifftest[testIndex].dateDiff.year || + // diff.month != datetimeDifftest[testIndex].dateDiff.month || + // diff.week != datetimeDifftest[testIndex].dateDiff.week || + // diff.day != datetimeDifftest[testIndex].dateDiff.day) + // { + // areIdentical = false; + // } + + // VERIFY_IS_TRUE(areIdentical); + //} +} + +/*Add Out of bound Tests*/ +TEST_METHOD(TestAddOob) +{ + // TODO - MSFT 10331900, fix this test + + // for (int testIndex = 0; testIndex< c_numAddOobDate; testIndex++) + //{ + // DateTime endDate; + + // // Add Duration + // bool isValid = m_DateCalcEngine.AddDuration(DateUtils::SystemTimeToDateTime(datetimeBoundAdd[testIndex].startDate), + // datetimeBoundAdd[testIndex].dateDiff, &endDate); + + // // Assert for the result + // VERIFY_IS_FALSE(isValid); + //} +} + +/*Subtract Out of bound Tests*/ +TEST_METHOD(TestSubtractOob) +{ + for (int testIndex = 0; testIndex < c_numSubtractOobDate; testIndex++) + { + DateTime endDate; + + // Subtract Duration + bool isValid = m_DateCalcEngine.SubtractDuration(DateUtils::SystemTimeToDateTime(datetimeBoundSubtract[testIndex].startDate), + datetimeBoundSubtract[testIndex].dateDiff, &endDate); + + // Assert for the result + VERIFY_IS_FALSE(isValid); + } +} + +// Add Tests +TEST_METHOD(TestAddition) +{ + // TODO - MSFT 10331900, fix this test + + // for (int testIndex = 0; testIndex < c_addCases; testIndex++) + //{ + // DateTime endDate; + + // // Add Duration + // bool isValid = m_DateCalcEngine.AddDuration(DateUtils::SystemTimeToDateTime(datetimeAddCase[testIndex].startDate), + // datetimeAddCase[testIndex].dateDiff, &endDate); + + // // Assert for the result + // VERIFY_IS_TRUE(isValid); + + // SYSTEMTIME systemTime = DateUtils::DateTimeToSystemTime(endDate); + // if (systemTime.wYear != datetimeAddCase[testIndex].endDate.wYear || + // systemTime.wMonth != datetimeAddCase[testIndex].endDate.wMonth || + // systemTime.wDay != datetimeAddCase[testIndex].endDate.wDay || + // systemTime.wDayOfWeek != datetimeAddCase[testIndex].endDate.wDayOfWeek) + // { + // isValid = false; + // } + + // VERIFY_IS_TRUE(isValid); + //} +} + +// Subtract Tests +TEST_METHOD(TestSubtraction) +{ + // TODO - MSFT 10331900, fix this test + + // for (int testIndex = 0; testIndex < c_subtractCases; testIndex++) + //{ + // DateTime endDate; + + // // Subtract Duration + // bool isValid = m_DateCalcEngine.SubtractDuration(DateUtils::SystemTimeToDateTime(datetimeSubtractCase[testIndex].startDate), + // datetimeSubtractCase[testIndex].dateDiff, &endDate); + + // // assert for the result + // VERIFY_IS_TRUE(isValid); + + // SYSTEMTIME systemTime = DateUtils::DateTimeToSystemTime(endDate); + // if (systemTime.wYear != datetimeSubtractCase[testIndex].endDate.wYear || + // systemTime.wMonth != datetimeSubtractCase[testIndex].endDate.wMonth || + // systemTime.wDay != datetimeSubtractCase[testIndex].endDate.wDay || + // systemTime.wDayOfWeek != datetimeSubtractCase[testIndex].endDate.wDayOfWeek) + // { + // isValid = false; + // } + + // VERIFY_IS_TRUE(isValid); + //} +} + +private: +} +; + +TEST_CLASS(DateCalculatorViewModelTests){ public: TEST_CLASS_INITIALIZE(TestClassSetup){ /* Test Case Data */ + + // Dates - DD.MM.YYYY + /*31.12.9999*/ date[0].wYear = 9999; +date[0].wMonth = 12; +date[0].wDayOfWeek = 5; +date[0].wDay = 31; +date[0].wHour = 0; +date[0].wMinute = 0; +date[0].wSecond = 0; +date[0].wMilliseconds = 0; +/*30.12.9999*/ date[1].wYear = 9999; +date[1].wMonth = 12; +date[1].wDayOfWeek = 4; +date[1].wDay = 30; +date[1].wHour = 0; +date[1].wMinute = 0; +date[1].wSecond = 0; +date[1].wMilliseconds = 0; +/*31.12.9998*/ date[2].wYear = 9998; +date[2].wMonth = 12; +date[2].wDayOfWeek = 4; +date[2].wDay = 31; +date[2].wHour = 0; +date[2].wMinute = 0; +date[2].wSecond = 0; +date[2].wMilliseconds = 0; +/*01.01.1601*/ date[3].wYear = 1601; +date[3].wMonth = 1; +date[3].wDayOfWeek = 1; +date[3].wDay = 1; +date[3].wHour = 0; +date[3].wMinute = 0; +date[3].wSecond = 0; +date[3].wMilliseconds = 0; +/*02.01.1601*/ date[4].wYear = 1601; +date[4].wMonth = 1; +date[4].wDayOfWeek = 2; +date[4].wDay = 2; +date[4].wHour = 0; +date[4].wMinute = 0; +date[4].wSecond = 0; +date[4].wMilliseconds = 0; +/*10.05.2008*/ date[5].wYear = 2008; +date[5].wMonth = 5; +date[5].wDayOfWeek = 6; +date[5].wDay = 10; +date[5].wHour = 0; +date[5].wMinute = 0; +date[5].wSecond = 0; +date[5].wMilliseconds = 0; +/*10.03.2008*/ date[6].wYear = 2008; +date[6].wMonth = 3; +date[6].wDayOfWeek = 1; +date[6].wDay = 10; +date[6].wHour = 0; +date[6].wMinute = 0; +date[6].wSecond = 0; +date[6].wMilliseconds = 0; +/*29.02.2008*/ date[7].wYear = 2008; +date[7].wMonth = 2; +date[7].wDayOfWeek = 5; +date[7].wDay = 29; +date[7].wHour = 0; +date[7].wMinute = 0; +date[7].wSecond = 0; +date[7].wMilliseconds = 0; +/*28.02.2007*/ date[8].wYear = 2007; +date[8].wMonth = 2; +date[8].wDayOfWeek = 3; +date[8].wDay = 28; +date[8].wHour = 0; +date[8].wMinute = 0; +date[8].wSecond = 0; +date[8].wMilliseconds = 0; +/*10.03.2007*/ date[9].wYear = 2007; +date[9].wMonth = 3; +date[9].wDayOfWeek = 6; +date[9].wDay = 10; +date[9].wHour = 0; +date[9].wMinute = 0; +date[9].wSecond = 0; +date[9].wMilliseconds = 0; +/*10.05.2007*/ date[10].wYear = 2007; +date[10].wMonth = 5; +date[10].wDayOfWeek = 4; +date[10].wDay = 10; +date[10].wHour = 0; +date[10].wMinute = 0; +date[10].wSecond = 0; +date[10].wMilliseconds = 0; +/*29.01.2008*/ date[11].wYear = 2008; +date[11].wMonth = 1; +date[11].wDayOfWeek = 2; +date[11].wDay = 29; +date[11].wHour = 0; +date[11].wMinute = 0; +date[11].wSecond = 0; +date[11].wMilliseconds = 0; +/*28.01.2007*/ date[12].wYear = 2007; +date[12].wMonth = 1; +date[12].wDayOfWeek = 0; +date[12].wDay = 28; +date[12].wHour = 0; +date[12].wMinute = 0; +date[12].wSecond = 0; +date[12].wMilliseconds = 0; +/*31.01.2008*/ date[13].wYear = 2008; +date[13].wMonth = 1; +date[13].wDayOfWeek = 4; +date[13].wDay = 31; +date[13].wHour = 0; +date[13].wMinute = 0; +date[13].wSecond = 0; +date[13].wMilliseconds = 0; +/*31.03.2008*/ date[14].wYear = 2008; +date[14].wMonth = 3; +date[14].wDayOfWeek = 1; +date[14].wDay = 31; +date[14].wHour = 0; +date[14].wMinute = 0; +date[14].wSecond = 0; +date[14].wMilliseconds = 0; + +// Date Differences +dateDifference[0].year = 1; +dateDifference[0].month = 1; +dateDifference[1].month = 1; +dateDifference[1].day = 10; +dateDifference[2].day = 2; +/*date[2]-[0]*/ dateDifference[3].week = 52; +dateDifference[3].day = 1; +/*date[2]-[0]*/ dateDifference[4].year = 1; +dateDifference[5].day = 365; +dateDifference[6].month = 1; +dateDifference[7].month = 1; +dateDifference[7].day = 2; +dateDifference[8].day = 31; +dateDifference[9].month = 11; +dateDifference[9].day = 1; +dateDifference[10].year = 8398; +dateDifference[10].month = 11; +dateDifference[10].day = 30; +dateDifference[11].year = 2008; +dateDifference[12].year = 7991; +dateDifference[12].month = 11; +dateDifference[13].week = 416998; +dateDifference[13].day = 1; + +/* Test Cases */ + +// Date Difference test cases +datetimeDifftest[0].startDate = date[0]; +datetimeDifftest[0].endDate = date[3]; +datetimeDifftest[0].dateDiff = dateDifference[10]; +datetimeDifftest[1].startDate = date[0]; +datetimeDifftest[1].endDate = date[2]; +datetimeDifftest[1].dateDiff = dateDifference[5]; +datetimeDifftest[2].startDate = date[0]; +datetimeDifftest[2].endDate = date[2]; +datetimeDifftest[2].dateDiff = dateDifference[4]; +datetimeDifftest[3].startDate = date[0]; +datetimeDifftest[3].endDate = date[2]; +datetimeDifftest[3].dateDiff = dateDifference[3]; +datetimeDifftest[4].startDate = date[14]; +datetimeDifftest[4].endDate = date[7]; +datetimeDifftest[4].dateDiff = dateDifference[7]; +datetimeDifftest[5].startDate = date[14]; +datetimeDifftest[5].endDate = date[7]; +datetimeDifftest[5].dateDiff = dateDifference[8]; +datetimeDifftest[6].startDate = date[11]; +datetimeDifftest[6].endDate = date[8]; +datetimeDifftest[6].dateDiff = dateDifference[9]; +datetimeDifftest[7].startDate = date[13]; +datetimeDifftest[7].endDate = date[0]; +datetimeDifftest[7].dateDiff = dateDifference[12]; +datetimeDifftest[8].startDate = date[13]; +datetimeDifftest[8].endDate = date[0]; +datetimeDifftest[8].dateDiff = dateDifference[13]; + +// Date Add Out of Bound test cases (Negative tests) +/*OutofBound*/ datetimeBoundAdd[0].startDate = date[1]; +datetimeBoundAdd[0].endDate = date[0]; +datetimeBoundAdd[0].dateDiff = dateDifference[2]; // on Add date[0] not used +/*OutofBound*/ datetimeBoundAdd[1].startDate = date[2]; +datetimeBoundAdd[1].endDate = date[0]; +datetimeBoundAdd[1].dateDiff = dateDifference[11]; // on Add date[0] not used + +// Date Subtract Out of Bound test cases (Negative tests) +/*OutofBound*/ datetimeBoundSubtract[0].startDate = date[3]; +datetimeBoundSubtract[0].endDate = date[0]; +datetimeBoundSubtract[0].dateDiff = dateDifference[2]; // on subtract date[0] not used +/*OutofBound*/ datetimeBoundSubtract[1].startDate = date[14]; +datetimeBoundSubtract[1].endDate = date[0]; +datetimeBoundSubtract[1].dateDiff = dateDifference[11]; // on subtract date[0] not used + +// Date Add test cases (Positive tests) +datetimeAddCase[0].startDate = date[13]; +datetimeAddCase[0].endDate = date[7]; +datetimeAddCase[0].dateDiff = dateDifference[6]; // add +datetimeAddCase[1].startDate = date[14]; +datetimeAddCase[1].endDate = date[5]; +datetimeAddCase[1].dateDiff = dateDifference[1]; // add +datetimeAddCase[2].startDate = date[13]; +datetimeAddCase[2].endDate = date[6]; +datetimeAddCase[2].dateDiff = dateDifference[1]; // add + +// Date Subtract test cases (Positive tests) +datetimeSubtractCase[0].startDate = date[14]; +datetimeSubtractCase[0].endDate = date[7]; +datetimeSubtractCase[0].dateDiff = dateDifference[6]; // subtract +datetimeSubtractCase[1].startDate = date[6]; +datetimeSubtractCase[1].endDate = date[11]; +datetimeSubtractCase[1].dateDiff = dateDifference[1]; // subtract +datetimeSubtractCase[2].startDate = date[9]; +datetimeSubtractCase[2].endDate = date[12]; +datetimeSubtractCase[2].dateDiff = dateDifference[1]; // subtract +} + +TEST_METHOD(DateCalcViewModelInitializationTest) +{ + auto viewModel = ref new DateCalculatorViewModel(); + + // Check for the initialized values + VERIFY_IS_TRUE(viewModel->IsDateDiffMode); + VERIFY_IS_TRUE(viewModel->IsAddMode); + + VERIFY_IS_TRUE(0 != viewModel->FromDate.UniversalTime); + VERIFY_IS_TRUE(0 != viewModel->ToDate.UniversalTime); + VERIFY_IS_TRUE(0 != viewModel->StartDate.UniversalTime); + + VERIFY_ARE_EQUAL(0, viewModel->DaysOffset); + VERIFY_ARE_EQUAL(0, viewModel->MonthsOffset); + VERIFY_ARE_EQUAL(0, viewModel->YearsOffset); + + VERIFY_IS_TRUE(viewModel->IsDiffInDays); + VERIFY_ARE_EQUAL(StringReference(L"Same dates"), viewModel->StrDateDiffResult); + VERIFY_IS_NULL(viewModel->StrDateDiffResultInDays); + + VERIFY_IS_NULL(viewModel->StrDateResult); +} + +TEST_METHOD(DateCalcViewModelAddSubtractInitTest) +{ + auto viewModel = ref new DateCalculatorViewModel(); + viewModel->IsDateDiffMode = false; + + // Check for the initialized values + VERIFY_IS_FALSE(viewModel->IsDateDiffMode); + VERIFY_IS_TRUE(viewModel->IsAddMode); + + VERIFY_IS_TRUE(0 != viewModel->FromDate.UniversalTime); + VERIFY_IS_TRUE(0 != viewModel->ToDate.UniversalTime); + VERIFY_IS_TRUE(0 != viewModel->StartDate.UniversalTime); + + VERIFY_ARE_EQUAL(0, viewModel->DaysOffset); + VERIFY_ARE_EQUAL(0, viewModel->MonthsOffset); + VERIFY_ARE_EQUAL(0, viewModel->YearsOffset); + + VERIFY_IS_TRUE(viewModel->IsDiffInDays); + VERIFY_ARE_EQUAL(StringReference(L"Same dates"), viewModel->StrDateDiffResult); + VERIFY_IS_NULL(viewModel->StrDateDiffResultInDays); + + VERIFY_IS_NOT_NULL(viewModel->StrDateResult); + VERIFY_IS_TRUE(StringReference(L"") != viewModel->StrDateResult); +} + +TEST_METHOD(DateCalcViewModelDateDiffDaylightSavingTimeTest) +{ + auto viewModel = ref new DateCalculatorViewModel(); + + viewModel->IsDateDiffMode = true; + VERIFY_IS_TRUE(viewModel->IsDateDiffMode); + + // 29.02.2008 + viewModel->FromDate = DateUtils::SystemTimeToDateTime(datetimeDifftest[5].startDate); + // 31.03.2008 + viewModel->ToDate = DateUtils::SystemTimeToDateTime(datetimeDifftest[5].endDate); + + //// Assert for the result + VERIFY_IS_FALSE(viewModel->IsDiffInDays); + VERIFY_ARE_EQUAL(StringReference(L"31 days"), viewModel->StrDateDiffResultInDays); + VERIFY_ARE_EQUAL(StringReference(L"1 month, 2 days"), viewModel->StrDateDiffResult); + + // Daylight Saving Time - Clock Forward + // 10.03.2019 + SYSTEMTIME startDate; + startDate.wYear = 2019; + startDate.wMonth = 03; + startDate.wDay = 10; + startDate.wDayOfWeek = 0; + startDate.wHour = startDate.wMinute = 0; + startDate.wSecond = startDate.wMilliseconds = 0; + viewModel->FromDate = DateUtils::SystemTimeToDateTime(startDate); + // 11.03.2019 + SYSTEMTIME endDate; + endDate.wYear = 2019; + endDate.wMonth = 03; + endDate.wDay = 11; + endDate.wDayOfWeek = 0; + endDate.wHour = endDate.wMinute = 0; + endDate.wSecond = endDate.wMilliseconds = 0; + viewModel->ToDate = DateUtils::SystemTimeToDateTime(endDate); + VERIFY_IS_TRUE(viewModel->IsDiffInDays); + VERIFY_ARE_EQUAL(StringReference(L"1 day"), viewModel->StrDateDiffResult); + + endDate.wDay += 6; + viewModel->ToDate = DateUtils::SystemTimeToDateTime(endDate); + VERIFY_IS_FALSE(viewModel->IsDiffInDays); + VERIFY_ARE_EQUAL(StringReference(L"1 week"), viewModel->StrDateDiffResult); + + // Daylight Saving Time - Clock Backward + // 03.11.2019 + startDate.wMonth = 11; + startDate.wDay = 03; + viewModel->FromDate = DateUtils::SystemTimeToDateTime(startDate); + // 04.11.2019 + endDate.wMonth = 11; + endDate.wDay = 04; + viewModel->ToDate = DateUtils::SystemTimeToDateTime(endDate); + VERIFY_IS_TRUE(viewModel->IsDiffInDays); + VERIFY_ARE_EQUAL(StringReference(L"1 day"), viewModel->StrDateDiffResult); +} + +TEST_METHOD(DateCalcViewModelAddTest) +{ + // TODO - MSFT 10331900, fix this test + // A few issues to be investigated.. + // The date returned by DateUtils::GetLongDate can be a different string than expected + // based on the values of date[7]. This is because date[7] is in UTC but GetLongDate + // doesn't format according to UTC. If it did, the test would still be incorrect because + // the ViewModel is not necessarily in UTC. + // + // The DateTime value assigned to StartDate after the conversion SystemTimeToDateTime is not + // the same DateTime value as if the user were to select the same date from the CalendarDatePicker. + // This means testing a specific date here, is *not* the same as selecting that date in the app. + + // auto viewModel = ref new DateCalculatorViewModel(); + // viewModel->Initialize(); + + // viewModel->IsDateDiffMode = false; + // viewModel->IsAddMode = true; + // VERIFY_IS_FALSE(viewModel->IsDateDiffMode); + // VERIFY_IS_TRUE(viewModel->IsAddMode); + + // viewModel->StartDate = DateUtils::SystemTimeToDateTime(datetimeAddCase[0].startDate); + // viewModel->DaysOffset = datetimeAddCase[0].dateDiff.day; + // viewModel->MonthsOffset = datetimeAddCase[0].dateDiff.month; + // viewModel->YearsOffset = datetimeAddCase[0].dateDiff.year; + + //// Assert for the result + // VERIFY_ARE_EQUAL(DateUtils::GetLongDate(date[7]), viewModel->StrDateResult); +} + +TEST_METHOD(DateCalcViewModelSubtractTest) +{ + // TODO - MSFT 10331900, fix this test + // A few issues to be investigated.. + // The date returned by DateUtils::GetLongDate can be a different string than expected + // based on the values of date[7]. This is because date[7] is in UTC but GetLongDate + // doesn't format according to UTC. If it did, the test would still be incorrect because + // the ViewModel is not necessarily in UTC. + // + // The DateTime value assigned to StartDate after the conversion SystemTimeToDateTime is not + // the same DateTime value as if the user were to select the same date from the CalendarDatePicker. + // This means testing a specific date here, is *not* the same as selecting that date in the app. + + // auto viewModel = ref new DateCalculatorViewModel(); + // viewModel->Initialize(); + + // viewModel->IsDateDiffMode = false; + // viewModel->IsAddMode = false; + // VERIFY_IS_FALSE(viewModel->IsDateDiffMode); + // VERIFY_IS_FALSE(viewModel->IsAddMode); + + // viewModel->StartDate = DateUtils::SystemTimeToDateTime(datetimeSubtractCase[0].startDate); + // viewModel->DaysOffset = datetimeSubtractCase[0].dateDiff.day; + // viewModel->MonthsOffset = datetimeSubtractCase[0].dateDiff.month; + // viewModel->YearsOffset = datetimeSubtractCase[0].dateDiff.year; + + //// Assert for the result + // VERIFY_ARE_EQUAL(DateUtils::GetLongDate(date[7]), viewModel->StrDateResult); +} + +TEST_METHOD(DateCalcViewModelAddOobTest) +{ + // TODO - MSFT 10331900, fix this test + // Curiously enough, this test fails because it fails to go Oob. + // Possibly need to update test to use a new max date. + + // auto viewModel = ref new DateCalculatorViewModel(); + // viewModel->Initialize(); + + // viewModel->IsDateDiffMode = false; + // viewModel->IsAddMode = true; + // VERIFY_IS_FALSE(viewModel->IsDateDiffMode); + // VERIFY_IS_TRUE(viewModel->IsAddMode); + + // for (int testIndex = 0; testIndex< c_numAddOobDate; testIndex++) + //{ + // viewModel->StartDate = DateUtils::SystemTimeToDateTime(datetimeBoundAdd[testIndex].startDate); + // viewModel->DaysOffset = datetimeBoundAdd[testIndex].dateDiff.day; + // viewModel->MonthsOffset = datetimeBoundAdd[testIndex].dateDiff.month; + // viewModel->YearsOffset = datetimeBoundAdd[testIndex].dateDiff.year; + + // // Assert for the result + // VERIFY_ARE_EQUAL(StringReference(L"Date out of Bound"), viewModel->StrDateResult); + //} +} + +TEST_METHOD(DateCalcViewModelSubtractOobTest) +{ + auto viewModel = ref new DateCalculatorViewModel(); + + viewModel->IsDateDiffMode = false; + viewModel->IsAddMode = false; + VERIFY_IS_FALSE(viewModel->IsDateDiffMode); + VERIFY_IS_FALSE(viewModel->IsAddMode); + + for (int testIndex = 0; testIndex < c_numSubtractOobDate; testIndex++) + { + viewModel->StartDate = DateUtils::SystemTimeToDateTime(datetimeBoundSubtract[testIndex].startDate); + viewModel->DaysOffset = datetimeBoundSubtract[testIndex].dateDiff.day; + viewModel->MonthsOffset = datetimeBoundSubtract[testIndex].dateDiff.month; + viewModel->YearsOffset = datetimeBoundSubtract[testIndex].dateDiff.year; + + // Assert for the result + VERIFY_ARE_EQUAL(StringReference(L"Date out of Bound"), viewModel->StrDateResult); + } +} + +TEST_METHOD(DateCalcViewModelDateDiffIgnoreSignTest) +{ + auto viewModel = ref new DateCalculatorViewModel(); + + viewModel->IsDateDiffMode = true; + VERIFY_IS_TRUE(viewModel->IsDateDiffMode); + + viewModel->FromDate = DateUtils::SystemTimeToDateTime(date[10]); + viewModel->ToDate = DateUtils::SystemTimeToDateTime(date[6]); + + VERIFY_IS_FALSE(viewModel->IsDiffInDays); + VERIFY_ARE_EQUAL(StringReference(L"305 days"), viewModel->StrDateDiffResultInDays); + VERIFY_ARE_EQUAL(StringReference(L"10 months"), viewModel->StrDateDiffResult); + viewModel->FromDate = DateUtils::SystemTimeToDateTime(date[6]); + viewModel->ToDate = DateUtils::SystemTimeToDateTime(date[10]); + VERIFY_IS_FALSE(viewModel->IsDiffInDays); + VERIFY_ARE_EQUAL(StringReference(L"305 days"), viewModel->StrDateDiffResultInDays); + VERIFY_ARE_EQUAL(StringReference(L"10 months"), viewModel->StrDateDiffResult); +} + +TEST_METHOD(DateCalcViewModelDateDiffTest) +{ + // TODO - MSFT 10331900, fix this test + // The last VERIFY checks with expected value "8398 years, 11 months, 4 weeks, 2 days" + // The viewmodel result is something like "8398 years, 12 months, 6568892 weeks, 1 day", + // which shows there is a problem with the viewmodel's reduction algorithm. + + // auto viewModel = ref new DateCalculatorViewModel(); + // viewModel->Initialize(); + + // viewModel->IsDateDiffMode = true; + // VERIFY_IS_TRUE(viewModel->IsDateDiffMode); + + // viewModel->FromDate = DateUtils::SystemTimeToDateTime(datetimeDifftest[0].startDate); + // viewModel->ToDate = DateUtils::SystemTimeToDateTime(datetimeDifftest[0].endDate); + + //// Assert for the result + // VERIFY_IS_FALSE(viewModel->IsDiffInDays); + // VERIFY_ARE_EQUAL(StringReference(L"3067670 days"), viewModel->StrDateDiffResultInDays); + // VERIFY_ARE_EQUAL(StringReference(L"8398 years, 11 months, 4 weeks, 2 days"), viewModel->StrDateDiffResult); +} + +TEST_METHOD(DateCalcViewModelDateDiffResultInPositiveDaysTest) +{ + auto viewModel = ref new DateCalculatorViewModel(); + + viewModel->IsDateDiffMode = true; + VERIFY_IS_TRUE(viewModel->IsDateDiffMode); + + viewModel->FromDate = DateUtils::SystemTimeToDateTime(date[1]); + viewModel->ToDate = DateUtils::SystemTimeToDateTime(date[0]); + + // Assert for the result + VERIFY_IS_TRUE(viewModel->IsDiffInDays); + VERIFY_ARE_EQUAL(StringReference(L"1 day"), viewModel->StrDateDiffResult); + VERIFY_IS_NULL(viewModel->StrDateDiffResultInDays); +} + +TEST_METHOD(DateCalcViewModelDateDiffFromDateHigherThanToDate) +{ + auto viewModel = ref new DateCalculatorViewModel(); + + viewModel->IsDateDiffMode = true; + VERIFY_IS_TRUE(viewModel->IsDateDiffMode); + + viewModel->FromDate = DateUtils::SystemTimeToDateTime(date[0]); + viewModel->ToDate = DateUtils::SystemTimeToDateTime(date[1]); + + // Assert for the result + VERIFY_IS_TRUE(viewModel->IsDiffInDays); + VERIFY_ARE_EQUAL(StringReference(L"1 day"), viewModel->StrDateDiffResult); + VERIFY_IS_NULL(viewModel->StrDateDiffResultInDays); +} + +// Tests that the automation name for the resulting date in Add Mode +// contains the DayOfWeek, Day, Month, and Year +TEST_METHOD(DateCalcViewModelAddSubtractResultAutomationNameTest) +{ + auto viewModel = ref new DateCalculatorViewModel(); + + auto cal = ref new Calendar(); + cal->Year = 2007; + cal->Month = 5; + cal->Day = 10; + cal->Hour = 12; + cal->Period = 2; + cal->Nanosecond = 0; + cal->Second = 0; + + DateTime startDate = cal->GetDateTime(); + viewModel->StartDate = startDate; + + viewModel->IsDateDiffMode = false; + viewModel->IsAddMode = true; + + wstring actualValue = viewModel->StrDateResultAutomationName->Data(); + + // Verify each component is present in the result + wstring components[] = { L"dayofweek.full", L"month.full", L"year.full", L"day" }; + + for (const wstring& component : components) + { + auto formatter = ref new DateTimeFormatter(ref new String(component.c_str())); + wstring expectedValue = formatter->Format(startDate)->Data(); + wstring message = L"Verifying " + component + L" is present in the result"; + VERIFY_IS_TRUE(actualValue.find(expectedValue) != wstring::npos, message.c_str()); + } +} + +TEST_METHOD(JaEraTransitionAddition) +{ + auto viewModel = make_unique(CalendarIdentifiers::Japanese); + auto cal = ref new Calendar(); + + // Showa period ended in Jan 1989. + cal->Year = 1989; + cal->Month = 1; + cal->Day = 1; + auto startTime = cal->GetDateTime(); + + cal->Year = 1990; + cal->Month = 1; + cal->Day = 1; + + // Expect that adding a year across boundaries adds the equivalent in the Gregorian calendar. + auto expectedResult = cal->GetDateTime(); + DateDifference duration; + duration.year = 1; + + DateTime actualResult; + viewModel->AddDuration(startTime, duration, &actualResult); + + VERIFY_ARE_EQUAL(expectedResult.UniversalTime, actualResult.UniversalTime); +} + +TEST_METHOD(JaEraTransitionSubtraction) +{ + auto viewModel = make_unique(CalendarIdentifiers::Japanese); + auto cal = ref new Calendar(); + + // Showa period ended in Jan 1989. + cal->Year = 1990; + cal->Month = 1; + cal->Day = 1; + auto startTime = cal->GetDateTime(); + + cal->Year = 1989; + cal->Month = 1; + cal->Day = 1; + + // Expect that adding a year across boundaries adds the equivalent in the Gregorian calendar. + auto expectedResult = cal->GetDateTime(); + DateDifference duration; + duration.year = 1; + + DateTime actualResult; + viewModel->SubtractDuration(startTime, duration, &actualResult); + + VERIFY_ARE_EQUAL(expectedResult.UniversalTime, actualResult.UniversalTime); +} +} +; } diff --git a/src/CalculatorUnitTests/MultiWindowUnitTests.cpp b/src/CalculatorUnitTests/MultiWindowUnitTests.cpp index 22407063..b41a6113 100644 --- a/src/CalculatorUnitTests/MultiWindowUnitTests.cpp +++ b/src/CalculatorUnitTests/MultiWindowUnitTests.cpp @@ -632,9 +632,9 @@ TEST_METHOD(MultipleDateCalculatorTest) //// Diff in viewModels[0] // SYSTEMTIME date1, date2, resultDate; ///* 01-10-2015 */ date1.wDay = 1; date1.wMonth = 10; date1.wYear = 2015; date1.wDayOfWeek = 4; date1.wHour = 0; date1.wMinute = 0; date1.wSecond = 0; - ///date1.wMilliseconds = 0; + /// date1.wMilliseconds = 0; ///* 15-02-2016 */ date2.wDay = 15; date2.wMonth = 2; date2.wYear = 2016; date2.wDayOfWeek = 1; date2.wHour = 0; date2.wMinute = 0; date2.wSecond = 0; - ///date2.wMilliseconds = 0; + /// date2.wMilliseconds = 0; // viewModels[0]->FromDate = DateUtils::SystemTimeToDateTime(date1); // viewModels[0]->ToDate = DateUtils::SystemTimeToDateTime(date2);