⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 enumerator_sequence_unittest_.h

📁 新版本TR1的stl
💻 H
📖 第 1 页 / 共 2 页
字号:

							{ for(size_t i = 0; i < STLSOFT_NUM_ELEMENTS(guids); ++i)
							{
								if(en.end() == b)
								{
									r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
									bSuccess = false;
								}
								else
								{
									if(*b != guids[i])
									{
										r->report("Enumerator sequence element contains the wrong value", __LINE__);
										bSuccess = false;
									}

									++b;
								}
							}}

							if(en.end() != b)
							{
								r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
								bSuccess = false;
							}
						}
					}}
				}

				// 4. cloneable_cloning_policy with copying
				{
					r->report("cloneable_cloning_policy with copying", -1, NULL);

					typedef enumerator_sequence<IEnumGUID
											,	GUID
											,	GUID_policy
											,	GUID
											,	cloneable_cloning_policy<IEnumGUID>
											,	10
											>			enumerator_t;

					{ for(cs_size_t q = 0; q < enumerator_t::retrievalQuanta; ++q)
					{
						LPENUMGUID	  lpenStr;

						hr = punkEnum->QueryInterface(IID_IEnumGUID_(), reinterpret_cast<void**>(&lpenStr));

						if(FAILED(hr))
						{
							r->report("Failed to retrieve required enumerator interface from enumerator object", __LINE__);
							bSuccess = false;
						}
						else
						{
							enumerator_t			en(lpenStr, false, q); // Eat the reference
							char					msg[101];

							::sprintf(&msg[0], "Enumerating GUIDs using IEnumGUID; quanta=%u", q);

							r->report(msg, -1, NULL);

							enumerator_t::iterator	b	=	en.begin();
							enumerator_t::iterator	e	=	en.end();

							{ for(size_t i = 0; i < STLSOFT_NUM_ELEMENTS(guids); ++i)
							{
								enumerator_t::iterator	b2	=	b;

								b = b2;

								if(en.end() == b)
								{
									r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
									bSuccess = false;
								}
								else
								{
									if(*b != guids[i])
									{
										r->report("Enumerator sequence element contains the wrong value", __LINE__);
										bSuccess = false;
									}

									b2	=	b;
									++b2;
									b	=	b2;
								}
							}}

							if(en.end() != b)
							{
								r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
								bSuccess = false;
							}
						}
					}}
				}

				// 5. forward_cloning_policy with copying
				{
					r->report("forward_cloning_policy with copying", -1, NULL);

					typedef enumerator_sequence<IEnumGUID
											,	GUID
											,	GUID_policy
											,	GUID
											,	forward_cloning_policy<IEnumGUID>
											,	10
											>			enumerator_t;

					{ for(cs_size_t q = 0; q < enumerator_t::retrievalQuanta; ++q)
					{
						LPENUMGUID	  lpenStr;

						hr = punkEnum->QueryInterface(IID_IEnumGUID_(), reinterpret_cast<void**>(&lpenStr));

						if(FAILED(hr))
						{
							r->report("Failed to retrieve required enumerator interface from enumerator object", __LINE__);
							bSuccess = false;
						}
						else
						{
							enumerator_t			en(lpenStr, false, q); // Eat the reference
							char					msg[101];

							::sprintf(&msg[0], "Enumerating GUIDs using IEnumGUID; quanta=%u", q);

							r->report(msg, -1, NULL);

							enumerator_t::iterator	b	=	en.begin();
							enumerator_t::iterator	e	=	en.end();

							{ for(size_t i = 0; i < STLSOFT_NUM_ELEMENTS(guids); ++i)
							{
								enumerator_t::iterator	b2	=	b;

								b = b2;

								if(en.end() == b)
								{
									r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
									bSuccess = false;
								}
								else
								{
									if(*b != guids[i])
									{
										r->report("Enumerator sequence element contains the wrong value", __LINE__);
										bSuccess = false;
									}

									b2	=	b;
									++b2;
									b	=	b2;
								}
							}}

							if(en.end() != b)
							{
								r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
								bSuccess = false;
							}
						}
					}}
				}

				// 6. forward_cloning_policy with comparison
				{
					r->report("forward_cloning_policy with comparison", -1, NULL);

					typedef enumerator_sequence<IEnumGUID
											,	GUID
											,	GUID_policy
											,	GUID
											,	forward_cloning_policy<IEnumGUID>
											,	10
											>			enumerator_t;

					{ for(cs_size_t q = 0; q < enumerator_t::retrievalQuanta; ++q)
					{
						LPENUMGUID	  lpenStr;

						hr = punkEnum->QueryInterface(IID_IEnumGUID_(), reinterpret_cast<void**>(&lpenStr));

						if(FAILED(hr))
						{
							r->report("Failed to retrieve required enumerator interface from enumerator object", __LINE__);
							bSuccess = false;
						}
						else
						{
							enumerator_t			en(lpenStr, false, q); // Eat the reference
							char					msg[101];

							::sprintf(&msg[0], "Enumerating GUIDs using IEnumGUID; quanta=%u", q);

							r->report(msg, -1, NULL);

							enumerator_t::iterator	b1	=	en.begin();
							enumerator_t::iterator	e1	=	en.end();
							enumerator_t::iterator	b2	=	en.begin();
							enumerator_t::iterator	e2	=	en.end();

							{ for(size_t i = 0; i < STLSOFT_NUM_ELEMENTS(guids); ++i)
							{
								if(b1 != b2)
								{
									r->report("iterators do not follow forward requirements: b1 != b2", __LINE__);
									bSuccess = false;
								}
								if(*b1 != *b2)
								{
									r->report("iterators do not follow forward requirements: *b1 != *b2", __LINE__);
									bSuccess = false;
								}

								if(en.end() == b1)
								{
									r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
									bSuccess = false;
								}
								else
								{
									if(*b1 != guids[i])
									{
										r->report("Enumerator sequence element contains the wrong value", __LINE__);
										bSuccess = false;
									}

									++b1;
									++b2;
								}
							}}

							if(en.end() != b1)
							{
								r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
								bSuccess = false;
							}
							if(en.end() != b2)
							{
								r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
								bSuccess = false;
							}
						}
					}}
				}

				punkEnum->Release();
			}

			return bSuccess;
		}

		ss_bool_t test_comstl_enumerator_sequence_MMCOMBSC_IEnumBSTR(HINSTANCE hinst, unittest_reporter *r)
		{
			using namespace Synesis_COM;

			BSTR	bstrs[23] =
			{
					::SysAllocString(L"BSTR-01")
				,	::SysAllocString(L"BSTR-02")
				,	::SysAllocString(L"BSTR-03")
				,	::SysAllocString(L"BSTR-04")
				,	::SysAllocString(L"BSTR-05")
				,	::SysAllocString(L"BSTR-06")
				,	::SysAllocString(L"BSTR-07")
				,	::SysAllocString(L"BSTR-08")
				,	::SysAllocString(L"BSTR-09")
				,	::SysAllocString(L"BSTR-10")
				,	::SysAllocString(L"BSTR-11")
				,	::SysAllocString(L"BSTR-12")
				,	::SysAllocString(L"BSTR-13")
				,	::SysAllocString(L"BSTR-14")
				,	::SysAllocString(L"BSTR-15")
				,	::SysAllocString(L"BSTR-16")
				,	::SysAllocString(L"BSTR-17")
				,	::SysAllocString(L"BSTR-18")
				,	::SysAllocString(L"BSTR-19")
				,	::SysAllocString(L"BSTR-20")
				,	::SysAllocString(L"BSTR-21")
				,	::SysAllocString(L"BSTR-22")
				,	::SysAllocString(L"BSTR-23")
			};

			ss_bool_t				bSuccess	=	true;
			LPUNKNOWN				punkEnum	=	NULL;
			HRESULT 				hr			=	winstl::dl_call<HRESULT>(hinst, winstl::fn_desc<STLSOFT_STDCALL_VALUE>(MAKEINTRESOURCE(147)), bstrs, STLSOFT_NUM_ELEMENTS(bstrs), reinterpret_cast<void**>(&punkEnum));

			if(FAILED(hr))
			{
				r->report("Failed to create BSTR enumerator from Synesis COM server");
				bSuccess = false;
			}
			else
			{
				typedef enumerator_sequence<IEnumBSTR
										,	BSTR
										,	BSTR_policy
										>			enumerator_t;

				{ for(cs_size_t q = 0; q < enumerator_t::retrievalQuanta; ++q)
				{
					LPENUMBSTR	lpenStr;

					hr = punkEnum->QueryInterface(IID_IEnumBSTR_(), reinterpret_cast<void**>(&lpenStr));

					if(FAILED(hr))
					{
						r->report("Failed to retrieve required enumerator interface from enumerator object", __LINE__);
						bSuccess = false;
					}
					else
					{
						enumerator_t			en(lpenStr, false, q); // Eat the reference
						char					msg[101];

						::sprintf(&msg[0], "Enumerating BSTRs using IEnumBSTR; quanta=%u", q);

						r->report(msg, -1, NULL);

						enumerator_t::iterator	b	=	en.begin();
						enumerator_t::iterator	e	=	en.end();

						{ for(size_t i = 0; i < STLSOFT_NUM_ELEMENTS(bstrs); ++i)
						{
							if(en.end() == b)
							{
								r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
								bSuccess = false;
							}
							else
							{
								if(0 != ::wcscmp(*b, bstrs[i]))
								{
									r->report("Enumerator sequence element contains the wrong value", __LINE__);
									bSuccess = false;
								}

								++b;
							}
						}}

						if(en.end() != b)
						{
							r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
							bSuccess = false;
						}
					}
				}}

				punkEnum->Release();
			}

			{ for(size_t i = 0; i < STLSOFT_NUM_ELEMENTS(bstrs); ++i)
			{
				::SysFreeString(bstrs[i]);
			}}

			return bSuccess;
		}

		ss_bool_t test_comstl_enumerator_sequence_MMCOMBSC_IEnumVARIANT(HINSTANCE hinst, unittest_reporter *r)
		{
			using namespace Synesis_COM;

			VARIANT variants[3];

			::VariantInit(&variants[0]);
			::VariantInit(&variants[1]);
			::VariantInit(&variants[2]);

			variants[0].vt		=	VT_I4;
			variants[0].lVal	=	123456;
			variants[1].vt		=	VT_BSTR;
			variants[1].bstrVal =	::SysAllocString(L"a BSTR instance");
			variants[2].vt		=	VT_EMPTY;

			ss_bool_t				bSuccess	=	true;
			LPUNKNOWN				punkEnum	=	NULL;
			HRESULT 				hr			=	winstl::dl_call<HRESULT>(hinst, winstl::fn_desc<STLSOFT_STDCALL_VALUE>(MAKEINTRESOURCE(158)), variants, STLSOFT_NUM_ELEMENTS(variants), reinterpret_cast<void**>(&punkEnum));

			if(FAILED(hr))
			{
				r->report("Failed to create VARIANT enumerator from Synesis COM server");
				bSuccess = false;
			}
			else
			{
				typedef enumerator_sequence<IEnumVARIANT
										,	VARIANT
										,	VARIANT_policy
										,	VARIANT const&
										,	input_cloning_policy<IEnumVARIANT>
										,	1
										>			enumerator_t;

				{ for(cs_size_t q = 0; q < enumerator_t::retrievalQuanta; ++q)
				{
					LPENUMVARIANT	lpenStr;

					hr = punkEnum->QueryInterface(IID_IEnumVARIANT, reinterpret_cast<void**>(&lpenStr));

					if(FAILED(hr))
					{
						r->report("Failed to retrieve required enumerator interface from enumerator object", __LINE__);
						bSuccess = false;
					}
					else
					{
						enumerator_t			en(lpenStr, false, q); // Eat the reference
						char					msg[101];

						::sprintf(&msg[0], "Enumerating VARIANTs using IEnumVARIANT; quanta=%u", q);

						r->report(msg, -1, NULL);

						enumerator_t::iterator	b	=	en.begin();
						enumerator_t::iterator	e	=	en.end();

						{ for(size_t i = 0; i < STLSOFT_NUM_ELEMENTS(variants); ++i)
						{
							if(en.end() == b)
							{
								r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
								bSuccess = false;
							}
							else
							{
//								b->wReserved1	=	0;

								if((*b).vt != variants[i].vt)
								{
									r->report("Enumerator sequence element contains the wrong value", __LINE__);
									bSuccess = false;
								}

								++b;
							}
						}}

						if(en.end() != b)
						{
							r->report("Enumerator sequence contains the wrong number of elements", __LINE__);
							bSuccess = false;
						}
					}
				}}

				punkEnum->Release();
			}

			{ for(size_t i = 0; i < STLSOFT_NUM_ELEMENTS(variants); ++i)
			{
				::VariantClear(&variants[0]);
			}}

			return bSuccess;
		}

		ss_bool_t test_comstl_enumerator_sequence_MMCOMBSC(unittest_reporter *r)
		{
			using namespace Synesis_COM;

			ss_bool_t	bSuccess	=	true;

			r->report("Loading Synesis COM server ...", -1, NULL);

			try
			{
				winstl::module	module("MMCOMBSC");

				if(!test_comstl_enumerator_sequence_MMCOMBSC_IEnumString(module.get_module_handle(), r))
				{
					bSuccess = false;
				}
				if(!test_comstl_enumerator_sequence_MMCOMBSC_IEnumBSTR(module.get_module_handle(), r))
				{
					bSuccess = false;
				}
				if(!test_comstl_enumerator_sequence_MMCOMBSC_IEnumVARIANT(module.get_module_handle(), r))
				{
					bSuccess = false;
				}
				if(!test_comstl_enumerator_sequence_MMCOMBSC_IEnumGUID(module.get_module_handle(), r))
				{
					bSuccess = false;
				}
			}
			catch(winstl::missing_entry_point_exception &)
			{
				r->report("Entry point not located in Synesis COM server", __LINE__);
				bSuccess = false;
			}
			catch(winstl::windows_exception &)
			{
				r->report("Cannot load Synesis COM server, so skipping this test", -1, NULL);
			}

			return bSuccess;
		}
#endif /* compiler */

		ss_bool_t test_comstl_enumerator_sequence(unittest_reporter *r)
		{
			using stlsoft::unittest::unittest_initialiser;

			ss_bool_t				bSuccess	=	true;

			unittest_initialiser	init(r, "COMSTL", "collections/enumerator_sequence", __FILE__);

#if !defined(STLSOFT_COMPILER_IS_DMC)
			if(!test_comstl_enumerator_sequence_recls_COM(r))
			{
				bSuccess = false;
			}
#endif /* compiler */

#if !defined(STLSOFT_COMPILER_IS_COMO) // dl_call gives como an ICE
			if(!test_comstl_enumerator_sequence_MMCOMBSC(r))
			{
				bSuccess = false;
			}
#endif /* compiler */

			return bSuccess;
		}

		unittest_registrar	  unittest_comstl_enumerator_sequence(test_comstl_enumerator_sequence);
	} // anonymous namespace

} // namespace unittest

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -