00001
00002
00003
00004
00005
00006
00007
00008 #include <stdlib.h>
00009 #include <stdio.h>
00010 #include <errno.h>
00011 #include <math.h>
00012 #include <complex.h>
00013 #include <string.h>
00014
00015 #include "enum_assert.h"
00016
00017 EXPORT_CREATE(enum_assert);
00018 EXPORT_INIT(enum_assert);
00019 EXPORT_COMMIT(enum_assert);
00020
00021 CLASS *enum_assert::oclass = NULL;
00022 enum_assert *enum_assert::defaults = NULL;
00023
00024 enum_assert::enum_assert(MODULE *module)
00025 {
00026 if (oclass==NULL)
00027 {
00028
00029 oclass = gl_register_class(module,"enum_assert",sizeof(enum_assert),PC_AUTOLOCK|PC_OBSERVER);
00030 if (oclass==NULL)
00031 throw "unable to register class enum_assert";
00032 else
00033 oclass->trl = TRL_PROVEN;
00034
00035 if (gl_publish_variable(oclass,
00036
00037 PT_enumeration,"status",get_status_offset(),PT_DESCRIPTION,"Conditions for the assert checks",
00038 PT_KEYWORD,"ASSERT_TRUE",(enumeration)ASSERT_TRUE,
00039 PT_KEYWORD,"ASSERT_FALSE",(enumeration)ASSERT_FALSE,
00040 PT_KEYWORD,"ASSERT_NONE",(enumeration)ASSERT_NONE,
00041 PT_int32, "value", get_value_offset(),PT_DESCRIPTION,"Value to assert",
00042 PT_char1024, "target", get_target_offset(),PT_DESCRIPTION,"Property to perform the assert upon",
00043 NULL)<1){
00044 char msg[256];
00045 sprintf(msg, "unable to publish properties in %s",__FILE__);
00046 throw msg;
00047 }
00048
00049 defaults = this;
00050 status = ASSERT_TRUE;
00051 value = 0;
00052 }
00053 }
00054
00055
00056 int enum_assert::create(void)
00057 {
00058 memcpy(this,defaults,sizeof(*this));
00059
00060 return 1;
00061 }
00062
00063 int enum_assert::init(OBJECT *parent)
00064 {
00065 return 1;
00066 }
00067
00068 TIMESTAMP enum_assert::commit(TIMESTAMP t1, TIMESTAMP t2)
00069 {
00070
00071 gld_property target_prop(get_parent(),get_target());
00072 if ( !target_prop.is_valid() || target_prop.get_type()!=PT_enumeration )
00073 {
00074 gl_error("Specified target %s for %s is not valid.",get_target(),get_parent()->get_name());
00075
00076
00077
00078
00079
00080
00081 return 0;
00082 }
00083
00084 int32 x; target_prop.getp(x);
00085 if (status == ASSERT_TRUE)
00086 {
00087 if (value != x)
00088 {
00089 gl_error("Assert failed on %s: %s=%g did not match %g",
00090 get_parent()->get_name(), get_target(), x, value);
00091 return 0;
00092 }
00093 else
00094 {
00095 gl_verbose("Assert passed on %s", get_parent()->get_name());
00096 return TS_NEVER;
00097 }
00098 }
00099 else if (status == ASSERT_FALSE)
00100 {
00101 if (value == x)
00102 {
00103 gl_error("Assert failed on %s: %s=%g did match %g",
00104 get_parent()->get_name(), get_target(), x, value);
00105 return 0;
00106 }
00107 else
00108 {
00109 gl_verbose("Assert passed on %s", get_parent()->get_name());
00110 return TS_NEVER;
00111 }
00112 }
00113 else
00114 {
00115 gl_verbose("Assert test is not being run on %s", get_parent()->get_name());
00116 return TS_NEVER;
00117 }
00118 }
00119
00120
00121 EXPORT SIMULATIONMODE update_enum_assert(OBJECT *obj, TIMESTAMP t0, unsigned int64 delta_time, unsigned long dt, unsigned int iteration_count_val)
00122 {
00123 char buff[64];
00124 char dateformat[8]="";
00125 char error_output_buff[1024];
00126 char datebuff[64];
00127 enum_assert *da = OBJECTDATA(obj,enum_assert);
00128 DATETIME delta_dt_val;
00129 double del_clock;
00130 TIMESTAMP del_clock_int;
00131 int del_microseconds;
00132 int32 *x;
00133
00134
00135 if (iteration_count_val == 0)
00136 {
00137
00138 if (delta_time>=dt)
00139 {
00140
00141 x = (int32*)gl_get_enum_by_name(obj->parent,da->get_target());
00142
00143 if (x==NULL)
00144 {
00145 gl_error("Specified target %s for %s is not valid.",da->get_target(),gl_name(obj->parent,buff,64));
00146
00147
00148
00149
00150
00151
00152 return SM_ERROR;
00153 }
00154 else if (da->get_status() == da->ASSERT_TRUE)
00155 {
00156 if (*x != da->get_value())
00157 {
00158
00159 if (delta_time>=dt)
00160 del_clock = (double)t0 + (double)(delta_time-dt)/(double)DT_SECOND;
00161 else
00162 del_clock = (double)t0 + (double)(delta_time)/(double)DT_SECOND;
00163
00164 del_clock_int = (TIMESTAMP)del_clock;
00165 del_microseconds = (int)((del_clock-(int)(del_clock))*1000000+0.5);
00166
00167
00168 gl_localtime(del_clock_int,&delta_dt_val);
00169
00170
00171 gl_global_getvar("dateformat",dateformat,sizeof(dateformat));
00172
00173
00174 if ( strcmp(dateformat,"ISO")==0)
00175 sprintf(datebuff,"ERROR [%04d-%02d-%02d %02d:%02d:%02d.%.06d %s] : ",delta_dt_val.year,delta_dt_val.month,delta_dt_val.day,delta_dt_val.hour,delta_dt_val.minute,delta_dt_val.second,del_microseconds,delta_dt_val.tz);
00176 else if ( strcmp(dateformat,"US")==0)
00177 sprintf(datebuff,"ERROR [%02d-%02d-%04d %02d:%02d:%02d.%.06d %s] : ",delta_dt_val.month,delta_dt_val.day,delta_dt_val.year,delta_dt_val.hour,delta_dt_val.minute,delta_dt_val.second,del_microseconds,delta_dt_val.tz);
00178 else if ( strcmp(dateformat,"EURO")==0)
00179 sprintf(datebuff,"ERROR [%02d-%02d-%04d %02d:%02d:%02d.%.06d %s] : ",delta_dt_val.day,delta_dt_val.month,delta_dt_val.year,delta_dt_val.hour,delta_dt_val.minute,delta_dt_val.second,del_microseconds,delta_dt_val.tz);
00180 else
00181 sprintf(datebuff,"ERROR .09f : ",del_clock);
00182
00183
00184 sprintf(error_output_buff,"Assert failed on %s - %s (%d) did not match %d",gl_name(obj->parent, buff, 64),da->get_target(), *x, da->get_value());
00185
00186
00187 gl_output("%s%s",datebuff,error_output_buff);
00188
00189 return SM_ERROR;
00190 }
00191 else
00192 {
00193 gl_verbose("Assert passed on %s", gl_name(obj->parent, buff, 64));
00194 return SM_EVENT;
00195 }
00196 }
00197 else if (da->get_status() == da->ASSERT_FALSE)
00198 {
00199 if (*x == da->get_value())
00200 {
00201
00202 if (delta_time>=dt)
00203 del_clock = (double)t0 + (double)(delta_time-dt)/(double)DT_SECOND;
00204 else
00205 del_clock = (double)t0 + (double)(delta_time)/(double)DT_SECOND;
00206
00207 del_clock_int = (TIMESTAMP)del_clock;
00208 del_microseconds = (int)((del_clock-(int)(del_clock))*1000000+0.5);
00209
00210
00211 gl_localtime(del_clock_int,&delta_dt_val);
00212
00213
00214 gl_global_getvar("dateformat",dateformat,sizeof(dateformat));
00215
00216
00217 if ( strcmp(dateformat,"ISO")==0)
00218 sprintf(datebuff,"ERROR [%04d-%02d-%02d %02d:%02d:%02d.%.06d %s] : ",delta_dt_val.year,delta_dt_val.month,delta_dt_val.day,delta_dt_val.hour,delta_dt_val.minute,delta_dt_val.second,del_microseconds,delta_dt_val.tz);
00219 else if ( strcmp(dateformat,"US")==0)
00220 sprintf(datebuff,"ERROR [%02d-%02d-%04d %02d:%02d:%02d.%.06d %s] : ",delta_dt_val.month,delta_dt_val.day,delta_dt_val.year,delta_dt_val.hour,delta_dt_val.minute,delta_dt_val.second,del_microseconds,delta_dt_val.tz);
00221 else if ( strcmp(dateformat,"EURO")==0)
00222 sprintf(datebuff,"ERROR [%02d-%02d-%04d %02d:%02d:%02d.%.06d %s] : ",delta_dt_val.day,delta_dt_val.month,delta_dt_val.year,delta_dt_val.hour,delta_dt_val.minute,delta_dt_val.second,del_microseconds,delta_dt_val.tz);
00223 else
00224 sprintf(datebuff,"ERROR .09f : ",del_clock);
00225
00226
00227 sprintf(error_output_buff,"Assert failed on %s - %s (%d) did not match %d",gl_name(obj->parent, buff, 64),da->get_target(), *x, da->get_value());
00228
00229
00230 gl_output("%s%s",datebuff,error_output_buff);
00231
00232 return SM_ERROR;
00233 }
00234 else
00235 {
00236 gl_verbose("Assert passed on %s", gl_name(obj->parent, buff, 64));
00237 return SM_EVENT;
00238 }
00239 }
00240 else
00241 {
00242 gl_verbose("Assert test is not being run on %s", gl_name(obj->parent, buff, 64));
00243 return SM_EVENT;
00244 }
00245 }
00246 else
00247 return SM_EVENT;
00248 }
00249 else
00250 return SM_EVENT;
00251 }