blob: f0d8025793f56d1fa88669b94557706c487f1d08 [file] [log] [blame]
/*
* Test harness for the aif library.
*
* Originally written by Raphael Finkel 8/2000 raphael@cs.uky.edu
*
* Copyright (c) 1996-2002 by Guardsoft Pty Ltd.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif /* HAVE_CONFIG_H */
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* memcpy */
#include <unistd.h> /* getopt */
#ifdef __alpha
#include <string.h> /* memcpy */
#endif
#include "aif.h"
#include "aifint.h"
#include "testaif.h"
#define TEST_SERIES_1 0x01
#define TEST_SERIES_2 0x02
#define TEST_SERIES_3 0x04
#define TEST_SERIES_4 0x08
#define TEST_SERIES_5 0x10
#define TEST_SERIES_6 0x20
TestFlags all = {
1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,
(AIF*)SELF, (AIF*)NULL, (AIF*)NULL,
(AIF*)NULL, (AIF*)NULL, (AIF*)NULL, (AIF*)NULL, (AIF*)NULL,
NULL,
0};
TestFlags none = {
0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,
NULL,NULL,
NULL,NULL,NULL,NULL,NULL,
NULL,
0};
/*****************************************
*** Function Prototypes ***
*****************************************/
void TestAllConstructors();
void TestAllAscii();
void TestAllArithmetic();
void TestAllCircularData();
void TestAllEPS();
void TestAllCompareByName();
void _testAscii(char *, char *, char *, char *, TestFlags);
void _testArithmetic(char *, AIF *, char *, TestFlags, AIF *);
void _testCircularData(char *, AIF *, AIF *, TestFlags);
void _testEPS(AIF *, AIF *, AIF *);
void _testCompareByName(int, AIF *, AIF *, char *);
int AIFTest(char *, AIF *, char *, TestFlags);
int AIFTestInt(char *, AIF *, char *, TestFlags);
int _aif_test(AIF *, TestFlags);
int _aif_test_general(AIF *, TestFlags);
int _aif_test_bool(AIF *, TestFlags);
int _aif_test_char(AIF *, TestFlags);
int _aif_test_int(AIF *, TestFlags);
int _aif_test_float(AIF *, TestFlags);
int _aif_test_array(AIF *, TestFlags);
int _aif_test_pointer(AIF *, TestFlags);
int _aif_test_region(AIF *, TestFlags);
int _aif_test_struct(AIF *, TestFlags);
int _aif_test_name(AIF *, TestFlags);
int _aif_test_reference(AIF *, TestFlags);
int _aif_test_string(AIF *, TestFlags);
int _aif_test_enum(AIF *, TestFlags);
int _aif_test_union(AIF *, TestFlags);
/*****************************************
*** Main Function ***
*****************************************/
int
main(int argc, char *argv[])
{
int c;
int tests = 0;
while ( (c = getopt(argc, argv, "123456")) != EOF )
{
switch ( c )
{
case '1':
tests |= TEST_SERIES_1;
break;
case '2':
tests |= TEST_SERIES_2;
break;
case '3':
tests |= TEST_SERIES_3;
break;
case '4':
tests |= TEST_SERIES_4;
break;
case '5':
tests |= TEST_SERIES_5;
break;
case '6':
tests |= TEST_SERIES_6;
break;
default:
fprintf(stderr, "usage: testaif [-1] [-2] [-3] [-4] [-5] [-6]\n");
exit(0);
}
}
if ( tests == 0 || tests & TEST_SERIES_1 )
TestAllConstructors();
if ( tests == 0 || tests & TEST_SERIES_2 )
TestAllAscii();
if ( tests == 0 || tests & TEST_SERIES_3 )
TestAllArithmetic();
if ( tests == 0 || tests & TEST_SERIES_4 )
TestAllCircularData();
if ( tests == 0 || tests & TEST_SERIES_5 )
TestAllEPS();
if ( tests == 0 || tests & TEST_SERIES_6 )
TestAllCompareByName();
fprintf(stdout, "\n****** END OF TEST ******\n");
return 0;
}
/*****************************************
*** Function Definitions ***
*****************************************/
void
TestAllConstructors()
{
AIF *aString, *aFloat, *aDouble, *anInt, *aPointer, *aStruct;
AIF *anArray, *anEnum, *aUnion;
TestFlags flag = all;
int min, max;
fprintf(stdout, "*********************************** \n");
fprintf(stdout, "*** TEST SERIES 1: constructors *** \n");
fprintf(stdout, "*********************************** \n\n");
aString = StringToAIF("hello, world!");
AIFTest("subtest1", aString, "string: hello, world!", flag);
aFloat = FloatToAIF(2);
AIFTest("subtest2", aFloat, "float: 2", flag);
aDouble = DoubleToAIF(0);
AIFTest("subtest3", aDouble, "double: 0", flag);
anInt = IntToAIF(16);
AIFTest("subtest4", anInt, "integer: 16", flag);
aPointer = PointerToAIF(NULL, anInt);
AIFTest("subtest5", aPointer, "a pointer", flag);
aPointer = PointerToAIF(NULL, aPointer);
AIFTest("subtest6", aPointer, "a double pointer", flag);
aStruct = EmptyStructToAIF("test_struct");
AIFTest("subtest7", aStruct, "empty struct", flag);
AIFAddFieldToStruct(aStruct, "field1", aFloat);
AIFTest("subtest8", aStruct, "with one field", flag);
AIFAddFieldToStruct(aStruct, "field2", IntToAIF(16));
AIFTest("subtest9", aStruct, "with two fields", flag);
AIFAddFieldToStruct(aStruct, "field3", aStruct);
AIFTest("subtest10", aStruct, "with three fields", flag);
min = 0; max = 9;
anArray = ArrayToAIF(1, &min, &max, "abcdefghij", 10, "c");
AIFTest("subtest11", anArray, "array of 10 chars", flag);
AIFAddFieldToStruct(aStruct, "field4", anArray);
AIFTest("subtest12", aStruct, "after the array is field 4", flag);
/* test a linked list: 1 -> 2 -> nil */
aStruct = EmptyStructToAIF("test_struct");
aStruct = NameAIF(aStruct, 0);
AIFAddFieldToStruct(aStruct, "value", IntToAIF(2));
AIFAddFieldToStruct(aStruct, "next", AIFNull(aStruct));
aPointer = PointerToAIF(NULL, aStruct);
aStruct = EmptyStructToAIF("test_struct");
AIFAddFieldToStruct(aStruct, "value", IntToAIF(1));
AIFAddFieldToStruct(aStruct, "next", aPointer);
aPointer = PointerToAIF(NULL, aStruct);
AIFTest("subtest13", aPointer, "linked list 1 -> 2 ", flag);
/* test an array of structs. */
{
char data[BUFSIZ], *dest;
int min=1, max=9, subMin = 1, subMax = 2;
int index;
int smallArray[2] = {1,2};
aStruct = EmptyStructToAIF("test_struct");
AIFAddFieldToStruct(aStruct, "a", FloatToAIF(2.1));
dest = data;
for (index = 0; index < 2; index++)
{
AIFNormalise(dest, sizeof(int), (char *)(smallArray+index), sizeof(int));
dest += sizeof(int);
}
anArray = ArrayToAIF(1, &subMin, &subMax, data, 2*sizeof(int),
AIF_FORMAT(IntToAIF(0)));
AIFAddFieldToStruct(aStruct, "b", anArray);
AIFTest("subtest14", aStruct, "underlying struct: {a=2.1 b=[1 2]}", flag);
dest = data;
for (index = min; index <= max; index++)
{
memcpy(dest, AIF_DATA(aStruct), AIF_LEN(aStruct));
dest += AIF_LEN(aStruct);
}
anArray = ArrayToAIF(1, &min, &max, data, (max-min+1)*AIF_LEN(aStruct), AIF_FORMAT(aStruct));
AIFTest("subtest15", anArray, "array of 9 underlying structs", flag);
}
anEnum = EmptyEnumToAIF("test_enum");
AIFTest("subtest16", anEnum, "empty enum", flag);
AIFAddConstToEnum(anEnum, "const1", IntToAIF(10));
AIFAddConstToEnum(anEnum, "const2", IntToAIF(20));
AIFAddConstToEnum(anEnum, "const3", IntToAIF(0));
AIFSetEnum(anEnum, "const1");
AIFTest("subtest17", anEnum, "enum: 10", flag);
aStruct = EmptyStructToAIF("test_enum");
AIFAddFieldToStruct(aStruct, "field1", anEnum);
AIFTest("subtest18", aStruct, "an enum in a struct", flag);
AIFSetEnum(anEnum, "const3");
aStruct = EmptyStructToAIF("test_enum");
AIFAddFieldToStruct(aStruct, "field1", anEnum);
AIFTest("subtest19", aStruct, "same struct but the enum is set to another value", flag);
AIFSetEnum(anEnum, "const2");
aPointer = PointerToAIF(NULL, anEnum);
aPointer = PointerToAIF(NULL, aPointer);
AIFAddFieldToStruct(aStruct, "field2", aPointer);
AIFTest("subtest20", aStruct, "field2 is a pointer to a pointer to an enum", flag);
/* test an array of enums. */
{
char data[BUFSIZ], *dest;
int min=1, max=15, index, val;
dest = data;
for (index = min; index <= max; index++)
{
val = rand() % 3;
switch (val)
{
case 0:
AIFSetEnum(anEnum, "const1");
break;
case 1:
AIFSetEnum(anEnum, "const2");
break;
case 2:
AIFSetEnum(anEnum, "const3");
break;
}
memcpy(dest, AIF_DATA(anEnum), AIF_LEN(anEnum));
dest += AIF_LEN(anEnum);
}
anArray = ArrayToAIF(1, &min, &max, data, (max-min+1)*AIF_LEN(anEnum), AIF_FORMAT(anEnum));
AIFTest("subtest21", anArray, "array of 15 underlying enums (random)", flag);
}
aUnion = EmptyUnionToAIF("test_union");
AIFTest("subtest22", aUnion, "empty union", flag);
AIFAddFieldToUnion(aUnion, "const1", "is4");
AIFAddFieldToUnion(aUnion, "const2", "is4");
AIFSetUnion(aUnion, "const1", IntToAIF(10));
AIFTest("subtest23", aUnion, "union: 10", flag);
aStruct = EmptyStructToAIF("test_struct");
AIFAddFieldToStruct(aStruct, "field1", IntToAIF(1));
AIFAddFieldToStruct(aStruct, "field2", StringToAIF("Hello World"));
AIFAddFieldToStruct(aStruct, "field3", IntToAIF(2));
AIFTest("subtest24", aStruct, "a struct: 1, Hello World, 2", flag);
/* Testing for a long string */
aString = StringToAIF("AIF0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789AIF");
AIFTest("subtest25", aString, "string: AIF100digitsAIF", flag);
fprintf(stdout, "\n");
}
void
_testAscii(char *tst, char *fds, char *data, char *msg, TestFlags flag)
{
AIF *toTest;
toTest = AsciiToAIF(fds, data);
AIFTest(tst, toTest, msg, flag);
AIFFree(toTest);
}
void
TestAllAscii()
{
TestFlags flag = all;
fprintf(stdout, "********************************** \n");
fprintf(stdout, "*** TEST SERIES 2: ascii input *** \n");
fprintf(stdout, "********************************** \n\n");
_testAscii("subtest1", "is4", "00000004", "4", flag);
_testAscii("subtest2", "f4", "3f8ccccd", "1.1", flag);
_testAscii("subtest3", "f8", "4005bf0a8b145769", "2.718281828459045235360287471352 (f8)", flag);
_testAscii("subtest4", "f16", "40005bf0a8b1457695355fb8ac404e7a", "2.718281828459045235360287471352662497 (f16)", flag);
_testAscii("subtest5", "{|a=is4,b=is4;;;}", "0000000200000003", "{a=2, b=3}", flag);
_testAscii("subtest6", "[r0..1is4]is4", "0000000200000003", "[2, 3]", flag);
_testAscii("subtest7", "%0/{|val=is4,next=^>0/,msg=^c;;;}", "00000003000163", "{val=3, next=nil, msg=^c}", flag);
_testAscii("subtest8", "%0/{|val=is4,next=^>0/,msg=^c;;;}", "0000000101000000020200000000000000030300000000016301620161", "a->b->c->self", flag);
_testAscii("subtest9", "[r0..1is4]%0/{|val=is4,next=^>0/,msg=^c;;;}", "00000001010000000202000000000000000303000000000163016201610000000203000000000162", "array of two lists of pointers", flag);
_testAscii("subtest10", "%0/{|val=is4,next=^>0/,msg=^c;;;}", "00000003020000000000000003030000000001630163", "{val=3, next=self, msg=^c}", flag);
_testAscii("subtest11", "s", "000b613a20686f20686f20686f", "a: ho ho ho", flag);
_testAscii("subtest12", "[r0..1is4]%0/{|val=is4,next=^>0/,msg=s;;;}", "0000000101000000020200000000000000030300000000000b633a20686f20686f20686f000b623a20686f20686f20686f000b613a20686f20686f20686f000000020300000000000b623a20686f20686f20686f", "d[,]", flag);
_testAscii("subtest13", "[r0..99is4]^%0/{|name=s,data=is4,next=^>0/}", "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "empty hash table", flag);
_testAscii("subtest14", "[r0..99is4]^%0/{|name=s,data=is4,next=^>0/;;;}", "00000000000000000000000000000000000100057468657265000000010000000000010005746865726500000001000000000000000000010002686900000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "hash table containing hi, there, there", flag);
_testAscii("subtest15", "[r0..1is4]%0/{|val=is4,next=^>0/,msg=s;;;}", "0011111101000000020200000111000000030300000111000b633a20686f20686f20686f000b623a20686f20686f20616f000b613a20686f20686f20686f000000020300000111000b623a20686f20686f20686f", "d[,]", flag);
_testAscii("subtest16", "%0/{|val=is4,next=^>0/,msg=^c;;;}", "0000000101000000020200000133000000030300000133016301620161", "a->b->c->self", flag);
_testAscii("subtest17", "[r0..1is4]%0/{|val=is4,next=^>0/,msg=^c;;;}", "00000001010000000202000001330000000303000001330163016201610000000203000001330162", "array of two lists of pointers", flag);
_testAscii("subtest18", "[r0..2is4][r0..1is4]is4", "000000060000000700000002000000030000000400000005", "array of two lists of pointers", flag);
_testAscii("subtest19", "v4", "00000006", "void", flag);
_testAscii("subtest20", "&is4,^^c/is4", "6D61696E00", "function with args (int, char **) returning int", flag);
fprintf(stdout, "\n");
}
void
_testArithmetic(char *msg1, AIF *a, char *msg2, TestFlags flag, AIF *b)
{
flag.AIFAdd = b;
flag.AIFSub = flag.AIFMul = flag.AIFDiv = flag.AIFRem = flag.AIFAdd;
flag.AIFAnd = flag.AIFOr = flag.AIFAdd;
AIFTestInt(msg1, a, msg2, flag);
}
void
TestAllArithmetic()
{
AIF *anEnum1, *anEnum2, *aStruct1, *aStruct2;
TestFlags flag = none;
flag.AIFNeg = 1;
flag.AIFNot = 1;
fprintf(stdout, "********************************* \n");
fprintf(stdout, "*** TEST SERIES 3: arithmetic *** \n");
fprintf(stdout, "********************************* \n\n");
_testArithmetic("subtest1", IntToAIF(16), "16 and 17", flag, IntToAIF(17));
_testArithmetic("subtest2", IntToAIF(18), "18 and 17", flag, IntToAIF(17));
_testArithmetic("subtest3", IntToAIF(0), "0 and -1", flag, IntToAIF(-1));
_testArithmetic("subtest4", IntToAIF(-1), "-1 and -1", flag, IntToAIF(-1));
_testArithmetic("subtest5", IntToAIF(1073741824L), "1073741824L and 1073741825L", flag, IntToAIF(1073741825L));
_testArithmetic("subtest6", LongestToAIF(1073741824L), "1073741824L and 1073741825L", flag, LongestToAIF(1073741825L));
_testArithmetic("subtest7", LongestToAIF(7L), "7L and 3", flag, IntToAIF(3));
_testArithmetic("subtest8", FloatToAIF(3.0), "3.0 and 1.5", flag, FloatToAIF(1.5));
_testArithmetic("subtest9", FloatToAIF(7.0), "7.0 and 3", flag, IntToAIF(3));
_testArithmetic("subtest10", IntToAIF(3), "3 and 7.0", flag, FloatToAIF(7.0));
anEnum1 = EmptyEnumToAIF("test_enum1");
anEnum2 = EmptyEnumToAIF("test_enum2");
AIFAddConstToEnum(anEnum1, "const1", IntToAIF(16));
AIFAddConstToEnum(anEnum1, "const2", IntToAIF(18));
AIFAddConstToEnum(anEnum2, "const1", IntToAIF(17));
AIFAddConstToEnum(anEnum2, "const2", IntToAIF(17));
AIFSetEnum(anEnum1, "const1");
AIFSetEnum(anEnum2, "const1");
_testArithmetic("subtest11", anEnum1, "anEnum1 and anEnum2", flag, anEnum2);
aStruct1 = EmptyStructToAIF("test_struct1");
aStruct2 = EmptyStructToAIF("test_struct2");
AIFAddFieldToStruct(aStruct1, "field1", IntToAIF(16));
AIFAddFieldToStruct(aStruct1, "field2", IntToAIF(18));
AIFAddFieldToStruct(aStruct2, "field1", IntToAIF(17));
AIFAddFieldToStruct(aStruct2, "field2", IntToAIF(17));
_testArithmetic("subtest12", aStruct1, "aStruct1 and aStruct2", flag, aStruct2);
aStruct1 = EmptyStructToAIF("test_struct1");
aStruct2 = EmptyStructToAIF("test_struct2");
AIFAddFieldToStruct(aStruct1, "field1", IntToAIF(18));
AIFAddFieldToStruct(aStruct1, "field2", anEnum1);
AIFAddFieldToStruct(aStruct2, "field1", IntToAIF(17));
AIFAddFieldToStruct(aStruct2, "field2", anEnum2);
_testArithmetic("subtest13", aStruct1, "aStruct1 and aStruct2", flag, aStruct2);
_testArithmetic("subtest14", anEnum1, "anEnum1 and 17", flag, IntToAIF(17));
_testArithmetic("subtest15", anEnum1, "anEnum1 and 17", flag, FloatToAIF(17));
_testArithmetic("subtest16", IntToAIF(17), "17 and anEnum1", flag, anEnum1);
_testArithmetic("subtest17", FloatToAIF(17), "17 and anEnum1", flag, anEnum1);
{
char data[BUFSIZ], *dest;
int min=1, max=2;
AIF *anArray1, *anArray2;
AIF *anInt1 = IntToAIF(10);
AIF *anInt2 = IntToAIF(20);
dest = data;
memcpy(dest, AIF_DATA(anInt1), AIF_LEN(anInt1));
dest += AIF_LEN(anInt1);
memcpy(dest, AIF_DATA(anInt1), AIF_LEN(anInt1));
dest += AIF_LEN(anInt1);
anArray1 = ArrayToAIF(1, &min, &max, data, (max-min+1)*AIF_LEN(anInt1), AIF_FORMAT(anInt1));
dest = data;
memcpy(dest, AIF_DATA(anInt2), AIF_LEN(anInt2));
dest += AIF_LEN(anInt2);
memcpy(dest, AIF_DATA(anInt2), AIF_LEN(anInt2));
dest += AIF_LEN(anInt2);
anArray2 = ArrayToAIF(1, &min, &max, data, (max-min+1)*AIF_LEN(anInt2), AIF_FORMAT(anInt2));
_testArithmetic("subtest18", anArray1, "anArray1 and anArray2", flag, anArray2);
}
{
char data[BUFSIZ], *dest;
int min=1, max=2;
AIF *anArray1, *anArray2;
dest = data;
AIFSetEnum(anEnum1, "const1");
memcpy(dest, AIF_DATA(anEnum1), AIF_LEN(anEnum1));
dest += AIF_LEN(anEnum1);
AIFSetEnum(anEnum1, "const2");
memcpy(dest, AIF_DATA(anEnum1), AIF_LEN(anEnum1));
dest += AIF_LEN(anEnum1);
anArray1 = ArrayToAIF(1, &min, &max, data, (max-min+1)*AIF_LEN(anEnum1), AIF_FORMAT(anEnum1));
dest = data;
AIFSetEnum(anEnum2, "const1");
memcpy(dest, AIF_DATA(anEnum2), AIF_LEN(anEnum2));
dest += AIF_LEN(anEnum2);
AIFSetEnum(anEnum2, "const2");
memcpy(dest, AIF_DATA(anEnum2), AIF_LEN(anEnum2));
dest += AIF_LEN(anEnum2);
anArray2 = ArrayToAIF(1, &min, &max, data, (max-min+1)*AIF_LEN(anEnum2), AIF_FORMAT(anEnum2));
_testArithmetic("subtest19", anArray1, "anArray1 and anArray2", flag, anArray2);
}
{
char data[BUFSIZ], *dest;
int min=1, max=2;
AIF *anArray1, *anArray2;
AIF *anInt = IntToAIF(3);
AIF *aFloat = FloatToAIF(7);
dest = data;
memcpy(dest, AIF_DATA(anInt), AIF_LEN(anInt));
dest += AIF_LEN(anInt);
memcpy(dest, AIF_DATA(anInt), AIF_LEN(anInt));
dest += AIF_LEN(anInt);
anArray1 = ArrayToAIF(1, &min, &max, data, (max-min+1)*AIF_LEN(anInt), AIF_FORMAT(anInt));
dest = data;
memcpy(dest, AIF_DATA(aFloat), AIF_LEN(aFloat));
dest += AIF_LEN(aFloat);
memcpy(dest, AIF_DATA(aFloat), AIF_LEN(aFloat));
dest += AIF_LEN(aFloat);
anArray2 = ArrayToAIF(1, &min, &max, data, (max-min+1)*AIF_LEN(aFloat), AIF_FORMAT(aFloat));
_testArithmetic("subtest20", anArray1, "anArray1 and anArray2", flag, anArray2);
}
aStruct1 = EmptyStructToAIF("test_struct1");
aStruct2 = EmptyStructToAIF("test_struct2");
AIFAddFieldToStruct(aStruct1, "field1", IntToAIF(10));
AIFAddFieldToStruct(aStruct1, "field2", IntToAIF(10));
AIFAddFieldToStruct(aStruct2, "field1", FloatToAIF(7));
AIFAddFieldToStruct(aStruct2, "field2", FloatToAIF(7));
_testArithmetic("subtest21", aStruct1, "aStruct1 and aStruct2", flag, aStruct2);
_testArithmetic("subtest22", UnsignedIntToAIF(16), "unsigned 16 and unsigned 17", flag, UnsignedIntToAIF(17));
_testArithmetic("subtest23", UnsignedIntToAIF(18), "unsigned 18 and unsigned 17", flag, UnsignedIntToAIF(17));
_testArithmetic("subtest24", UnsignedIntToAIF(0), "unsigned 0 and unsigned -1", flag, UnsignedIntToAIF(-1));
_testArithmetic("subtest25", UnsignedIntToAIF(-1), "unsigned -1 and unsigned -1", flag, UnsignedIntToAIF(-1));
_testArithmetic("subtest26", UnsignedIntToAIF(1073741824L), "unsigned 1073741824L and unsigned 1073741825L", flag, UnsignedIntToAIF(1073741825L));
fprintf(stdout, "\n");
}
void
_testCircularData(char * msg, AIF *a, AIF *b, TestFlags flag)
{
TestFlags f = flag;
char txt[BUFSIZ];
AIFTest(msg, a, "(a) with depth = 0", f);
AIFTest(msg, b, "(b) with depth = 0", f);
for (f.D_AIFPrint = -2; f.D_AIFPrint <= flag.D_AIFPrint; f.D_AIFPrint++)
{
if (f.D_AIFPrint == 0) continue;
sprintf(txt, "(a) with depth = %d", f.D_AIFPrint);
AIFTest(">>>>>>>>", a, txt, f);
sprintf(txt, "(b) with depth = %d", f.D_AIFPrint);
AIFTest(">>>>>>>>", b, txt, f);
}
_testArithmetic("\n\narithmetic", a, "(a) and (b)", flag, b);
f = none;
f.AIFDiff = b;
AIFTest("\n\nAIFDiff", a, "AIFDiff(a, b)", f);
printf("\n----------------------------------\n\n");
}
void
TestAllCircularData()
{
AIF *a, *b;
TestFlags flag = none;
fprintf(stdout, "************************************ \n");
fprintf(stdout, "*** TEST SERIES 4: circular data *** \n");
fprintf(stdout, "************************************ \n\n");
a = AsciiToAIF((char *)strdup("^%0/{|a=is4,b=^>0/,c=is4;;;}"), (char *)strdup("02000000000000000a03000000000000000a"));
b = AsciiToAIF((char *)strdup("^%0/{|a=is4,b=^>0/,c=is4;;;}"), (char *)strdup("02000000000000000b03000000000000000c"));
flag.D_AIFPrint = 3;
_testCircularData("subtest1", a, b, flag);
a = AsciiToAIF((char *)strdup("^%0/{|a=is4,b=^>0/,c=is4;;;}"), (char *)strdup("02000000000000000a01000000140300000000000000150000000b"));
b = AsciiToAIF((char *)strdup("^%0/{|a=is4,b=^>0/,c=is4;;;}"), (char *)strdup("02000000000000000b01000000160300000000000000180000000f"));
flag.D_AIFPrint = 4;
_testCircularData("subtest2", a, b, flag);
a = AsciiToAIF((char *)strdup("^%0/{|a=is4,b=^>0/,c=^%1/{|a=is4,b=^>0/,c=^>1/,d=is4;;;},d=is4;;;}"), (char *)strdup("02000000000000000a010000001400010000001e0300000000000000001e00000014000000000a"));
b = AsciiToAIF((char *)strdup("^%0/{|a=is4,b=^>0/,c=^%1/{|a=is4,b=^>0/,c=^>1/,d=is4;;;},d=is4;;;}"), (char *)strdup("02000000000000000b01000000170001000000230300000000000000002400000018000000000c"));
flag.D_AIFPrint = 5;
_testCircularData("subtest3", a, b, flag);
a = AsciiToAIF((char *)strdup("^%0/{|a=is4,b=^>0/,c=^%1/{|a=is4,b=^>0/,c=^>1/,d=is4;;;},d=is4;;;}"), (char *)strdup("02000000000000000a0100000014010000001e00010000002800010000003200010000003c0300000000000000003c00000032000000280000001e0000000014000000000a"));
b = AsciiToAIF((char *)strdup("^%0/{|a=is4,b=^>0/,c=^%1/{|a=is4,b=^>0/,c=^>1/,d=is4;;;},d=is4;;;}"), (char *)strdup("02000000000000000a0100000014010000001e00010000002800010000003200010000003c0300000000000000003c00000032000000280000001e0000000014000000000a"));
flag.D_AIFPrint = 7;
_testCircularData("subtest4", a, b, flag);
}
void
_testEPS(AIF *lo, AIF *hi, AIF *a)
{
int val;
int ret;
ret = AIFEPS(lo, hi, a, &val);
if (ret == 0)
{
printf("AIFEPS(lo = ");
AIFPrint(stdout, 0, lo);
printf(", hi = ");
AIFPrint(stdout, 0, hi);
printf(", a = ");
AIFPrint(stdout, 0, a);
printf("): val = %d\n", val);
}
else
printf("*** ERROR *** : %s\n", AIFErrorStr());
}
void
TestAllEPS()
{
AIF * a;
AIF * lo;
AIF * hi;
fprintf(stdout, "********************************** \n");
fprintf(stdout, "*** TEST SERIES 5: AIFEPS *** \n");
fprintf(stdout, "********************************** \n\n");
//AIF_BOOLEAN
printf("\n>>>>>>> BOOLEAN\n");
a = BoolToAIF(0); lo = BoolToAIF(0); hi = BoolToAIF(1);
_testEPS(lo, hi, a);
_testEPS(a, lo, hi);
_testEPS(hi, a, lo);
AIFFree(a); AIFFree(lo); AIFFree(hi);
//AIF_INTEGER
printf("\n>>>>>>> INTEGER\n");
a = IntToAIF(5); lo = IntToAIF(3); hi = IntToAIF(8);
_testEPS(lo, hi, a);
_testEPS(a, lo, hi);
_testEPS(hi, a, lo);
AIFFree(a); AIFFree(lo); AIFFree(hi);
//AIF_CHARACTER
printf("\n>>>>>>> CHARACTER\n");
a = CharToAIF('c'); lo = CharToAIF('b'); hi = CharToAIF('d');
_testEPS(lo, hi, a);
_testEPS(a, lo, hi);
_testEPS(hi, a, lo);
AIFFree(a); AIFFree(lo); AIFFree(hi);
//AIF_ENUM
printf("\n>>>>>>> ENUM\n");
a = EmptyEnumToAIF("test_enum");
AIFAddConstToEnum(a, "const1", IntToAIF(10));
AIFAddConstToEnum(a, "const2", IntToAIF(20));
AIFAddConstToEnum(a, "const3", IntToAIF(15));
AIFSetEnum(a, "const3");
lo = EmptyEnumToAIF(NULL);
AIFAddConstToEnum(lo, "const1", IntToAIF(10));
AIFAddConstToEnum(lo, "const2", IntToAIF(20));
AIFAddConstToEnum(lo, "const3", IntToAIF(15));
AIFSetEnum(lo, "const1");
hi = EmptyEnumToAIF(NULL);
AIFAddConstToEnum(hi, "const1", IntToAIF(10));
AIFAddConstToEnum(hi, "const2", IntToAIF(20));
AIFAddConstToEnum(hi, "const3", IntToAIF(15));
AIFSetEnum(hi, "const2");
_testEPS(lo, hi, a);
_testEPS(a, lo, hi);
_testEPS(hi, a, lo);
AIFFree(a); AIFFree(lo); AIFFree(hi);
a = EmptyEnumToAIF("test_enum");
AIFAddConstToEnum(a, "const1a", IntToAIF(10));
AIFAddConstToEnum(a, "const2a", IntToAIF(20));
AIFAddConstToEnum(a, "const3a", IntToAIF(15));
AIFSetEnum(a, "const3a");
lo = EmptyEnumToAIF(NULL);
AIFAddConstToEnum(lo, "const1lo", IntToAIF(10));
AIFAddConstToEnum(lo, "const2lo", IntToAIF(20));
AIFAddConstToEnum(lo, "const3lo", IntToAIF(15));
AIFSetEnum(lo, "const1lo");
hi = EmptyEnumToAIF(NULL);
AIFAddConstToEnum(hi, "const1hi", IntToAIF(10));
AIFAddConstToEnum(hi, "const2hi", IntToAIF(20));
AIFAddConstToEnum(hi, "const3hi", IntToAIF(15));
AIFSetEnum(hi, "const2hi");
_testEPS(lo, hi, a);
_testEPS(a, lo, hi);
_testEPS(hi, a, lo);
AIFFree(a); AIFFree(lo); AIFFree(hi);
//AIF_STRING
printf("\n>>>>>>> STRING\n");
a = StringToAIF("b");
lo = StringToAIF("a");
hi = StringToAIF("c");
_testEPS(lo, hi, a);
_testEPS(a, lo, hi);
_testEPS(hi, a, lo);
AIFFree(a); AIFFree(lo); AIFFree(hi);
//AIF_FLOATING
printf("\n>>>>>>> FLOAT\n");
a = FloatToAIF(5); lo = FloatToAIF(3); hi = FloatToAIF(8);
_testEPS(lo, hi, a);
_testEPS(a, lo, hi);
_testEPS(hi, a, lo);
AIFFree(a); AIFFree(lo); AIFFree(hi);
a = DoubleToAIF(5); lo = DoubleToAIF(3); hi = DoubleToAIF(8);
_testEPS(lo, hi, a);
_testEPS(a, lo, hi);
_testEPS(hi, a, lo);
AIFFree(a); AIFFree(lo); AIFFree(hi);
//AIF_ARRAY
printf("\n>>>>>>> ARRAY\n");
{
char data[BUFSIZ], *dest;
int index, submin, submax;
int smallArray[5] = {3,4,5,6,7};
dest = data;
submin = 1;
submax = 5;
for (index = 0; index < 5; index++)
{
AIFNormalise(dest, sizeof(int), (char *) (smallArray+index), sizeof(int));
dest += sizeof(int);
}
a = ArrayToAIF(1, &submin, &submax, data, 5*sizeof(int), AIF_FORMAT(IntToAIF(0)));
}
lo = IntToAIF(10);
hi = IntToAIF(20);
_testEPS(lo, hi, a);
AIFFree(lo); AIFFree(hi);
lo = IntToAIF(1);
hi = IntToAIF(20);
_testEPS(lo, hi, a);
AIFFree(lo); AIFFree(hi);
lo = IntToAIF(1);
hi = IntToAIF(2);
_testEPS(lo, hi, a);
AIFFree(lo); AIFFree(hi);
AIFFree(a);
//AIF_STRUCT
printf("\n>>>>>>> STRUCT\n");
{
a = EmptyStructToAIF("test_struct");
AIFAddFieldToStruct(a, "val1", IntToAIF(11));
AIFAddFieldToStruct(a, "val2", IntToAIF(12));
AIFAddFieldToStruct(a, "val3", IntToAIF(13));
}
lo = IntToAIF(18);
hi = IntToAIF(20);
_testEPS(lo, hi, a);
AIFFree(lo); AIFFree(hi);
lo = IntToAIF(1);
hi = IntToAIF(20);
_testEPS(lo, hi, a);
AIFFree(lo); AIFFree(hi);
lo = IntToAIF(1);
hi = IntToAIF(2);
_testEPS(lo, hi, a);
AIFFree(lo); AIFFree(hi);
AIFFree(a);
//AIF_POINTER
printf("\n>>>>>>> POINTER\n");
a = IntToAIF(5); lo = IntToAIF(3); hi = IntToAIF(8);
a = PointerToAIF(NULL, a);
_testEPS(lo, hi, a);
AIFFree(lo); AIFFree(hi);
lo = IntToAIF(1);
hi = IntToAIF(2);
_testEPS(lo, hi, a);
AIFFree(lo); AIFFree(hi);
lo = IntToAIF(6);
hi = IntToAIF(7);
_testEPS(lo, hi, a);
AIFFree(lo); AIFFree(hi);
AIFFree(a);
}
void
_testCompareByName(int dep, AIF *a, AIF *b, char *method)
{
AIF * c;
int res;
if (strcmp(method, "AIFDiff") == 0)
{
c = AIFDiff(dep, a, b);
if (c == NULL)
printf("*** ERROR *** : %s\n", AIFErrorStr());
else
{
printf("a = ");
AIFPrint(stdout, 0, a);
printf("\nb = ");
AIFPrint(stdout, 0, b);
printf("\nAIFDiff(depth = %d, a, b) = c = ", dep);
AIFPrint(stdout, 0, c);
printf("\n\n");
AIFFree(c);
}
}
else if (strcmp(method, "AIFCompare") == 0)
{
if (AIFCompare(dep, a, b, &res) < 0)
printf("*** ERROR *** : %s\n", AIFErrorStr());
else
{
printf("a = ");
AIFPrint(stdout, 0, a);
printf("\nb = ");
AIFPrint(stdout, 0, b);
printf("\nAIFCompare(depth = %d, a, b) = ", dep);
printf("%d\n\n", res);
}
}
else
return;
}
void
TestAllCompareByName()
{
AIF * a;
AIF * b;
AIFSetOption(AIFOPT_CMP_METHOD, AIF_CMP_BY_NAME);
fprintf(stdout, "************************************** \n");
fprintf(stdout, "*** TEST SERIES 6: compare by name *** \n");
fprintf(stdout, "************************************** \n\n");
a = AsciiToAIF("{|a=is4,b=s;;;}", "0000000400026363");
b = AsciiToAIF("{|b=s,a=is4;;;}", "0002646400000002");
_testCompareByName(0, a, b, "AIFDiff");
AIFFree(a); AIFFree(b);
a = AsciiToAIF("^%0/{|c=is4,b=^>0/,a=is4;;;}", "02000000000000000a01000000140300000000000000150000000b");
b = AsciiToAIF("^%2/{|a=is4,b=^>2/,c=is4;;;}", "02000000000000000b01000000160300000000000000180000000f");
_testCompareByName(0, a, b, "AIFDiff");
_testCompareByName(1, a, b, "AIFDiff");
_testCompareByName(2, a, b, "AIFDiff");
_testCompareByName(3, a, b, "AIFDiff");
AIFFree(a); AIFFree(b);
a = AsciiToAIF("^%0/{|a=is4,b=^>0/,c=^%1/{|a=is4,b=^>0/,c=^>1/,d=is4;;;},d=is4;;;}", "02000000000000000a010000001400010000001e0300000000000000001e00000014000000000a");
b = AsciiToAIF("^%2/{|d=is4,b=^>2/,c=^%3/{|d=is4,b=^>2/,c=^>3/,a=is4;;;},a=is4;;;}", "02000000000000000b01000000170001000000230300000000000000002400000018000000000c");
_testCompareByName(0, a, b, "AIFDiff");
_testCompareByName(1, a, b, "AIFDiff");
_testCompareByName(2, a, b, "AIFDiff");
_testCompareByName(3, a, b, "AIFDiff");
AIFFree(a); AIFFree(b);
/* This one works even though b will be rearranged to
** "{|a=is4,c=>0/,b=%0/is4;;;}" since
** _fds_resolve() in _fds_skip_data() is called before the
** rearrangement
*/
a = AsciiToAIF("{|a=is4,c=is4,b=is4;;;}", "0000000b0000001500000016");
b = AsciiToAIF("{|a=is4,b=%0/is4,c=>0/;;;}", "0000000a0000001400000015");
_testCompareByName(0, a, b, "AIFDiff");
AIFFree(a); AIFFree(b);
a = AsciiToAIF("{|a=is4,b=s;;;}", "0000000400026363");
b = AsciiToAIF("{|b=s,a=is4;;;}", "0002636300000004");
_testCompareByName(0, a, b, "AIFCompare");
AIFFree(a); AIFFree(b);
a = AsciiToAIF("{|a=is4,c=is4,b=is4;;;}", "0000000b0000001500000016");
b = AsciiToAIF("{|a=is4,b=%0/is4,c=>0/;;;}", "0000000b0000001600000015");
_testCompareByName(0, a, b, "AIFCompare");
AIFFree(a); AIFFree(b);
a = AsciiToAIF("^%0/{|a=is4,b=^>0/,c=^%1/{|a=is4,b=^>0/,c=^>1/,d=is4;;;},d=is4;;;}", "02000000000000000b010000001400010000001e0300000000000000001e00000014000000000a");
b = AsciiToAIF("^%2/{|d=is4,b=^>2/,c=^%3/{|d=is4,b=^>2/,c=^>3/,a=is4;;;},a=is4;;;}", "02000000000000000a01000000170001000000230300000000000000002400000018000000000b");
_testCompareByName(0, a, b, "AIFCompare");
_testCompareByName(1, a, b, "AIFCompare");
AIFFree(a); AIFFree(b);
AIFSetOption(AIFOPT_CMP_METHOD, AIF_CMP_BY_POSITION);
}
/*
* There are some test codes that share the same code in this file,
* thus probably we can replace the similarities with C macros. However,
* macros can make the code hard to read whereas we want a simple
* test functions (to avoid the testing of the test functions)
*/
int
AIFTest(char *title, AIF *a, char *msg, TestFlags f)
{
int ret;
if ( title != NULL )
fprintf(stdout, "%s > ", title);
if ( msg != NULL )
fprintf(stdout, "%s:", msg);
fprintf(stdout, "\n\tAIFPrint: ");
if (AIFPrint(stdout, f.D_AIFPrint, a) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(a));
ret = _aif_test(a, f);
fprintf(stdout, "\n");
return ret;
}
int
_aif_test(AIF *a, TestFlags f)
{
//char * tmp;
//_fds_resolve(fds);
_aif_test_general(a, f);
switch ( AIFType(a) )
{
case AIF_BOOLEAN:
return _aif_test_bool(a, f);
case AIF_CHARACTER:
return _aif_test_char(a, f);
case AIF_INTEGER:
return _aif_test_int(a, f);
case AIF_FLOATING:
return _aif_test_float(a, f);
case AIF_ARRAY:
return _aif_test_array(a, f);
case AIF_POINTER:
return _aif_test_pointer(a, f);
case AIF_REGION:
return _aif_test_region(a, f);
case AIF_STRUCT:
return _aif_test_struct(a, f);
case AIF_NAME:
return _aif_test_name(a, f);
case AIF_REFERENCE:
//tmp = (char *) _fds_lookup(fds);
//return _aif_test(fp, depth, &tmp, data);
case AIF_STRING:
return _aif_test_string(a, f);
case AIF_ENUM:
return _aif_test_enum(a, f);
case AIF_UNION:
return _aif_test_union(a, f);
case AIF_FUNCTION:
case AIF_VOID:
default:
fprintf(stdout, "Unsupported Type\n");
break;
}
return -1;
}
int
_aif_test_general(AIF *a, TestFlags f)
{
int zeroVal, compareVal;
AIF * result;
// Test AIFIsZero
if (f.AIFIsZero == 1){
if (AIFIsZero(a, &zeroVal))
fprintf(stdout, "\n\tAIFIsZero ERROR: trouble checking against zero: %s", AIFErrorStr());
else
fprintf(stdout, "\n\tAIFIsZero: %sequal to zero", zeroVal ? "" : "not ");
}
// Test AIFCompare
if (f.AIFCompare == 1){
if (AIFCompare(0, a, a, &compareVal))
fprintf(stdout, "\n\tAIFCompare (a,a) ERROR: trouble comparing against self: %s", AIFErrorStr());
else if (compareVal)
fprintf(stdout, "\n\tAIFCompare (a,a) ERROR: not equal to itself");
else
fprintf(stdout, "\n\tAIFCompare (a,a): OK");
}
// Test AIFTypeCompare
if (f.AIFTypeCompare == 1){
if (!AIFTypeCompare(a, a))
fprintf(stdout, "\n\tAIFTypeCompare (a,a) ERROR: not the same type as itself");
else
fprintf(stdout, "\n\tAIFTypeCompare (a,a): OK");
}
// Test AIFDiff
if (f.AIFDiff != NULL){
if ( f.AIFDiff == (AIF*)SELF )
result = AIFDiff(0, a, a);
else
result = AIFDiff(0, a, f.AIFDiff);
if ( result != NULL )
{
fprintf(stdout, "\n\tAIFDiff (a,a or f.AIFDiff): ");
if (AIFPrint(stdout, 0, result) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(result));
}
else
fprintf(stdout, "\n\tAIFDiff (a,a or f.AIFDiff) ERROR: %s", AIFErrorStr());
}
return 0;
}
int
_aif_test_bool(AIF *a, TestFlags f)
{
AIF * result;
// Test AIFAnd
if (f.AIFAnd != NULL){
if ( f.AIFAnd == (AIF*)SELF )
result = AIFAnd(a,a);
else
result = AIFAnd(a, f.AIFAnd);
if ( result != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFAnd (a, a or f.AIFAnd): ");
if (AIFPrint(stdout, 0, result) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(result));
AIFFree(result);
}
else
fprintf(stdout, "\n\tAIFAnd (a, a or f.AIFAnd) ERROR: %s", AIFErrorStr());
}
// Test AIFOr
if (f.AIFOr != NULL){
if ( f.AIFOr == (AIF*)SELF )
result = AIFOr(a,a);
else
result = AIFOr(a, f.AIFOr);
if ( result != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFOr (a, a or f.AIFOr): ");
if (AIFPrint(stdout, 0, result) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(result));
AIFFree(result);
}
else
fprintf(stdout, "\n\tAIFOr (a, a or f.AIFOr) ERROR: %s", AIFErrorStr());
}
// Test AIFNeg
if (f.AIFNeg == 1){
result = AIFNeg(a);
if ( result != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFNeg: ");
if (AIFPrint(stdout, 0, result) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(result));
AIFFree(result);
}
else
fprintf(stdout, "\n\tAIFNeg ERROR: %s", AIFErrorStr());
}
// Test AIFNot
if (f.AIFNot == 1){
result = AIFNot(a);
if ( result != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFNot: ");
if (AIFPrint(stdout, 0, result) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(result));
AIFFree(result);
}
else
fprintf(stdout, "\n\tAIFNot ERROR: %s", AIFErrorStr());
}
return 0;
}
int
_aif_test_char(AIF *a, TestFlags f)
{
_aif_test_bool(a, f);
return 0;
}
int
_aif_test_int(AIF *a, TestFlags f)
{
AIF * result;
_aif_test_bool(a, f);
// Test AIFAdd
if (f.AIFAdd != NULL){
if ( f.AIFAdd == (AIF*)SELF )
result = AIFAdd(a,a);
else
result = AIFAdd(a, f.AIFAdd);
if ( result != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFAdd (a, a or f.AIFAdd): ");
if (AIFPrint(stdout, 0, result) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(result));
AIFFree(result);
}
else
fprintf(stdout, "\n\tAIFAdd (a, a or f.AIFAdd) ERROR: %s", AIFErrorStr());
}
// Test AIFSub
if (f.AIFSub != NULL){
if (f.AIFSub == (AIF*)SELF)
result = AIFSub(a,a);
else
result = AIFSub(a, f.AIFSub);
if ( result != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFSub (a, a or f.AIFSub): ");
if (AIFPrint(stdout, 0, result) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(result));
AIFFree(result);
}
else
fprintf(stdout, "\n\tAIFSub (a, a or f.AIFSub) ERROR: %s", AIFErrorStr());
}
// Test AIFMul
if (f.AIFMul != NULL){
if ( f.AIFMul == (AIF*)SELF)
result = AIFMul(a,a);
else
result = AIFMul(a, f.AIFMul);
if ( result != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFMul (a, a or f.AIFMul): ");
if (AIFPrint(stdout, 0, result) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(result));
AIFFree(result);
}
else
fprintf(stdout, "\n\tAIFMul (a, a or f.AIFMul) ERROR: %s", AIFErrorStr());
}
// Test AIFDiv
if (f.AIFDiv != NULL){
if (f.AIFDiv == (AIF*)SELF)
result = AIFDiv(a,a);
else
result = AIFDiv(a, f.AIFDiv);
if ( result != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFDiv (a, a or f.AIFDiv): ");
if (AIFPrint(stdout, 0, result) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(result));
AIFFree(result);
}
else
fprintf(stdout, "\n\tAIFDiv (a, a or f.AIFDiv) ERROR: %s", AIFErrorStr());
}
// Test AIFRem
if (f.AIFRem != NULL){
if (f.AIFRem == (AIF*)SELF)
result = AIFRem(a,a);
else
result = AIFRem(a, f.AIFRem);
if ( result != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFRem (a, a or f.AIFRem): ");
if (AIFPrint(stdout, 0, result) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(result));
AIFFree(result);
}
else
fprintf(stdout, "\n\tAIFRem (a, a or f.AIFRem) ERROR: %s", AIFErrorStr());
}
return 0;
}
int
_aif_test_float(AIF *a, TestFlags f)
{
_aif_test_int(a, f);
return 0;
}
int
_aif_test_array(AIF *a, TestFlags f)
{
int tmp1;
char * tmp2;
int tmp3;
AIFIndex * tmp4;
AIFIndex * ix;
AIF * ax;
ix = AIFArrayIndexInit(a);
if (ix == NULL)
{
fprintf(stdout, "\n\tAIFArrayIndexInit FATAL ERROR: %s", AIFErrorStr());
exit(100);
}
// Test AIFArrayRank
if (f.AIFArrayRank == 1){
if ( (tmp1 = AIFArrayRank(a)) < 0)
fprintf(stdout, "\n\tAIFArrayRank ERROR: %s", AIFErrorStr());
else
fprintf(stdout, "\n\tAIFArrayRank: %d", tmp1);
}
// Test AIFArrayInfo
if (f.AIFArrayInfo == 1){
if ( AIFArrayInfo(a, &tmp1, &tmp2, &tmp3) )
fprintf(stdout, "\n\tAIFArrayInfo ERROR: %s", AIFErrorStr());
else
{
fprintf(stdout, "\n\tAIFArrayInfo: rank (%d), type (%s), type_id (%d)", tmp1, tmp2, tmp3);
_aif_free(tmp2);
}
}
// Test AIFArrayBounds
if (f.AIFArrayBounds == 1){
int *min, *max, *size;
if ( AIFArrayBounds(a, ix->i_rank, &min, &max, &size) < 0 )
fprintf(stdout, "\n\tAIFArrayBounds ERROR: %s", AIFErrorStr());
else
{
fprintf(stdout, "\n\tAIFArrayBounds: ");
for ( tmp3 = 0; tmp3 < ix->i_rank; tmp3++)
fprintf(stdout, "[rank:%d min:%d max:%d size:%d] ",
tmp3, min[tmp3], max[tmp3], size[tmp3]);
_aif_free(min);
_aif_free(max);
_aif_free(size);
}
}
// Test AIFArrayIndexType
if (f.AIFArrayIndexType == 1){
if ( (tmp2 = AIFArrayIndexType(a)) == NULL )
fprintf(stdout, "\n\tAIFArrayIndexType ERROR: %s", AIFErrorStr());
else
{
fprintf(stdout, "\n\tAIFArrayIndexType: %s", tmp2);
_aif_free(tmp2);
}
}
// Test AIFArrayMinIndex
if (f.AIFArrayMinIndex == 1){
for ( tmp1 = 0 ; tmp1 < ix->i_rank ; tmp1++ )
{
if ( (tmp3 = AIFArrayMinIndex(a, tmp1)) < 0 )
fprintf(stdout, "\n\tAIFArrayMinIndex ERROR: %s",
AIFErrorStr());
else
fprintf(stdout, "\n\tAIFArrayMinIndex: [rank %d: %d]", tmp1, tmp3);
}
}
// Test AIFArrayMaxIndex
if (f.AIFArrayMaxIndex == 1){
for ( tmp1 = 0 ; tmp1 < ix->i_rank ; tmp1++ )
{
if ( (tmp3 = AIFArrayMaxIndex(a, tmp1)) < 0 )
fprintf(stdout, "\n\tAIFArrayMaxIndex ERROR: %s",
AIFErrorStr());
else
fprintf(stdout, "\n\tAIFArrayMaxIndex: [rank %d: %d]", tmp1, tmp3);
}
}
// Test AIFArraySize
if (f.AIFArraySize == 1){
if ( (tmp1 = AIFArraySize(a)) < 0)
fprintf(stdout, "\n\tAIFArraySize ERROR: %s", AIFErrorStr());
else
fprintf(stdout, "\n\tAIFArraySize: %d", tmp1);
}
// Test AIFArraySlice
if (f.AIFArraySlice == 1){
int * mn;
int * mx;
mn = (int *)_aif_alloc(sizeof(int) * ix->i_rank);
mx = (int *)_aif_alloc(sizeof(int) * ix->i_rank);
// AIFArraySlice (first element)
for (tmp3 = 0; tmp3 < ix->i_rank; tmp3++)
{
mn[tmp3] = ix->i_min[tmp3];
mx[tmp3] = ix->i_min[tmp3];
}
ax = AIFArraySlice(a, ix->i_rank, mn, mx);
if ( ax != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFArraySlice (first): ");
if (AIFPrint(stdout, 0, ax) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(ax));
AIFFree(ax);
}
else
fprintf(stdout, "\n\tAIFArraySlice (first) ERROR: %s", AIFErrorStr());
// AIFArraySlice (last element)
for (tmp3 = 0; tmp3 < ix->i_rank; tmp3++)
{
mn[tmp3] = ix->i_max[tmp3];
mx[tmp3] = ix->i_max[tmp3];
}
ax = AIFArraySlice(a, ix->i_rank, mn, mx);
if ( ax != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFArraySlice (last): ");
if (AIFPrint(stdout, 0, ax) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(ax));
AIFFree(ax);
}
else
fprintf(stdout, "\n\tAIFArraySlice (last) ERROR: %s", AIFErrorStr());
// AIFArraySlice (2nd to 2nd last or all)
for (tmp3 = 0; tmp3 < ix->i_rank; tmp3++)
{
if (ix->i_min[tmp3] < ix->i_max[tmp3] - 1)
{
mn[tmp3] = ix->i_min[tmp3] + 1;
mx[tmp3] = ix->i_max[tmp3] - 1;
}
else
{
mn[tmp3] = ix->i_min[tmp3];
mx[tmp3] = ix->i_max[tmp3];
}
}
ax = AIFArraySlice(a, ix->i_rank, mn, mx);
if ( ax != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFArraySlice (2nd to 2nd last or all): ");
if (AIFPrint(stdout, 0, ax) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(ax));
AIFFree(ax);
}
else
fprintf(stdout, "\n\tAIFArraySlice (2nd to 2nd last or all) ERROR: %s", AIFErrorStr());
_aif_free(mn);
_aif_free(mx);
}
// Test AIFArrayPerm (the rank must be > 1)
if (f.AIFArrayPerm == 1 && ix->i_rank > 1){
int *perm;
perm = (int *) _aif_alloc(sizeof(int) * ix->i_rank);
for ( tmp3 = ix->i_rank-1; tmp3 >= 0; tmp3-- )
perm[tmp3] = ix->i_rank - tmp3 - 1;
if ( (ax = AIFArrayPerm(a, perm)) == NULL )
fprintf(stdout, "\n\tAIFArrayPerm ERROR: %s", AIFErrorStr());
else
{
fprintf(stdout, "\n\tAIFArrayPerm: ");
if (AIFPrint(stdout, 0, ax) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(ax));
AIFFree(ax);
}
_aif_free(perm);
}
// Test AIFArrayElementToInt
tmp4 = AIFArrayIndexInit(a);
if (tmp4 == NULL)
fprintf(stdout, "\n\tAIFArrayIndexInit ERROR: %s", AIFErrorStr());
if (f.AIFArrayElementToInt == 1 && AIFBaseType(a) == AIF_INTEGER ){
while (tmp4->i_finished != 1)
{
int x;
if (AIFArrayElementToInt(a, tmp4, &x) < 0)
fprintf(stdout, "\n\tAIFArrayElementToInt ERROR: %s", AIFErrorStr());
else
printf("\n\tAIFArrayElementToInt: %d (int)", x);
AIFArrayIndexInc(tmp4);
}
AIFArrayIndexFree(tmp4);
}
// Test AIFArrayElementToLongest
tmp4 = AIFArrayIndexInit(a);
if (tmp4 == NULL)
fprintf(stdout, "\n\tAIFArrayIndexInit ERROR: %s", AIFErrorStr());
if (f.AIFArrayElementToLongest == 1 && AIFBaseType(a) == AIF_INTEGER ){
while (tmp4->i_finished != 1)
{
AIFLONGEST x;
if (AIFArrayElementToLongest(a, tmp4, &x) < 0)
fprintf(stdout, "\n\tAIFArrayElementToLongest ERROR: %s", AIFErrorStr());
else
printf("\n\tAIFArrayElementToLongest: %lld (AIFLONGEST)", x);
AIFArrayIndexInc(tmp4);
}
AIFArrayIndexFree(tmp4);
}
// Test AIFArrayElementToDouble
tmp4 = AIFArrayIndexInit(a);
if (tmp4 == NULL)
fprintf(stdout, "\n\tAIFArrayIndexInit ERROR: %s", AIFErrorStr());
if (f.AIFArrayElementToDouble == 1 && AIFBaseType(a) == AIF_FLOATING ){
while (tmp4->i_finished != 1)
{
double x;
if (AIFArrayElementToDouble(a, tmp4, &x) < 0)
fprintf(stdout, "\n\tAIFArrayElementToDouble ERROR: %s", AIFErrorStr());
else
printf("\n\tAIFArrayElementToDouble: %f (double)", x);
AIFArrayIndexInc(tmp4);
}
AIFArrayIndexFree(tmp4);
}
// Test AIFArrayElementToDoublest
tmp4 = AIFArrayIndexInit(a);
if (tmp4 == NULL)
fprintf(stdout, "\n\tAIFArrayIndexInit ERROR: %s", AIFErrorStr());
if (f.AIFArrayElementToDoublest == 1 && AIFBaseType(a) == AIF_FLOATING ){
while (tmp4->i_finished != 1)
{
AIFDOUBLEST x;
if (AIFArrayElementToDoublest(a, tmp4, &x) < 0)
fprintf(stdout, "\n\tAIFArrayElementToDoublest ERROR: %s", AIFErrorStr());
else
{
#ifdef HAVE_LONG_DOUBLE
printf("\n\tAIFArrayElementToDoublest: %Lf (AIFDOUBLEST)", x);
#else
printf("\n\tAIFArrayElementToDoublest: %f (AIFDOUBLEST)", x);
#endif
}
AIFArrayIndexInc(tmp4);
}
AIFArrayIndexFree(tmp4);
}
// Test AIFArrayRef
if (f.AIFArrayRef == 1){
int * loc;
loc = (int *)_aif_alloc(sizeof(int) * ix->i_rank);
for (tmp1 = 0; tmp1 < ix->i_rank; tmp1++)
loc[tmp1] = ix->i_min[tmp1];
ax = AIFArrayRef(a, ix->i_rank, loc);
if ( ax != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFArrayRef (first): ");
if (AIFPrint(stdout, 0, ax) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(ax));
AIFFree(ax);
}
else
fprintf(stdout, "\n\tAIFArrayRef (first) ERROR: %s", AIFErrorStr());
for (tmp1 = 0; tmp1 < ix->i_rank; tmp1++)
loc[tmp1] = ix->i_max[tmp1];
ax = AIFArrayRef(a, ix->i_rank, loc);
if ( ax != (AIF *)NULL )
{
fprintf(stdout, "\n\tAIFArrayRef (last): ");
if (AIFPrint(stdout, 0, ax) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(ax));
AIFFree(ax);
}
else
fprintf(stdout, "\n\tAIFArrayRef (last) ERROR: %s", AIFErrorStr());
_aif_free(loc);
}
// Test AIFSetArrayData
if (f.AIFSetArrayData != NULL) {
AIF * result;
tmp4 = AIFArrayIndexInit(a);
if (tmp4 == NULL)
fprintf(stdout, "\n\tAIFArrayIndexInit ERROR: %s", AIFErrorStr());
if ( (result = CopyAIF(a)) == NULL)
fprintf(stdout, "\n\tCopyAIF ERROR: %s", AIFErrorStr());
if ( f.AIFSetArrayData == (AIF *) SELF )
tmp1 = AIFSetArrayData(result, tmp4, result );
else
tmp1 = AIFSetArrayData(result, tmp4, f.AIFSetArrayData );
if ( tmp1 < 0)
fprintf(stdout, "\n\tAIFSetArrayData ERROR: %s", AIFErrorStr());
else
{
fprintf(stdout, "\n\tAIFSetArrayData: Set [0] to ");
if (AIFPrint(stdout, 0, f.AIFSetArrayData) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s): ", AIF_FORMAT((AIF *)f.AIFSetArrayData));
if (AIFPrint(stdout, 0, result) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(result));
}
AIFArrayIndexFree(tmp4);
}
// Test each of the array elements
printf("\n");
tmp1 = 0;
tmp2 = (char *) _aif_alloc(sizeof(char) * 100);
tmp4 = AIFArrayIndexInit(a);
if (tmp4 == NULL)
fprintf(stdout, "\n\tAIFArrayIndexInit ERROR: %s", AIFErrorStr());
while ( (ax = AIFArrayElement(a, tmp4)) != NULL )
{
sprintf(tmp2, "\t --> Element %d", tmp1);
AIFTest(NULL, ax, tmp2, f);
AIFFree(ax);
tmp1++;
AIFArrayIndexInc(tmp4);
}
if ( ax == NULL && AIFError() != AIFERR_NOERR )
fprintf(stdout, "\n\tAIFArrayElement ERROR: %s", AIFErrorStr());
_aif_free(tmp2);
AIFArrayIndexFree(tmp4);
AIFArrayIndexFree(ix);
return 0;
}
int
_aif_test_pointer(AIF *a, TestFlags f)
{
return 0;
}
int
_aif_test_region(AIF *a, TestFlags f)
{
return 0;
}
int
_aif_test_struct(AIF *a, TestFlags f)
{
return 0;
}
int
_aif_test_name(AIF *a, TestFlags f)
{
return 0;
}
int
_aif_test_reference(AIF *a, TestFlags f)
{
return 0;
}
int
_aif_test_string(AIF *a, TestFlags f)
{
return 0;
}
int
_aif_test_enum(AIF *a, TestFlags f)
{
return 0;
}
int
_aif_test_union(AIF *a, TestFlags f)
{
return 0;
}
int
AIFTestInt(char *title, AIF *a, char *msg, TestFlags f)
{
int ret;
if ( title != NULL )
fprintf(stdout, "%s > ", title);
if ( msg != NULL )
fprintf(stdout, "%s:", msg);
fprintf(stdout, "\n\tAIFPrint: ");
if (AIFPrint(stdout, 0, a) != 0)
fprintf(stdout, "\n\tAIFPrint ERROR: %s", AIFErrorStr());
fprintf(stdout, " (%s)", AIF_FORMAT(a));
ret = _aif_test_int(a, f);
fprintf(stdout, "\n");
return ret;
}