Integrated the contents of the old controls_errors.cpp directly into controls.c. We need to rework some test control stuff to get this to compile, and we'll also need to add more test cases for things in the docs that are not in this file.

This commit is contained in:
Pietro Gagliardi 2020-05-10 21:29:03 -04:00
parent d584842628
commit 436cb567dc
2 changed files with 253 additions and 0 deletions

View File

@ -1,6 +1,8 @@
// 8 june 2019
#include "test.h"
// TODO replace hardcoded control types of 5 with a constant from the test hook system
struct counts {
unsigned int countInit;
unsigned int countFree;
@ -88,3 +90,254 @@ Test(ControlMethodsCalled)
if (counts.countInit != 1)
TestErrorf("Init() called unexpectedly by uiControlFree()");
}
Test(NullControlTypeNameIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiRegisterControlType(): invalid null pointer for name");
uiRegisterControlType(NULL, NULL, NULL, 0);
endCheckProgrammerError(ctx);
}
Test(NullControlVtableIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiRegisterControlType(): invalid null pointer for uiControlVtable");
uiRegisterControlType("name", NULL, NULL, 0);
endCheckProgrammerError(ctx);
}
Test(WrongControlVtableSizeIsProgrammerError)
{
uiControlVtable vtable;
void *ctx;
ctx = beginCheckProgrammerError("uiRegisterControlType(): wrong size 1 for uiControlVtable");
memset(&vtable, 0, sizeof (uiControlVtable));
vtable.Size = 1;
uiRegisterControlType("name", &vtable, NULL, 0);
endCheckProgrammerError(ctx);
}
Test(ControlVtableWithMIssingInitMethodIsProgrammerError)
{
uiControlVtable vt;
void *ctx;
ctx = beginCheckProgrammerError("uiRegisterControlType(): required uiControlVtable method Init() missing for uiControl type name");
vt = vtable;
vt.Init = NULL;
uiRegisterControlType("name", &vt, NULL, 0);
endCheckProgrammerError(ctx);
}
Test(ControlVtableWithMIssingFreeMethodIsProgrammerError)
{
uiControlVtable vt;
void *ctx;
ctx = beginCheckProgrammerError("uiRegisterControlType(): required uiControlVtable method Free() missing for uiControl type name");
vt = vtable;
vt.Free = NULL;
uiRegisterControlType("name", &vt, NULL, 0);
endCheckProgrammerError(ctx);
}
Test(NullControlOSVtableIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiRegisterControlType(): invalid null pointer for uiControlOSVtable");
uiRegisterControlType("name", &vtable, NULL, 0);
endCheckProgrammerError(ctx);
}
Test(CheckingNullControlIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiCheckControlType(): invalid null pointer for uiControl");
uiCheckControlType(NULL, uiControlType());
endCheckProgrammerError(ctx);
}
// TODO should this test be the same as the following one instead?
Test(CheckingNonControlIsProgrammerError)
{
// TODO make sure this is fine; if not, just use the following check instead
static char buf[] = "this is not a uiControl but is big enough to at the very least not cause a problem with UB hopefully";
void *ctx;
ctx = beginCheckProgrammerError("TODO");
uiCheckControlType(buf, uiControlType());
endCheckProgrammerError(ctx);
}
Test(CheckingControlWithoutControlMarkerIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiCheckControlType(): object passed in not a uiControl");
uiCheckControlType(uiprivTestHookControlWithInvalidControlMarker(), uiControlType());
endCheckProgrammerError(ctx);
}
Test(CheckingControlWithAnUnknownTypeIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiCheckControlType(): unknown uiControl type 5 found in uiControl (this is likely not a real uiControl or some data is corrupt)");
uiCheckControlType(uiprivTestHookControlWithInvalidType(), testControlType);
endCheckProgrammerError(ctx);
}
Test(CheckingControlWithAnUnknownTypeIsProgrammerErrorEvenIfCheckingAgainstuiControlType)
{
void *ctx;
ctx = beginCheckProgrammerError("uiCheckControlType(): unknown uiControl type 5 found in uiControl (this is likely not a real uiControl or some data is corrupt)");
uiCheckControlType(uiprivTestHookControlWithInvalidType(), uiControlType());
endCheckProgrammerError(ctx);
}
Test(CheckingForUnknownControlTypeIsProgrammerError)
{
uiControl *c;
void *ctx;
ctx = beginCheckProgrammerError("uiCheckControlType(): unknown uiControl type 5 requested");
c = uiNewControl(testControlType, NULL);
uiCheckControlType(c, 5);
uiControlFree(c);
endCheckProgrammerError(ctx);
}
Test(CheckControlTypeFailsCorrectly)
{
uiControl *c;
void *ctx;
ctx = beginCheckProgrammerError("uiCheckControlType(): wrong uiControl type passed: got TestControl, want TestControl2");
c = uiNewControl(testControlType, NULL);
uiCheckControlType(c, testControlType2);
uiControlFree(c);
endCheckProgrammerError(ctx);
}
Test(NewControlOfTypeControlIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiNewControl(): uiControlType() passed in when specific control type needed");
uiNewControl(uiControlType(), NULL);
endCheckProgrammerError(ctx);
}
Test(NewControlOfUnknownTypeIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiNewControl(): unknown uiControl type 5 requested");
uiNewControl(5, NULL);
endCheckProgrammerError(ctx);
}
Test(NewControlWithInvalidInitDataIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiNewControl(): invalid init data for TestControl");
uiNewControl(testControlType, testControlFailInit);
endCheckProgrammerError(ctx);
}
Test(FreeingNullControlIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiControlFree(): invalid null pointer for uiControl");
uiControlFree(NULL);
endCheckProgrammerError(ctx);
}
// TODO go back through all these tests and make the programmer error check as finely scoped as necessary
Test(FreeingParentedControlIsProgrammerError)
{
uiControl *c, *d;
void *ctx;
ctx = beginCheckProgrammerError("uiControlFree(): cannot be called on a control with has a parent");
c = uiNewControl(testControlType, NULL);
d = uiNewControl(testControlType, NULL);
// this should fail
uiControlSetParent(c, d);
uiControlFree(c);
// this should not fail; it's normal cleanup
uiControlSetParent(c, NULL);
uiControlFree(d);
uiControlFree(c);
endCheckProgrammerError(ctx);
}
Test(SetParentWithNullControlIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiControlSetParent(): invalid null pointer for uiControl");
uiControlSetParent(NULL, NULL);
endCheckProgrammerError(ctx);
}
// TODO copy this test but first setting and then removing the parent first, instead of just testing the initial state
Test(RemovingParentFromParentlessControlIsProgrammerError)
{
uiControl *c;
void *ctx;
ctx = beginCheckProgrammerError("uiControlSetParent(): cannot set a control with no parent to have no parent");
c = uiNewControl(testControlType, NULL);
uiControlSetParent(c, NULL);
uiControlFree(c);
endCheckProgrammerError(ctx);
}
Test(ReparentingAlreadyParentedControlIsProgrammerError)
{
uiControl *c, *d, *e;
void *ctx;
ctx = beginCheckProgrammerError("uiControlSetParent(): cannot set a control with a parent to have another parent");
c = uiNewControl(testControlType, NULL);
d = uiNewControl(testControlType, NULL);
e = uiNewControl(testControlType, NULL);
// this should fail
uiControlSetParent(c, d);
uiControlSetParent(c, e);
// this should not (cleanup)
uiControlSetParent(c, NULL);
uiControlFree(e);
uiControlFree(d);
uiControlFree(c);
endCheckProgrammerError(ctx);
}
// TODO define and then test the above but for the same parent
Test(GettingImplDataOfNullControlIsProgrammerError)
{
void *ctx;
ctx = beginCheckProgrammerError("uiControlImplData(): invalid null pointer for uiControl");
uiControlImplData(NULL);
endCheckProgrammerError(ctx);
}