📄 enumerator_sequence_unittest_.h
字号:
{ 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 + -