test_generic.c

Go to the documentation of this file.
00001 
00006 /*
00007 Copyright (C) 2002-2010 UFO: Alien Invasion.
00008 
00009 This program is free software; you can redistribute it and/or
00010 modify it under the terms of the GNU General Public License
00011 as published by the Free Software Foundation; either version 2
00012 of the License, or (at your option) any later version.
00013 
00014 This program is distributed in the hope that it will be useful,
00015 but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00017 
00018 See the GNU General Public License for more details.
00019 
00020 You should have received a copy of the GNU General Public License
00021 along with this program; if not, write to the Free Software
00022 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
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     /* Com_sprintf */
00220 
00221     /* empty string */
00222     Com_sprintf(dest, 1, "aab%c%c", 0xd0, 0x80);
00223     CU_ASSERT_EQUAL(dest[0], '\0');
00224 
00225     /* trimmed non utf8 */
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     /* trimmed utf8 char */
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     /* untrimmed utf8 char */
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     /* 2 consecutive utf8 char */
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     /* UTF8_strncpyz */
00247 
00248     /* empty string */
00249     UTF8_strncpyz(dest, "aab\xD0\x80", 1);
00250     CU_ASSERT_EQUAL(dest[0], '\0');
00251 
00252     /* trimmed non utf8 */
00253     UTF8_strncpyz(dest, "aab\xD0\x80", 4);
00254     CU_ASSERT_EQUAL(dest[2], 'b');
00255     CU_ASSERT_EQUAL(dest[3], '\0');
00256 
00257     /* trimmed utf8 char */
00258     UTF8_strncpyz(dest, "aab\xD0\x80", 5);
00259     CU_ASSERT_EQUAL(dest[2], 'b');
00260     CU_ASSERT_EQUAL(dest[3], '\0');
00261 
00262     /* untrimmed utf8 char */
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     /* 2 consecutive utf8 char */
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     /* add a suite to the registry */
00277     CU_pSuite GenericSuite = CU_add_suite("GenericTests", UFO_InitSuiteGeneric, UFO_CleanSuiteGeneric);
00278 
00279     if (GenericSuite == NULL)
00280         return CU_get_error();
00281 
00282     /* add the tests to the suite */
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 }

Generated by  doxygen 1.6.2