4#include <gtest/gtest.h>
6#include "system/shared_ptr.h"
7#include "system/decimal.h"
8#include "system/array.h"
9#include "system/collections/list.h"
10#include "system/collections/dictionary.h"
11#include "system/collections/sorted_dictionary.h"
12#include "system/collections/sorted_list.h"
13#include "system/collections/stack.h"
14#include "system/collections/queue.h"
15#include "system/collections/bitarray.h"
16#include "system/collections/specialized/string_collection.h"
17#include "system/collections/hashset.h"
18#include "system/object_ext.h"
20#include "system/test_tools/test_tools.h"
21#include "system/test_tools/compare.h"
28namespace TestPredicates
37template<
typename T1,
typename T2>
38using AreFPandArithmetic = std::integral_constant<bool, (std::is_floating_point<T1>::value && std::is_arithmetic<T2>::value) || (std::is_arithmetic<T1>::value && std::is_floating_point<T2>::value) >;
44template<
typename T1,
typename T2>
45using AnyOfDecimal = std::integral_constant<bool, std::is_same<T1, System::Decimal>::value || std::is_same<T2, System::Decimal>::value>;
51template<
typename T1,
typename T2,
typename Enable =
void>
54template<
typename T1,
typename T2>
55struct LargestFPType<T1, T2, typename std::enable_if<std::is_floating_point<T1>::value && !std::is_floating_point<T2>::value>::type>
61template<
typename T1,
typename T2>
62struct LargestFPType<T1, T2, typename std::enable_if<std::is_floating_point<T2>::value && !std::is_floating_point<T1>::value>::type>
68template<
typename T1,
typename T2>
69struct LargestFPType<T1, T2, typename std::enable_if<std::is_floating_point<T1>::value && std::is_floating_point<T2>::value>::type>
72 using type =
typename std::conditional<
sizeof(T1) >=
sizeof(T2), T1, T2>::type;
79template<
typename T,
typename Enable =
void>
85 , decltype((void)(
PrintTo(std::declval<T&>(), std::declval<std::ostream*>())))
91template<
typename T,
typename Enable =
void>
97 , decltype((void)(std::declval<T>().data()))
104> : std::false_type {};
109using IsArray = std::is_same<T, System::Array<typename T::ValueType>>;
114using IsList = std::is_same<T, System::Collections::Generic::List<typename T::ValueType>>;
120template<
typename T1,
typename T2>
126template<
typename T,
typename Enable =
void>
132 , decltype((void)(std::declval<typename T::ValueType>()))
133> : std::is_base_of<System::Collections::Generic::IEnumerable<typename T::ValueType>, T> {};
139template <
typename T1,
typename T2>
147template<
typename T,
typename Enable =
void>
153 , decltype(std::declval<typename T::iterator>(), std::declval<typename T::const_iterator>(), void(0))
154> : std::true_type {};
162std::enable_if_t<!TypeTraits::IsEnumerable<T>::value, std::string>
166std::enable_if_t<TypeTraits::IsEnumerable<T>::value, std::string>
179typename std::enable_if<System::Details::HasToString<T>::value, std::string>::type
184 return value->ToString().ToUtf8String();
196typename std::enable_if<System::Details::HasToString<T>::value, std::string>::type
199 if (
auto ptr = value.lock())
201 return ptr->ToString().ToUtf8String();
213typename std::enable_if<!TypeTraits::has_print_to_method<T>::value && System::Details::HasToString<T>::value, std::string>::type
217 return const_cast<T&
>(value).ToString().ToUtf8String();
230 ::std::stringstream ss;
254template<
typename T1,
typename T2>
258 std::ostringstream os;
269template<
typename T1,
typename T2>
273 std::ostringstream os;
284typename std::enable_if<TypeTraits::IsCppContainer<T>::value && !std::is_base_of<Object, T>::value, std::string>::type
288 std::ostringstream ostr;
289 const size_t kMaxCount = 32;
293 for (
auto it = container.begin();
294 it != container.end(); ++it, ++count) {
297 if (count == kMaxCount) {
323 return ::testing::PrintToString(value);
330std::enable_if_t<!TypeTraits::IsEnumerable<T>::value, std::string>
347 std::ostringstream ostr;
348 const size_t kMaxCount = 32;
352 while (enumerator->MoveNext())
356 if (count == kMaxCount)
364 ostr << enumerator->get_Current();
373std::enable_if_t<TypeTraits::IsEnumerable<T>::value, std::string>
376 std::ostringstream ostr;
377 const size_t kMaxCount = 32;
382 auto enumerator =
const_cast<T&
>(value).GetEnumerator();
383 while (enumerator->MoveNext())
388 if (count == kMaxCount) {
412template<
typename T1,
typename T2>
413testing::AssertionResult
EqFailure(
const char* lhs_expr,
const char* rhs_expr
417 return testing::internal::EqFailure(lhs_expr,
431template<
typename T1,
typename T2>
432testing::AssertionResult
NotEqFailure(
const char* lhs_expr,
const char* rhs_expr
436 return testing::AssertionFailure()
437 <<
"Expected: (" << lhs_expr <<
") != (" << rhs_expr
449template<
typename T1,
typename T2>
450testing::AssertionResult
SameFailure(
const char* lhs_expr,
const char* rhs_expr
454 return testing::AssertionFailure()
455 <<
"Expected: (" << lhs_expr <<
") same (" << rhs_expr
467template<
typename T1,
typename T2>
468testing::AssertionResult
NotSameFailure(
const char* lhs_expr,
const char* rhs_expr
472 return testing::AssertionFailure()
473 <<
"Expected: (" << lhs_expr <<
") isn't same (" << rhs_expr
478namespace SharedPtrAsserts
487template<
typename T1,
typename T2>
492 return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
500template<
typename T1,
typename T2>
505 return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(),
506 [](
const typename T1::value_type &l,
const typename T2::value_type &r)
508 return System::Object::Equals(l, r);
519template<
typename T1,
typename T2>
524 return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(),
525 [](
const typename T1::value_type &l,
const typename T2::value_type &r)
527 return System::Object::Equals(l, r);
537template<
typename T1,
typename T2>
542 return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
551typename std::enable_if<!System::IsSmartPtr<typename T::value_type>::value
566 return lhs.size() == rhs.size() && std::all_of(lhs.begin(), lhs.end(),
567 [&rhs](
const typename T::value_type value)
569 auto it = rhs.find(value.first);
570 return it != rhs.end() && System::Object::Equals(value.second, it->second);
584template<
typename T1,
typename T2>
585typename std::enable_if<TypeTraits::BothArrayOrList<typename T1::Pointee_, typename T2::Pointee_>::value
586, testing::AssertionResult>::type
588 ,
const T1& lhs,
const T2& rhs,
long long s)
592 return testing::AssertionSuccess();
594 return EqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
607template<
typename T1,
typename T2>
608typename std::enable_if<
613 testing::AssertionResult
615 ,
const T1& lhs,
const T2& rhs,
long long s)
621 return testing::AssertionSuccess();
623 return EqFailure(lhs_expr, rhs_expr, lhs, rhs);
635template<
typename K,
typename V>
642 return testing::AssertionSuccess();
644 return EqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
654template<
typename K,
typename V>
661 return testing::AssertionSuccess();
663 return EqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
673template<
typename T1,
typename T2>
680 return testing::AssertionSuccess();
682 return EqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
692template<
typename T1,
typename T2>
699 return testing::AssertionSuccess();
701 return EqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
711template<
typename T1,
typename T2>
718 return testing::AssertionSuccess();
720 return EqFailure(lhs_expr, rhs_expr, *lhs, *rhs);
730template<
typename K,
typename V>
737 return testing::AssertionSuccess();
739 return EqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
749template<
typename K,
typename V>
756 return testing::AssertionSuccess();
758 return EqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
768template<
typename K,
typename V>
775 return testing::AssertionSuccess();
777 return EqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
787template<
typename K,
typename V>
794 return testing::AssertionSuccess();
796 return EqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
804inline testing::AssertionResult
NotNullAreEqual(
const char* lhs_expr,
const char* rhs_expr
810 return testing::AssertionSuccess();
825inline testing::AssertionResult
NotNullAreEqual(
const char* lhs_expr,
const char* rhs_expr
831 return testing::AssertionSuccess();
833 return EqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
846 if (lhs->get_Count() != rhs->get_Count())
851 if (lhs->get_Count() == 0)
856 auto lhs_en = lhs->GetEnumerator();
857 auto rhs_en = rhs->GetEnumerator();
859 while (lhs_en->MoveNext() && rhs_en->MoveNext())
861 auto lhs_it = lhs_en->get_Current();
862 auto rhs_it = rhs_en->get_Current();
863 if (lhs_it != rhs_it)
885 return testing::AssertionSuccess();
888 return EqFailure(lhs_expr, rhs_expr, *lhs, *rhs);
898template<
typename T1,
typename T2>
900 ,
const T1& lhs,
const T2& rhs, int32_t)
902 if (lhs->Equals(rhs))
904 return ::testing::AssertionSuccess();
907 return EqFailure(lhs_expr, rhs_expr, *lhs, *rhs);
920 if (lhs->Equals(rhs))
922 return ::testing::AssertionSuccess();
925 const auto lt = lhs->GetTypeCode();
926 const auto rt = rhs->GetTypeCode();
931 return ::testing::AssertionSuccess();
936 return ::testing::AssertionSuccess();
941 return ::testing::AssertionSuccess();
943 return EqFailure(lhs_expr, rhs_expr, *lhs, *rhs);
952inline testing::AssertionResult
NotNullAreEqual(
const char* lhs_expr,
const char* rhs_expr
958 return AreBoxedValuesEqual(lhs_expr, rhs_expr, AsCast<BoxedValueBase>(lhs), AsCast<BoxedValueBase>(rhs));
971template<
typename T1,
typename T2>
987template<
typename T1,
typename T2>
988testing::AssertionResult
AreEqual(
const char* lhs_expr,
const char* rhs_expr
989 ,
const T1& lhs,
const T2& rhs)
993 return testing::AssertionSuccess();
1000 return testing::internal::EqFailure(lhs_expr, rhs_expr,
1005 return testing::internal::EqFailure(lhs_expr, rhs_expr,
1026template<
typename T1,
typename T2>
1027typename std::enable_if<TypeTraits::BothArrayOrList<typename T1::Pointee_, typename T2::Pointee_>::value
1028, testing::AssertionResult>::type
1030 ,
const T1& lhs,
const T2& rhs,
long long s)
1034 return testing::AssertionSuccess();
1036 return NotEqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
1049template<
typename T1,
typename T2>
1050typename std::enable_if<
1055 testing::AssertionResult
1057 ,
const T1& lhs,
const T2& rhs,
long long s)
1064 return testing::AssertionSuccess();
1077template<
typename K,
typename V>
1084 return testing::AssertionSuccess();
1086 return NotEqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
1096template<
typename K,
typename V>
1103 return testing::AssertionSuccess();
1105 return NotEqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
1115template<
typename T1,
typename T2>
1122 return testing::AssertionSuccess();
1124 return NotEqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
1134template<
typename T1,
typename T2>
1141 return testing::AssertionSuccess();
1143 return NotEqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
1153template<
typename T1,
typename T2>
1160 return testing::AssertionSuccess();
1162 return NotEqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
1172template<
typename K,
typename V>
1179 return testing::AssertionSuccess();
1181 return NotEqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
1191template<
typename K,
typename V>
1198 return testing::AssertionSuccess();
1200 return NotEqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
1210template<
typename K,
typename V>
1217 return testing::AssertionSuccess();
1219 return NotEqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
1229template<
typename K,
typename V>
1236 return testing::AssertionSuccess();
1238 return NotEqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
1252 return testing::AssertionSuccess();
1273 return testing::AssertionSuccess();
1275 return NotEqFailure(lhs_expr, rhs_expr, lhs->data(), rhs->data());
1291 return testing::AssertionSuccess();
1304template<
typename T1,
typename T2>
1306 ,
const T1& lhs,
const T2& rhs, int32_t)
1308 if (!lhs->Equals(rhs))
1310 return ::testing::AssertionSuccess();
1323template<
typename T1,
typename T2>
1339template<
typename T1,
typename T2>
1340testing::AssertionResult
AreNotEqual(
const char* lhs_expr,
const char* rhs_expr
1341 ,
const T1& lhs,
const T2& rhs)
1347 return testing::AssertionSuccess();
1353 return NotEqFailure(lhs_expr, rhs_expr,
"nullptr",
"nullptr");
1374template<
typename T1,
typename T2>
1375typename std::enable_if<std::numeric_limits<T1>::has_quiet_NaN && std::numeric_limits<T2>::has_quiet_NaN,
bool>::type
1376 AreFPNaN(T1 lhs, T2 rhs) {
return (std::isnan(lhs) && std::isnan(rhs)); }
1384template<
typename T1,
typename T2>
1385typename std::enable_if<!std::numeric_limits<T1>::has_quiet_NaN || !std::numeric_limits<T2>::has_quiet_NaN,
bool>::type
1398template<
typename T1,
typename T2>
1399testing::AssertionResult
AreEqual(
const char* lhs_expr,
const char* rhs_expr, T1&& lhs, T2&& rhs);
1412template <
typename T1,
typename T2>
1413typename std::enable_if<TypeTraits::AreFPandArithmetic<T1, T2>::value
1414 , testing::AssertionResult>::type
1420 return AreFPNaN(lhs, rhs) ? testing::AssertionSuccess() :
1421 testing::internal::CmpHelperFloatingPointEQ<typename TypeTraits::LargestFPType<T1, T2>::type>(lhs_expr, rhs_expr,
1434template <
typename T1,
typename T2>
1435typename std::enable_if<TypeTraits::AnyOfDecimal<T1, T2>::value
1436 , testing::AssertionResult>::type
1442 return testing::internal::
1443 EqHelper::Compare<System::Decimal, System::Decimal>
1444 (lhs_expr, rhs_expr, lhs, rhs);
1455template <
typename T>
1457 , testing::AssertionResult>::type
1463 if (lhs.Equals(rhs)) {
1464 return testing::AssertionSuccess();
1478template <
typename T>
1480 , testing::AssertionResult>::type
1487 if (lhs.Equals(rhs)) {
1488 return testing::AssertionSuccess();
1502template <
typename T>
1504 , testing::AssertionResult>::type
1511 return testing::AssertionSuccess();
1525template <
typename T>
1527 , testing::AssertionResult>::type
1533 return AreEqual(lhs_expr, rhs_expr, ObjectExt::Box<T>(lhs), rhs);
1544template <
typename T>
1546 , testing::AssertionResult>::type
1552 return AreEqual(lhs_expr, rhs_expr, lhs, ObjectExt::Box<T>(rhs));
1562inline testing::AssertionResult
AreEqualImpl(
const char* lhs_expr,
const char* rhs_expr
1563 ,
const char16_t* lhs
1578inline testing::AssertionResult
AreEqualImpl(
const char* lhs_expr,
const char* rhs_expr
1580 ,
const char16_t* rhs
1594template <
typename T>
1595testing::AssertionResult
AreEqualImpl(
const char* lhs_expr,
const char* rhs_expr
1602 return testing::AssertionSuccess();
1605 return testing::internal::EqFailure(lhs_expr, rhs_expr,
1618template <
typename T>
1619testing::AssertionResult
AreEqualImpl(
const char* lhs_expr,
const char* rhs_expr
1626 return testing::AssertionSuccess();
1629 return testing::internal::EqFailure(lhs_expr, rhs_expr,
1644template<
typename T1,
typename T2>
1649 !std::is_base_of<System::IO::Stream, typename T1::Pointee_>::value ||
1650 !std::is_base_of<System::IO::Stream, typename T2::Pointee_>::value
1652 testing::AssertionResult
1672template<
typename T1,
typename T2>
1676 std::is_base_of<System::IO::Stream, typename T1::Pointee_>::value &&
1677 std::is_base_of<System::IO::Stream, typename T2::Pointee_>::value,
1678 testing::AssertionResult
1687 return testing::AssertionSuccess();
1694 return testing::internal::EqFailure(lhs_expr, rhs_expr,
1699 return testing::internal::EqFailure(lhs_expr, rhs_expr,
1707 lhs->set_Position(0);
1708 rhs->set_Position(0);
1712 b1 = lhs->ReadByte();
1713 b2 = rhs->ReadByte();
1717 return testing::internal::EqFailure(lhs_expr, rhs_expr,
1723 }
while (b1 != -1 && b2 != -1);
1725 return testing::AssertionSuccess();
1738template <
typename T1,
typename T2>
1739typename std::enable_if<!std::is_null_pointer<T1>::value && !
IsNullable<T1>::value, testing::AssertionResult>::type
1758template <
typename T1,
typename T2>
1759typename std::enable_if<!std::is_null_pointer<T2>::value && !
IsNullable<T2>::value, testing::AssertionResult>::type
1777template<
typename T1,
typename T2>
1778testing::AssertionResult
AreEqualImpl(
const char* lhs_expr,
const char* rhs_expr, T1 lhs, T2 rhs,
int)
1780 return ::testing::internal::EqHelper::Compare(lhs_expr, rhs_expr, lhs, rhs);
1790template<
typename T1,
typename T2>
1791testing::AssertionResult
AreEqual(
const char* lhs_expr,
const char* rhs_expr, T1&& lhs, T2&& rhs)
1793 return AreEqualImpl(lhs_expr, rhs_expr, lhs, rhs, 1LL);
1805template<
typename T1,
typename T2>
1806testing::AssertionResult
AreNotEqual(
const char* lhs_expr,
const char* rhs_expr, T1&& lhs, T2&& rhs);
1818template <
typename T1,
typename T2>
1819typename std::enable_if<TypeTraits::AnyOfDecimal<T1, T2>::value
1820 , testing::AssertionResult>::type
1828 return testing::AssertionSuccess();
1842template <
typename T>
1844 , testing::AssertionResult>::type
1850 if (! lhs.Equals(rhs)) {
1851 return testing::AssertionSuccess();
1865template <
typename T>
1867 , testing::AssertionResult>::type
1873 if (!lhs.Equals(rhs)) {
1874 return testing::AssertionSuccess();
1888template <
typename T>
1890 , testing::AssertionResult>::type
1897 return testing::AssertionSuccess();
1911template <
typename T>
1912typename std::enable_if<IsBoxable<T>::value
1913 , testing::AssertionResult>::type
1919 return AreNotEqual(lhs_expr, rhs_expr, lhs, System::ObjectExt::Unbox<T>(rhs));
1930template <
typename T>
1931typename std::enable_if<IsBoxable<T>::value
1932 , testing::AssertionResult>::type
1938 return AreNotEqual(lhs_expr, rhs_expr, System::ObjectExt::Unbox<T>(lhs), rhs);
1948template <
typename T>
1956 return testing::AssertionSuccess();
1969template <
typename T>
1977 return testing::AssertionSuccess();
1992template<
typename T1,
typename T2>
1994 , testing::AssertionResult>::type
2010template<
typename T1,
typename T2>
2011testing::AssertionResult
AreNotEqualImpl(
const char* lhs_expr,
const char* rhs_expr, T1 lhs, T2 rhs,
int)
2013 return ::testing::internal::CmpHelperNE(lhs_expr, rhs_expr, lhs , rhs);
2023template<
typename T1,
typename T2>
2024testing::AssertionResult
AreNotEqual(
const char* lhs_expr,
const char* rhs_expr, T1&& lhs, T2&& rhs)
2038template<
typename T1,
typename T2>
2039testing::AssertionResult
AreSame(
const char* lhs_expr,
const char* rhs_expr,
const T1& lhs,
const T2& rhs);
2051template<
typename T1,
typename T2>
2053 , testing::AssertionResult>::type
2064 auto rhs_addr =
reinterpret_cast<std::ptrdiff_t
>(rhs.GetObjectOrNull());
2067 auto lhs_addr =
reinterpret_cast<std::ptrdiff_t
>(lhs.GetObjectOrNull());
2074 return testing::AssertionSuccess();
2079 return testing::AssertionSuccess();
2082 auto rhs_addr =
reinterpret_cast<std::ptrdiff_t
>(rhs.GetObjectOrNull());
2083 auto lhs_addr =
reinterpret_cast<std::ptrdiff_t
>(lhs.GetObjectOrNull());
2096template<
typename T1,
typename T2>
2098 , testing::AssertionResult>::type
2105 return testing::AssertionSuccess();
2107 auto rhs_addr =
reinterpret_cast<std::ptrdiff_t
>(&rhs);
2108 auto lhs_addr =
reinterpret_cast<std::ptrdiff_t
>(&lhs);
2119template<
typename T1,
typename T2>
2120testing::AssertionResult
AreSameImpl(
const char* lhs_expr,
const char* rhs_expr,
const T1& lhs,
const T2& rhs,
int)
2124 return testing::AssertionSuccess();
2127 std::ptrdiff_t lhs_addr =
reinterpret_cast<std::ptrdiff_t
>(&lhs);
2128 std::ptrdiff_t rhs_addr =
reinterpret_cast<std::ptrdiff_t
>(&rhs);
2140template<
typename T1,
typename T2>
2141testing::AssertionResult
AreSame(
const char* lhs_expr,
const char* rhs_expr,
const T1& lhs,
const T2& rhs)
2143 return AreSameImpl(lhs_expr, rhs_expr, lhs, rhs, 1LL);
2155template<
typename T1,
typename T2>
2156testing::AssertionResult
AreNotSame(
const char* lhs_expr,
const char* rhs_expr,
const T1& lhs,
const T2& rhs);
2168template<
typename T1,
typename T2>
2170 , testing::AssertionResult>::type
2179 return testing::AssertionSuccess();
2190 return testing::AssertionSuccess();
2193 auto rhs_addr =
reinterpret_cast<std::ptrdiff_t
>(rhs.GetObjectOrNull());
2194 auto lhs_addr =
reinterpret_cast<std::ptrdiff_t
>(lhs.GetObjectOrNull());
2205template<
typename T1,
typename T2>
2206testing::AssertionResult
AreNotSameImpl(
const char* lhs_expr,
const char* rhs_expr,
const T1& lhs,
const T2& rhs,
int)
2210 return testing::AssertionSuccess();
2213 std::ptrdiff_t lhs_addr =
reinterpret_cast<std::ptrdiff_t
>(&lhs);
2214 std::ptrdiff_t rhs_addr =
reinterpret_cast<std::ptrdiff_t
>(&rhs);
2226template<
typename T1,
typename T2>
2227testing::AssertionResult
AreNotSame(
const char* lhs_expr,
const char* rhs_expr,
const T1& lhs,
const T2& rhs)
2240testing::AssertionResult
IsInstanceOf(
const char* lhs_expr,
const char* rhs_expr,
const TypeInfo& typeInfo,
const T& obj)
2242 if (obj->Is(typeInfo))
2244 return ::testing::AssertionSuccess();
2247 return testing::AssertionFailure()
2248 <<
"Expected: " << rhs_expr <<
" is " << lhs_expr
2249 <<
", actual: " << obj->GetType().ToString().ToUtf8String()
2259#define ASPOSE_ASSERT_EQ(val1, val2) \
2260 ASSERT_PRED_FORMAT2(System::TestPredicates::AreEqual, val1, val2)
2265#define ASPOSE_EXPECT_EQ(val1, val2) \
2266 EXPECT_PRED_FORMAT2(System::TestPredicates::AreEqual, val1, val2)
2271#define ASPOSE_ASSERT_NE(val1, val2) \
2272 ASSERT_PRED_FORMAT2(System::TestPredicates::AreNotEqual, val1, val2)
2277#define ASPOSE_EXPECT_NE(val1, val2) \
2278 EXPECT_PRED_FORMAT2(System::TestPredicates::AreNotEqual, val1, val2)
2283#define ASPOSE_ASSERT_SAME(val1, val2) \
2284 ASSERT_PRED_FORMAT2(System::TestPredicates::AreSame, val1, val2)
2289#define ASPOSE_EXPECT_SAME(val1, val2) \
2290 EXPECT_PRED_FORMAT2(System::TestPredicates::AreSame, val1, val2)
2295#define ASPOSE_ASSERT_NS(val1, val2) \
2296 ASSERT_PRED_FORMAT2(System::TestPredicates::AreNotSame, val1, val2)
2301#define ASPOSE_EXPECT_NS(val1, val2) \
2302 EXPECT_PRED_FORMAT2(System::TestPredicates::AreNotSame, val1, val2)
2307#define ASPOSE_ASSERT_ISINSTANCEOF(val1, val2) \
2308 ASSERT_PRED_FORMAT2(System::TestPredicates::IsInstanceOf, val1, val2)
2313#define ASPOSE_EXPECT_ISINSTANCEOF(val1, val2) \
2314 EXPECT_PRED_FORMAT2(System::TestPredicates::IsInstanceOf, val1, val2)
2318#define ASPOSE_GTEST_TEST_THROW_(statement, expected_exception, exception_ref, fail) \
2319 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
2320 if (::testing::internal::ConstCharPtr gtest_msg = "") { \
2321 bool gtest_caught_expected = false; \
2323 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
2325 catch (expected_exception const& e) { \
2326 gtest_caught_expected = true; \
2327 static_assert(std::is_base_of<std::remove_pointer<decltype(exception_ref)>::type, expected_exception>::value, "Should be base class of expected exception"); \
2328 *exception_ref = e; \
2332 "Expected: " #statement " throws an exception of type " \
2333 #expected_exception ".\n Actual: it throws a different type."; \
2334 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
2336 if (!gtest_caught_expected) { \
2338 "Expected: " #statement " throws an exception of type " \
2339 #expected_exception ".\n Actual: it throws nothing."; \
2340 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
2343 GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
2344 fail(gtest_msg.value)
2350#define ASPOSE_ASSERT_THROW(statement, expected_exception, exception_ref) \
2351 ASPOSE_GTEST_TEST_THROW_(statement, expected_exception, exception_ref, GTEST_FATAL_FAILURE_);
2354#define ASPOSE_ASSERT_THROW_EXCEPTION_TYPE_(statement, expected_exception_type, fail) \
2355 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
2356 if (::testing::internal::ConstCharPtr gtest_msg = "") { \
2357 bool gtest_caught_expected = false; \
2359 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
2361 catch (const System::Exception& e) { \
2362 gtest_caught_expected = true; \
2363 if(e.Get()->GetType() != expected_exception_type)\
2366 "Actual: " #statement " throws a different type."; \
2367 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
2372 "Actual: " #statement " throws a unexpected exception type."; \
2373 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
2375 if (!gtest_caught_expected) { \
2377 "Actual: " #statement " throws nothing."; \
2378 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
2381 GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
2382 fail(gtest_msg.value)
2392#define ASPOSE_ASSERT_THROW_EXCEPTION_TYPE(statement, exceptionType) \
2393 ASPOSE_ASSERT_THROW_EXCEPTION_TYPE_(statement, exceptionType, GTEST_FATAL_FAILURE_)
Array of bits which can be addressed by index. Objects of this class should only be allocated using S...
Definition: bitarray.h:97
Forward declaration of Dictionary class.
Definition: dictionary.h:96
Forward declaration of HashSet class.
Definition: hashset.h:82
Interface of collection of elements. Objects of this class should only be allocated using System::Mak...
Definition: icollection.h:20
Pair of key and value. This type should be allocated on stack and passed to functions by value or by ...
Definition: keyvalue_pair.h:20
const TKey & get_Key() const
Gets key.
Definition: keyvalue_pair.h:40
const TValue & get_Value() const
Gets value.
Definition: keyvalue_pair.h:43
Queue class forward declaration.
Definition: queue.h:88
Sorted dictionary type forward declaration.
Definition: sorted_dictionary.h:52
Sorted list wrapping FlatMap structure. Objects of this class should only be allocated using System::...
Definition: sorted_list.h:334
Stack class forward declaration.
Definition: stack.h:87
Represents a decimal number. This type should be allocated on stack and passed to functions by value ...
Definition: decimal.h:107
Forward declaration.
Definition: nullable.h:74
T get_Value() const
Returns a copy of the value represented by the current object.
Definition: nullable.h:143
bool IsNull() const
Determines if the current object represents a null-value.
Definition: nullable.h:171
static bool IsBoxedValue(const SmartPtr< Object > &obj)
Checks if object is a boxed value.
Base class that enables using methods available for System.Object class in C#. All non-trivial classe...
Definition: object.h:62
Pointer class to wrap types being allocated on heap. Use it to manage memory for classes inheriting O...
Definition: smart_ptr.h:180
String class used across the library. Is a substitute for C# System.String when translating code....
Definition: string.h:122
std::string ToUtf8String() const
Converts string to std::string. Uses UTF-8 encoding.
Represents a particular type and provides information about it.
Definition: type_info.h:109
String ToString() const
Returns a string containing the name of the type represented by the current object.
Subclass of System::SmartPtr which sets itself to weak mode at construction. Please note that this cl...
Definition: weak_ptr.h:18
std::enable_if< TypeTraits::BothArrayOrList< typenameT1::Pointee_, typenameT2::Pointee_ >::value, testing::AssertionResult >::type NotNullAreEqualImpl(const char *lhs_expr, const char *rhs_expr, const T1 &lhs, const T2 &rhs, long long s)
Equal-compares arrays or lists.
Definition: test_predicates.h:587
testing::AssertionResult NotNullAreEqual(const char *lhs_expr, const char *rhs_expr, const SharedPtr< System::Collections::Generic::Dictionary< K, V > > &lhs, const SharedPtr< System::Collections::Generic::Dictionary< K, V > > &rhs)
Equal-compares dictionaries of value types.
Definition: test_predicates.h:636
testing::AssertionResult AreBoxedValuesEqual(const char *lhs_expr, const char *rhs_expr, const SharedPtr< BoxedValueBase > &lhs, const SharedPtr< BoxedValueBase > &rhs)
Equal-compares two Boxed types.
Definition: test_predicates.h:916
testing::AssertionResult NotNullAreNotEqual(const char *lhs_expr, const char *rhs_expr, const SharedPtr< System::Collections::Generic::Dictionary< K, V > > &lhs, const SharedPtr< System::Collections::Generic::Dictionary< K, V > > &rhs)
Not-equal-compares dictionaries of value types.
Definition: test_predicates.h:1078
std::enable_if< System::IsSmartPtr< typenameT1::value_type >::value &&System::IsSmartPtr< typenameT2::value_type >::value, bool >::type AreEqualData(const T1 &lhs, const T2 &rhs)
Equal-compares two containers using System::Object::Equals on elements. Works for SmartPtr elements.
Definition: test_predicates.h:522
testing::AssertionResult AreNotEqual(const char *lhs_expr, const char *rhs_expr, const T1 &lhs, const T2 &rhs)
Not-equal-compares arguments for AreNotEqual assertion translation.
Definition: test_predicates.h:1340
std::enable_if<!System::IsSmartPtr< typenameT1::value_type >::value &&!System::IsSmartPtr< typenameT2::value_type >::value, bool >::type AreEqualContainer(const T1 &lhs, const T2 &rhs)
Equal-compares two containers using operator == on elements. Works for non-SmartPtr elements.
Definition: test_predicates.h:490
bool NotNullAreEqualHelper(const SharedPtr< System::Collections::Generic::ICollection< T > > &lhs, const SharedPtr< System::Collections::Generic::ICollection< T > > &rhs)
Equal-compares abstract collections.
Definition: test_predicates.h:841
std::enable_if< TypeTraits::BothArrayOrList< typenameT1::Pointee_, typenameT2::Pointee_ >::value, testing::AssertionResult >::type NotNullAreNotEqualImpl(const char *lhs_expr, const char *rhs_expr, const T1 &lhs, const T2 &rhs, long long s)
Not-equal-compares arrays or lists.
Definition: test_predicates.h:1029
bool AreEqualMapOfObjects(const T &lhs, const T &rhs)
Equal-compares two maps using System::Object::Equals on elements.
Definition: test_predicates.h:564
testing::AssertionResult AreEqual(const char *lhs_expr, const char *rhs_expr, const T1 &lhs, const T2 &rhs)
Equal-compares arguments for AreEqual assertion translation.
Definition: test_predicates.h:988
std::enable_if< System::Details::HasToString< T >::value, std::string >::type PrintToStringImpl(const SharedPtr< T > &value, long long s)
Prints System::Object subclass to string using ToString() method.
Definition: test_predicates.h:180
std::enable_if_t<!TypeTraits::IsEnumerable< T >::value, std::string > PrintToString(const T &)
Prints object to string by selecting proper serializer function.
Definition: test_predicates.h:331
testing::AssertionResult NotSameFailure(const char *lhs_expr, const char *rhs_expr, T1 &lhs, T2 &rhs)
Formats 'not same' assertion failure for output.
Definition: test_predicates.h:468
testing::AssertionResult EqFailure(const char *lhs_expr, const char *rhs_expr, T1 &lhs, T2 &rhs)
Formats == assertion failure for output.
Definition: test_predicates.h:413
testing::AssertionResult SameFailure(const char *lhs_expr, const char *rhs_expr, T1 &lhs, T2 &rhs)
Formats 'same' assertion failure for output.
Definition: test_predicates.h:450
testing::AssertionResult NotEqFailure(const char *lhs_expr, const char *rhs_expr, T1 &lhs, T2 &rhs)
Formats != assertion failure for output.
Definition: test_predicates.h:432
std::is_same< T, System::Array< typename T::ValueType > > IsArray
Checks if type is a System::Array specialization. If so, value member is set to true,...
Definition: test_predicates.h:109
std::integral_constant< bool,(IsArray< T1 >::value||IsList< T1 >::value) &&(IsArray< T2 >::value||IsList< T2 >::value)> BothArrayOrList
Checks if both type arguments are arrays or lists. If so, value member is set to true,...
Definition: test_predicates.h:121
std::integral_constant< bool, std::is_same< T1, System::Decimal >::value||std::is_same< T2, System::Decimal >::value > AnyOfDecimal
Checks that at least one of type arguments is System::Decimal. If so, sets value member to true,...
Definition: test_predicates.h:45
std::is_same< T, System::Collections::Generic::List< typename T::ValueType > > IsList
Checks if type is a System::Collections::Generic::List specialization. If so, value member is set to ...
Definition: test_predicates.h:114
std::integral_constant< bool, IsEnumerable< T1 >::value &&IsEnumerable< T2 >::value > BothEnumerable
Checks if both type arguments are IEnumerable. If so, value member is set to true,...
Definition: test_predicates.h:140
std::integral_constant< bool,(std::is_floating_point< T1 >::value &&std::is_arithmetic< T2 >::value)||(std::is_arithmetic< T1 >::value &&std::is_floating_point< T2 >::value) > AreFPandArithmetic
Checks that T1 is arithmetic and T2 is floating point, or vice versa. If so, sets value member to tru...
Definition: test_predicates.h:38
std::enable_if< TypeTraits::AnyOfDecimal< T1, T2 >::value, testing::AssertionResult >::type AreNotEqualImpl(const char *lhs_expr, const char *rhs_expr, const T1 &lhs, const T2 &rhs, long long s)
Not-equal-compares values one or both of them being Decimal.
Definition: test_predicates.h:1821
std::enable_if< TypeTraits::AreFPandArithmetic< T1, T2 >::value, testing::AssertionResult >::type AreEqualImpl(const char *lhs_expr, const char *rhs_expr, const T1 lhs, const T2 rhs, long long s)
Equal-compares floating point with arithmetic types.
Definition: test_predicates.h:1415
testing::AssertionResult AreNotSame(const char *lhs_expr, const char *rhs_expr, const T1 &lhs, const T2 &rhs)
Are-not-same-compares arguments for AreSame assertion translation.
Definition: test_predicates.h:2227
testing::AssertionResult AreEqual(const char *lhs_expr, const char *rhs_expr, T1 &&lhs, T2 &&rhs)
Equal-compares arguments for AreEqual assertion translation.
Definition: test_predicates.h:1791
std::enable_if< IsSmartPtr< T1 >::value &&IsSmartPtr< T2 >::value, testing::AssertionResult >::type AreNotSameImpl(const char *lhs_expr, const char *rhs_expr, const T1 &lhs, const T2 &rhs, long long s)
Are-not-same-compares smart pointers.
Definition: test_predicates.h:2171
testing::AssertionResult IsInstanceOf(const char *lhs_expr, const char *rhs_expr, const TypeInfo &typeInfo, const T &obj)
Is-instance-of-compares arguments for IsInstanceOf assertion translation.
Definition: test_predicates.h:2240
testing::AssertionResult AreSame(const char *lhs_expr, const char *rhs_expr, const T1 &lhs, const T2 &rhs)
Are-same-compares arguments for AreSame assertion translation.
Definition: test_predicates.h:2141
std::enable_if< IsSmartPtr< T1 >::value &&IsSmartPtr< T2 >::value, testing::AssertionResult >::type AreSameImpl(const char *lhs_expr, const char *rhs_expr, const T1 &lhs, const T2 &rhs, long long s)
Are-same-compares smart pointers.
Definition: test_predicates.h:2054
testing::AssertionResult AreNotEqual(const char *lhs_expr, const char *rhs_expr, T1 &&lhs, T2 &&rhs)
Not-equal-compares arguments for AreEqual assertion translation.
Definition: test_predicates.h:2024
std::enable_if< std::numeric_limits< T1 >::has_quiet_NaN &&std::numeric_limits< T2 >::has_quiet_NaN, bool >::type AreFPNaN(T1 lhs, T2 rhs)
namespace Details
Definition: test_predicates.h:1376
Definition: db_command.h:9
void PrintTo(DateTime value, std::ostream *stream)
Prints value to ostream. Mostly used for debug.
@ Single
A floating point type representing values ranging from approximately 1.5 x 10 -45 to 3....
@ Decimal
A simple type representing values ranging from 1.0 x 10 -28 to approximately 7.9 x 10 28 with 28-29 s...
@ Double
A floating point type representing values ranging from approximately 5.0 x 10 -324 to 1....
std::enable_if_t< Details::CastType< Source, Result >::Static, Result > AsCast(const Source &value)
Casts the source type to the result type using 'as' operator cast. Used when simple constructor-like ...
Definition: object_ext.h:1099
static Decimal ToDecimal(bool value)
Converts the specified boolean value to an equivalent decimal number.
Definition: convert.h:1022
static constexpr double ToDouble(bool value)
Converts the specified boolean value to an equivalent double-precision floating-point number.
Definition: convert.h:956
static constexpr float ToSingle(bool value)
Converts the specified boolean value to an equivalent single-precision floating-point number.
Definition: convert.h:890
Template predicate that checks if boxing of the specified type is supported.
Definition: boxable_traits.h:16
A template predicate that determines if the specified type is a Exception class or its descendant.
Definition: object.h:405
A template predicate that determines if its template argument T in Nullable or its subclass.
Definition: nullable.h:23
Trait class to check if a type is a specialization of SmartPtr class.
Definition: smart_ptr.h:1499
Template magic to check if a type is a sequence of string characters.
Definition: string.h:68
static bool AreEqual(const SharedPtr< Array< T > > &arrA, const SharedPtr< Array< U > > &arrB)
Compares arrays of non-pointers.
Definition: compare.h:41
Checks if specific type is STL-style container. To do so, checks for iterator and const_iterator memb...
Definition: test_predicates.h:148
Checks if type has System::Collections::Generic::IEnumerable specialization as basetype....
Definition: test_predicates.h:127
Provides alias for longest floating point type provided. Ignores non-floating point types.
Definition: test_predicates.h:52
Checks if a type has data() method. If it does, inherits std::true_type, otherwise inherits std::fals...
Definition: test_predicates.h:92
Checks for overload of PrintTo function that accepts given type as first argument....
Definition: test_predicates.h:80
Checks whether Equals method exists in specified type. If so, inherits std::true_type,...
Definition: detail.h:137
Checks whether operator == exists in specified type. If so, inherits std::true_type,...
Definition: detail.h:122