27 #include "../common/common.h"
28 #include "../common/sha1.h"
29 #include "../common/sha2.h"
30 #include "../common/http.h"
31 #include "../common/binaryexpressionparser.h"
32 #include "../shared/utf8.h"
33 #include "../shared/shared.h"
34 #include "../shared/parse.h"
35 #include "../shared/infostring.h"
36 #include "../shared/stringhunk.h"
37 #include "../shared/entitiesdef.h"
38 #include "../ports/system.h"
54 ASSERT_STREQ(
string,
"Test");
59 ASSERT_STREQ(
string,
"T");
70 ASSERT_TRUE(
nullptr == hunk);
85 ASSERT_TRUE(
nullptr == hunk);
100 {
"namespace::power", 1},
101 {
"namespace::speed", 2},
102 {
"namespace::accuracy", 3},
103 {
"namespace::mind", 4},
104 {
"namespace::close", 5},
105 {
"namespace::heavy", 6},
106 {
"namespace::assault", 7},
107 {
"namespace::sniper", 8},
108 {
"namespace::explosive", 9},
109 {
"namespace::hp", 10},
114 {
"namespace2::soldier", 0},
115 {
"namespace2::scientist", 1},
116 {
"namespace2::worker", 2},
117 {
"namespace2::pilot", 3},
184 return strcmp((
const char*)entry1->
data, (
const char*)entry2->
data);
190 const char*
data =
"SomeDataForTheLinkedList";
191 const size_t length = strlen(data);
194 const char* returnedData;
196 entry =
LIST_Add(&list, data, length);
198 ASSERT_TRUE(entry !=
nullptr);
200 ASSERT_TRUE(returnedData !=
nullptr);
202 ASSERT_TRUE(entry2 !=
nullptr);
203 ASSERT_EQ((
const void*)entry2->
data, (
const void*)returnedData);
204 ASSERT_STREQ(static_cast<const char*>(entry2->
data), returnedData);
228 ASSERT_STREQ(static_cast<const char*>(
LIST_GetByIdx(list, 0)),
"test1");
229 ASSERT_STREQ(static_cast<const char*>(
LIST_GetByIdx(list, 1)),
"test2");
230 ASSERT_STREQ(static_cast<const char*>(
LIST_GetByIdx(list, 2)),
"test3");
231 ASSERT_STREQ(static_cast<const char*>(
LIST_GetByIdx(list, 3)),
"test4");
232 ASSERT_STREQ(static_cast<const char*>(
LIST_GetByIdx(list, 4)),
"test5");
233 ASSERT_STREQ(static_cast<const char*>(
LIST_GetByIdx(list, 5)),
"test6");
234 ASSERT_STREQ(static_cast<const char*>(
LIST_GetByIdx(list, 6)),
"test7");
248 ASSERT_TRUE(
nullptr !=
string);
309 const char* wildcard =
"ufos/**.ufo";
312 ASSERT_TRUE(ufosCnt > 1);
316 if (prev !=
nullptr) {
354 Cvar_Set(
"testGeneric_cvar",
"test");
355 ASSERT_STREQ(
Cvar_GetString(
"testGeneric_cvar"),
"testGeneric_cvarValue");
360 const char src[] =
"Командующий, я чрезвычайно рад доложить, что наш проект ОПЭВ был завершён успешно. Я прикрепил к письму "
361 "изображения и схемы прототипа лазерного оружия, в котором реализовано непрерывное волновое излучение достаточной "
362 "мощности в портативном корпусе. Практическое решение лежало не в тщетных попытках увеличения ёмкости аккумуляторной "
363 "батареи, а в использовании радикальных технологий миниатюризации с целью облегчения и уменьшения размеров существующих "
364 "лазеров с химической накачкой. Они использовались довольно долгое время, будучи частью экспериментальных военных "
365 "программ с конца XX века, но их применение всегда сталкивалось с множеством проблем. Модели химических лазеров с "
366 "реальными военными перспективами были слишком большими и громоздкими для использования в бою пехотой. До сих пор их "
367 "расположение было ограничено выбором между лазерными орудиями на сухопутном шасси и батареями морского базирования. "
368 "Боевое применение заключалось в основном для целей противоракетной обороны (ПРО). Тем не менее, теперь мы в ФАЛАНКС "
369 "создали компактное лазерное орудие. Вопреки своему малому размеру, оно полностью способно управлять фтор-дейтериевой "
370 "реакцией и её токсическими продуктами распада без опасности поражения личного состава. Разрешите мне дать вам краткое "
371 "описание принципа его работы. Внутри камеры сгорания этилен окисляется в пламени трифторида азота. В ходе этой реакции "
372 "выделяются свободные радикалы фтора, которые затем приводятся в контакт с газообразной смесью гелия и дейтерия. Дейтерий "
373 "вступает в реакцию с фтором, что приводит к образованию энергетически возбуждённых молекул фторида дейтерия. Они "
374 "подвергаются стимулированной эмиссии в оптическом резонаторе оружия, генерируя лазерный луч. Серия интеллектуальных "
375 "линз фокусирует и направляет луч в точку прицеливания, и даже вносит коррекцию, с учётом небольших перемещений стрелка "
376 "и/или цели. Излишки газообразного дейтерия направляются через сконструированную нами систему фильтров высокого давления, "
377 "которые задерживают все токсичные и радиоактивные молекулы перед выбросом отработанных паров в атмосферу. Фильтр требует "
378 "замены после каждой боевой операции, но разработанная нами система делает этот процесс простым и безболезненным. Если ";
381 const int copies = 10000;
387 for (i = 0; i < copies; ++
i) {
391 Com_Printf(
"%d copies with Q_strncpyz: %ld ms\n", copies, time);
394 for (i = 0; i < copies; ++
i) {
398 Com_Printf(
"%d copies with UTF8_strncpyz: %ld ms\n", copies, time);
401 for (i = 0; i < copies; ++
i) {
405 Com_Printf(
"%d copies with Com_sprintf: %ld ms\n", copies, time);
418 ASSERT_EQ(dest[0],
'\0');
422 ASSERT_EQ(dest[2],
'b');
423 ASSERT_EQ(dest[3],
'\0');
427 ASSERT_EQ(dest[2],
'b');
428 ASSERT_EQ(dest[3],
'\0');
432 ASSERT_EQ((
unsigned char) dest[3], 0xd0);
433 ASSERT_EQ((
unsigned char) dest[4], 0x80);
434 ASSERT_EQ(dest[5],
'\0');
438 ASSERT_NE(dest[3],
'\0');
439 ASSERT_EQ(dest[5],
'\0');
445 ASSERT_EQ(dest[0],
'\0');
449 ASSERT_EQ(dest[2],
'b');
450 ASSERT_EQ(dest[3],
'\0');
454 ASSERT_EQ(dest[2],
'b');
455 ASSERT_EQ(dest[3],
'\0');
459 ASSERT_EQ((
unsigned char) dest[3], 0xd0);
460 ASSERT_EQ((
unsigned char) dest[4], 0x80);
461 ASSERT_EQ(dest[5],
'\0');
465 ASSERT_NE(dest[3],
'\0');
466 ASSERT_EQ(dest[5],
'\0');
475 ASSERT_FALSE(
Q_strreplace(
"ReplaceNothing",
"###",
"foobar", targetBuf, length));
476 ASSERT_TRUE(
Q_strreplace(
"Replace###Something",
"###",
"foobar", targetBuf, length));
477 ASSERT_STREQ(targetBuf,
"ReplacefoobarSomething");
479 ASSERT_TRUE(
Q_strreplace(
"Replace#",
"#",
"foobar", targetBuf, length));
480 ASSERT_STREQ(targetBuf,
"Replacefoobar");
482 ASSERT_TRUE(
Q_strreplace(
"#Replace",
"#",
"foobar", targetBuf, length));
483 ASSERT_STREQ(targetBuf,
"foobarReplace");
485 ASSERT_TRUE(
Q_strreplace(
"#Replace#",
"#",
"foobar", targetBuf, length));
486 ASSERT_STREQ(targetBuf,
"foobarReplace#");
488 ASSERT_FALSE(
Q_strreplace(
"#ReplaceNothing#",
"##",
"foobar", targetBuf, length));
502 Q_strncpyz(buf,
"mn\xD0\x80opq\xD0\x81r",
sizeof(buf));
511 Q_strncpyz(buf,
"mn\xD0\x80opq\xD0\x81r",
sizeof(buf));
515 ASSERT_STREQ(buf,
"mn\xD0\x80oq\xD0\x81r");
519 ASSERT_STREQ(buf,
"mn\xD0\x80oqr");
523 ASSERT_STREQ(buf,
"n\xD0\x80oqr");
527 ASSERT_STREQ(buf,
"n\xD0\x80oqr");
531 Q_strncpyz(buf,
"m\xD0\x82opqr",
sizeof(buf));
535 ASSERT_STREQ(buf,
"mn\xD0\x82opqr");
539 ASSERT_STREQ(buf,
"mn\xD0\x82op\xD0\x83qr");
543 ASSERT_STREQ(buf,
"\xD0\x84mn\xD0\x82op\xD0\x83qr");
547 ASSERT_STREQ(buf,
"\xD0\x84mn\xD0\x82op\xD0\x83qr\xD0\x85");
553 ASSERT_STREQ(buf,
"mnopqr");
557 ASSERT_STREQ(buf,
"mnopqr");
561 ASSERT_STREQ(buf,
"m\xD0\x86nopqr");
565 ASSERT_STREQ(buf,
"ms\xD0\x86nopqr");
567 char catBuf[32] =
"";
568 Q_strcat(catBuf,
sizeof(catBuf),
"foo");
569 Q_strcat(catBuf,
sizeof(catBuf),
"bar");
570 ASSERT_STREQ(catBuf,
"foobar");
581 url =
"http://www.test.domain.com:123/someScript.cgi?parameter";
582 ASSERT_TRUE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
583 ASSERT_STREQ(
"http", scheme);
584 ASSERT_STREQ(
"www.test.domain.com", server);
585 ASSERT_EQ(port, 123);
586 ASSERT_STREQ(
"/someScript.cgi?parameter", uriPath);
588 url =
"hTTpS://Www.TeST.domain.coM:123/someScript.cgi?parameter";
589 ASSERT_TRUE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
590 ASSERT_STREQ(
"https", scheme);
591 ASSERT_STREQ(
"www.test.domain.com", server);
592 ASSERT_EQ(port, 123);
593 ASSERT_STREQ(
"/someScript.cgi?parameter", uriPath);
595 url =
"http://www.test.domain.com/someScript.cgi?parameter";
596 ASSERT_TRUE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
597 ASSERT_STREQ(
"http", scheme);
598 ASSERT_STREQ(
"www.test.domain.com", server);
600 ASSERT_STREQ(
"/someScript.cgi?parameter", uriPath);
602 url =
"http://www.test.domain.com";
603 ASSERT_TRUE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
604 ASSERT_STREQ(
"http", scheme);
605 ASSERT_STREQ(
"www.test.domain.com", server);
607 ASSERT_STREQ(
"", uriPath);
609 url =
"http://www.test.domain.com/";
610 ASSERT_TRUE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
611 ASSERT_STREQ(
"http", scheme);
612 ASSERT_STREQ(
"www.test.domain.com", server);
614 ASSERT_STREQ(
"/", uriPath);
616 url =
"http://ufoai.org/ufo/masterserver.php?query";
617 ASSERT_TRUE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
618 ASSERT_STREQ(
"http", scheme);
619 ASSERT_STREQ(
"ufoai.org", server);
621 ASSERT_STREQ(
"/ufo/masterserver.php?query", uriPath);
623 url =
"https://ufoai.org/ufo/masterserver.php?query";
624 ASSERT_TRUE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
625 ASSERT_STREQ(
"https", scheme);
626 ASSERT_STREQ(
"ufoai.org", server);
627 ASSERT_EQ(443, port);
628 ASSERT_STREQ(
"/ufo/masterserver.php?query", uriPath);
630 url =
"https://ufoai.org:0/ufo/masterserver.php?query";
631 ASSERT_FALSE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
632 url =
"https://ufoai.org:65536/ufo/masterserver.php?query";
633 ASSERT_FALSE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
634 url =
"https://ufoai.org:80sas/ufo/masterserver.php?query";
635 ASSERT_FALSE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
636 url =
"https://ufoai.org:000000080/ufo/masterserver.php?query";
637 ASSERT_FALSE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
638 url =
"ftp://ufoai.org:0/ufo/masterserver.php?query";
639 ASSERT_FALSE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
640 url =
"https:///ufo/masterserver.php?query";
641 ASSERT_FALSE(
HTTP_ExtractComponents(url, scheme,
sizeof(scheme), server,
sizeof(server), uriPath,
sizeof(uriPath), &port));
647 ASSERT_TRUE(
NET_ResolvNode(
"localhost", ipServer,
sizeof(ipServer))) <<
"failed to resolve localhost";
648 ASSERT_STREQ(
"127.0.0.1", ipServer);
654 ASSERT_STREQ(buf,
"00000000 00000000 00000000 00000011");
657 ASSERT_STREQ(buf,
"00000000 00000000 00000000 11111111");
660 ASSERT_STREQ(buf,
"00000000 00000001 00000000 00000000");
663 ASSERT_STREQ(buf,
"00000000 00000000 11111111 11111111");
666 ASSERT_STREQ(buf,
"00000010");
669 ASSERT_STREQ(buf,
"11111111");
674 const char* strNull =
nullptr;
675 const char* strEmpty =
"";
676 const char* strValid =
"someString";
689 ASSERT_NE(-1,
FS_LoadFile(
"ufos/entities.ufo", &fileBuffer)) <<
"Could not load ufos/entities.ufo.";
690 ASSERT_TRUE(fileBuffer !=
nullptr);
692 const char*
buf = (
const char*) fileBuffer;
697 bool worldSpawnFound =
false;
701 ASSERT_TRUE(
nullptr != e);
703 worldSpawnFound =
true;
708 ASSERT_TRUE(
nullptr != keyDef);
713 ASSERT_TRUE(worldSpawnFound);
722 const char* test =
"invalid block";
724 ASSERT_EQ(length, -1);
727 const char* test =
"{the block length }";
728 const char*
buf = test;
729 const size_t expected = strlen(test) - 2;
730 const char* start =
nullptr;
732 ASSERT_EQ(length, expected);
733 ASSERT_EQ(strncmp(start, test + 1, length), 0) << start <<
" and " << (test + 1) <<
" should match on the first " << length <<
" characters";
741 ASSERT_STREQ(buf,
"/foo/bar");
743 Com_FilePath(
"/foo/bar/a/little/bit/too/long/for/the/buffer/file.txt", buf,
sizeof(buf));
744 ASSERT_STREQ(buf,
"");
749 const char* md5 =
Com_MD5File(
"media/DejaVuSans.ttf");
750 const char* expected =
"c4adcbdd6ec636e0b19cd6aabe85e8fb";
751 Com_Printf(
"got: '%s', expected '%s'\n", md5, expected);
752 ASSERT_STREQ(md5, expected);
757 const char* in =
"Test";
758 const char* expected =
"0cbc6611f5540bd0809a388dc95a615b";
760 Com_Printf(
"got: '%s', expected '%s'\n", md5, expected);
761 ASSERT_STREQ(md5, expected);
766 const char* in =
"Test";
767 const char* expected =
"640ab2bae07bedc4c163f679a746f7ab7fb5d1fa";
770 Com_Printf(
"got: '%s', expected '%s'\n", digest, expected);
771 ASSERT_STREQ(digest, expected);
776 const char* in =
"Test";
777 const char* expected =
"532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25";
782 Com_Printf(
"got: '%s', expected '%s'\n", buf, expected);
783 ASSERT_STREQ(buf, expected);
789 static int TEST_BEP (
const char*
id,
const void* userdata)
list of script aliases to register
bool Q_strnull(const char *string)
const char * Cmd_Argv(int arg)
Returns a given argument.
const char * FS_NextFileFromFileList(const char *files)
Returns the next file that is found in the virtual filesystem identified by the given file pattern...
int UTF8_char_offset_to_byte_offset(char *str, int pos)
Convert UTF-8 character offset to a byte offset in the given string.
void Com_SHA2ToHex(const byte digest[32], char final[65])
bool Com_UnregisterConstVariable(const char *name)
Removes a registered constant from the script mapping hash table.
size_t UTF8_strlen(const char *str)
Count the number of character (not the number of bytes) of a zero termination string.
void LIST_PrependString(linkedList_t **listDest, const char *data)
Adds a string as first entry to a linked list.
bool Com_SHA1Buffer(const unsigned char *buf, unsigned int len, char digest[41])
const char * va(const char *format,...)
does a varargs printf into a temp buffer, so I don't need to have varargs versions of all text functi...
void LIST_AddStringSorted(linkedList_t **listDest, const char *data)
void * LIST_GetByIdx(linkedList_t *list, int index)
Get an entry of a linked list by its index in the list.
Evaluates stuff like this expression.
char * UTF8_strncpyz(char *dest, const char *src, size_t limit)
UTF8 capable string copy function.
bool Com_sprintf(char *dest, size_t size, const char *fmt,...)
copies formatted string with buffer-size checking
static void SetUpTestCase()
entityDef_t entityDefs[ED_MAX_DEFS+1]
void Com_FilePath(const char *in, char *out, size_t size)
Returns the path up to, but not including the last /.
int UTF8_next(const char **str)
Get the next utf-8 character from the given string.
bool STRHUNK_Add(stringHunk_t *hunk, const char *string)
void Cmd_TokenizeString(const char *text, bool macroExpand, bool replaceWhitespaces)
Parses the given string into command line tokens.
int FS_LoadFile(const char *path, byte **buffer)
Filenames are relative to the quake search path.
void Com_Printf(const char *const fmt,...)
bool HTTP_ExtractComponents(const char *url, char *scheme, size_t schemeLength, char *host, size_t hostLength, char *path, size_t pathLength, int *port)
Extract the servername, the port and the path part of the given url.
int FS_BuildFileList(const char *fileList)
Build a filelist.
void LIST_Delete(linkedList_t **list)
void Com_RegisterConstList(const constListEntry_t constList[])
Registers a list of string aliases.
int LIST_Count(const linkedList_t *list)
#define Q_strvalid(string)
static int testListSorter(linkedList_t *entry1, linkedList_t *entry2, const void *userData)
bool BEP_Evaluate(const char *expr, BEPEvaluteCallback_t varFuncParam, const void *userdata)
const char * Info_ValueForKey(const char *s, const char *key)
Searches the string for the given key and returns the associated value, or an empty string...
static void STRHUNK_VisitorTestEntry2(const char *string)
const char * Com_MD5File(const char *fn, int length=0)
Compute the md5sum of a given file.
void Q_strncpyz(char *dest, const char *src, size_t destsize)
Safe strncpy that ensures a trailing zero.
bool LIST_Remove(linkedList_t **list, const void *data)
int UTF8_delete_char_at(char *s, int pos)
Delete a whole (possibly multibyte) character from a string.
char * Com_ConvertToASCII7(char *s)
Remove high character values and only keep ascii. This can be used to print utf-8 characters to the c...
const char * Com_MD5Buffer(const byte *buf, size_t len)
Compute the md5sum of the given buffer.
cvar_t * Cvar_Get(const char *var_name, const char *var_value, int flags, const char *desc)
Init or return a cvar.
void LIST_AddString(linkedList_t **listDest, const char *data)
Adds an string to a new or to an already existing linked list. The string is copied here...
QGL_EXTERN GLuint GLsizei GLsizei * length
stringHunk_t * STRHUNK_Create(size_t size)
void LIST_Sort(linkedList_t **list, linkedListSort_t sorter, const void *userData)
int STRHUNK_Size(const stringHunk_t *hunk)
int UTF8_insert_char_at(char *s, int n, int pos, int c)
Insert a (possibly multibyte) UTF-8 character into a string.
static int TEST_BEP(const char *id, const void *userdata)
The string 'a' and 'c' evaluates to true - everything else to false.
static void STRHUNK_VisitorTestEntry(const char *string)
const linkedList_t * LIST_ContainsString(const linkedList_t *list, const char *string)
Searches for the first occurrence of a given string.
linkedList_t * LIST_CopyStructure(linkedList_t *src)
int ED_Parse(const char *data_p)
QGL_EXTERN GLenum GLuint * dest
bool LIST_RemoveEntry(linkedList_t **list, linkedList_t *entry)
Removes one entry from the linked list.
void Com_RegisterConstInt(const char *name, int value)
Register mappings between script strings and enum values for values of the type V_INT.
const GLuint *typedef void(APIENTRY *GenRenderbuffersEXT_t)(GLsizei
int Com_GetBlock(const char **text, const char **start)
Get the start and end point of a block in the given text.
CGAME_HARD_LINKED_FUNCTIONS linkedList_t * LIST_Add(linkedList_t **listDest, void const *data, size_t length)
const char * Com_UnsignedIntToBinary(uint32_t x)
const char * Com_GetConstVariable(const char *space, int value)
Searches the mapping variable for a given integer value and a namespace.
static void TearDownTestCase()
void Info_SetValueForKey(char *s, const size_t size, const char *key, const char *value)
Adds a new entry into string with given value.
const char * Com_ByteToBinary(byte x)
void STRHUNK_Reset(stringHunk_t *hunk)
TEST_F(GenericTest, StringHunks)
void Q_strcat(char *dest, size_t destsize, const char *format,...)
Safely (without overflowing the destination buffer) concatenates two strings.
const char * Cvar_Userinfo(char *info, size_t infoSize)
Returns an info string containing all the CVAR_USERINFO cvars.
void Info_RemoveKey(char *s, const char *key)
Searches through s for key and remove is.
bool Q_strreplace(const char *source, const char *pattern, const char *replace, char *dest, size_t destsize)
Replaces the first occurence of the given pattern in the source string with the given replace string...
#define LIST_Foreach(list, type, var)
Iterates over a linked list, it's safe to delete the returned entry from the list while looping over ...
void Com_SHA2Csum(const byte *buf, uint32_t buflen, byte digest[32])
Output SHA-256(buf)
int Q_StringSort(const void *string1, const void *string2)
Compare two strings.
GLsizei const GLvoid * data
cvar_t * Cvar_Set(const char *varName, const char *value,...)
Sets a cvar value.
const char * Cvar_GetString(const char *varName)
Returns the value of cvar as string.
bool LIST_IsEmpty(const linkedList_t *list)
Checks whether the given list is empty.
size_t STRHUNK_GetFreeSpace(const stringHunk_t *hunk)
void STRHUNK_Delete(stringHunk_t **hunk)
void * LIST_GetRandom(linkedList_t *list)
void STRHUNK_Visit(stringHunk_t *hunk, stringHunkVisitor_t visitor)
bool Com_GetConstInt(const char *name, int *value)
Searches whether a given value was registered as a string to int mapping.
bool Com_UnregisterConstList(const constListEntry_t constList[])
Unregisters a list of string aliases.
void FS_FreeFile(void *buffer)
bool NET_ResolvNode(const char *node, char *buf, size_t bufLength)
int Sys_Milliseconds(void)