/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id$ */ #include /* INT_MAX */ #include /* sqrt () */ #include /* strlen () */ #include /* setenv (), unsetenv () */ #ifdef _WIN32 #include #define setenv(key, value, unused) SetEnvironmentVariableA (key, value) #define unsetenv(key) SetEnvironmentVariableA (key, NULL) #endif #include "transmission.h" #include "ConvertUTF.h" /* tr_utf8_validate*/ #include "platform.h" #include "crypto-utils.h" /* tr_rand_int_weak */ #include "utils.h" #include "web.h" #define NUM_LOOPS 1 #define SPEED_TEST 0 #if SPEED_TEST #define VERBOSE #undef NUM_LOOPS #define NUM_LOOPS 200 #endif #include "libtransmission-test.h" static int test_strip_positional_args (void) { const char * in; const char * out; const char * expected; in = "Hello %1$s foo %2$.*f"; expected = "Hello %s foo %.*f"; out = tr_strip_positional_args (in); check_streq (expected, out); in = "Hello %1$'d foo %2$'f"; expected = "Hello %d foo %f"; out = tr_strip_positional_args (in); check_streq (expected, out); return 0; } static int test_strstrip (void) { char *in, *out; /* strstrip */ in = tr_strdup (" test "); out = tr_strstrip (in); check (in == out); check_streq ("test", out); tr_free (in); /* strstrip */ in = tr_strdup (" test test "); out = tr_strstrip (in); check (in == out); check_streq ("test test", out); tr_free (in); /* strstrip */ in = tr_strdup ("test"); out = tr_strstrip (in); check (in == out); check_streq ("test", out); tr_free (in); return 0; } static int test_buildpath (void) { char * out; out = tr_buildPath ("foo", "bar", NULL); check_streq ("foo" TR_PATH_DELIMITER_STR "bar", out); tr_free (out); out = tr_buildPath ("", "foo", "bar", NULL); check_streq (TR_PATH_DELIMITER_STR "foo" TR_PATH_DELIMITER_STR "bar", out); tr_free (out); return 0; } static int test_utf8 (void) { const char * in; char * out; in = "hello world"; out = tr_utf8clean (in, -1); check_streq (in, out); tr_free (out); in = "hello world"; out = tr_utf8clean (in, 5); check_streq ("hello", out); tr_free (out); /* this version is not utf-8 (but cp866) */ in = "\x92\xE0\xE3\xA4\xAD\xAE \xA1\xEB\xE2\xEC \x81\xAE\xA3\xAE\xAC"; out = tr_utf8clean (in, 17); check (out != NULL); check ((strlen (out) == 17) || (strlen (out) == 33)); check (tr_utf8_validate (out, -1, NULL)); tr_free (out); /* same string, but utf-8 clean */ in = "Трудно быть Богом"; out = tr_utf8clean (in, -1); check (out != NULL); check (tr_utf8_validate (out, -1, NULL)); check_streq (in, out); tr_free (out); return 0; } static int test_numbers (void) { int i; int count; int * numbers; numbers = tr_parseNumberRange ("1-10,13,16-19", -1, &count); check_int_eq (15, count); check_int_eq (1, numbers[0]); check_int_eq (6, numbers[5]); check_int_eq (10, numbers[9]); check_int_eq (13, numbers[10]); check_int_eq (16, numbers[11]); check_int_eq (19, numbers[14]); tr_free (numbers); numbers = tr_parseNumberRange ("1-5,3-7,2-6", -1, &count); check (count == 7); check (numbers != NULL); for (i=0; i buf[i]) lowest_high = buf[i]; check (highest_low <= lowest_high); return 0; } static int test_quickfindFirst (void) { size_t i; const size_t k = 10; const size_t n = 100; const size_t n_trials = 1000; int * buf = tr_new (int, n); for (i=0; i