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

📄 enumerator_sequence_unittest_.h

📁 用STL的方式封装了WindowsAPI、COM调用、ACE、ATL、MFC、WTL等多种组件
💻 H
📖 第 1 页 / 共 3 页
字号:
                                            ,   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_handle(), r))
                {
                    bSuccess = false;
                }
                if(!test_comstl_enumerator_sequence_MMCOMBSC_IEnumBSTR(module.get_handle(), r))
                {
                    bSuccess = false;
                }
                if(!test_comstl_enumerator_sequence_MMCOMBSC_IEnumVARIANT(module.get_handle(), r))
                {
                    bSuccess = false;
                }
                if(!test_comstl_enumerator_sequence_MMCOMBSC_IEnumGUID(module.get_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;
        }

        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", "enumerator_sequence", __FILE__);

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

            if(!test_comstl_enumerator_sequence_MMCOMBSC(r))
            {
                bSuccess = false;
            }

            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 + -