static void
testOneDouble(double const value) {

    /* Test serialize of a double.  */

    xmlrpc_env env;
    xmlrpc_value * valueP;
    xmlrpc_mem_block * serializedP;
    char * result;
        /* serialized result, as asciiz string */
    size_t resultLength;
        /* Length in characters of the serialized result */
    double serializedValue;
    char nextChar;
    int itemsMatched;
    
    xmlrpc_env_init(&env);

    /* Build a double to serialize */
    valueP = xmlrpc_double_new(&env, value);
    TEST_NO_FAULT(&env);
    
    /* Serialize the value. */
    serializedP = XMLRPC_MEMBLOCK_NEW(char, &env, 0);
    TEST_NO_FAULT(&env);
    xmlrpc_serialize_value(&env, serializedP, valueP);
    TEST_NO_FAULT(&env);

    /* Make sure we serialized the correct value.  Note that because
       doubles aren't precise, this might serialize as 3.1415899999
       or something like that.  So we check it arithmetically.
    */
    resultLength = XMLRPC_MEMBLOCK_SIZE(char, serializedP);
    result = malloc(resultLength + 1);

    memcpy(result, XMLRPC_MEMBLOCK_CONTENTS(char, serializedP), resultLength);
    result[resultLength] = '\0';
    
    itemsMatched = sscanf(result, 
                          "<value><double>%lf</double></value>\r\n%c",
                          &serializedValue, &nextChar);

    TEST(itemsMatched == 1);
    TESTFLOATEQUAL(serializedValue, value);

    free(result);
    
    /* Clean up our value. */
    XMLRPC_TYPED_MEM_BLOCK_FREE(char, serializedP);
    xmlrpc_DECREF(valueP);

    xmlrpc_env_clean(&env);
}
예제 #2
0
static void
testParseNumberValue(void) {

char const xmldata[] =
    XML_PROLOGUE
    "<methodCall>\r\n"
    "<methodName>test</methodName>\r\n"
    "<params>\r\n"
    "<param><value><int>2147483647</int></value></param>\r\n" \
    "<param><value><int>-2147483648</int></value></param>\r\n" \
    "<param><value><i1>10</i1></value></param>\r\n"
    "<param><value><i2>10</i2></value></param>\r\n"
    "<param><value><i4>10</i4></value></param>\r\n"
    "<param><value><i8>10</i8></value></param>\r\n"
    "<param><value><ex:i8>10</ex:i8></value></param>\r\n"
    "<param><value><double>10</double></value></param>\r\n"
    "<param><value><double>10.1</double></value></param>\r\n"
    "<param><value><double>-10.1</double></value></param>\r\n"
    "<param><value><double>+10.1</double></value></param>\r\n"
    "<param><value><double>0</double></value></param>\r\n"
    "<param><value><double>.01</double></value></param>\r\n"
    "<param><value><double>5.</double></value></param>\r\n"
    "<param><value><double>5.3E6</double></value></param>\r\n"
    "<param><value><double> 1</double></value></param>\r\n"
    "</params>\r\n"
    "</methodCall>\r\n";
    
    xmlrpc_env env;
    xmlrpc_value * paramArrayP;
    const char * methodName;
    int arraySize;
    xmlrpc_int int_max, int_min;
    xmlrpc_int32 i_i1, i_i2, i_i4;
    xmlrpc_int64 i_i8, i_ex_i8;
    double d1, d2, d3, d4, d5, d6, d7, d8, d9;

    xmlrpc_env_init(&env);

    xmlrpc_parse_call(&env, xmldata, strlen(xmldata),
                      &methodName, &paramArrayP);
    TEST_NO_FAULT(&env);

    arraySize = xmlrpc_array_size(&env, paramArrayP);
    TEST_NO_FAULT(&env);

    TEST(arraySize == 16);

    xmlrpc_decompose_value(
        &env, paramArrayP, "(iiiiiIIddddddddd)", 
        &int_max, &int_min, &i_i1, &i_i2, &i_i4, &i_i8, &i_ex_i8,
        &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9);

    TEST_NO_FAULT(&env);

    TEST(int_max == INT_MAX);
    TEST(int_min == INT_MIN);
    TEST(i_i1 == 10);
    TEST(i_i2 == 10);
    TEST(i_i4 == 10);
    TEST(i_i8 == 10);
    TEST(i_ex_i8 == 10);
    TESTFLOATEQUAL(d1, 10.0);
    TESTFLOATEQUAL(d2, 10.1);
    TESTFLOATEQUAL(d3, -10.1);
    TESTFLOATEQUAL(d4, +10.1);
    TESTFLOATEQUAL(d5, 0.0);
    TESTFLOATEQUAL(d6, 0.01);
    TESTFLOATEQUAL(d7, 5.0);
    TESTFLOATEQUAL(d8, 5.3E6);
    TESTFLOATEQUAL(d9, 1.0);

    xmlrpc_DECREF(paramArrayP);
    strfree(methodName);

    xmlrpc_env_clean(&env);
}