static void TEST_AssertError( DaoProcess *proc, DaoValue* p[], int N ) { DString *expected = p[0]->xString.value; DString *actual = NULL; DList *errors = proc->exceptions; DaoVmCode *sect = DaoProcess_InitCodeSection( proc, 0 ); int catched = 0; int size = errors->size; if( sect == NULL ) return; DaoProcess_Execute( proc ); if ( proc->status == DAO_PROCESS_ABORTED && errors->size > size ){ DaoException *e = (DaoException*)&errors->items.pValue[errors->size - 1]->xCdata; if ( DString_Compare( expected, e->ctype->name ) != 0 ) actual = DString_Copy( e->ctype->name ); else catched = 1; DList_Clear( errors ); } DaoProcess_PopFrame( proc ); if ( !catched ){ char buf[512]; if ( actual ){ snprintf( buf, sizeof(buf), "expected %s error, intercepted %s", expected->chars, actual->chars ); DString_Delete( actual ); } else snprintf( buf, sizeof(buf), "expected %s error, intercepted nothing", expected->chars ); DaoProcess_RaiseError( proc, "Test::AssertError", buf ); } }
int DaoValue_Compare( DaoValue *left, DaoValue *right ) { double L, R; int res = 0; if( left == right ) return 0; if( left == NULL || right == NULL ) return left < right ? -100 : 100; if( left->type != right->type ){ res = left->type < right->type ? -100 : 100; if( right->type == DAO_TUPLE && right->xTuple.subtype == DAO_PAIR ){ if( (res = DaoValue_Compare( left, right->xTuple.items[0] )) <= 0 ) return res; if( (res = DaoValue_Compare( left, right->xTuple.items[1] )) >= 0 ) return res; return 0; }else if( left->type == DAO_TUPLE && left->xTuple.subtype == DAO_PAIR ){ if( (res = DaoValue_Compare( left->xTuple.items[0], right )) >= 0 ) return res; if( (res = DaoValue_Compare( left->xTuple.items[1], right )) <= 0 ) return res; return 0; } #ifdef DAO_WITH_LONGINT if( left->type == DAO_LONG && (right->type && right->type <= DAO_DOUBLE) ){ if( right->type == DAO_INTEGER ){ return DLong_CompareToInteger( left->xLong.value, right->xInteger.value ); } return DLong_CompareToDouble( left->xLong.value, DaoValue_GetDouble( right ) ); }else if( right->type == DAO_LONG && (left->type && left->type <= DAO_DOUBLE) ){ if( left->type == DAO_INTEGER ){ return - DLong_CompareToInteger( right->xLong.value, left->xInteger.value ); } return - DLong_CompareToDouble( right->xLong.value, DaoValue_GetDouble( left ) ); } #endif if( left->type < DAO_INTEGER || left->type > DAO_DOUBLE ) return res; if( right->type < DAO_INTEGER || right->type > DAO_DOUBLE ) return res; L = DaoValue_GetDouble( left ); R = DaoValue_GetDouble( right ); return L == R ? 0 : (L < R ? -1 : 1); } switch( left->type ){ case DAO_NONE : return 0; case DAO_INTEGER : return number_compare( left->xInteger.value, right->xInteger.value ); case DAO_FLOAT : return number_compare( left->xFloat.value, right->xFloat.value ); case DAO_DOUBLE : return number_compare( left->xDouble.value, right->xDouble.value ); case DAO_COMPLEX : return DaoComplex_Compare( & left->xComplex, & right->xComplex ); #ifdef DAO_WITH_LONGINT case DAO_LONG : return DLong_Compare( left->xLong.value, right->xLong.value ); #endif case DAO_STRING : return DString_Compare( left->xString.data, right->xString.data ); case DAO_ENUM : return DaoEnum_Compare( & left->xEnum, & right->xEnum ); case DAO_TUPLE : return DaoTuple_Compare( & left->xTuple, & right->xTuple ); case DAO_LIST : return DaoList_Compare( & left->xList, & right->xList ); case DAO_CDATA : case DAO_CSTRUCT : case DAO_CTYPE : return DaoCstruct_Compare( left, right ); #ifdef DAO_WITH_NUMARRAY case DAO_ARRAY : return DaoArray_Compare( & left->xArray, & right->xArray ); #endif } return left < right ? -100 : 100; /* needed for map */ }
int DaoEnum_Compare( DaoEnum *L, DaoEnum *R ) { DaoEnum E; DNode *N = NULL; DMap *ML = L->etype->mapNames; DMap *MR = R->etype->mapNames; uchar_t FL = L->etype->flagtype; uchar_t FR = R->etype->flagtype; char SL = L->etype->name->mbs[0]; char SR = R->etype->name->mbs[0]; if( L->etype == R->etype ){ return L->value == R->value ? 0 : ( L->value < R->value ? -1 : 1 ); }else if( SL == '$' && SR == '$' && FL == 0 && FR == 0 ){ return DString_Compare( L->etype->name, R->etype->name ); }else if( SL == '$' && SR == '$' ){ if( L->etype->mapNames->size != R->etype->mapNames->size ){ return number_compare( L->etype->mapNames->size, R->etype->mapNames->size ); }else{ for(N=DMap_First(ML);N;N=DMap_Next(ML,N)){ if( DMap_Find( MR, N->key.pVoid ) ==0 ) return -1; } return 0; } }else if( SL == '$' ){ E.etype = R->etype; E.value = R->value; DaoEnum_SetValue( & E, L, NULL ); return E.value == R->value ? 0 : ( E.value < R->value ? -1 : 1 ); }else if( SR == '$' ){ E.etype = L->etype; E.value = L->value; DaoEnum_SetValue( & E, R, NULL ); return L->value == E.value ? 0 : ( L->value < E.value ? -1 : 1 ); }else{ return L->value == R->value ? 0 : ( L->value < R->value ? -1 : 1 ); } }
int DString_EQ( DString *self, DString *chs ) { return (DString_Compare( self, chs )==0); }