// Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. #ifndef MOCKVALUE_H #define MOCKVALUE_H #pragma once #include "stdafx.h" #include "mockvaluebase.h" #include template class CMockValue : public CMockValueBase { public: CMockValue(_In_ const T& value) : m_Value(value), m_OriginalValue(m_Value) { } virtual ~CMockValue() { } virtual std::tstring ToString() const { std::tostringstream strStream; strStream << m_Value; return strStream.str(); } virtual bool EqualTo(_In_ const CMockValueBase* right) { return (*this == *(reinterpret_cast*>(right))); } void SetValue(_In_ const T& value) { m_Value = value; m_OriginalValue = value; } const T& GetValue() const { return m_Value; } protected: T m_Value; T m_OriginalValue; }; template<> class CMockValue : public CMockValueBase { public: CMockValue(_In_ const unsigned char& value) : m_Value(value), m_OriginalValue(value) { } virtual ~CMockValue() { } virtual std::tstring ToString() const { std::tostringstream strStream; strStream << (unsigned int)m_Value; return strStream.str(); } virtual bool EqualTo(_In_ const CMockValueBase* right) { return (this->m_Value == (reinterpret_cast*>(right))->m_Value); } void SetValue(_In_ const unsigned char& value) { m_Value = value; m_OriginalValue = value; } const unsigned char& GetValue() const { return m_Value; } protected: unsigned char m_Value; unsigned char m_OriginalValue; }; template<> class CMockValue : public CMockValueBase { public: CMockValue(void) { } virtual ~CMockValue() { } virtual std::tstring ToString() const { std::tostringstream strStream; strStream << "void"; return strStream.str(); } virtual bool EqualTo(_In_ const CMockValueBase* right) { (void)right; return true; } void SetValue(void) { } void GetValue() const { return; } protected: unsigned char m_Value; unsigned char m_OriginalValue; }; template<> class CMockValue : public CMockValueBase { public: CMockValue(_In_ const wchar_t * value) { if (value == NULL) { m_Value = L"NULL"; m_OriginalValue = L"NULL"; } else { m_Value = value; m_OriginalValue = value; } } virtual ~CMockValue() { } virtual std::tstring ToString() const { #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4244) #endif // _MSC_VER std::string temp(m_Value.begin(), m_Value.end()); std::tostringstream strStream; strStream << temp.c_str(); return strStream.str(); #ifdef _MSC_VER #pragma warning(pop) #endif // _MSC_VER } virtual bool EqualTo(_In_ const CMockValueBase* right) { return (this->m_Value == (reinterpret_cast*>(right))->m_Value); } void SetValue(_In_ const wchar_t* value) { if (value == NULL) { m_Value = L"NULL"; m_OriginalValue = L"NULL"; } else { m_Value = value; m_OriginalValue = value; } } const wchar_t* GetValue() const { return m_Value.c_str(); } protected: std::wstring m_Value; std::wstring m_OriginalValue; }; template<> class CMockValue : public CMockValueBase { public: CMockValue(_In_ const wchar_t * value) { if (value == NULL) { m_Value = L"NULL"; m_OriginalValue = L"NULL"; } else { m_Value = value; m_OriginalValue = value; } } virtual ~CMockValue() { } virtual std::tstring ToString() const { #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4244) #endif // _MSC_VER std::string temp(m_Value.begin(), m_Value.end()); std::tostringstream strStream; strStream << temp.c_str(); return strStream.str(); #ifdef _MSC_VER #pragma warning(pop) #endif // _MSC_VER } virtual bool EqualTo(_In_ const CMockValueBase* right) { return (this->m_Value == (reinterpret_cast*>(right))->m_Value); } void SetValue(_In_ const wchar_t* value) { if (value == NULL) { m_Value = L"NULL"; m_OriginalValue = L"NULL"; } else { m_Value = value; m_OriginalValue = value; } } const wchar_t* GetValue() const { return m_Value.c_str(); } protected: std::wstring m_Value; std::wstring m_OriginalValue; }; template class CMockValue : public CMockValueBase { public: CMockValue(_In_ T* value) { m_Value = value; m_OriginalValue = value; } virtual ~CMockValue() { } virtual std::tstring ToString() const { std::tostringstream strStream; if (NULL == m_Value) { strStream << _T("NULL"); } else { strStream << m_Value; } return strStream.str(); } virtual bool EqualTo(_In_ const CMockValueBase* right) { return (*this == *(reinterpret_cast*>(right))); } void SetValue(_In_ T* value) { m_Value = value; m_OriginalValue = value; } T* GetValue() const { return m_Value; } protected: T* m_Value; T* m_OriginalValue; }; template class CMockValue : public CMockValueBase { public: typedef struct arraySave_TAG { bool isNULL; T* copy; }arraySave; typedef T T_Array_N[N]; CMockValue(_In_ T* value) { m_OriginalValue = value; if (value == NULL) { m_Value.isNULL = true; } else { m_Value.isNULL = false; m_Value.copy = new T[N](); for (size_t i = 0; i < N;i++) { m_Value.copy[i] = value[i]; } } } virtual ~CMockValue() { if (m_Value.isNULL ==false) { delete[] m_Value.copy; } } virtual std::tstring ToString() const { std::tostringstream strStream; if (m_Value.isNULL) { strStream << "NULL"; } else { strStream << "{"; for (size_t i = 0; i < N; i++) { if (i > 0) { strStream << ","; } strStream << m_Value.copy[i]; } strStream << "}"; } return strStream.str(); } virtual bool EqualTo(_In_ const CMockValueBase* right) { /*this will be interesting*/ return (*this == *(reinterpret_cast*>(right))); } void SetValue(_In_ T* value) { m_OriginalValue = value; if (m_Value.isNULL == true) { if (value == NULL) { /*do nothing*/ } else { m_Value.isNULL = false; m_Value.copy = new T[N]; for (size_t i = 0; i < N; i++) { m_Value.copy[i] = value[i]; } } } else { if (value == NULL) { m_Value.isNULL = true; delete[]m_Value.copy; } else { if (value == m_Value.copy) { /*do nothing, we are copying from us to us*/ } else { m_Value.isNULL = false; delete[] m_Value.copy; m_Value.copy = new T[N]; for (size_t i = 0; i < N; i++) { m_Value.copy[i] = value[i]; } } } } } const T* GetValue() const { if (m_Value.isNULL == true) { return NULL; } else { return m_Value.copy; } } protected: arraySave m_Value; T* m_OriginalValue; }; template class CMockValue : public CMockValueBase { public: typedef struct arraySave_TAG { bool isNULL; T* copy; }arraySave; typedef T T_Array_N[N]; CMockValue(_In_ const T* value) { m_OriginalValue = value; if (value == NULL) { m_Value.isNULL = true; } else { m_Value.isNULL = false; m_Value.copy = new T[N](); for (size_t i = 0; i < N; i++) { m_Value.copy[i] = value[i]; } } } virtual ~CMockValue() { if (m_Value.isNULL == false) { delete[] m_Value.copy; } } virtual std::tstring ToString() const { std::tostringstream strStream; if (m_Value.isNULL) { strStream << "NULL"; } else { strStream << "{"; for (size_t i = 0; i < N; i++) { if (i > 0) { strStream << ","; } strStream << m_Value.copy[i]; } strStream << "}"; } return strStream.str(); } virtual bool EqualTo(_In_ const CMockValueBase* right) { /*this will be interesting*/ return (*this == *(reinterpret_cast*>(right))); } void SetValue(_In_ const T* value) { m_OriginalValue = value; if (m_Value.isNULL == true) { if (value == NULL) { /*do nothing*/ } else { m_Value.isNULL = false; m_Value.copy = new T[N]; for (size_t i = 0; i < N; i++) { m_Value.copy[i] = value[i]; } } } else { if (value == NULL) { m_Value.isNULL = true; delete[]m_Value.copy; } else { if (value == m_Value.copy) { /*do nothing, we are copying from us to us*/ } else { m_Value.isNULL = false; delete[] m_Value.copy; m_Value.copy = new T[N]; for (size_t i = 0; i < N; i++) { m_Value.copy[i] = value[i]; } } } } } const T* GetValue() const { if (m_Value.isNULL == true) { return NULL; } else { return m_Value.copy; } } protected: arraySave m_Value; const T* m_OriginalValue; }; template static bool operator==(_In_ const CMockValue& lhs, _In_ const CMockValue& rhs) { return lhs.GetValue() == rhs.GetValue(); } template static bool operator==(_In_ const CMockValue& lhs, _In_ const CMockValue& rhs) { /*comparing two arrays needs to be handled differently than the build in == operator*/ return(strcmp(lhs.ToString().c_str(), rhs.ToString().c_str()) == 0); } #endif // MOCKVALUE_H