aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-06-04 14:23:20 -0500
committerSean Hall <r.sean.hall@gmail.com>2021-06-04 14:57:11 -0500
commit1d3bd04d4aca82979b08a955dc0bf61eb80f2e66 (patch)
tree2d8c998916fcf4991b33dab114d29fd44b02839b
parent1f85dac530dee933457e99438fd1c82485a2a48e (diff)
downloadwix-1d3bd04d4aca82979b08a955dc0bf61eb80f2e66.tar.gz
wix-1d3bd04d4aca82979b08a955dc0bf61eb80f2e66.tar.bz2
wix-1d3bd04d4aca82979b08a955dc0bf61eb80f2e66.zip
Add a manual test bundle for testing BAFunctions and thmutil.
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp432
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.def6
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.vcxproj64
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/precomp.cpp46
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/precomp.h40
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128.pngbin0 -> 1484 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_focus.pngbin0 -> 1420 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_hover.pngbin0 -> 2312 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_selected.pngbin0 -> 1863 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/16x16.pngbin0 -> 206 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256.pngbin0 -> 3208 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_focus.pngbin0 -> 3698 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_hover.pngbin0 -> 5171 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_selected.pngbin0 -> 5458 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/32x32.pngbin0 -> 243 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64.pngbin0 -> 372 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_focus.pngbin0 -> 330 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_hover.pngbin0 -> 328 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_selected.pngbin0 -> 327 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/BafThmUtilTestingTheme.xml137
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/progressbar.bmpbin0 -> 66 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/progressbar_reverse.bmpbin0 -> 66 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_opaque.bmpbin0 -> 262198 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_transparent.bmpbin0 -> 262198 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_transparent.pngbin0 -> 1663 bytes
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/theme/theme.rc20
-rw-r--r--src/test/burn/TestData/Manual/BundleA/BundleA.wixproj18
-rw-r--r--src/test/burn/TestData/Manual/BundleA/BundleA.wxs13
-rw-r--r--src/test/burn/TestData/Manual/PackageA/PackageA.wixproj9
29 files changed, 785 insertions, 0 deletions
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp b/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp
new file mode 100644
index 00000000..8b49cab6
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp
@@ -0,0 +1,432 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4#include "BalBaseBAFunctions.h"
5#include "BalBaseBAFunctionsProc.h"
6
7static const LPCWSTR BAFTHMUTILTESTING_WINDOW_CLASS = L"BafThmUtilTesting";
8
9enum BAFTHMUTILTESTING_CONTROL
10{
11 BAFTHMUTILTESTING_CONTROL_LISTVIEW_TOP_LEFT = THEME_FIRST_ASSIGN_CONTROL_ID,
12 BAFTHMUTILTESTING_CONTROL_LISTVIEW_TOP_RIGHT,
13 BAFTHMUTILTESTING_CONTROL_LISTVIEW_BOTTOM_LEFT,
14 BAFTHMUTILTESTING_CONTROL_LISTVIEW_BOTTOM_RIGHT,
15 BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_STANDARD,
16 BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_IMAGE,
17};
18
19static THEME_ASSIGN_CONTROL_ID vrgInitControls[] = {
20 { BAFTHMUTILTESTING_CONTROL_LISTVIEW_TOP_LEFT, L"ListViewTopLeft" },
21 { BAFTHMUTILTESTING_CONTROL_LISTVIEW_TOP_RIGHT, L"ListViewTopRight" },
22 { BAFTHMUTILTESTING_CONTROL_LISTVIEW_BOTTOM_LEFT, L"ListViewBottomLeft" },
23 { BAFTHMUTILTESTING_CONTROL_LISTVIEW_BOTTOM_RIGHT, L"ListViewBottomRight" },
24 { BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_IMAGE, L"ImageProgressBar" },
25 { BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_STANDARD, L"StandardProgressBar" },
26};
27
28static void CALLBACK BafThmUtilTestingTraceError(
29 __in_z LPCSTR szFile,
30 __in int iLine,
31 __in REPORT_LEVEL rl,
32 __in UINT source,
33 __in HRESULT hrError,
34 __in_z __format_string LPCSTR szFormat,
35 __in va_list args
36 );
37
38class CBafThmUtilTesting : public CBalBaseBAFunctions
39{
40public: // IBAFunctions
41 /*virtual STDMETHODIMP OnThemeLoaded(
42 THEME* pTheme,
43 WIX_LOCALIZATION* pWixLoc
44 )
45 {
46 HRESULT hr = S_OK;
47
48 hr = __super::OnThemeLoaded(pTheme, pWixLoc);
49
50 return hr;
51 }*/
52
53 virtual STDMETHODIMP WndProc(
54 __in THEME* pTheme,
55 __in HWND hWnd,
56 __in UINT uMsg,
57 __in WPARAM wParam,
58 __in LPARAM lParam,
59 __inout LRESULT* plRes
60 )
61 {
62 HRESULT hr = S_OK;
63
64 __super::WndProc(pTheme, hWnd, uMsg, wParam, lParam, plRes);
65
66 // Show our window when any button is clicked.
67 switch (uMsg)
68 {
69 case WM_COMMAND:
70 switch (HIWORD(wParam))
71 {
72 case BN_CLICKED:
73 OnShowTheme();
74 break;
75 }
76 break;
77 }
78
79 return hr;
80 }
81
82private:
83 HRESULT OnShowTheme()
84 {
85 HRESULT hr = S_OK;
86 BOOL fRet = FALSE;
87 MSG msg = { };
88
89 hr = ThemeLoadFromResource(m_hModule, MAKEINTRESOURCEA(1), &m_pBafTheme);
90 BalExitOnFailure(hr, "Failed to load BafThmUtilTesting theme.");
91
92 hr = CreateTestingWindow();
93 BalExitOnFailure(hr, "Failed to create BafThmUtilTesting window.");
94
95 ::EnableWindow(m_pTheme->hwndParent, FALSE);
96
97 // message pump
98 while (0 != (fRet = ::GetMessageW(&msg, NULL, 0, 0)))
99 {
100 if (-1 == fRet)
101 {
102 hr = E_UNEXPECTED;
103 BalExitOnFailure(hr, "Unexpected return value from message pump.");
104 }
105 else if (!ThemeHandleKeyboardMessage(m_pBafTheme, msg.hwnd, &msg))
106 {
107 ::TranslateMessage(&msg);
108 ::DispatchMessageW(&msg);
109 }
110 }
111
112 LExit:
113 ::EnableWindow(m_pTheme->hwndParent, TRUE);
114
115 DestroyTestingWindow();
116
117 ReleaseTheme(m_pBafTheme);
118
119 return hr;
120 }
121
122 HRESULT CreateTestingWindow()
123 {
124 HRESULT hr = S_OK;
125 HICON hIcon = reinterpret_cast<HICON>(m_pTheme->hIcon);
126 WNDCLASSW wc = { };
127 int x = CW_USEDEFAULT;
128 int y = CW_USEDEFAULT;
129 POINT ptCursor = { };
130
131 // If the theme did not provide an icon, try using the icon from the bundle engine.
132 if (!hIcon)
133 {
134 HMODULE hBootstrapperEngine = ::GetModuleHandleW(NULL);
135 if (hBootstrapperEngine)
136 {
137 hIcon = ::LoadIconW(hBootstrapperEngine, MAKEINTRESOURCEW(1));
138 }
139 }
140
141 // Register the window class and create the window.
142 wc.lpfnWndProc = CBafThmUtilTesting::TestingWndProc;
143 wc.hInstance = m_hModule;
144 wc.hIcon = hIcon;
145 wc.hCursor = ::LoadCursorW(NULL, (LPCWSTR)IDC_ARROW);
146 wc.hbrBackground = m_pTheme->rgFonts[m_pBafTheme->dwFontId].hBackground;
147 wc.lpszMenuName = NULL;
148 wc.lpszClassName = BAFTHMUTILTESTING_WINDOW_CLASS;
149 if (!::RegisterClassW(&wc))
150 {
151 ExitWithLastError(hr, "Failed to register window.");
152 }
153
154 m_fRegistered = TRUE;
155
156 // Center the window on the monitor with the mouse.
157 if (::GetCursorPos(&ptCursor))
158 {
159 x = ptCursor.x;
160 y = ptCursor.y;
161 }
162
163 hr = ThemeCreateParentWindow(m_pBafTheme, 0, wc.lpszClassName, m_pBafTheme->sczCaption, m_pBafTheme->dwStyle, x, y, m_pTheme->hwndParent, m_hModule, this, THEME_WINDOW_INITIAL_POSITION_CENTER_MONITOR_FROM_COORDINATES, &m_hWndBaf);
164 ExitOnFailure(hr, "Failed to create window.");
165
166 hr = S_OK;
167
168 LExit:
169 return hr;
170 }
171
172 void DestroyTestingWindow()
173 {
174 if (::IsWindow(m_hWndBaf))
175 {
176 ::DestroyWindow(m_hWndBaf);
177 m_hWndBaf = NULL;
178 }
179
180 if (m_fRegistered)
181 {
182 ::UnregisterClassW(BAFTHMUTILTESTING_WINDOW_CLASS, m_hModule);
183 m_fRegistered = FALSE;
184 }
185 }
186
187 static LRESULT CALLBACK TestingWndProc(
188 __in HWND hWnd,
189 __in UINT uMsg,
190 __in WPARAM wParam,
191 __in LPARAM lParam
192 )
193 {
194#pragma warning(suppress:4312)
195 CBafThmUtilTesting* pBaf = reinterpret_cast<CBafThmUtilTesting*>(::GetWindowLongPtrW(hWnd, GWLP_USERDATA));
196
197 switch (uMsg)
198 {
199 case WM_NCCREATE:
200 {
201 LPCREATESTRUCT lpcs = reinterpret_cast<LPCREATESTRUCT>(lParam);
202 pBaf = reinterpret_cast<CBafThmUtilTesting*>(lpcs->lpCreateParams);
203#pragma warning(suppress:4244)
204 ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pBaf));
205 break;
206 }
207
208 case WM_CLOSE:
209 if (pBaf)
210 {
211 ::EnableWindow(pBaf->m_pTheme->hwndParent, TRUE);
212 }
213
214 break;
215
216 case WM_NCDESTROY:
217 {
218 LRESULT lres = ThemeDefWindowProc(pBaf ? pBaf->m_pBafTheme : NULL, hWnd, uMsg, wParam, lParam);
219 ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, 0);
220
221 ::PostQuitMessage(0);
222 return lres;
223 }
224
225 case WM_CREATE:
226 if (!pBaf->OnCreate(hWnd))
227 {
228 return -1;
229 }
230 break;
231
232 case WM_TIMER:
233 if (!lParam && pBaf)
234 {
235 pBaf->UpdateProgressBarProgress();
236
237 return 0;
238 }
239 break;
240 }
241
242 return ThemeDefWindowProc(pBaf ? pBaf->m_pBafTheme : NULL, hWnd, uMsg, wParam, lParam);
243 }
244
245 BOOL OnCreate(
246 __in HWND hWnd
247 )
248 {
249 HRESULT hr = S_OK;
250 LVITEMW lvitem = { };
251 LVGROUP lvgroup = { };
252 static UINT puColumns[] = { 0, 1, 2 };
253 HWND hwndTopLeft = NULL;
254 HWND hwndTopRight = NULL;
255 HWND hwndBottomLeft = NULL;
256 HWND hwndBottomRight = NULL;
257
258 hr = ThemeLoadControls(m_pBafTheme, vrgInitControls, countof(vrgInitControls));
259 BalExitOnFailure(hr, "Failed to load theme controls.");
260
261 hwndTopLeft = ::GetDlgItem(m_pBafTheme->hwndParent, BAFTHMUTILTESTING_CONTROL_LISTVIEW_TOP_LEFT);
262 BalExitOnNull(hwndTopLeft, hr, E_INVALIDSTATE, "Failed to get top left list view hWnd.");
263
264 hwndTopRight = ::GetDlgItem(m_pBafTheme->hwndParent, BAFTHMUTILTESTING_CONTROL_LISTVIEW_TOP_RIGHT);
265 BalExitOnNull(hwndTopRight, hr, E_INVALIDSTATE, "Failed to get top right list view hWnd.");
266
267 hwndBottomLeft = ::GetDlgItem(m_pBafTheme->hwndParent, BAFTHMUTILTESTING_CONTROL_LISTVIEW_BOTTOM_LEFT);
268 BalExitOnNull(hwndBottomLeft, hr, E_INVALIDSTATE, "Failed to get bottom left list view hWnd.");
269
270 hwndBottomRight = ::GetDlgItem(m_pBafTheme->hwndParent, BAFTHMUTILTESTING_CONTROL_LISTVIEW_BOTTOM_RIGHT);
271 BalExitOnNull(hwndBottomRight, hr, E_INVALIDSTATE, "Failed to get bottom right list view hWnd.");
272
273 lvgroup.cbSize = sizeof(LVGROUP);
274 lvgroup.mask = LVGF_GROUPID | LVGF_TITLEIMAGE | LVGF_DESCRIPTIONTOP | LVGF_HEADER;
275
276 for (int i = 0; i < 3; ++i)
277 {
278 lvgroup.iGroupId = i;
279 lvgroup.iTitleImage = i;
280
281 hr = StrAllocFormatted(&lvgroup.pszDescriptionTop, L"DescriptionTop_%d", i);
282 BalExitOnFailure(hr, "Failed to alloc list view group description.");
283
284 hr = StrAllocFormatted(&lvgroup.pszHeader, L"Header_%d", i);
285 BalExitOnFailure(hr, "Failed to alloc list view group header.");
286
287 ListView_InsertGroup(hwndTopLeft, -1, &lvgroup);
288 ListView_InsertGroup(hwndTopRight, -1, &lvgroup);
289 ListView_InsertGroup(hwndBottomLeft, -1, &lvgroup);
290 ListView_InsertGroup(hwndBottomRight, -1, &lvgroup);
291
292 lvitem.mask = LVIF_COLUMNS | LVIF_GROUPID | LVIF_IMAGE | LVIF_TEXT;
293 lvitem.iItem = i;
294 lvitem.iSubItem = 0;
295
296 hr = StrAllocFormatted(&lvitem.pszText, L"ListViewItem_%d", i);
297 BalExitOnFailure(hr, "Failed to alloc list view item text.");
298
299 lvitem.iImage = i;
300 lvitem.iGroupId = i;
301 lvitem.cColumns = countof(puColumns);
302 lvitem.puColumns = puColumns;
303
304 ListView_InsertItem(hwndTopLeft, &lvitem);
305 ListView_InsertItem(hwndTopRight, &lvitem);
306 ListView_InsertItem(hwndBottomLeft, &lvitem);
307 ListView_InsertItem(hwndBottomRight, &lvitem);
308
309 for (int j = 0; j < 3; ++j)
310 {
311 lvitem.mask = LVIF_TEXT;
312 lvitem.iSubItem = j + 1;
313
314 hr = StrAllocFormatted(&lvitem.pszText, L"%d_%d", j, i);
315 BalExitOnFailure(hr, "Failed to alloc list view subitem text.");
316
317 ListView_InsertItem(hwndTopLeft, &lvitem);
318 ListView_InsertItem(hwndTopRight, &lvitem);
319 ListView_InsertItem(hwndBottomLeft, &lvitem);
320 ListView_InsertItem(hwndBottomRight, &lvitem);
321 }
322 }
323
324 ListView_EnableGroupView(hwndTopRight, TRUE);
325
326 ::SetTimer(hWnd, BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_IMAGE, 500, NULL);
327
328 LExit:
329 ReleaseStr(lvgroup.pszDescriptionTop);
330 ReleaseStr(lvgroup.pszHeader);
331 ReleaseStr(lvitem.pszText);
332
333 return SUCCEEDED(hr);
334 }
335
336 void UpdateProgressBarProgress()
337 {
338 static DWORD dwProgress = 0;
339 DWORD dwCurrent = dwProgress < 100 ? dwProgress : 200 - dwProgress;
340
341 if (0 == dwProgress || 100 == dwProgress)
342 {
343 ThemeSetProgressControlColor(m_pBafTheme, BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_IMAGE, 100 == dwProgress ? 1 : 0);
344 }
345
346 dwProgress = (dwProgress + 10) % 200;
347
348 ThemeSetProgressControl(m_pBafTheme, BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_IMAGE, dwCurrent);
349 ThemeSetProgressControl(m_pBafTheme, BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_STANDARD, dwCurrent);
350 }
351
352public:
353 //
354 // Constructor - initialize member variables.
355 //
356 CBafThmUtilTesting(
357 __in HMODULE hModule,
358 __in IBootstrapperEngine* pEngine,
359 __in const BA_FUNCTIONS_CREATE_ARGS* pArgs
360 ) : CBalBaseBAFunctions(hModule, pEngine, pArgs)
361 {
362 m_pBafTheme = NULL;
363 m_fRegistered = FALSE;
364 m_hWndBaf = NULL;
365
366 ThemeInitialize(hModule);
367 }
368
369 //
370 // Destructor - release member variables.
371 //
372 ~CBafThmUtilTesting()
373 {
374 Assert(!::IsWindow(m_hWndBaf));
375 Assert(!m_pBafTheme);
376
377 ThemeUninitialize();
378 }
379
380private:
381 THEME* m_pBafTheme;
382 BOOL m_fRegistered;
383 HWND m_hWndBaf;
384};
385
386
387HRESULT WINAPI CreateBAFunctions(
388 __in HMODULE hModule,
389 __in const BA_FUNCTIONS_CREATE_ARGS* pArgs,
390 __inout BA_FUNCTIONS_CREATE_RESULTS* pResults
391 )
392{
393 HRESULT hr = S_OK;
394 CBafThmUtilTesting* pBAFunctions = NULL;
395 IBootstrapperEngine* pEngine = NULL;
396
397 DutilInitialize(&BafThmUtilTestingTraceError);
398
399 hr = BalInitializeFromCreateArgs(pArgs->pBootstrapperCreateArgs, &pEngine);
400 ExitOnFailure(hr, "Failed to initialize Bal.");
401
402 pBAFunctions = new CBafThmUtilTesting(hModule, pEngine, pArgs);
403 ExitOnNull(pBAFunctions, hr, E_OUTOFMEMORY, "Failed to create new CBafThmUtilTesting object.");
404
405 pResults->pfnBAFunctionsProc = BalBaseBAFunctionsProc;
406 pResults->pvBAFunctionsProcContext = pBAFunctions;
407 pBAFunctions = NULL;
408
409LExit:
410 ReleaseObject(pBAFunctions);
411 ReleaseObject(pEngine);
412
413 return hr;
414}
415
416static void CALLBACK BafThmUtilTestingTraceError(
417 __in_z LPCSTR /*szFile*/,
418 __in int /*iLine*/,
419 __in REPORT_LEVEL /*rl*/,
420 __in UINT source,
421 __in HRESULT hrError,
422 __in_z __format_string LPCSTR szFormat,
423 __in va_list args
424 )
425{
426 // BalLogError currently uses the Exit... macros,
427 // so if expanding the scope need to ensure this doesn't get called recursively.
428 if (DUTIL_SOURCE_THMUTIL == source)
429 {
430 BalLogErrorArgs(hrError, szFormat, args);
431 }
432}
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.def b/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.def
new file mode 100644
index 00000000..6e016dad
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.def
@@ -0,0 +1,6 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4EXPORTS
5 BAFunctionsCreate
6 BAFunctionsDestroy
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.vcxproj b/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.vcxproj
new file mode 100644
index 00000000..8e7e9bd9
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.vcxproj
@@ -0,0 +1,64 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<Project DefaultTargets="Build" Toolsxmlns="http://schemas.microsoft.com/developer/msbuild/2003">
4 <ItemGroup Label="ProjectConfigurations">
5 <ProjectConfiguration Include="Debug|ARM64">
6 <Configuration>Debug</Configuration>
7 <Platform>ARM64</Platform>
8 </ProjectConfiguration>
9 <ProjectConfiguration Include="Release|ARM64">
10 <Configuration>Release</Configuration>
11 <Platform>ARM64</Platform>
12 </ProjectConfiguration>
13 <ProjectConfiguration Include="Debug|Win32">
14 <Configuration>Debug</Configuration>
15 <Platform>Win32</Platform>
16 </ProjectConfiguration>
17 <ProjectConfiguration Include="Release|Win32">
18 <Configuration>Release</Configuration>
19 <Platform>Win32</Platform>
20 </ProjectConfiguration>
21 <ProjectConfiguration Include="Debug|x64">
22 <Configuration>Debug</Configuration>
23 <Platform>x64</Platform>
24 </ProjectConfiguration>
25 <ProjectConfiguration Include="Release|x64">
26 <Configuration>Release</Configuration>
27 <Platform>x64</Platform>
28 </ProjectConfiguration>
29 </ItemGroup>
30 <PropertyGroup Label="Globals">
31 <ProjectGuid>{565E99AE-975F-4F26-8A6E-852603386A80}</ProjectGuid>
32 <ConfigurationType>DynamicLibrary</ConfigurationType>
33 <PlatformToolset>v142</PlatformToolset>
34 <CharacterSet>Unicode</CharacterSet>
35 <TargetName>BafThmUtilTesting</TargetName>
36 <ProjectModuleDefinitionFile>BafThmUtilTesting.def</ProjectModuleDefinitionFile>
37 </PropertyGroup>
38 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
39 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
40 <PropertyGroup>
41 <ProjectAdditionalLinkLibraries>comctl32.lib;gdiplus.lib;msimg32.lib;shlwapi.lib;wininet.lib</ProjectAdditionalLinkLibraries>
42 </PropertyGroup>
43 <ItemGroup>
44 <ClCompile Include="BafThmUtilTesting.cpp" />
45 <ClCompile Include="precomp.cpp">
46 <PrecompiledHeader>Create</PrecompiledHeader>
47 </ClCompile>
48 </ItemGroup>
49 <ItemGroup>
50 <ClInclude Include="precomp.h" />
51 </ItemGroup>
52 <ItemGroup>
53 <ResourceCompile Include="theme\theme.rc" Link="theme.rc" />
54 </ItemGroup>
55 <ItemGroup>
56 <None Include="BafThmUtilTesting.def" />
57 </ItemGroup>
58 <ItemGroup>
59 <PackageReference Include="WixToolset.Dutil" />
60 <PackageReference Include="WixToolset.BalUtil" />
61 <PackageReference Include="WixToolset.BootstrapperCore.Native" />
62 </ItemGroup>
63 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
64</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/precomp.cpp b/src/test/burn/TestData/Manual/BafThmutilTesting/precomp.cpp
new file mode 100644
index 00000000..b20f4230
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/precomp.cpp
@@ -0,0 +1,46 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5static HINSTANCE vhInstance = NULL;
6
7extern "C" BOOL WINAPI DllMain(
8 IN HINSTANCE hInstance,
9 IN DWORD dwReason,
10 IN LPVOID /* pvReserved */
11 )
12{
13 switch (dwReason)
14 {
15 case DLL_PROCESS_ATTACH:
16 ::DisableThreadLibraryCalls(hInstance);
17 vhInstance = hInstance;
18 break;
19
20 case DLL_PROCESS_DETACH:
21 vhInstance = NULL;
22 break;
23 }
24
25 return TRUE;
26}
27
28extern "C" HRESULT WINAPI BAFunctionsCreate(
29 __in const BA_FUNCTIONS_CREATE_ARGS* pArgs,
30 __inout BA_FUNCTIONS_CREATE_RESULTS* pResults
31 )
32{
33 HRESULT hr = S_OK;
34
35 hr = CreateBAFunctions(vhInstance, pArgs, pResults);
36 BalExitOnFailure(hr, "Failed to create BAFunctions interface.");
37
38LExit:
39 return hr;
40}
41
42extern "C" void WINAPI BAFunctionsDestroy(
43 )
44{
45 BalUninitialize();
46}
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/precomp.h b/src/test/burn/TestData/Manual/BafThmutilTesting/precomp.h
new file mode 100644
index 00000000..e7cd39dc
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/precomp.h
@@ -0,0 +1,40 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include <windows.h>
6
7#pragma warning(push)
8#pragma warning(disable:4458) // declaration of 'xxx' hides class member
9#include <gdiplus.h>
10#pragma warning(pop)
11
12#include <msiquery.h>
13#include <objbase.h>
14#include <shlobj.h>
15#include <shlwapi.h>
16#include <stdlib.h>
17#include <strsafe.h>
18#include <CommCtrl.h>
19
20#include "dutil.h"
21#include "dictutil.h"
22#include "fileutil.h"
23#include "locutil.h"
24#include "pathutil.h"
25#include "strutil.h"
26#include "thmutil.h"
27#include "regutil.h"
28#include "xmlutil.h"
29
30#include "BalBaseBootstrapperApplication.h"
31#include "balutil.h"
32
33#include "BAFunctions.h"
34#include "IBAFunctions.h"
35
36HRESULT WINAPI CreateBAFunctions(
37 __in HMODULE hModule,
38 __in const BA_FUNCTIONS_CREATE_ARGS* pArgs,
39 __inout BA_FUNCTIONS_CREATE_RESULTS* pResults
40 );
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128.png
new file mode 100644
index 00000000..4dfceeba
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_focus.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_focus.png
new file mode 100644
index 00000000..2caffb30
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_focus.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_hover.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_hover.png
new file mode 100644
index 00000000..8242b0d1
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_hover.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_selected.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_selected.png
new file mode 100644
index 00000000..7355fc06
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/128x128_selected.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/16x16.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/16x16.png
new file mode 100644
index 00000000..52975ac0
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/16x16.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256.png
new file mode 100644
index 00000000..6924ec48
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_focus.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_focus.png
new file mode 100644
index 00000000..8cc141b2
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_focus.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_hover.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_hover.png
new file mode 100644
index 00000000..a1cff210
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_hover.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_selected.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_selected.png
new file mode 100644
index 00000000..184c1f78
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/256x256_selected.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/32x32.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/32x32.png
new file mode 100644
index 00000000..01d621b3
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/32x32.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64.png
new file mode 100644
index 00000000..697274f9
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_focus.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_focus.png
new file mode 100644
index 00000000..7bd5b2ca
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_focus.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_hover.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_hover.png
new file mode 100644
index 00000000..88b2e8c2
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_hover.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_selected.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_selected.png
new file mode 100644
index 00000000..39e75799
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/64x64_selected.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/BafThmUtilTestingTheme.xml b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/BafThmUtilTestingTheme.xml
new file mode 100644
index 00000000..0d0dabf5
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/BafThmUtilTestingTheme.xml
@@ -0,0 +1,137 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Theme xmlns="http://wixtoolset.org/schemas/v4/thmutil">
6 <Font Id="Default" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
7 <Image Id="star_transparent.bmp" ImageResource="2" />
8 <Image Id="star_opaque.bmp" ImageResource="3" />
9 <Image Id="star_transparent.png" ImageResource="4" />
10 <Image Id="square_default" ImageResource="5">
11 <AlternateResolution ImageResource="6" />
12 <AlternateResolution ImageResource="7" />
13 <AlternateResolution ImageResource="8" />
14 <AlternateResolution ImageResource="9" />
15 </Image>
16 <Image Id="square_focus" ImageResource="13">
17 <AlternateResolution ImageResource="14" />
18 <AlternateResolution ImageResource="15" />
19 </Image>
20 <Image Id="square_hover" ImageResource="19">
21 <AlternateResolution ImageResource="20" />
22 <AlternateResolution ImageResource="21" />
23 </Image>
24 <Image Id="square_selected" ImageResource="25">
25 <AlternateResolution ImageResource="26" />
26 <AlternateResolution ImageResource="27" />
27 </Image>
28 <Image Id="progressbar" ImageResource="30" />
29 <Image Id="progressbar_reverse" ImageResource="31" />
30
31 <Window Width="600" Height="450" FontId="Default" Caption="BafThmUtilTestingTheme" HexStyle="10cf0000" AutoResize="yes">
32 <ImageList Name="Stars">
33 <ImageListItem ImageResource="2" />
34 <ImageListItem ImageResource="3" />
35 <ImageListItem ImageResource="4" />
36 </ImageList>
37 <Page Name="Transparency">
38 <Label X="6" Y="6" Width="-6" Height="94" FontId="Default">
39 This page has three versions of an image. The top image is a bitmap with a transparent background, the yellow star should be visible but its black background should not (this is currently broken). The middle image is the same bitmap except the black background is fully opaque so the yellow star should be visible on a black background. The bottom image in a PNG version of the top image and should look exactly the same.
40 </Label>
41 <ImageControl X="6" Y="106" Width="64" Height="64" ImageId="star_transparent.bmp" />
42 <ImageControl X="6" Y="176" Width="64" Height="64" ImageId="star_opaque.bmp" />
43 <ImageControl X="6" Y="246" Width="64" Height="64" ImageId="star_transparent.png" />
44 <Button Name="ListViewButton" X="-183" Y="-11" Width="75" Height="23" TabStop="yes" FontId="Default">
45 <Text>Next</Text>
46 <ChangePageAction Page="ListView" />
47 </Button>
48 </Page>
49 <Page Name="ListView">
50 <Label X="6" Y="6" Width="-6" Height="18" FontId="Default">
51 This page is for testing ListView.
52 </Label>
53 <ListView Name="ListViewTopLeft" X="6" Y="30" Width="288" Height="176" FontId="Default" HexStyle="00" ImageList="Stars">
54 <Column Width="100">TL One</Column>
55 <Column Width="100">TL Two</Column>
56 <Column Width="88">TL Three</Column>
57 </ListView>
58 <ListView Name="ListViewTopRight" X="300" Y="30" Width="-11" Height="176" FontId="Default" HexStyle="01" ImageListGroupHeader="Stars">
59 <Column Width="100">TR One</Column>
60 <Column Width="100">TR Two</Column>
61 <Column Width="88" Expands="yes">TR Exp</Column>
62 </ListView>
63 <ListView Name="ListViewBottomLeft" X="6" Y="212" Width="288" Height="176" FontId="Default" HexStyle="02" ImageListSmall="Stars">
64 <Column Width="100">BL One</Column>
65 <Column Width="100">BL Two</Column>
66 <Column Width="88">BL Three</Column>
67 </ListView>
68 <ListView Name="ListViewBottomRight" X="300" Y="212" Width="-11" Height="176" FontId="Default" HexStyle="03">
69 <Column Width="100">BR One</Column>
70 <Column Width="100">BR Two</Column>
71 <Column Width="88" Expands="yes">BR Exp</Column>
72 </ListView>
73 <Button Name="ListViewBackButton" X="-269" Y="-11" Width="75" Height="23" TabStop="yes" FontId="Default">
74 <Text>Back</Text>
75 <ChangePageAction Page="Transparency" />
76 </Button>
77 <Button Name="ButtonButton" X="-183" Y="-11" Width="75" Height="23" TabStop="yes" FontId="Default">
78 <Text>Next</Text>
79 <ChangePageAction Page="Button" />
80 </Button>
81 </Page>
82 <Page Name="Button">
83 <Label X="6" Y="6" Width="-6" Height="132" FontId="Default">
84 This page is for testing graphical buttons. The left image is 16x16 at 100% scaling, the middle image is 32x32 at 100% scaling. The images for the buttons display their dimensions, so the left should be 16x16 at 100% but 32x32 at 200%. The right button starts at 32x32 at 100%, but grows and shrinks with the window and its image should also change.
85
86There are currently four states for a button: default, focus, hover, and selected (in that priority order). There should be a different image for each state, although the left button should have a focus rectangle over the default image since it didn't specify an image for the focused state.
87 </Label>
88 <Button Name="Square16Button" X="6" Y="140" Width="16" Height="16" FontId="Default" TabStop="yes">
89 <ButtonImage ImageId="square_default" />
90 <ButtonHoverImage ImageId="square_hover" />
91 <ButtonSelectedImage ImageId="square_selected" />
92 </Button>
93 <Button Name="Square32Button" X="54" Y="140" Width="32" Height="32" FontId="Default" TabStop="yes">
94 <ButtonImage ImageId="square_default" />
95 <ButtonFocusImage ImageId="square_focus" />
96 <ButtonHoverImage ImageId="square_hover" />
97 <ButtonSelectedImage ImageId="square_selected" />
98 </Button>
99 <Button Name="SquareExpandButton" X="92" Y="140" Width="-476" Height="-278" FontId="Default" TabStop="yes">
100 <ButtonImage ImageId="square_default" />
101 <ButtonFocusImage ImageId="square_focus" />
102 <ButtonHoverImage ImageId="square_hover" />
103 <ButtonSelectedImage ImageId="square_selected" />
104 </Button>
105 <Button Name="ButtonBackButton" X="-269" Y="-11" Width="75" Height="23" TabStop="yes" FontId="Default">
106 <Text>Back</Text>
107 <ChangePageAction Page="ListView" />
108 </Button>
109 <Button Name="ProgressbarButton" X="-183" Y="-11" Width="75" Height="23" TabStop="yes" FontId="Default">
110 <Text>Next</Text>
111 <ChangePageAction Page="Progressbar" />
112 </Button>
113 </Page>
114 <Page Name="Progressbar">
115 <Label X="6" Y="6" Width="-6" Height="94" FontId="Default">
116 This page has two progress bars. The top progress bar is a standard control, the bottom one is custom drawn from an image. The bottom one should have its left side one pixel wide as black, the right side one pixel wide as grey, the progress as green, and the remaining as blue. The colors should be reversed when the progress goes backward (this is a way to test different colors, not a standard feature of thmutil).
117 </Label>
118 <Progressbar Name="StandardProgressBar" X="6" Y="106" Width="-6" Height="23" />
119 <Progressbar Name="ImageProgressBar" X="6" Y="141" Width="-6" Height="23">
120 <ProgressbarImage ImageId="progressbar" />
121 <ProgressbarImage ImageId="progressbar_reverse" />
122 </Progressbar>
123 <Button Name="ProgressbarBackButton" X="-269" Y="-11" Width="75" Height="23" TabStop="yes" FontId="Default">
124 <Text>Back</Text>
125 <ChangePageAction Page="Button" />
126 </Button>
127 </Page>
128 <Button Name="StartButton" X="-97" Y="-11" Width="75" Height="23" TabStop="yes" FontId="Default" Visible="yes">
129 <Text>Start</Text>
130 <ChangePageAction Page="Transparency" />
131 </Button>
132 <Button Name="CloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="Default" Visible="yes">
133 <Text>ThemeClose</Text>
134 <CloseWindowAction />
135 </Button>
136 </Window>
137</Theme>
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/progressbar.bmp b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/progressbar.bmp
new file mode 100644
index 00000000..2bab3944
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/progressbar.bmp
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/progressbar_reverse.bmp b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/progressbar_reverse.bmp
new file mode 100644
index 00000000..6fedd05e
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/progressbar_reverse.bmp
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_opaque.bmp b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_opaque.bmp
new file mode 100644
index 00000000..230d958c
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_opaque.bmp
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_transparent.bmp b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_transparent.bmp
new file mode 100644
index 00000000..6596bcff
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_transparent.bmp
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_transparent.png b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_transparent.png
new file mode 100644
index 00000000..2f018763
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/star_transparent.png
Binary files differ
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/theme/theme.rc b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/theme.rc
new file mode 100644
index 00000000..808d29d5
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/theme/theme.rc
@@ -0,0 +1,20 @@
11 RCDATA "BafThmutilTestingTheme.xml"
22 RCDATA "star_transparent.bmp"
33 RCDATA "star_opaque.bmp"
44 RCDATA "star_transparent.png"
55 RCDATA "16x16.png"
66 RCDATA "32x32.png"
77 RCDATA "64x64.png"
88 RCDATA "128x128.png"
99 RCDATA "256x256.png"
1013 RCDATA "64x64_focus.png"
1114 RCDATA "128x128_focus.png"
1215 RCDATA "256x256_focus.png"
1319 RCDATA "64x64_hover.png"
1420 RCDATA "128x128_hover.png"
1521 RCDATA "256x256_hover.png"
1625 RCDATA "64x64_selected.png"
1726 RCDATA "128x128_selected.png"
1827 RCDATA "256x256_selected.png"
1930 RCDATA "progressbar.bmp"
2031 RCDATA "progressbar_reverse.bmp" \ No newline at end of file
diff --git a/src/test/burn/TestData/Manual/BundleA/BundleA.wixproj b/src/test/burn/TestData/Manual/BundleA/BundleA.wixproj
new file mode 100644
index 00000000..dcfd3b7e
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BundleA/BundleA.wixproj
@@ -0,0 +1,18 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <BA>hyperlinkLicense</BA>
6 <UpgradeCode>{98ACBCF6-B54A-46AF-8990-DFB8795B965B}</UpgradeCode>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <ProjectReference Include="..\BafThmUtilTesting\BafThmUtilTesting.vcxproj" Properties="Platform=x86" ReferenceOutputAssembly="false" />
13 <ProjectReference Include="..\PackageA\PackageA.wixproj" />
14 </ItemGroup>
15 <ItemGroup>
16 <PackageReference Include="WixToolset.Bal.wixext" />
17 </ItemGroup>
18</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/Manual/BundleA/BundleA.wxs b/src/test/burn/TestData/Manual/BundleA/BundleA.wxs
new file mode 100644
index 00000000..1706f4e8
--- /dev/null
+++ b/src/test/burn/TestData/Manual/BundleA/BundleA.wxs
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
5 <Fragment>
6 <BootstrapperApplication>
7 <Payload SourceFile="$(var.BafThmUtilTesting.TargetPath)" bal:BAFunctions="yes" />
8 </BootstrapperApplication>
9 <PackageGroup Id="BundlePackages">
10 <MsiPackage Id="PackageA" SourceFile="$(var.PackageA.TargetPath)" />
11 </PackageGroup>
12 </Fragment>
13</Wix>
diff --git a/src/test/burn/TestData/Manual/PackageA/PackageA.wixproj b/src/test/burn/TestData/Manual/PackageA/PackageA.wixproj
new file mode 100644
index 00000000..c9c81c3a
--- /dev/null
+++ b/src/test/burn/TestData/Manual/PackageA/PackageA.wixproj
@@ -0,0 +1,9 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <UpgradeCode>{0D803A6E-8090-4174-8DAC-810ECC2B1BBF}</UpgradeCode>
5 </PropertyGroup>
6 <ItemGroup>
7 <Compile Include="..\..\Templates\Package.wxs" Link="Package.wxs" />
8 </ItemGroup>
9</Project> \ No newline at end of file