test/testautomation_stdlib.c
author Sam Lantinga <slouken@libsdl.org>
Thu, 07 Dec 2017 16:08:09 -0800
changeset 11730 ac6c607e065c
parent 10782 1de6d4633ee6
permissions -rw-r--r--
Enable building the Metal renderer by default, and weak link the Metal framework so the SDL library is safe to use on older Macs
Also generate iOS versions of the Metal shaders
     1 /**
     2  * Standard C library routine test suite
     3  */
     4 
     5 #include <stdio.h>
     6 
     7 #include "SDL.h"
     8 #include "SDL_test.h"
     9 
    10 
    11 /* Test case functions */
    12 
    13 /**
    14  * @brief Call to SDL_strlcpy
    15  */
    16 #undef SDL_strlcpy
    17 int
    18 stdlib_strlcpy(void *arg)
    19 {
    20   size_t result;
    21   char text[1024];
    22   const char *expected;
    23 
    24   result = SDL_strlcpy(text, "foo", sizeof(text));
    25   expected = "foo";
    26   SDLTest_AssertPass("Call to SDL_strlcpy(\"foo\")");
    27   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
    28   SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", (int) SDL_strlen(text), (int) result);
    29 
    30   result = SDL_strlcpy(text, "foo", 2);
    31   expected = "f";
    32   SDLTest_AssertPass("Call to SDL_strlcpy(\"foo\") with buffer size 2");
    33   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
    34   SDLTest_AssertCheck(result == 3, "Check result value, expected: 3, got: %d", (int) result);
    35 
    36   return TEST_COMPLETED;
    37 }
    38 
    39 /**
    40  * @brief Call to SDL_snprintf
    41  */
    42 #undef SDL_snprintf
    43 int
    44 stdlib_snprintf(void *arg)
    45 {
    46   int result;
    47   char text[1024];
    48   const char *expected;
    49 
    50   result = SDL_snprintf(text, sizeof(text), "%s", "foo");
    51   expected = "foo";
    52   SDLTest_AssertPass("Call to SDL_snprintf(\"%%s\", \"foo\")");
    53   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
    54   SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", (int) SDL_strlen(text), result);
    55 
    56   result = SDL_snprintf(text, 2, "%s", "foo");
    57   expected = "f";
    58   SDLTest_AssertPass("Call to SDL_snprintf(\"%%s\", \"foo\") with buffer size 2");
    59   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
    60   SDLTest_AssertCheck(result == 3, "Check result value, expected: 3, got: %d", result);
    61 
    62   result = SDL_snprintf(NULL, 0, "%s", "foo");
    63   SDLTest_AssertCheck(result == 3, "Check result value, expected: 3, got: %d", result);
    64 
    65   result = SDL_snprintf(text, sizeof(text), "%f", 1.0);
    66   expected = "1.000000";
    67   SDLTest_AssertPass("Call to SDL_snprintf(\"%%f\", 1.0)");
    68   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
    69   SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", (int) SDL_strlen(text), result);
    70 
    71   result = SDL_snprintf(text, sizeof(text), "%.f", 1.0);
    72   expected = "1";
    73   SDLTest_AssertPass("Call to SDL_snprintf(\"%%.f\", 1.0)");
    74   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
    75   SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", (int) SDL_strlen(text), result);
    76 
    77   result = SDL_snprintf(text, sizeof(text), "%#.f", 1.0);
    78   expected = "1.";
    79   SDLTest_AssertPass("Call to SDL_snprintf(\"%%#.f\", 1.0)");
    80   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
    81   SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", (int) SDL_strlen(text), result);
    82 
    83   result = SDL_snprintf(text, sizeof(text), "%f", 1.0 + 1.0 / 3.0);
    84   expected = "1.333333";
    85   SDLTest_AssertPass("Call to SDL_snprintf(\"%%f\", 1.0 + 1.0 / 3.0)");
    86   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
    87   SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", (int) SDL_strlen(text), result);
    88 
    89   result = SDL_snprintf(text, sizeof(text), "%+f", 1.0 + 1.0 / 3.0);
    90   expected = "+1.333333";
    91   SDLTest_AssertPass("Call to SDL_snprintf(\"%%+f\", 1.0 + 1.0 / 3.0)");
    92   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
    93   SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", (int) SDL_strlen(text), result);
    94 
    95   result = SDL_snprintf(text, sizeof(text), "%.2f", 1.0 + 1.0 / 3.0);
    96   expected = "1.33";
    97   SDLTest_AssertPass("Call to SDL_snprintf(\"%%.2f\", 1.0 + 1.0 / 3.0)");
    98   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
    99   SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", (int) SDL_strlen(text), result);
   100 
   101   result = SDL_snprintf(text, sizeof(text), "%6.2f", 1.0 + 1.0 / 3.0);
   102   expected = "  1.33";
   103   SDLTest_AssertPass("Call to SDL_snprintf(\"%%6.2f\", 1.0 + 1.0 / 3.0)");
   104   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
   105   SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", (int) SDL_strlen(text), result);
   106 
   107   result = SDL_snprintf(text, sizeof(text), "%06.2f", 1.0 + 1.0 / 3.0);
   108   expected = "001.33";
   109   SDLTest_AssertPass("Call to SDL_snprintf(\"%%06.2f\", 1.0 + 1.0 / 3.0)");
   110   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
   111   SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", (int) SDL_strlen(text), result);
   112 
   113   result = SDL_snprintf(text, 5, "%06.2f", 1.0 + 1.0 / 3.0);
   114   expected = "001.";
   115   SDLTest_AssertPass("Call to SDL_snprintf(\"%%06.2f\", 1.0 + 1.0 / 3.0) with buffer size 5");
   116   SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
   117   SDLTest_AssertCheck(result == 6, "Check result value, expected: 6, got: %d", result);
   118 
   119   return TEST_COMPLETED;
   120 }
   121 
   122 /**
   123  * @brief Call to SDL_getenv and SDL_setenv
   124  */
   125 int
   126 stdlib_getsetenv(void *arg)
   127 {
   128   const int nameLen = 16;
   129   char name[17];
   130   int counter;
   131   int result;
   132   char * value1;
   133   char * value2;
   134   char * expected;
   135   int overwrite;
   136   char * text;
   137 
   138   /* Create a random name. This tests SDL_getenv, since we need to */
   139   /* make sure the variable is not set yet (it shouldn't). */
   140   do {
   141     for(counter = 0; counter < nameLen; counter++) {
   142       name[counter] = (char)SDLTest_RandomIntegerInRange(65, 90);
   143     }
   144     name[nameLen] = '\0';
   145     
   146     text = SDL_getenv(name);
   147     SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
   148     if (text != NULL) {
   149       SDLTest_Log("Expected: NULL, Got: '%s' (%i)", text, (int) SDL_strlen(text));
   150     }
   151   } while (text != NULL);
   152    
   153   /* Create random values to set */                    
   154   value1 = SDLTest_RandomAsciiStringOfSize(10);
   155   value2 = SDLTest_RandomAsciiStringOfSize(10);
   156 
   157   /* Set value 1 without overwrite */
   158   overwrite = 0;
   159   expected = value1;
   160   result = SDL_setenv(name, value1, overwrite);
   161   SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value1, overwrite);
   162   SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
   163 
   164   /* Check value */
   165   text = SDL_getenv(name);
   166   SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
   167   SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
   168   if (text != NULL) {
   169     SDLTest_AssertCheck(
   170       SDL_strcmp(text, expected) == 0, 
   171       "Verify returned text, expected: %s, got: %s",
   172       expected,
   173       text);
   174   }
   175   
   176   /* Set value 2 with overwrite */
   177   overwrite = 1;
   178   expected = value2;    
   179   result = SDL_setenv(name, value2, overwrite);
   180   SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value2, overwrite);
   181   SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
   182 
   183   /* Check value */
   184   text = SDL_getenv(name);
   185   SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
   186   SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
   187   if (text != NULL) {
   188     SDLTest_AssertCheck(
   189       SDL_strcmp(text, expected) == 0, 
   190       "Verify returned text, expected: %s, got: %s",
   191       expected,
   192       text);
   193   }
   194 
   195   /* Set value 1 without overwrite */
   196   overwrite = 0;
   197   expected = value2;    
   198   result = SDL_setenv(name, value1, overwrite);
   199   SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value1, overwrite);
   200   SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
   201 
   202   /* Check value */
   203   text = SDL_getenv(name);
   204   SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
   205   SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
   206   if (text != NULL) {
   207     SDLTest_AssertCheck(
   208       SDL_strcmp(text, expected) == 0, 
   209       "Verify returned text, expected: %s, got: %s",
   210       expected,
   211       text);
   212   }
   213   
   214   /* Set value 1 without overwrite */
   215   overwrite = 1;
   216   expected = value1;
   217   result = SDL_setenv(name, value1, overwrite);
   218   SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value1, overwrite);
   219   SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
   220 
   221   /* Check value */
   222   text = SDL_getenv(name);
   223   SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
   224   SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
   225   if (text != NULL) {
   226     SDLTest_AssertCheck(
   227       SDL_strcmp(text, expected) == 0, 
   228       "Verify returned text, expected: %s, got: %s",
   229       expected,
   230       text);
   231   }
   232 
   233   /* Negative cases */
   234   for (overwrite=0; overwrite <= 1; overwrite++) { 
   235     result = SDL_setenv(NULL, value1, overwrite);
   236     SDLTest_AssertPass("Call to SDL_setenv(NULL,'%s', %i)", value1, overwrite);
   237     SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
   238     result = SDL_setenv("", value1, overwrite);
   239     SDLTest_AssertPass("Call to SDL_setenv('','%s', %i)", value1, overwrite);
   240     SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
   241     result = SDL_setenv("=", value1, overwrite);
   242     SDLTest_AssertPass("Call to SDL_setenv('=','%s', %i)", value1, overwrite);
   243     SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
   244     result = SDL_setenv(name, NULL, overwrite);
   245     SDLTest_AssertPass("Call to SDL_setenv('%s', NULL, %i)", name, overwrite);
   246     SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
   247   }
   248 
   249   /* Clean up */
   250   SDL_free(value1);
   251   SDL_free(value2);
   252     
   253   return TEST_COMPLETED;
   254 }
   255 
   256 /**
   257  * @brief Call to SDL_sscanf
   258  */
   259 #undef SDL_sscanf
   260 int
   261 stdlib_sscanf(void *arg)
   262 {
   263   int output;
   264   int result;
   265   int expected_output;
   266   int expected_result;
   267 
   268   expected_output = output = 123;
   269   expected_result = -1;
   270   result = SDL_sscanf("", "%i", &output);
   271   SDLTest_AssertPass("Call to SDL_sscanf(\"\", \"%%i\", &output)");
   272   SDLTest_AssertCheck(expected_output == output, "Check output, expected: %i, got: %i", expected_output, output);
   273   SDLTest_AssertCheck(expected_result == result, "Check return value, expected: %i, got: %i", expected_result, result);
   274 
   275   expected_output = output = 123;
   276   expected_result = 0;
   277   result = SDL_sscanf("a", "%i", &output);
   278   SDLTest_AssertPass("Call to SDL_sscanf(\"a\", \"%%i\", &output)");
   279   SDLTest_AssertCheck(expected_output == output, "Check output, expected: %i, got: %i", expected_output, output);
   280   SDLTest_AssertCheck(expected_result == result, "Check return value, expected: %i, got: %i", expected_result, result);
   281 
   282   output = 123;
   283   expected_output = 2;
   284   expected_result = 1;
   285   result = SDL_sscanf("2", "%i", &output);
   286   SDLTest_AssertPass("Call to SDL_sscanf(\"2\", \"%%i\", &output)");
   287   SDLTest_AssertCheck(expected_output == output, "Check output, expected: %i, got: %i", expected_output, output);
   288   SDLTest_AssertCheck(expected_result == result, "Check return value, expected: %i, got: %i", expected_result, result);
   289 
   290   return TEST_COMPLETED;
   291 }
   292 
   293 /* ================= Test References ================== */
   294 
   295 /* Standard C routine test cases */
   296 static const SDLTest_TestCaseReference stdlibTest1 =
   297         { (SDLTest_TestCaseFp)stdlib_strlcpy, "stdlib_strlcpy", "Call to SDL_strlcpy", TEST_ENABLED };
   298 
   299 static const SDLTest_TestCaseReference stdlibTest2 =
   300         { (SDLTest_TestCaseFp)stdlib_snprintf, "stdlib_snprintf", "Call to SDL_snprintf", TEST_ENABLED };
   301 
   302 static const SDLTest_TestCaseReference stdlibTest3 =
   303         { (SDLTest_TestCaseFp)stdlib_getsetenv, "stdlib_getsetenv", "Call to SDL_getenv and SDL_setenv", TEST_ENABLED };
   304 
   305 static const SDLTest_TestCaseReference stdlibTest4 =
   306         { (SDLTest_TestCaseFp)stdlib_sscanf, "stdlib_sscanf", "Call to SDL_sscanf", TEST_ENABLED };
   307 
   308 /* Sequence of Standard C routine test cases */
   309 static const SDLTest_TestCaseReference *stdlibTests[] =  {
   310     &stdlibTest1, &stdlibTest2, &stdlibTest3, &stdlibTest4, NULL
   311 };
   312 
   313 /* Standard C routine test suite (global) */
   314 SDLTest_TestSuiteReference stdlibTestSuite = {
   315     "Stdlib",
   316     NULL,
   317     stdlibTests,
   318     NULL
   319 };