[v3] d3dx9/tests: Add test for out of bounds array selector in effect.
Paul Gofman
gofmanp at gmail.com
Tue Mar 7 15:48:40 CST 2017
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
v3:
- spell "out of bound" -> "out of bounds".
v2:
- added back original tests for all error return codes to the helper function;
- moved main test check into the helper function, otherwise if it is called as
todo_wine ok(test_effect_preshader_compare_shader(),...)
the whole function block is treated as todo and tests fail on successful ok() inside helper function;
- added original test function line display, otherwise test failures or todos all have the same line number;
and it is impossible to guess from test output which test actually failed.
---
dlls/d3dx9_36/tests/effect.c | 166 ++++++++++++++++++++++++++++++++++++++-----
1 file changed, 148 insertions(+), 18 deletions(-)
diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index b3845c5..56d9fe6 100644
--- a/dlls/d3dx9_36/tests/effect.c
+++ b/dlls/d3dx9_36/tests/effect.c
@@ -3813,6 +3813,40 @@ static const DWORD test_effect_preshader_effect_blob[] =
#define TEST_EFFECT_PRESHADER_VSHADER_POS 2458
#define TEST_EFFECT_PRESHADER_VSHADER_LEN 13
+#define test_effect_preshader_compare_shader(a, b, c) \
+ test_effect_preshader_compare_shader_(__LINE__, a, b, c)
+static void test_effect_preshader_compare_shader_(unsigned int line, IDirect3DDevice9 *device,
+ int expected_shader_index, BOOL todo)
+{
+ IDirect3DVertexShader9 *vshader;
+ void *byte_code;
+ unsigned int byte_code_size;
+ HRESULT hr;
+
+ hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
+ ok_(__FILE__, line)(hr == D3D_OK, "IDirect3DDevice9_GetVertexShader result %#x.\n", hr);
+
+ todo_wine_if(todo)
+ ok_(__FILE__, line)(!!vshader, "Got NULL vshader.\n");
+ if (!vshader)
+ return;
+
+ hr = IDirect3DVertexShader9_GetFunction(vshader, NULL, &byte_code_size);
+ ok_(__FILE__, line)(hr == D3D_OK, "IDirect3DVertexShader9_GetFunction %#x.\n", hr);
+ ok_(__FILE__, line)(byte_code_size > 1, "Got unexpected byte code size %u.\n", byte_code_size);
+
+ byte_code = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, byte_code_size);
+ hr = IDirect3DVertexShader9_GetFunction(vshader, byte_code, &byte_code_size);
+ ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ todo_wine_if(todo)
+ ok_(__FILE__, line)(!memcmp(byte_code, &test_effect_preshader_effect_blob[TEST_EFFECT_PRESHADER_VSHADER_POS
+ + expected_shader_index * TEST_EFFECT_PRESHADER_VSHADER_LEN], byte_code_size),
+ "Incorrect shader selected.\n");
+ HeapFree(GetProcessHeap(), 0, byte_code);
+ IDirect3DVertexShader9_Release(vshader);
+ }
+
static void test_effect_preshader(IDirect3DDevice9 *device)
{
static const D3DXVECTOR4 test_effect_preshader_fconstsv[] =
@@ -3933,8 +3967,6 @@ static void test_effect_preshader(IDirect3DDevice9 *device)
int idata[TEST_EFFECT_PRES_NINT][4];
BOOL bdata[TEST_EFFECT_PRES_NBOOL];
IDirect3DVertexShader9 *vshader;
- void *byte_code;
- unsigned int byte_code_size;
unsigned int i, j;
D3DCAPS9 caps;
@@ -4071,22 +4103,7 @@ static void test_effect_preshader(IDirect3DDevice9 *device)
hr = effect->lpVtbl->BeginPass(effect, 1);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
- hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
- ok(hr == D3D_OK, "Got result %#x.\n", hr);
- ok(!!vshader, "Got NULL vshader.\n");
-
- hr = IDirect3DVertexShader9_GetFunction(vshader, NULL, &byte_code_size);
- ok(hr == D3D_OK, "Got result %#x.\n", hr);
- byte_code = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, byte_code_size);
- hr = IDirect3DVertexShader9_GetFunction(vshader, byte_code, &byte_code_size);
- ok(hr == D3D_OK, "Got result %#x.\n", hr);
- ok(byte_code_size > 1, "Got unexpected byte code size %u.\n", byte_code_size);
- ok(!memcmp(byte_code,
- &test_effect_preshader_effect_blob[TEST_EFFECT_PRESHADER_VSHADER_POS +
- TEST_EFFECT_PRESHADER_VSHADER_LEN], byte_code_size),
- "Incorrect shader selected.\n");
- HeapFree(GetProcessHeap(), 0, byte_code);
- IDirect3DVertexShader9_Release(vshader);
+ test_effect_preshader_compare_shader(device, 1, FALSE);
hr = IDirect3DDevice9_SetVertexShader(device, NULL);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
@@ -4284,6 +4301,118 @@ static void test_effect_isparameterused(IDirect3DDevice9 *device)
effect->lpVtbl->Release(effect);
}
+static void test_effect_out_of_bounds_selector(IDirect3DDevice9 *device)
+{
+ ID3DXEffect *effect;
+ HRESULT hr;
+ D3DXHANDLE param;
+ int ivect[4];
+ unsigned int passes_count;
+ IDirect3DVertexShader9 *vshader;
+
+ hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
+ NULL, NULL, 0, NULL, &effect, NULL);
+
+ hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ ivect[0] = ivect[1] = ivect[3] = 1;
+
+ param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect");
+ ok(!!param, "GetParameterByName failed.\n");
+ ivect[2] = 3;
+ hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ hr = IDirect3DDevice9_SetVertexShader(device, NULL);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ hr = effect->lpVtbl->BeginPass(effect, 1);
+ todo_wine ok(hr == E_FAIL, "Got result %#x.\n", hr);
+ if (SUCCEEDED(hr))
+ effect->lpVtbl->EndPass(effect);
+
+ hr = effect->lpVtbl->BeginPass(effect, 1);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ test_effect_preshader_compare_shader(device, 2, TRUE);
+
+ hr = effect->lpVtbl->EndPass(effect);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ hr = IDirect3DDevice9_SetVertexShader(device, NULL);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ ivect[2] = -2;
+ hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ hr = effect->lpVtbl->BeginPass(effect, 1);
+ todo_wine ok(hr == E_FAIL, "Got result %#x.\n", hr);
+ if (SUCCEEDED(hr))
+ hr = effect->lpVtbl->EndPass(effect);
+
+ hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+ ok(!vshader, "Got non NULL vshader.\n");
+
+ hr = effect->lpVtbl->BeginPass(effect, 1);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ test_effect_preshader_compare_shader(device, 2, TRUE);
+
+ hr = effect->lpVtbl->EndPass(effect);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ ivect[2] = -1;
+ hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ hr = effect->lpVtbl->BeginPass(effect, 1);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ test_effect_preshader_compare_shader(device, 0, TRUE);
+
+ hr = IDirect3DDevice9_SetVertexShader(device, NULL);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ ivect[2] = 3;
+ hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+ hr = effect->lpVtbl->CommitChanges(effect);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+ ok(!vshader, "Got non NULL vshader.\n");
+
+ ivect[2] = -1;
+ hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+ hr = effect->lpVtbl->CommitChanges(effect);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+ ok(!vshader, "Got non NULL vshader.\n");
+
+ ivect[2] = 1;
+ hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+ hr = effect->lpVtbl->CommitChanges(effect);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ test_effect_preshader_compare_shader(device, 1, FALSE);
+
+ hr = effect->lpVtbl->EndPass(effect);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ hr = effect->lpVtbl->End(effect);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ effect->lpVtbl->Release(effect);
+}
+
START_TEST(effect)
{
HWND wnd;
@@ -4327,6 +4456,7 @@ START_TEST(effect)
test_effect_preshader(device);
test_effect_preshader_ops(device);
test_effect_isparameterused(device);
+ test_effect_out_of_bounds_selector(device);
count = IDirect3DDevice9_Release(device);
ok(count == 0, "The device was not properly freed: refcount %u\n", count);
--
2.9.3
More information about the wine-patches
mailing list