testtools/micromock/inc/mockvalue.h (519 lines of code) (raw):
// 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 <sstream>
template<typename T>
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<const CMockValue<T>*>(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 <unsigned char>:
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<const CMockValue<unsigned char>*>(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 <void> :
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 <wchar_t *> :
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<const CMockValue<wchar_t *>*>(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 <const wchar_t *> :
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<const CMockValue<const wchar_t *>*>(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<typename T>
class CMockValue <T*> :
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<const CMockValue<T*>*>(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<typename T, size_t N>
class CMockValue <T[N]> :
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<const CMockValue<T_Array_N>*>(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<typename T, size_t N>
class CMockValue <const T[N]> :
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<const CMockValue<const T_Array_N>*>(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<typename T>
static bool operator==(_In_ const CMockValue<T>& lhs, _In_ const CMockValue<T>& rhs)
{
return lhs.GetValue() == rhs.GetValue();
}
template<typename T, size_t N>
static bool operator==(_In_ const CMockValue<T[N]>& lhs, _In_ const CMockValue<T[N]>& 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