Edit

kc3-lang/SDL/test/testautomation_stdlib.c

Branch :

  • Show log

    Commit

  • Author : Ryan C. Gordon
    Date : 2015-04-20 12:22:44
    Hash : b72938c8
    Message : Windows: Always set the system timer resolution to 1ms by default. An existing hint lets apps that don't need the timer resolution changed avoid this, to save battery, etc, but this fixes several problems in timing, audio callbacks not firing fast enough, etc. Fixes Bugzilla #2944.

  • test/testautomation_stdlib.c
  • /**
     * Standard C library routine test suite
     */
    
    #include <stdio.h>
    
    #include "SDL.h"
    #include "SDL_test.h"
    
    
    /* Test case functions */
    
    /**
     * @brief Call to SDL_strlcpy
     */
    #undef SDL_strlcpy
    int
    stdlib_strlcpy(void *arg)
    {
      size_t result;
      char text[1024];
      const char *expected;
    
      result = SDL_strlcpy(text, "foo", sizeof(text));
      expected = "foo";
      SDLTest_AssertPass("Call to SDL_strlcpy(\"foo\")");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
      SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
    
      result = SDL_strlcpy(text, "foo", 2);
      expected = "f";
      SDLTest_AssertPass("Call to SDL_strlcpy(\"foo\") with buffer size 2");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
      SDLTest_AssertCheck(result == 3, "Check result value, expected: 3, got: %d", result);
    
      return TEST_COMPLETED;
    }
    
    /**
     * @brief Call to SDL_snprintf
     */
    #undef SDL_snprintf
    int
    stdlib_snprintf(void *arg)
    {
      int result;
      char text[1024];
      const char *expected;
    
      result = SDL_snprintf(text, sizeof(text), "%s", "foo");
      expected = "foo";
      SDLTest_AssertPass("Call to SDL_snprintf(\"%%s\", \"foo\")");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
      SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
    
      result = SDL_snprintf(text, 2, "%s", "foo");
      expected = "f";
      SDLTest_AssertPass("Call to SDL_snprintf(\"%%s\", \"foo\") with buffer size 2");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
      SDLTest_AssertCheck(result == 3, "Check result value, expected: 3, got: %d", result);
    
      result = SDL_snprintf(NULL, 0, "%s", "foo");
      SDLTest_AssertCheck(result == 3, "Check result value, expected: 3, got: %d", result);
    
      result = SDL_snprintf(text, sizeof(text), "%f", 1.0);
      expected = "1.000000";
      SDLTest_AssertPass("Call to SDL_snprintf(\"%%f\", 1.0)");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
      SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
    
      result = SDL_snprintf(text, sizeof(text), "%.f", 1.0);
      expected = "1";
      SDLTest_AssertPass("Call to SDL_snprintf(\"%%.f\", 1.0)");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
      SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
    
      result = SDL_snprintf(text, sizeof(text), "%#.f", 1.0);
      expected = "1.";
      SDLTest_AssertPass("Call to SDL_snprintf(\"%%#.f\", 1.0)");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
      SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
    
      result = SDL_snprintf(text, sizeof(text), "%f", 1.0 + 1.0 / 3.0);
      expected = "1.333333";
      SDLTest_AssertPass("Call to SDL_snprintf(\"%%f\", 1.0 + 1.0 / 3.0)");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
      SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
    
      result = SDL_snprintf(text, sizeof(text), "%+f", 1.0 + 1.0 / 3.0);
      expected = "+1.333333";
      SDLTest_AssertPass("Call to SDL_snprintf(\"%%+f\", 1.0 + 1.0 / 3.0)");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
      SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
    
      result = SDL_snprintf(text, sizeof(text), "%.2f", 1.0 + 1.0 / 3.0);
      expected = "1.33";
      SDLTest_AssertPass("Call to SDL_snprintf(\"%%.2f\", 1.0 + 1.0 / 3.0)");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
      SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
    
      result = SDL_snprintf(text, sizeof(text), "%6.2f", 1.0 + 1.0 / 3.0);
      expected = "  1.33";
      SDLTest_AssertPass("Call to SDL_snprintf(\"%%6.2f\", 1.0 + 1.0 / 3.0)");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
      SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
    
      result = SDL_snprintf(text, sizeof(text), "%06.2f", 1.0 + 1.0 / 3.0);
      expected = "001.33";
      SDLTest_AssertPass("Call to SDL_snprintf(\"%%06.2f\", 1.0 + 1.0 / 3.0)");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
      SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
    
      result = SDL_snprintf(text, 5, "%06.2f", 1.0 + 1.0 / 3.0);
      expected = "001.";
      SDLTest_AssertPass("Call to SDL_snprintf(\"%%06.2f\", 1.0 + 1.0 / 3.0) with buffer size 5");
      SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
      SDLTest_AssertCheck(result == 6, "Check result value, expected: 6, got: %d", result);
    
      return TEST_COMPLETED;
    }
    
    /**
     * @brief Call to SDL_getenv and SDL_setenv
     */
    int
    stdlib_getsetenv(void *arg)
    {
      const int nameLen = 16;
      char name[17];
      int counter;
      int result;
      char * value1;
      char * value2;
      char * expected;
      int overwrite;
      char * text;
    
      /* Create a random name. This tests SDL_getenv, since we need to */
      /* make sure the variable is not set yet (it shouldn't). */
      do {
        for(counter = 0; counter < nameLen; counter++) {
          name[counter] = (char)SDLTest_RandomIntegerInRange(65, 90);
        }
        name[nameLen] = '\0';
        
        text = SDL_getenv(name);
        SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
        if (text != NULL) {
          SDLTest_Log("Expected: NULL, Got: '%s' (%i)", text, SDL_strlen(text));
        }
      } while (text != NULL);
       
      /* Create random values to set */                    
      value1 = SDLTest_RandomAsciiStringOfSize(10);
      value2 = SDLTest_RandomAsciiStringOfSize(10);
    
      /* Set value 1 without overwrite */
      overwrite = 0;
      expected = value1;
      result = SDL_setenv(name, value1, overwrite);
      SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value1, overwrite);
      SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
    
      /* Check value */
      text = SDL_getenv(name);
      SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
      SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
      if (text != NULL) {
        SDLTest_AssertCheck(
          SDL_strcmp(text, expected) == 0, 
          "Verify returned text, expected: %s, got: %s",
          expected,
          text);
      }
      
      /* Set value 2 with overwrite */
      overwrite = 1;
      expected = value2;    
      result = SDL_setenv(name, value2, overwrite);
      SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value2, overwrite);
      SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
    
      /* Check value */
      text = SDL_getenv(name);
      SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
      SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
      if (text != NULL) {
        SDLTest_AssertCheck(
          SDL_strcmp(text, expected) == 0, 
          "Verify returned text, expected: %s, got: %s",
          expected,
          text);
      }
    
      /* Set value 1 without overwrite */
      overwrite = 0;
      expected = value2;    
      result = SDL_setenv(name, value1, overwrite);
      SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value1, overwrite);
      SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
    
      /* Check value */
      text = SDL_getenv(name);
      SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
      SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
      if (text != NULL) {
        SDLTest_AssertCheck(
          SDL_strcmp(text, expected) == 0, 
          "Verify returned text, expected: %s, got: %s",
          expected,
          text);
      }
      
      /* Set value 1 without overwrite */
      overwrite = 1;
      expected = value1;
      result = SDL_setenv(name, value1, overwrite);
      SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value1, overwrite);
      SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
    
      /* Check value */
      text = SDL_getenv(name);
      SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
      SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
      if (text != NULL) {
        SDLTest_AssertCheck(
          SDL_strcmp(text, expected) == 0, 
          "Verify returned text, expected: %s, got: %s",
          expected,
          text);
      }
    
      /* Negative cases */
      for (overwrite=0; overwrite <= 1; overwrite++) { 
        result = SDL_setenv(NULL, value1, overwrite);
        SDLTest_AssertPass("Call to SDL_setenv(NULL,'%s', %i)", value1, overwrite);
        SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
        result = SDL_setenv("", value1, overwrite);
        SDLTest_AssertPass("Call to SDL_setenv('','%s', %i)", value1, overwrite);
        SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
        result = SDL_setenv("=", value1, overwrite);
        SDLTest_AssertPass("Call to SDL_setenv('=','%s', %i)", value1, overwrite);
        SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
        result = SDL_setenv(name, NULL, overwrite);
        SDLTest_AssertPass("Call to SDL_setenv('%s', NULL, %i)", name, overwrite);
        SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
      }
    
      /* Clean up */
      SDL_free(value1);
      SDL_free(value2);
        
      return TEST_COMPLETED;
    }
    
    /* ================= Test References ================== */
    
    /* Standard C routine test cases */
    static const SDLTest_TestCaseReference stdlibTest1 =
            { (SDLTest_TestCaseFp)stdlib_strlcpy, "stdlib_strlcpy", "Call to SDL_strlcpy", TEST_ENABLED };
    
    static const SDLTest_TestCaseReference stdlibTest2 =
            { (SDLTest_TestCaseFp)stdlib_snprintf, "stdlib_snprintf", "Call to SDL_snprintf", TEST_ENABLED };
    
    static const SDLTest_TestCaseReference stdlibTest3 =
            { (SDLTest_TestCaseFp)stdlib_getsetenv, "stdlib_getsetenv", "Call to SDL_getenv and SDL_setenv", TEST_ENABLED };
    
    /* Sequence of Standard C routine test cases */
    static const SDLTest_TestCaseReference *stdlibTests[] =  {
        &stdlibTest1, &stdlibTest2, &stdlibTest3, NULL
    };
    
    /* Timer test suite (global) */
    SDLTest_TestSuiteReference stdlibTestSuite = {
        "Stdlib",
        NULL,
        stdlibTests,
        NULL
    };