source: dev/branches/egtra/ab5.0/abdev/ab-test/ab-test.cpp@ 782

Last change on this file since 782 was 782, checked in by イグトランス (egtra), 13 years ago

アイコン読込のテストのコードを整理。

File size: 3.3 KB
Line 
1#include "stdafx.h"
2
3#include <cstdint>
4#include <cstring>
5
6#include <GdiPlus.h>
7
8#define BOOST_TEST_MAIN
9
10#include <boost/test/unit_test.hpp>
11
12#include <boost/preprocessor/cat.hpp>
13
14#include <Resource/Load.h>
15
16#include <res/resource.h>
17
18namespace fs = boost::filesystem;
19
20namespace abres = ActiveBasic::Resource;
21
22struct HModuleDeleter
23{
24 typedef HMODULE pointer;
25
26 void operator ()(pointer hmod) const
27 {
28 ::FreeLibrary(hmod);
29 }
30};
31
32typedef std::unique_ptr<HMODULE, HModuleDeleter> UniqueHModule;
33
34template<typename F>
35struct ScopeExitHolder
36{
37 ScopeExitHolder(F f) : f(f) {}
38
39 ~ScopeExitHolder()
40 {
41 f();
42 }
43
44private:
45 F f;
46
47 ScopeExitHolder(ScopeExitHolder const&);
48 ScopeExitHolder& operator =(ScopeExitHolder const&);
49};
50
51#define AB_SCOPE_EXIT_2(f) auto BOOST_PP_CAT(AB_SCOPE_EXIT_FUNCTION_TEMP_, __LINE__) = (f); \
52 ScopeExitHolder<decltype(BOOST_PP_CAT(AB_SCOPE_EXIT_FUNCTION_TEMP_, __LINE__))> BOOST_PP_CAT(AB_SCOPE_EXIT_FUNCTION_HOLDER_, __LINE__)_ (BOOST_PP_CAT(AB_SCOPE_EXIT_FUNCTION_TEMP_, __LINE__));
53#define AB_SCOPE_EXIT(f) AB_SCOPE_EXIT_2([&]() f)
54
55template<typename F>
56ScopeExitHolder<F> ScopeExit(F fn)
57{
58 return fn;
59}
60
61#define GET_AT(bd, y, x) (*reinterpret_cast<DWORD const*>(static_cast<BYTE const*>((bd).Scan0) + (y) * bdL.Stride + (x) * sizeof (DWORD)))
62
63bool IconEquals(HICON hiconL, HICON hiconR)
64{
65 Gdiplus::Bitmap bmpL(hiconL), bmpR(hiconR);
66
67 if (bmpL.GetWidth() == bmpR.GetWidth()
68 && bmpR.GetHeight() == bmpR.GetHeight())
69 {
70 Gdiplus::Rect rc(0, 0, bmpL.GetWidth(), bmpL.GetHeight());
71 Gdiplus::BitmapData bdL = {}, bdR = {};
72 BOOST_CHECK_EQUAL(bmpL.LockBits(&rc, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, &bdL), Gdiplus::Ok);
73 BOOST_CHECK_EQUAL(bmpR.LockBits(&rc, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, &bdR), Gdiplus::Ok);
74
75 AB_SCOPE_EXIT({bmpL.UnlockBits(&bdL);});
76 AB_SCOPE_EXIT({bmpR.UnlockBits(&bdR);});
77
78 if (bdL.Width == bdR.Width && bdL.Height == bdR.Height)
79 {
80 for (UINT i = 0; i < bdL.Height; ++i)
81 {
82 if (std::memcmp(
83 static_cast<BYTE const*>(bdL.Scan0) + i * bdL.Stride,
84 static_cast<BYTE const*>(bdR.Scan0) + i * bdR.Stride,
85 bdL.Width * sizeof (std::uint32_t)) != 0)
86 {
87 return false;
88 }
89 }
90 return true;
91 }
92 }
93 return false;
94}
95
96BOOST_AUTO_TEST_CASE( ResourceLoading )
97{
98 Gdiplus::GdiplusStartupInput gdiplusStartupInput;
99
100 ULONG_PTR gdiplusToken;
101 Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, nullptr);
102 AB_SCOPE_EXIT_2(std::bind(Gdiplus::GdiplusShutdown, gdiplusToken));
103
104 TCHAR moduleName[MAX_PATH];
105 ::GetModuleFileName(nullptr, moduleName, MAX_PATH);
106
107 auto systemDir = fs::path(moduleName).parent_path().parent_path() / "build/release/system";
108
109 UniqueHModule hmodRes(::LoadLibraryExW((systemDir / "res.dll").wstring().c_str(), nullptr, LOAD_LIBRARY_AS_DATAFILE));
110 BOOST_CHECK(hmodRes != nullptr);
111
112 auto hBasicProgramIconTarget = (HICON)LoadImage(hmodRes.get(), MAKEINTRESOURCE(IDI_BASICPROGRAM), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
113 auto hBasicProgramIcon = abres::LoadIcon(hmodRes.get(), IDI_BASICPROGRAM, 16, 16, LR_DEFAULTCOLOR);
114
115 BOOST_CHECK(hBasicProgramIconTarget != nullptr);
116 BOOST_CHECK(hBasicProgramIcon != nullptr);
117
118 BOOST_CHECK(IconEquals(hBasicProgramIconTarget, hBasicProgramIcon));
119
120}
Note: See TracBrowser for help on using the repository browser.