00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "CUnit/Basic.h"
00027 #include "test_shared.h"
00028 #include "../common/common.h"
00029 #include "../shared/utf8.h"
00030 #include "../shared/shared.h"
00031 #include "../ports/system.h"
00032 #include "test_generic.h"
00033
00038 static int UFO_InitSuiteGeneric (void)
00039 {
00040 TEST_Init();
00041 return 0;
00042 }
00043
00048 static int UFO_CleanSuiteGeneric (void)
00049 {
00050 TEST_Shutdown();
00051 return 0;
00052 }
00053
00054 static void testConstInt (void)
00055 {
00056 const constListEntry_t list[] = {
00057 {"namespace::power", 1},
00058 {"namespace::speed", 2},
00059 {"namespace::accuracy", 3},
00060 {"namespace::mind", 4},
00061 {"namespace::close", 5},
00062 {"namespace::heavy", 6},
00063 {"namespace::assault", 7},
00064 {"namespace::sniper", 8},
00065 {"namespace::explosive", 9},
00066 {"namespace::hp", 10},
00067
00068 {NULL, -1}
00069 };
00070 const constListEntry_t list2[] = {
00071 {"namespace2::soldier", 0},
00072 {"namespace2::scientist", 1},
00073 {"namespace2::worker", 2},
00074 {"namespace2::pilot", 3},
00075 {NULL, -1}
00076 };
00077 int out;
00078
00079 Com_RegisterConstInt("namespace::variable", 1);
00080 CU_ASSERT(Com_UnregisterConstVariable("namespace::variable"));
00081
00082 Com_RegisterConstInt("namespace::variable", 1);
00083 CU_ASSERT(Com_UnregisterConstVariable("namespace::variable"));
00084
00085 Com_RegisterConstInt("namespace::variable2", 2);
00086 Com_RegisterConstInt("namespace::variable3", 3);
00087 Com_RegisterConstInt("namespace::variable4", 4);
00088 Com_RegisterConstInt("namespace::variable5", 5);
00089 Com_RegisterConstInt("namespace::variable6", 6);
00090
00091 Com_RegisterConstInt("namespace2::variable2", 10);
00092
00093 out = 0;
00094 CU_ASSERT_TRUE(Com_GetConstInt("namespace2::variable2", &out));
00095 CU_ASSERT_EQUAL(out, 10);
00096 out = 0;
00097 CU_ASSERT_TRUE(Com_GetConstInt("namespace::variable2", &out));
00098 CU_ASSERT_EQUAL(out, 2);
00099 out = 0;
00100 CU_ASSERT_TRUE(Com_GetConstInt("variable2", &out));
00101 CU_ASSERT_EQUAL(out, 2);
00102
00103 CU_ASSERT_STRING_EQUAL(Com_GetConstVariable("namespace", 2), "variable2");
00104
00105 CU_ASSERT(Com_UnregisterConstVariable("namespace2::variable2"));
00106 CU_ASSERT(Com_UnregisterConstVariable("namespace::variable2"));
00107 CU_ASSERT(Com_UnregisterConstVariable("namespace::variable3"));
00108 CU_ASSERT(Com_UnregisterConstVariable("namespace::variable4"));
00109 CU_ASSERT(Com_UnregisterConstVariable("namespace::variable5"));
00110 CU_ASSERT(Com_UnregisterConstVariable("namespace::variable6"));
00111
00112 CU_ASSERT(!Com_UnregisterConstVariable("namespace::variable"));
00113 CU_ASSERT(!Com_UnregisterConstVariable("namespace::variable2"));
00114 CU_ASSERT(!Com_UnregisterConstVariable("namespace::variable3"));
00115 CU_ASSERT(!Com_UnregisterConstVariable("namespace::variable4"));
00116 CU_ASSERT(!Com_UnregisterConstVariable("namespace::variable5"));
00117 CU_ASSERT(!Com_UnregisterConstVariable("namespace::variable6"));
00118
00119 Com_RegisterConstList(list);
00120 out = 0;
00121 CU_ASSERT_TRUE(Com_GetConstInt("sniper", &out));
00122 CU_ASSERT_EQUAL(out, 8);
00123
00124 CU_ASSERT_TRUE(Com_UnregisterConstList(list));
00125 out = 0;
00126 CU_ASSERT_FALSE(Com_GetConstInt("sniper", &out));
00127
00128 Com_RegisterConstList(list2);
00129
00130 Com_RegisterConstList(list);
00131 CU_ASSERT_TRUE(Com_UnregisterConstList(list));
00132
00133 out = 0;
00134 CU_ASSERT(Com_GetConstInt("pilot", &out));
00135 CU_ASSERT_EQUAL(out, 3);
00136 Com_UnregisterConstList(list2);
00137 }
00138
00139
00140 static void testLinkedList (void)
00141 {
00142 linkedList_t *list = NULL;
00143 const char* data = "SomeDataForTheLinkedList";
00144 const size_t length = strlen(data);
00145 linkedList_t *entry;
00146 const linkedList_t *entry2;
00147 const char *returnedData;
00148
00149 entry = LIST_Add(&list, (const byte*)data, length);
00150 CU_ASSERT_EQUAL(LIST_Count(list), 1);
00151 CU_ASSERT_TRUE(entry != NULL);
00152 returnedData = LIST_GetByIdx(list, 0);
00153 CU_ASSERT_TRUE(returnedData != NULL);
00154 entry2 = LIST_ContainsString(list, returnedData);
00155 CU_ASSERT_TRUE(entry2 != NULL);
00156 CU_ASSERT_EQUAL((const void*)entry2->data, (const void*)returnedData);
00157 CU_ASSERT_STRING_EQUAL(entry2->data, returnedData);
00158 LIST_RemoveEntry(&list, entry);
00159 CU_ASSERT_EQUAL(LIST_Count(list), 0);
00160 }
00161
00162 static void testStringCopiers (void)
00163 {
00164 const char src[] = "Командующий, я чрезвычайно рад доложить, что наш проект ОПЭВ был завершён успешно. Я прикрепил к письму "
00165 "изображения и схемы прототипа лазерного оружия, в котором реализовано непрерывное волновое излучение достаточной "
00166 "мощности в портативном корпусе. Практическое решение лежало не в тщетных попытках увеличения ёмкости аккумуляторной "
00167 "батареи, а в использовании радикальных технологий миниатюризации с целью облегчения и уменьшения размеров существующих "
00168 "лазеров с химической накачкой. Они использовались довольно долгое время, будучи частью экспериментальных военных "
00169 "программ с конца XX века, но их применение всегда сталкивалось с множеством проблем. Модели химических лазеров с "
00170 "реальными военными перспективами были слишком большими и громоздкими для использования в бою пехотой. До сих пор их "
00171 "расположение было ограничено выбором между лазерными орудиями на сухопутном шасси и батареями морского базирования. "
00172 "Боевое применение заключалось в основном для целей противоракетной обороны (ПРО). Тем не менее, теперь мы в ФАЛАНКС "
00173 "создали компактное лазерное орудие. Вопреки своему малому размеру, оно полностью способно управлять фтор-дейтериевой "
00174 "реакцией и её токсическими продуктами распада без опасности поражения личного состава. Разрешите мне дать вам краткое "
00175 "описание принципа его работы. Внутри камеры сгорания этилен окисляется в пламени трифторида азота. В ходе этой реакции "
00176 "выделяются свободные радикалы фтора, которые затем приводятся в контакт с газообразной смесью гелия и дейтерия. Дейтерий "
00177 "вступает в реакцию с фтором, что приводит к образованию энергетически возбуждённых молекул фторида дейтерия. Они "
00178 "подвергаются стимулированной эмиссии в оптическом резонаторе оружия, генерируя лазерный луч. Серия интеллектуальных "
00179 "линз фокусирует и направляет луч в точку прицеливания, и даже вносит коррекцию, с учётом небольших перемещений стрелка "
00180 "и/или цели. Излишки газообразного дейтерия направляются через сконструированную нами систему фильтров высокого давления, "
00181 "которые задерживают все токсичные и радиоактивные молекулы перед выбросом отработанных паров в атмосферу. Фильтр требует "
00182 "замены после каждой боевой операции, но разработанная нами система делает этот процесс простым и безболезненным. Если "
00183 "система фильтров будет так или иначе повреждена в ходе операции, оружие немедленно заблокируется, чтобы избежать "
00184 "поражения бойца и окружающих. Лазер работает в среднем инфракрасном диапазоне, так что он генерирует невидимый глазом "
00185 "луч, который однако можно видеть в инфракрасных очках. К сожалению, прототип, который мы создали, ещё не готов к "
00186 "широкомасштабному производству в качестве оружия пехоты, так как требуется оптимизация и балансировка для его "
00187 "использования человеком, но инновационные разработки, сделанные нами, могут так же применяться в орудийных системах "
00188 "боевых машин, и, возможно, даже в авиационных орудиях. Я отправил вам на электронную почту несколько новых концепций с "
00189 "принципиальными идеями, предложенными моим отделом. Сообщите, когда вы сочтёте нужным, чтоб мы начали работу над ними, "
00190 "командующий. —ком. Наварре ";
00191
00192 long time;
00193 const int copies = 10000;
00194 char dest[8192];
00195 int i;
00196
00197 TEST_Printf("\n");
00198 time = Sys_Milliseconds();
00199 for (i = 0; i < copies; ++i) {
00200 Q_strncpyz(dest, src, sizeof(dest));
00201 }
00202 time = Sys_Milliseconds() - time;
00203 TEST_Printf("%d copies with Q_strncpyz: %ld ms\n", copies, time);
00204
00205 time = Sys_Milliseconds();
00206 for (i = 0; i < copies; ++i) {
00207 UTF8_strncpyz(dest, src, sizeof(dest));
00208 }
00209 time = Sys_Milliseconds() - time;
00210 TEST_Printf("%d copies with UTF8_strncpyz: %ld ms\n", copies, time);
00211
00212 time = Sys_Milliseconds();
00213 for (i = 0; i < copies; ++i) {
00214 Com_sprintf(dest, sizeof(dest), "%s", src);
00215 }
00216 time = Sys_Milliseconds() - time;
00217 TEST_Printf("%d copies with Com_sprintf: %ld ms\n", copies, time);
00218
00219
00220
00221
00222 Com_sprintf(dest, 1, "aab%c%c", 0xd0, 0x80);
00223 CU_ASSERT_EQUAL(dest[0], '\0');
00224
00225
00226 Com_sprintf(dest, 4, "aab%c%c", 0xd0, 0x80);
00227 CU_ASSERT_EQUAL(dest[2], 'b');
00228 CU_ASSERT_EQUAL(dest[3], '\0');
00229
00230
00231 Com_sprintf(dest, 5, "aab%c%c", 0xd0, 0x80);
00232 CU_ASSERT_EQUAL(dest[2], 'b');
00233 CU_ASSERT_EQUAL(dest[3], '\0');
00234
00235
00236 Com_sprintf(dest, 6, "aab%c%c", 0xd0, 0x80);
00237 CU_ASSERT_EQUAL((unsigned char) dest[3], 0xd0);
00238 CU_ASSERT_EQUAL((unsigned char) dest[4], 0x80);
00239 CU_ASSERT_EQUAL(dest[5], '\0');
00240
00241
00242 Com_sprintf(dest, 7, "aab\xD0\x80\xD0\x80");
00243 CU_ASSERT_NOT_EQUAL(dest[3], '\0');
00244 CU_ASSERT_EQUAL(dest[5], '\0');
00245
00246
00247
00248
00249 UTF8_strncpyz(dest, "aab\xD0\x80", 1);
00250 CU_ASSERT_EQUAL(dest[0], '\0');
00251
00252
00253 UTF8_strncpyz(dest, "aab\xD0\x80", 4);
00254 CU_ASSERT_EQUAL(dest[2], 'b');
00255 CU_ASSERT_EQUAL(dest[3], '\0');
00256
00257
00258 UTF8_strncpyz(dest, "aab\xD0\x80", 5);
00259 CU_ASSERT_EQUAL(dest[2], 'b');
00260 CU_ASSERT_EQUAL(dest[3], '\0');
00261
00262
00263 UTF8_strncpyz(dest, "aab\xD0\x80", 6);
00264 CU_ASSERT_EQUAL((unsigned char) dest[3], 0xd0);
00265 CU_ASSERT_EQUAL((unsigned char) dest[4], 0x80);
00266 CU_ASSERT_EQUAL(dest[5], '\0');
00267
00268
00269 UTF8_strncpyz(dest, "aab\xD0\x80\xD0\x80", 7);
00270 CU_ASSERT_NOT_EQUAL(dest[3], '\0');
00271 CU_ASSERT_EQUAL(dest[5], '\0');
00272 }
00273
00274 int UFO_AddGenericTests (void)
00275 {
00276
00277 CU_pSuite GenericSuite = CU_add_suite("GenericTests", UFO_InitSuiteGeneric, UFO_CleanSuiteGeneric);
00278
00279 if (GenericSuite == NULL)
00280 return CU_get_error();
00281
00282
00283 if (CU_ADD_TEST(GenericSuite, testConstInt) == NULL)
00284 return CU_get_error();
00285
00286 if (CU_ADD_TEST(GenericSuite, testLinkedList) == NULL)
00287 return CU_get_error();
00288
00289 if (CU_ADD_TEST(GenericSuite, testStringCopiers) == NULL)
00290 return CU_get_error();
00291
00292 return CUE_SUCCESS;
00293 }