blob: cc20df19700167518223adf4a535ebf6408aaee8 [file] [log] [blame]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* test_validator.c
* test etch_validator
*/
#include "etch_runtime.h"
#include "etch_validator.h"
#include "etch_tagged_data.h"
#include "etch_nativearray.h"
#include "etch_structval.h"
#include "etch_objecttypes.h"
#include <stdio.h>
#include "CUnit.h"
#include "Basic.h"
#include "Automated.h"
#define IS_DEBUG_CONSOLE FALSE
/* - - - - - - - - - - - - - -
* unit test infrastructure
* - - - - - - - - - - - - - -
*/
static int init_suite(void)
{
etch_status_t etch_status = ETCH_SUCCESS;
etch_status = etch_runtime_initialize(NULL);
if(etch_status != NULL) {
// error
}
return 0;
}
static int clean_suite(void)
{
etch_runtime_shutdown();
return 0;
}
static etch_type* testtype;
static etch_boolean* objbool_false;
static etch_boolean* objbool_true;
static etch_byte* objbyte_one;
static etch_int16* objshort_two;
static etch_int32* objint_three;
static etch_int64* objlong_four;
static etch_float* objfloat_five;
static etch_double* objdouble_six;
static etch_string* objstring_abc;
static etch_object* objobject_null;
static etch_nativearray* arraydim1;
static etch_nativearray* arraydim2;
static etch_nativearray* arraydim3;
static void create_testobjects()
{
testtype = new_type(L"abc");
objbool_false = new_boolean(FALSE);
objbool_true = new_boolean(TRUE);
objbyte_one = new_byte(1);
objshort_two = new_int16(2);
objint_three = new_int32(3);
objlong_four = new_int64(4);
objfloat_five = new_float(5.0);
objdouble_six = new_double(6.0);
objstring_abc = new_stringw(L"abc");
objobject_null = (etch_object*) new_primitive(sizeof(etch_object), CLASSID_NONE);
arraydim1 = new_etch_nativearray(CLASSID_ARRAY_BOOL, 1, 1, 4, 0, 0);
arraydim2 = new_etch_nativearray(CLASSID_ARRAY_BOOL, 1, 2, 4, 3, 0);
arraydim3 = new_etch_nativearray(CLASSID_ARRAY_BOOL, 1, 3, 4, 3, 2);
}
static void destroy_testobjects()
{
etch_object_destroy(testtype); testtype = NULL;
etch_object_destroy(objbool_false); objbool_false = NULL;
etch_object_destroy(objbool_true); objbool_true = NULL;
etch_object_destroy(objbyte_one); objbyte_one = NULL;
etch_object_destroy(objshort_two); objshort_two = NULL;
etch_object_destroy(objint_three); objint_three = NULL;
etch_object_destroy(objlong_four); objlong_four = NULL;
etch_object_destroy(objfloat_five); objfloat_five = NULL;
etch_object_destroy(objdouble_six); objdouble_six = NULL;
etch_object_destroy(objstring_abc); objstring_abc = NULL;
etch_object_destroy(objobject_null);objobject_null= NULL;
etch_object_destroy(arraydim1); arraydim1 = NULL;
etch_object_destroy(arraydim2); arraydim2 = NULL;
etch_object_destroy(arraydim3); arraydim3 = NULL;
}
/**
* do_boolean_test()
* common test template for the boolean validator tests
*/
static void do_boolean_test(int dims, char* name, byte in_typecode,
unsigned short validated_class_id, etch_object* objgood, etch_object* objbad)
{
int result = 0;
byte out_typecode = 0;
etch_validator* vtor = etchvtor_boolean_get(dims);
CU_ASSERT_PTR_NOT_NULL_FATAL(vtor);
CU_ASSERT_EQUAL(vtor->numdimensions, dims);
CU_ASSERT_EQUAL(validated_class_id, vtor->expected_class_id);
CU_ASSERT_STRING_EQUAL(name, vtor->description);
result = vtor->validate(vtor, objgood);
CU_ASSERT_EQUAL(result,0);
result = vtor->validate(vtor, objbad);
CU_ASSERT_EQUAL(result,-1);
if (result != -1)
result = 1;
result = vtor->check_value(vtor, objgood, &out_typecode);
CU_ASSERT_EQUAL(result, 0);
CU_ASSERT_EQUAL(in_typecode, out_typecode);
result = vtor->check_value(vtor, objbad, &out_typecode);
CU_ASSERT_EQUAL(result, -1);
CU_ASSERT_EQUAL(vtor->is_cached, TRUE);
etch_object_destroy(vtor); /* test that vtor is cached */
CU_ASSERT_EQUAL(result, -1); /* and cannot be destroyed */
}
/**
* test_boolean_validator()
*/
static void test_boolean_validator(void)
{
char* strbool0 = "bool[0]";
create_testobjects();
do_boolean_test(0, "bool[0]", ETCH_XTRNL_TYPECODE_BOOLEAN_FALSE,
CLASSID_PRIMITIVE_BOOL, (etch_object*) objbool_false, (etch_object*) objbyte_one);
do_boolean_test(0, "bool[0]", ETCH_XTRNL_TYPECODE_BOOLEAN_TRUE,
CLASSID_PRIMITIVE_BOOL, (etch_object*) objbool_true, (etch_object*) objshort_two);
do_boolean_test(0, "bool[0]", ETCH_XTRNL_TYPECODE_BOOLEAN_TRUE,
CLASSID_PRIMITIVE_BOOL, (etch_object*) objbool_true, (etch_object*) objint_three);
do_boolean_test(0, strbool0, ETCH_XTRNL_TYPECODE_BOOLEAN_TRUE,
CLASSID_PRIMITIVE_BOOL, (etch_object*) objbool_true, (etch_object*) objlong_four);
do_boolean_test(0, strbool0, ETCH_XTRNL_TYPECODE_BOOLEAN_TRUE,
CLASSID_PRIMITIVE_BOOL, (etch_object*) objbool_true, (etch_object*) objfloat_five);
do_boolean_test(0, strbool0, ETCH_XTRNL_TYPECODE_BOOLEAN_TRUE,
CLASSID_PRIMITIVE_BOOL, (etch_object*) objbool_true, (etch_object*) objdouble_six);
do_boolean_test(0, strbool0, ETCH_XTRNL_TYPECODE_BOOLEAN_TRUE,
CLASSID_PRIMITIVE_BOOL, (etch_object*) objbool_true, (etch_object*) objstring_abc);
do_boolean_test(0, strbool0, ETCH_XTRNL_TYPECODE_BOOLEAN_TRUE,
CLASSID_PRIMITIVE_BOOL, (etch_object*) objbool_true, objobject_null);
do_boolean_test(1, "bool[1]", ETCH_XTRNL_TYPECODE_ARRAY,
CLASSID_ARRAY_BOOL, (etch_object*) arraydim1, (etch_object*) objbool_true);
do_boolean_test(2, "bool[2]", ETCH_XTRNL_TYPECODE_ARRAY,
CLASSID_ARRAY_BOOL, (etch_object*) arraydim2, (etch_object*) arraydim1);
do_boolean_test(3, "bool[3]", ETCH_XTRNL_TYPECODE_ARRAY,
CLASSID_ARRAY_BOOL, (etch_object*) arraydim3, (etch_object*) arraydim2);
destroy_testobjects();
etchvtor_clear_cache(); /* destroy cached validators */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/*
* do_recursive_test()
* run a validate on an anonymous object. if the object is a nativearray,
* this method is invoked recursively until the array elements are validated.
* the caller relinquishes ownership of valobj to this method.
*/
static void do_recursive_test(etch_validator* vtor, const int dims, byte* typecodes, etch_object* valobj)
{
int result = 0;
signed char expected_typecode = 0, validated_typecode = 0;
//++debug_count;
//if (debug_count == 0x28)
// result = 0; // debugger target
result = vtor->validate(vtor, (etch_object*) valobj);
CU_ASSERT_EQUAL(result, 0);
expected_typecode = typecodes[dims];
result = vtor->check_value(vtor, (etch_object*) valobj, (unsigned char*)&validated_typecode);
CU_ASSERT_EQUAL(result,0);
if (expected_typecode == validated_typecode)
result = TRUE;
else result = FALSE; // debugger target
CU_ASSERT_EQUAL(result, TRUE);
if (dims)
{ /* if validating an array, iterate the array and recursively validate
* each array element, which could itself be an array. todo -- this
* is coded for nativearray, we may need to generalize to arrayvalue
*/
int itemcount = 0, i = 0;
etch_nativearray* a = NULL;
etch_validator* element_vtor = vtor->element_validator(vtor);
CU_ASSERT_EQUAL_FATAL(is_etch_nativearray(valobj), TRUE);
a = (etch_nativearray*) valobj;
itemcount = (int) a->dimension[dims-1];
for(; i < (const int) itemcount; i++)
{
etch_object* subobj = etch_nativearray_get_element(a, i);
CU_ASSERT_PTR_NOT_NULL_FATAL(subobj);
do_recursive_test(element_vtor, dims-1, typecodes, subobj);
}
etch_object_destroy(valobj);
}
}
/*
* test_array_boolean()
* test validator on arrays of boolean using the recursive test
*/
static void test_array_boolean(void)
{
const int numdimensions = 2, dim0count = 3, dim1count = 2;
boolean x1[2][3] = { { FALSE,FALSE,FALSE,}, { FALSE,FALSE,FALSE,}, };
boolean x2[2][3] = { { TRUE, TRUE, TRUE, }, { TRUE, TRUE, TRUE, }, };
byte typecodz[3] = { ETCH_XTRNL_TYPECODE_BOOLEAN_FALSE,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
etch_nativearray* a1 = NULL, *a2 = NULL;
/* test validate boolean array x1/a1 */
etch_validator* vtor = etchvtor_boolean_get(numdimensions);
a1 = new_etch_nativearray_from(&x1, CLASSID_ARRAY_BOOL,
sizeof(boolean), numdimensions, dim0count, dim1count, 0);
a1->is_content_owned = FALSE;
/* fyi we relinquish ownership of array a1 here */
do_recursive_test(vtor, numdimensions, typecodz, (etch_object*) a1);
/* test validate boolean array x2/a2 */
typecodz[0] = ETCH_XTRNL_TYPECODE_BOOLEAN_TRUE;
vtor = etchvtor_boolean_get(numdimensions);
a2 = new_etch_nativearray_from(&x2, CLASSID_ARRAY_BOOL,
sizeof(boolean), numdimensions, dim0count, dim1count, 0);
a2->is_content_owned = FALSE;
/* fyi we relinquish ownership of array a2 here */
do_recursive_test(vtor, numdimensions, typecodz, (etch_object*) a2);
/* done */
etchvtor_clear_cache(); /* destroy cached validator */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/*
* test_array_byte()
* test validator on arrays of byte using the recursive test
*/
static void test_array_byte(void)
{
const int numdimensions = 2, dim0count = 3, dim1count = 2;
byte x1[2][3] = { { 'a', 'b', 'c', }, { 'd', 'e', 'f',}, };
byte x2[2][3] = { { ETCHTYPE_MIN_BYTE,0xff,0},{ ETCHTYPE_MAX_BYTE,0xff,0, }, };
byte typecodz[3] = { ETCH_XTRNL_TYPECODE_BYTE,
ETCH_XTRNL_TYPECODE_BYTES, ETCH_XTRNL_TYPECODE_ARRAY };
etch_nativearray* a1 = NULL, *a2 = NULL;
/* test validate byte array x1/a1 */
etch_validator* vtor = etchvtor_byte_get(numdimensions);
a1 = new_etch_nativearray_from(&x1, CLASSID_ARRAY_BYTE,
sizeof(byte), numdimensions, dim0count, dim1count, 0);
/* fyi we relinquish ownership of array a1 here */
do_recursive_test(vtor, numdimensions, typecodz, (etch_object*) a1);
/* test validate byte array x2/a2 */
vtor = etchvtor_byte_get(numdimensions);
a2 = new_etch_nativearray_from(&x2, CLASSID_ARRAY_BYTE,
sizeof(byte), numdimensions, dim0count, dim1count, 0);
/* fyi we relinquish ownership of array a2 here */
do_recursive_test(vtor, numdimensions, typecodz, (etch_object*) a2);
/* done */
etchvtor_clear_cache(); /* destroy cached validator */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/*
* test_array_int16()
* test validator on arrays of short using the recursive test
*/
static void test_array_int16(void)
{
const int numdimensions = 3, dim0count = 4, dim1count = 3, dim2count = 2;
etch_nativearray* a = NULL;
short x1[2][3][4] =
{ { { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
{ { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
};
short x2[2][3][4] =
{ { { 1,1,1,1, }, { 1,1,1,1, }, { 1,1,1,1, }, },
{ { 1,1,1,1, }, { 1,1,1,1, }, { 1,1,1,1, }, },
};
short x3[2][3][4] =
{ { { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, },
{ { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, },
};
short x4[2][3][4] =
{ { { ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
},
{ { ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
},
};
short x5[2][3][4] =
{ { { ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
},
{ { ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
},
};
short x6[2][3][4] =
{ { { ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
},
{ { ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
},
};
short x7[2][3][4] =
{ { { ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
},
{ { ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
},
};
byte typecodz1[4] = { ETCH_XTRNL_TYPECODE_BYTE,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
byte typecodz2[4] = { ETCH_XTRNL_TYPECODE_SHORT,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
etch_validator* vtor = etchvtor_int16_get(numdimensions); /* vtor for all tests */
/* test validate short array x1/tc1 (1-byte shorts) */
a = new_etch_nativearray_from(&x1, CLASSID_ARRAY_INT16,
sizeof(short), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate short array x2/tc1 (1-byte shorts) */
a = new_etch_nativearray_from(&x2, CLASSID_ARRAY_INT16,
sizeof(short), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate short array x3/tc1 (1-byte shorts) */
a = new_etch_nativearray_from(&x3, CLASSID_ARRAY_INT16,
sizeof(short), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate short array x4/tc1 (1-byte shorts) */
a = new_etch_nativearray_from(&x4, CLASSID_ARRAY_INT16,
sizeof(short), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate short array x5/tc1 (1-byte shorts) */
a = new_etch_nativearray_from(&x5, CLASSID_ARRAY_INT16,
sizeof(short), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate short array x6/tc2 (2-byte shorts) */
a = new_etch_nativearray_from(&x6, CLASSID_ARRAY_INT16,
sizeof(short), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz2, (etch_object*) a);
/* test validate short array x7/tc2 (2-byte shorts) */
a = new_etch_nativearray_from(&x7, CLASSID_ARRAY_INT16,
sizeof(short), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz2, (etch_object*) a);
/* done */
etchvtor_clear_cache(); /* destroy cached validator */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/*
* test_array_int32()
* test validator on arrays of int using the recursive test
*/
static void test_array_int32(void)
{
const int numdimensions = 3, dim0count = 4, dim1count = 3, dim2count = 2;
etch_nativearray* a = NULL;
int x1[2][3][4] =
{ { { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
{ { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
};
int x2[2][3][4] =
{ { { 1,1,1,1, }, { 1,1,1,1, }, { 1,1,1,1, }, },
{ { 1,1,1,1, }, { 1,1,1,1, }, { 1,1,1,1, }, },
};
int x3[2][3][4] =
{ { { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, },
{ { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, },
};
int x4[2][3][4] =
{ { { ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
},
{ { ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
},
};
int x5[2][3][4] =
{ { { ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
},
{ { ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
},
};
int x6[2][3][4] =
{ { { ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
},
{ { ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
},
};
int x7[2][3][4] =
{ { { ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
},
{ { ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
},
};
byte typecodz1[4] = { ETCH_XTRNL_TYPECODE_BYTE,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
byte typecodz2[4] = { ETCH_XTRNL_TYPECODE_SHORT,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
/* test validate int array x1/tc1 (1-byte ints) */
etch_validator* vtor = etchvtor_int32_get(numdimensions); /* allocates object */
a = new_etch_nativearray_from(&x1, CLASSID_ARRAY_INT32,
sizeof(int), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate int array x2/tc1 (1-byte ints) */
vtor = etchvtor_int32_get(numdimensions); /* gets cached object */
a = new_etch_nativearray_from(&x2, CLASSID_ARRAY_INT32,
sizeof(int), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate int array x3/tc1 (1-byte ints) */
a = new_etch_nativearray_from(&x3, CLASSID_ARRAY_INT32,
sizeof(int), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate int array x4/tc1 (1-byte ints) */
a = new_etch_nativearray_from(&x4, CLASSID_ARRAY_INT32,
sizeof(int), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate int array x5/tc1 (1-byte ints) */
a = new_etch_nativearray_from(&x5, CLASSID_ARRAY_INT32,
sizeof(int), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate int array x6/tc2 (2-byte ints) */
a = new_etch_nativearray_from(&x6, CLASSID_ARRAY_INT32,
sizeof(int), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz2, (etch_object*) a);
/* test validate int array x7/tc2 (2-byte ints) */
a = new_etch_nativearray_from(&x7, CLASSID_ARRAY_INT32,
sizeof(int), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz2, (etch_object*) a);
/* test validate int array x8/tc4 (4-byte ints) */
a = new_etch_nativearray_from(&x6, CLASSID_ARRAY_INT32,
sizeof(int), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz2, (etch_object*) a);
/* test validate int array x9/tc4 (4-byte ints) */
a = new_etch_nativearray_from(&x7, CLASSID_ARRAY_INT32,
sizeof(int), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz2, (etch_object*) a);
/* done */
etchvtor_clear_cache(); /* destroy cached validator */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/*
* test_array_int64()
* test validator on arrays of long long using the recursive test
*/
static void test_array_int64(void)
{
const int numdimensions = 3, dim0count = 4, dim1count = 3, dim2count = 2;
etch_nativearray* a = NULL;
int64 x1[2][3][4] =
{ { { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
{ { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
};
int64 x2[2][3][4] =
{ { { 1,1,1,1, }, { 1,1,1,1, }, { 1,1,1,1, }, },
{ { 1,1,1,1, }, { 1,1,1,1, }, { 1,1,1,1, }, },
};
int64 x3[2][3][4] =
{ { { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, },
{ { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, },
};
int64 x4[2][3][4] =
{ { { ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
},
{ { ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
{ ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE,ETCHTYPE_MAX_BYTE, },
},
};
int64 x5[2][3][4] =
{ { { ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
},
{ { ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
{ ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE,ETCHTYPE_MIN_BYTE, },
},
};
int64 x6[2][3][4] =
{ { { ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
},
{ { ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
{ ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16,ETCHTYPE_MAX_INT16, },
},
};
int64 x7[2][3][4] =
{ { { ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
},
{ { ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
{ ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16,ETCHTYPE_MIN_INT16, },
},
};
int64 x8[2][3][4] =
{ { { ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32, },
{ ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32, },
{ ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32, },
},
{ { ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32, },
{ ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32, },
{ ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32,ETCHTYPE_MAX_INT32, },
},
};
int64 x9[2][3][4] =
{ { { ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32, },
{ ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32, },
{ ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32, },
},
{ { ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32, },
{ ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32, },
{ ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32,ETCHTYPE_MIN_INT32, },
},
};
int64 x10[2][3][4] =
{ { { ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64, },
{ ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64, },
{ ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64, },
},
{ { ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64, },
{ ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64, },
{ ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64,ETCHTYPE_MAX_INT64, },
},
};
int64 x11[2][3][4] =
{ { { ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64, },
{ ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64, },
{ ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64, },
},
{ { ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64, },
{ ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64, },
{ ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64,ETCHTYPE_MIN_INT64, },
},
};
byte typecodz1[4] = { ETCH_XTRNL_TYPECODE_BYTE,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
byte typecodz2[4] = { ETCH_XTRNL_TYPECODE_SHORT,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
byte typecodz4[4] = { ETCH_XTRNL_TYPECODE_INT,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
byte typecodz8[4] = { ETCH_XTRNL_TYPECODE_LONG,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
/* test validate int array x1/tc1 (1-byte ints) */
etch_validator* vtor = etchvtor_int64_get(numdimensions); /* allocates object */
a = new_etch_nativearray_from(&x1, CLASSID_ARRAY_INT64,
sizeof(int64), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate int64 array x2/tc1 (1-byte longs) */
vtor = etchvtor_int64_get(numdimensions); /* gets cached object */
a = new_etch_nativearray_from(&x2, CLASSID_ARRAY_INT64,
sizeof(int64), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate int64 array x3/tc1 (1-byte longs) */
a = new_etch_nativearray_from(&x3, CLASSID_ARRAY_INT64,
sizeof(int64), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate int64 array x4/tc1 (1-byte longs) */
a = new_etch_nativearray_from(&x4, CLASSID_ARRAY_INT64,
sizeof(int64), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate int64 array x5/tc1 (1-byte longs) */
a = new_etch_nativearray_from(&x5, CLASSID_ARRAY_INT64,
sizeof(int64), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate int64 array x6/tc2 (2-byte longs) */
a = new_etch_nativearray_from(&x6, CLASSID_ARRAY_INT64,
sizeof(int64), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz2, (etch_object*) a);
/* test validate int64 array x7/tc2 (2-byte longs) */
a = new_etch_nativearray_from(&x7, CLASSID_ARRAY_INT64,
sizeof(int64), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz2, (etch_object*) a);
/* test validate int64 array x8/tc4 (4-byte longs) */
a = new_etch_nativearray_from(&x8, CLASSID_ARRAY_INT64,
sizeof(int64), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz4, (etch_object*) a);
/* test validate int64 array x9/tc4 (4-byte longs) */
a = new_etch_nativearray_from(&x9, CLASSID_ARRAY_INT64,
sizeof(int64), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz4, (etch_object*) a);
/* test validate int64 array x10/tc8 (8-byte longs) */
a = new_etch_nativearray_from(&x10, CLASSID_ARRAY_INT64,
sizeof(int64), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz8, (etch_object*) a);
/* test validate int64 array x11/tc8 (8-byte longs) */
a = new_etch_nativearray_from(&x11, CLASSID_ARRAY_INT64,
sizeof(int64), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz8, (etch_object*) a);
/* done */
etchvtor_clear_cache(); /* destroy cached validator */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/*
* test_array_float()
* test validator on arrays of float using the recursive test
*/
static void test_array_float(void)
{
const int numdimensions = 3, dim0count = 4, dim1count = 3, dim2count = 2;
etch_nativearray* a = NULL;
float x1[2][3][4] =
{ { { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
{ { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
};
float x2[2][3][4] =
{ { { 1,1,1,1, }, { 1,1,1,1, }, { 1,1,1,1, }, },
{ { 1,1,1,1, }, { 1,1,1,1, }, { 1,1,1,1, }, },
};
float x3[2][3][4] =
{ { { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, },
{ { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, },
};
float x4[2][3][4] =
{ { { ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT, },
{ ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT, },
{ ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT, },
},
{ { ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT, },
{ ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT, },
{ ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT,ETCHTYPE_MAX_FLOAT, },
},
};
float x5[2][3][4] =
{ { { ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT, },
{ ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT, },
{ ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT, },
},
{ { ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT, },
{ ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT, },
{ ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT,ETCHTYPE_MIN_FLOAT, },
},
};
byte typecodz1[4] = { ETCH_XTRNL_TYPECODE_FLOAT,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
etch_validator* vtor = etchvtor_float_get(numdimensions); /* vtor for all tests */
/* test validate float array x1/tc1 (1-byte floats) */
a = new_etch_nativearray_from(&x1, CLASSID_ARRAY_FLOAT,
sizeof(float), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate float array x2/tc1 (1-byte floats) */
a = new_etch_nativearray_from(&x2, CLASSID_ARRAY_FLOAT,
sizeof(float), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate float array x3/tc1 (1-byte floats) */
a = new_etch_nativearray_from(&x3, CLASSID_ARRAY_FLOAT,
sizeof(float), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate float array x4/tc1 (1-byte floats) */
a = new_etch_nativearray_from(&x4, CLASSID_ARRAY_FLOAT,
sizeof(float), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate float array x5/tc1 (1-byte floats) */
a = new_etch_nativearray_from(&x5, CLASSID_ARRAY_FLOAT,
sizeof(float), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* done */
etchvtor_clear_cache(); /* destroy cached validator */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/*
* test_array_double()
* test validator on arrays of double using the recursive test
*/
static void test_array_double(void)
{
const int numdimensions = 3, dim0count = 4, dim1count = 3, dim2count = 2;
etch_nativearray* a = NULL;
double x1[2][3][4] =
{ { { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
{ { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
};
double x2[2][3][4] =
{ { { 1,1,1,1, }, { 1,1,1,1, }, { 1,1,1,1, }, },
{ { 1,1,1,1, }, { 1,1,1,1, }, { 1,1,1,1, }, },
};
double x3[2][3][4] =
{ { { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, },
{ { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, { -1,-1,-1,-1, }, },
};
double x4[2][3][4] =
{ { { ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE, },
{ ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE, },
{ ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE, },
},
{ { ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE, },
{ ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE, },
{ ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE,ETCHTYPE_MAX_DOUBLE, },
},
};
double x5[2][3][4] =
{ { { ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE, },
{ ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE, },
{ ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE, },
},
{ { ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE, },
{ ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE, },
{ ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE,ETCHTYPE_MIN_DOUBLE, },
},
};
byte typecodz1[4] = { ETCH_XTRNL_TYPECODE_DOUBLE,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
etch_validator* vtor = etchvtor_double_get(numdimensions); /* vtor for all tests */
/* test validate double array x1/tc1 (1-byte doubles) */
a = new_etch_nativearray_from(&x1, CLASSID_ARRAY_DOUBLE,
sizeof(double), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate double array x2/tc1 (1-byte doubles) */
a = new_etch_nativearray_from(&x2, CLASSID_ARRAY_DOUBLE,
sizeof(double), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate double array x3/tc1 (1-byte doubles) */
a = new_etch_nativearray_from(&x3, CLASSID_ARRAY_DOUBLE,
sizeof(double), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate double array x4/tc1 (1-byte doubles) */
a = new_etch_nativearray_from(&x4, CLASSID_ARRAY_DOUBLE,
sizeof(double), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate double array x5/tc1 (1-byte doubles) */
a = new_etch_nativearray_from(&x5, CLASSID_ARRAY_DOUBLE,
sizeof(double), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* done */
etchvtor_clear_cache(); /* destroy cached validator */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/*
* test_array_string()
* test validator on arrays of etch_string* using the recursive test
*/
static void test_array_string(void)
{
const int numdimensions = 3, dim0count = 4, dim1count = 3, dim2count = 2;
etch_nativearray* a = NULL;
int i = 0, j = 0, k = 0;
const wchar_t* emptystring = L"";
const wchar_t* nonemptystring = L"abc";
etch_string* x1[2][3][4] =
{ { { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
{ { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
};
etch_string* x2[2][3][4] =
{ { { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
{ { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
};
byte typecodz1[4] = { ETCH_XTRNL_TYPECODE_EMPTY_STRING,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
byte typecodz2[4] = { ETCH_XTRNL_TYPECODE_STRING,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY };
etch_validator* vtor = etchvtor_string_get(numdimensions); /* vtor for all tests */
for(i=0; i < dim2count; i++) /* populate test data arrays */
for(j=0; j < dim1count; j++)
for(k=0; k < dim0count; k++)
{
x1[i][j][k] = new_stringw(emptystring);
x2[i][j][k] = new_stringw(nonemptystring);
}
/* test validate etch_string* array x1/tc1 (empty string) */
a = new_etch_nativearray_from(&x1, CLASSID_ARRAY_STRING,
sizeof(etch_string*), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz1, (etch_object*) a);
/* test validate etch_string* array x2/tc2 (nonempty string) */
a = new_etch_nativearray_from(&x2, CLASSID_ARRAY_STRING,
sizeof(etch_string*), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz2, (etch_object*) a);
/* done */
etchvtor_clear_cache(); /* destroy cached validator */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/*
* test_array_object()
* test validator on arrays of etch_object* using the recursive test
*/
static void test_array_object(void)
{
const int numdimensions = 3, dim0count = 4, dim1count = 3, dim2count = 2;
etch_nativearray* a = NULL;
etch_object* obj = NULL;
int i = 0, j = 0, k = 0;
int sequence = 0;
etch_object* x1[2][3][4] =
{ { { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
{ { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
};
etch_object* x2[2][3][4] =
{ { { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
{ { 0,0,0,0, }, { 0,0,0,0, }, { 0,0,0,0, }, },
};
byte typecodz[4] = { ETCH_XTRNL_TYPECODE_ANY,
ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY, ETCH_XTRNL_TYPECODE_ARRAY};
etch_validator* vtor = etchvtor_object_get(numdimensions); /* vtor for all tests */
for(i=0; i < dim2count; i++) /* populate test data arrays */
for(j=0; j < dim1count; j++)
for(k=0; k < dim0count; k++)
{
sequence = i*j*k;
obj = (etch_object*)new_int32(sequence);
x1[i][j][k] = obj;
obj = (etch_object*)&sequence;
x2[i][j][k] = obj;
}
/* test validate etch_object* array x1/tc (object owning object content) */
a = new_etch_nativearray_from(&x1, CLASSID_ARRAY_OBJECT,
sizeof(etch_object*), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz, (etch_object*) a);
/* test validate etch_object* array x2/tc (object not owning its content) */
a = new_etch_nativearray_from(&x2, CLASSID_ARRAY_OBJECT,
sizeof(etch_object*), numdimensions, dim0count, dim1count, dim2count);
do_recursive_test(vtor, numdimensions, typecodz, (etch_object*) a);
/* done */
etchvtor_clear_cache(); /* destroy cached validator */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/**
* do_struct_element_vtor_test()
* common test template for the structvalue element_validator tests
*/
static void do_struct_element_vtor_test(int testdims, char* name, unsigned short expected_class_id, etch_type* thistype)
{
etch_validator* vtor = etchvtor_struct_get(thistype, testdims);
CU_ASSERT_PTR_NOT_NULL_FATAL(vtor);
CU_ASSERT_EQUAL(vtor->numdimensions, testdims);
CU_ASSERT_EQUAL(vtor->expected_class_id, expected_class_id);
CU_ASSERT_STRING_EQUAL(vtor->description, name);
CU_ASSERT_EQUAL(is_equal_types(vtor->struct_type, thistype), TRUE);
/* validator destructor is benign if validator is marked cached
* however a struct validator is not cached */
etch_object_destroy(vtor);
}
/**
* test_struct_element_validator()
*/
static void test_struct_element_validator(void)
{
etch_type* typeabc = new_type(L"abc");
do_struct_element_vtor_test(0, "struct_abc[0]", CLASSID_STRUCTVALUE, typeabc);
do_struct_element_vtor_test(1, "struct_abc[1]", CLASSID_ARRAY_OBJECT, typeabc);
do_struct_element_vtor_test(2, "struct_abc[2]", CLASSID_ARRAY_OBJECT, typeabc);
do_struct_element_vtor_test(3, "struct_abc[3]", CLASSID_ARRAY_OBJECT, typeabc);
etch_object_destroy(typeabc);
etchvtor_clear_cache(); /* not needed since struct validator not cached */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/**
* do_struct_goodvalue_test()
*/
static void do_struct_goodvalue_test(int testdims, const byte expected_typecode,
etch_object* value, etch_type* thistype, const int is_expected_newobject)
{
int result = 0;
byte validated_typecode = 0;
etch_object* validated_value = NULL;
etch_validator* vtor = etchvtor_struct_get(thistype, testdims);
CU_ASSERT_PTR_NOT_NULL_FATAL(vtor);
result = vtor->check_value(vtor, value, &validated_typecode);
CU_ASSERT_EQUAL_FATAL(result,0);
CU_ASSERT_EQUAL(validated_typecode, expected_typecode);
result = vtor->validate(vtor, value);
CU_ASSERT_EQUAL_FATAL(result,0);
validated_value = vtor->validate_value(vtor, value);
CU_ASSERT_PTR_NOT_NULL_FATAL(validated_value);
if (is_expected_newobject)
{
CU_ASSERT_PTR_NOT_EQUAL_FATAL(value, validated_value);
}
else CU_ASSERT_PTR_EQUAL_FATAL(value, validated_value);
/* validated_value can return the same object as paassed, or a different
* object. for example when we expect etch_byte but validate against an
* etch_int32, we would pass an etch_int32 and get back an etch_byte.
* in the real world, we would replace the passed value with the validated
* value; however in this test the caller is not prepared to handle this
* situation, so we free the new object, and let caller free the original */
if (validated_value != value)
etch_object_destroy(validated_value);
/* validator destructor is benign if validator is marked cached
* however a struct validator is not cached */
etch_object_destroy(vtor);
}
/**
* do_struct_badvalue_test()
*/
static void do_struct_badvalue_test(int testdims, etch_object* value, etch_type* thistype)
{
int result = 0;
byte validated_typecode = 0;
etch_object* validated_value = NULL;
etch_validator* vtor = etchvtor_struct_get(thistype, testdims);
CU_ASSERT_PTR_NOT_NULL_FATAL(vtor);
result = vtor->check_value(vtor, value, &validated_typecode);
CU_ASSERT_EQUAL_FATAL(result,-1);
result = vtor->validate(vtor, value);
CU_ASSERT_EQUAL_FATAL(result,-1);
validated_value = vtor->validate_value(vtor, value);
CU_ASSERT_PTR_NULL_FATAL(validated_value);
if (validated_value && validated_value != value)
etch_object_destroy(validated_value);
/* validator destructor is benign if validator is marked cached
* however a struct validator is not cached */
etch_object_destroy(vtor);
}
/**
* test_struct_good_values()
*/
static void test_struct_good_values(void)
{
etch_type* typeabc = new_type(L"abc");
etch_nativearray* array_of_struct = NULL;
const int NUMDIMS0 = 0, NUMDIMS1 = 1, NUMDIMS2 = 2, DIMSIZE4 = 4;
etch_structvalue* sv = new_structvalue(typeabc, 0);
do_struct_goodvalue_test(NUMDIMS0, ETCH_XTRNL_TYPECODE_CUSTOM, (etch_object*) sv, typeabc, FALSE);
/* following tests create an empty array of structvalue objects */
array_of_struct = new_etch_nativearray_of(((etch_object*)sv)->obj_type, ((etch_object*)sv)->class_id, NUMDIMS1, DIMSIZE4, 0, 0);
do_struct_goodvalue_test(NUMDIMS1, ETCH_XTRNL_TYPECODE_ARRAY, (etch_object*) array_of_struct, typeabc, FALSE);
etch_object_destroy(array_of_struct);
array_of_struct = new_etch_nativearray_of(((etch_object*)sv)->obj_type, ((etch_object*)sv)->class_id, NUMDIMS2, DIMSIZE4, DIMSIZE4, 0);
do_struct_goodvalue_test(NUMDIMS2, ETCH_XTRNL_TYPECODE_ARRAY, (etch_object*) array_of_struct, typeabc, FALSE);
etch_object_destroy(array_of_struct);
etch_object_destroy(sv);
etch_object_destroy(typeabc); /* in practice this would have been a static type */
etchvtor_clear_cache(); /* not needed since struct validator not cached */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/**
* test_struct_bad_values()
*/
static void test_struct_bad_values(void)
{
etch_type* type_expected = new_type(L"abc");
etch_type* type_unexpect = new_type(L"def");
etch_nativearray* array_of_struct = NULL;
const int NUMDIMS0 = 0, NUMDIMS1 = 1, NUMDIMS2 = 2, NUMDIMS3 = 3, DIMSIZE4 = 4;
etch_structvalue* sv = new_structvalue(type_expected, 0);
etch_structvalue* svbogus = new_structvalue(type_unexpect, 0);
etch_int32* intobj = new_int32(1);
etch_object* objobj = (etch_object*)intobj;
do_struct_badvalue_test(0, (etch_object*) intobj, type_expected);
do_struct_badvalue_test(0, objobj, type_expected);
do_struct_badvalue_test(0, (etch_object*) svbogus, type_expected);
do_struct_badvalue_test(0, (etch_object*) sv, type_unexpect);
do_struct_badvalue_test(1, (etch_object*) intobj, type_expected);
do_struct_badvalue_test(1, objobj, type_expected);
do_struct_badvalue_test(1, (etch_object*) svbogus, type_expected);
do_struct_badvalue_test(1, (etch_object*) sv, type_unexpect);
/* following tests create an empty array of structvalue objects */
array_of_struct = new_etch_nativearray_of(((etch_object*)sv)->obj_type, ((etch_object*)sv)->class_id, NUMDIMS1, DIMSIZE4, 0, 0);
do_struct_badvalue_test(NUMDIMS0, (etch_object*) array_of_struct, type_expected);
etch_object_destroy(array_of_struct);
array_of_struct = new_etch_nativearray_of(((etch_object*)sv)->obj_type, ((etch_object*)sv)->class_id, NUMDIMS2, DIMSIZE4, DIMSIZE4, 0);
do_struct_badvalue_test(NUMDIMS1, (etch_object*) array_of_struct, type_expected);
do_struct_badvalue_test(NUMDIMS0, (etch_object*) array_of_struct, type_expected);
etch_object_destroy(array_of_struct);
array_of_struct = new_etch_nativearray_of(((etch_object*)sv)->obj_type, ((etch_object*)sv)->class_id, NUMDIMS3, DIMSIZE4, DIMSIZE4, DIMSIZE4);
do_struct_badvalue_test(NUMDIMS2, (etch_object*) array_of_struct, type_expected);
do_struct_badvalue_test(NUMDIMS1, (etch_object*) array_of_struct, type_expected);
do_struct_badvalue_test(NUMDIMS0, (etch_object*) array_of_struct, type_expected);
etch_object_destroy(array_of_struct);
etch_object_destroy(objobj);
etch_object_destroy(sv);
etch_object_destroy(svbogus);
etch_object_destroy(type_expected); /* in real world these are static types */
etch_object_destroy(type_unexpect);
etchvtor_clear_cache(); /* however struct validator is not cached */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/**
* test_combo_validator_1()
*/
static void test_combo_validator_1(void)
{
int result = 0;
etch_validator *vtor1 = 0, *vtor2 = 0, *vtor3 = 0;
create_testobjects();
/* one cached validator */
vtor1 = etchvtor_boolean_get(0);
vtor2 = NULL;
vtor3 = new_combo_validator(vtor1, vtor2);
result = is_etch_combo_validator(vtor3);
CU_ASSERT_EQUAL_FATAL(result, TRUE);
result = vtor3->validate(vtor3, (etch_object*) objbool_true);
CU_ASSERT_EQUAL(result,0);
etch_object_destroy(vtor3);
/* one cached validator */
vtor1 = NULL;
vtor2 = etchvtor_boolean_get(0);
vtor3 = new_combo_validator(vtor1, vtor2);
result = vtor3->validate(vtor3, (etch_object*) objbool_true);
CU_ASSERT_EQUAL(result,0);
etch_object_destroy(vtor3);
/* two cached validators */
vtor1 = etchvtor_boolean_get(0);
vtor2 = etchvtor_int32_get(0);
vtor3 = new_combo_validator(vtor1, vtor2);
result = vtor3->validate(vtor3, (etch_object*) objint_three);
CU_ASSERT_EQUAL(result,0);
etch_object_destroy(vtor3);
destroy_testobjects();
etchvtor_clear_cache(); /* destroy cached validators */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/**
* test_combo_validator_2()
*/
static void test_combo_validator_2(void)
{
int result = 0;
etch_validator *vtor1 = 0, *vtor2 = 0, *vtor3 = 0, *vtor4 = 0, *vtor5 = 0;
create_testobjects();
/* chain 1 of cached validators and combos */
vtor1 = etchvtor_boolean_get(0);
vtor2 = etchvtor_boolean_get(0);
vtor3 = new_combo_validator(vtor1, vtor2);
vtor4 = etchvtor_boolean_get(0);
vtor5 = new_combo_validator(vtor4, vtor3);
result = vtor5->validate(vtor5, (etch_object*) objbool_true);
CU_ASSERT_EQUAL(result,0);
etch_object_destroy(vtor5);
/* chain 2 of cached validators and combos */
vtor1 = etchvtor_boolean_get(0);
vtor2 = etchvtor_boolean_get(0);
vtor3 = new_combo_validator(vtor1, vtor2);
vtor4 = etchvtor_boolean_get(0);
vtor5 = new_combo_validator(vtor3, vtor4);
result = vtor5->validate(vtor5, (etch_object*) objbool_true);
CU_ASSERT_EQUAL(result,0);
etch_object_destroy(vtor5);
destroy_testobjects();
etchvtor_clear_cache(); /* destroy cached validators */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/**
* test_combo_validator_3()
*/
static void test_combo_validator_3(void)
{
int result = 0;
etch_validator *vtor1 = 0, *vtor2 = 0, *vtor3 = 0, *vtor4 = 0, *vtor5 = 0;
create_testobjects();
/* chain 1 of cached and non-cached validators and combos */
vtor1 = etchvtor_boolean_get(0);
vtor2 = etchvtor_int32_get(0);
vtor3 = new_combo_validator(vtor1, vtor2);
vtor4 = etchvtor_struct_get(testtype, 0);
vtor5 = new_combo_validator(vtor4, vtor3);
result = vtor5->validate(vtor5, (etch_object*) objint_three);
CU_ASSERT_EQUAL(result, 0);
etch_object_destroy(vtor5);
/* chain 2 of cached and non-cached validators and combos */
vtor1 = etchvtor_int32_get(0);
vtor2 = etchvtor_boolean_get(0);
vtor3 = new_combo_validator(vtor1, vtor2);
vtor4 = etchvtor_struct_get(testtype, 0);
vtor5 = new_combo_validator(vtor3, vtor4);
result = vtor5->validate(vtor5, (etch_object*) objint_three);
CU_ASSERT_EQUAL(result, 0);
etch_object_destroy(vtor5);
destroy_testobjects();
etchvtor_clear_cache(); /* destroy cached validators */
#ifdef ETCH_DEBUGALLOC
g_bytes_allocated = etch_showmem(0,IS_DEBUG_CONSOLE); /* verify all memory freed */
CU_ASSERT_EQUAL(g_bytes_allocated, 0);
// start fresh for next test
memtable_clear();
#endif
}
/**
* main
*/
//int wmain( int argc, wchar_t* argv[], wchar_t* envp[])
CU_pSuite test_etch_validator_suite()
{
CU_pSuite ps = CU_add_suite("validator test suite", init_suite, clean_suite);
CU_add_test(ps, "test boolean validator", test_boolean_validator);
CU_add_test(ps, "test validate boolean arrays", test_array_boolean);
CU_add_test(ps, "test validate byte arrays", test_array_byte);
CU_add_test(ps, "test validate int16 arrays", test_array_int16);
CU_add_test(ps, "test validate int32 arrays", test_array_int32);
CU_add_test(ps, "test validate int64 arrays", test_array_int64);
CU_add_test(ps, "test validate float arrays", test_array_float);
CU_add_test(ps, "test validate double arrays", test_array_double);
CU_add_test(ps, "test validate etch_string* arrays", test_array_string);
CU_add_test(ps, "test validate etch_object* arrays", test_array_object);
CU_add_test(ps, "test struct element validator", test_struct_element_validator);
CU_add_test(ps, "test struct good values", test_struct_good_values);
CU_add_test(ps, "test struct bad values", test_struct_bad_values);
CU_add_test(ps, "test combo validator 1", test_combo_validator_1);
CU_add_test(ps, "test combo validator 2", test_combo_validator_2);
CU_add_test(ps, "test combo validator 3", test_combo_validator_3);
return ps;
}