iutest  1.17.1.0
iutest_util_menu.hpp
[詳解]
1 //======================================================================
2 //-----------------------------------------------------------------------
13 //-----------------------------------------------------------------------
14 //======================================================================
15 #ifndef INCG_IRIS_IUTEST_UTIL_MENU_HPP_52925DE1_A4AE_4CCB_B524_8E97AA73E03D_
16 #define INCG_IRIS_IUTEST_UTIL_MENU_HPP_52925DE1_A4AE_4CCB_B524_8E97AA73E03D_
17 
18 //======================================================================
19 // include
20 #include "iutest_util_tests.hpp"
21 
22 #if defined(IUTEST_OS_WINDOWS)
23 #include <windows.h>
24 #include <map>
25 
26 namespace iuutil
27 {
28 
29 //======================================================================
30 // class
34 class TestMenu
35 {
36  typedef ::std::map<WORD, const ::iutest::TestInfo*> TestInfoMap;
37  typedef ::std::map<WORD, const ::iutest::TestCase*> TestCaseMap;
38  WORD m_nID;
39  const WORD m_nIDTop;
40  HMENU m_hRootMenu;
41  TestInfoMap m_TestInfoList;
42  TestCaseMap m_TestCaseList;
43 public:
44  explicit TestMenu(WORD nIDTop) : m_nIDTop(nIDTop), m_nID(nIDTop), m_hRootMenu(NULL) {}
45 public:
46  bool Create(HMENU hMenu)
47  {
48  if( hMenu == NULL )
49  {
50  return false;
51  }
52  if( m_hRootMenu == NULL )
53  {
54  if( !Create() )
55  {
56  return false;
57  }
58  }
59  return AppendPopup(hMenu, "TestList", m_hRootMenu);
60  }
61  bool Create()
62  {
63  // テストを列挙
64  HMENU hRoot = CreateMenu();
65  if( hRoot == NULL )
66  {
67  return false;
68  }
69 
70  Append(hRoot, "以下をすべて実行", m_nID);
71  ++m_nID;
72 
74  const int testcase_count = pUnitTest->total_test_case_count();
75  for( int i=0; i < testcase_count; ++i )
76  {
77  const ::iutest::TestCase* pTestCase = pUnitTest->GetTestCase(i);
78  const int test_count = pTestCase->total_test_count();
79  HMENU hTestCase = AppendPopup(hRoot, pTestCase->name());
80  Append(hTestCase, "以下をすべて実行", m_nID);
81 #if IUTEST_HAS_STD_EMPLACE
82  m_TestCaseList.emplace(m_nID, pTestCase);
83 #else
84  m_TestCaseList.insert( ::std::pair<WORD, const ::iutest::TestCase*>(m_nID, pTestCase) );
85 #endif
86  ++m_nID;
87  for( int j=0; j < test_count; ++j )
88  {
89  const ::iutest::TestInfo* pTestInfo = pTestCase->GetTestInfo(j);
90  Append(hTestCase, pTestInfo->name(), m_nID);
91 #if IUTEST_HAS_STD_EMPLACE
92  m_TestInfoList.emplace(m_nID, pTestInfo);
93 #else
94  m_TestInfoList.insert(::std::pair<WORD, const ::iutest::TestInfo*>(m_nID, pTestInfo));
95 #endif
96  ++m_nID;
97  }
98  }
99  m_hRootMenu = hRoot;
100  return true;
101  }
102 
103  bool OnCommand(WORD wID)
104  {
105  if( wID == m_nIDTop )
106  {
107  ::iutest::IUTEST_FLAG(filter) = "*";
108  return IUTEST_RUN_ALL_TESTS() == 0 ? true : false;
109  }
110 
111  {
112  TestInfoMap::iterator it = m_TestInfoList.find(wID);
113  if( it != m_TestInfoList.end() )
114  {
115  ::iutest::IUTEST_FLAG(filter) = TestFullName(it->second);
116  return IUTEST_RUN_ALL_TESTS() == 0 ? true : false;
117  }
118  }
119  {
120  TestCaseMap::iterator it = m_TestCaseList.find(wID);
121  if( it != m_TestCaseList.end() )
122  {
123  ::std::string filter = it->second->name();
124  filter += ".*";
125  ::iutest::IUTEST_FLAG(filter) = filter;
126  return IUTEST_RUN_ALL_TESTS() == 0 ? true : false;
127  }
128  }
129  return true;
130  }
131 
132  bool TrackPopupMenu(HWND hWnd, POINT point)
133  {
134  if ( !::TrackPopupMenu(m_hRootMenu
135  , TPM_LEFTALIGN | TPM_BOTTOMALIGN
136  , point.x, point.y
137  , 0
138  , hWnd
139  , NULL
140  ) )
141  {
142  return false;
143  }
144  return true;
145  }
146 
147 private:
148  static bool Append(HMENU hMenu, const char* lpszName, WORD nID)
149  {
150  char str[256];
151  MENUITEMINFOA mii = {0};
152  mii.cbSize = sizeof(mii);
153  mii.fMask = MIIM_ID | MIIM_TYPE;
154  mii.fType = MFT_STRING;
155  mii.dwTypeData = str;
156  mii.wID = nID;
157  strcpy_s(str, lpszName);
158  const int num = ::GetMenuItemCount(hMenu);
159  if( !::InsertMenuItemA(hMenu, num, TRUE, &mii) )
160  {
161  return false;
162  }
163  return true;
164  }
165  static bool AppendPopup(HMENU hMenu, const char* lpszName, HMENU hSubMenu)
166  {
167  char str[256];
168  MENUITEMINFOA mii = {0};
169  mii.cbSize = sizeof(mii);
170  mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_SUBMENU;
171  mii.fType = MFT_STRING;
172  mii.dwTypeData = str;
173  mii.hSubMenu = hSubMenu;
174  strcpy_s(str, lpszName);
175  const int num = ::GetMenuItemCount(hMenu);
176  if( !::InsertMenuItemA(hMenu, num, TRUE, &mii) )
177  {
178  return false;
179  }
180  return true;
181  }
182  static HMENU AppendPopup(HMENU hMenu, const char* lpszName)
183  {
184  HMENU hSubMenu = CreateMenu();
185  if( !AppendPopup(hMenu, lpszName, hSubMenu) )
186  {
187  DestroyMenu(hSubMenu);
188  return NULL;
189  }
190  return hSubMenu;
191  }
192 };
193 
194 } // end of namespace iuutil
195 
196 #endif
197 
198 #endif // INCG_IRIS_IUTEST_MENU_TESTS_HPP_52925DE1_A4AE_4CCB_B524_8E97AA73E03D_
iutest::UnitTest::GetInstance
static UnitTest * GetInstance()
UnitTest インスタンスの取得
Definition: iutest_core.hpp:41
iutest_config.hpp
iris unit test config
iutest::UnitTest
テスト全体の管理者
Definition: iutest_core.hpp:33
iutest::UnitTest::total_test_case_count
int total_test_case_count() const
Definition: iutest_core.hpp:89
IUTEST_FLAG
#define IUTEST_FLAG(name)
フラグセット
Definition: iutest_env.hpp:55
iutest::UnitTest::GetTestCase
const TestCase * GetTestCase(int index) const
Definition: iutest_core.hpp:113
iuutil
iutest utility namespace
Definition: iutest_util.hpp:33
iuutil::TestFullName
inline ::std::string TestFullName(const ::iutest::TestInfo *test_info)
テスト名を取得
Definition: iutest_util_tests.hpp:30
iutest::TestCase::total_test_count
int total_test_count() const IUTEST_CXX_NOEXCEPT_SPEC
Definition: iutest_case.hpp:76
iutest_util_tests.hpp
iris unit test テスト情報 utility ファイル
IUTEST_RUN_ALL_TESTS
#define IUTEST_RUN_ALL_TESTS()
すべてのテストを実行する
Definition: iutest.hpp:154