BUG#: 8698
authorkarl <karl>
Thu, 28 Jan 2010 13:31:02 +0000 (13:31 +0000)
committerkarl <karl>
Thu, 28 Jan 2010 13:31:02 +0000 (13:31 +0000)
TITLE: Repository test fails on Windows

DESCRIPTION: Corrected issue in StringConversion and added unit tests for
the condition

src/Pegasus/Common/StringConversion.cpp
src/Pegasus/Common/tests/StringConversion/StringConversion.cpp

index b7d8326eb6253b2d7ee11c3668a81df05edec240..f5006809b3ed100e713d14acd4c11dc23e88a303 100644 (file)
@@ -226,7 +226,7 @@ struct Converter
 // On windows sprintf outputs 3 digit precision exponent prepending
 // zeros. Make it 2 digit precision if first digit is zero in the exponent.
 #ifdef PEGASUS_OS_TYPE_WINDOWS
-void _normalizeRealValueString(char* str)
+void _normalizeRealValueString(char* str, Uint32& size)
 {
     // skip initial sign value...
     if (*str == '-' || *str == '+')
@@ -242,6 +242,7 @@ void _normalizeRealValueString(char* str)
         *str = *(str+1);
         *(str+1) = *(str+2);
         *(str+2) = 0;
+        size--;
     }
 }
 #endif
@@ -294,7 +295,7 @@ const char* Real32ToString(char buffer[128], Real32 x, Uint32& size)
     // (4 byte IEEE floating point)
     size = sprintf(buffer, "%.7e", x);
 #ifdef PEGASUS_OS_TYPE_WINDOWS
-    _normalizeRealValueString(buffer);
+    _normalizeRealValueString(buffer, size);
 #endif
     return buffer;
 }
@@ -306,7 +307,7 @@ const char* Real64ToString(char buffer[128], Real64 x, Uint32& size)
     // by the CIM 2.2 spec (8 byte IEEE floating point)
     size = sprintf(buffer, "%.16e", x);
 #ifdef PEGASUS_OS_TYPE_WINDOWS
-    _normalizeRealValueString(buffer);
+    _normalizeRealValueString(buffer, size);
 #endif
     return buffer;
 }
index 4e2e846331650073c8ce53084484779651c679c6..383848acd69e87298b80851e296545a015084c54 100644 (file)
@@ -31,6 +31,7 @@
 #include <Pegasus/Common/StringConversion.h>
 #include <cstring>
 #include <iostream>
+#include <math.h>
 
 PEGASUS_USING_PEGASUS;
 PEGASUS_USING_STD;
@@ -513,6 +514,82 @@ void testStringToReal64()
         !StringConversion::stringToReal64("1.1e+123456789", r64));
 }
 
+void testReal32ToString()
+{
+    Real32 r32;
+    Real64 r64r;
+    char buffer[128];
+    Uint32 size;
+    {
+        r32 = 1.5;
+        const char* result = Real32ToString(buffer, r32, size);
+        PEGASUS_TEST_ASSERT(strlen(result) == size);
+        PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+        PEGASUS_TEST_ASSERT(fabs(r32 - r64r) < r32/1000);
+    }
+
+    {
+        r32 = 0;
+        const char* result = Real32ToString(buffer, r32, size);
+        PEGASUS_TEST_ASSERT(strlen(result) == size);
+        PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+        PEGASUS_TEST_ASSERT(fabs(r32 - r64r) < .0001);
+    }
+
+    {
+        r32 = 10.0E-0001;
+        const char* result = Real32ToString(buffer, r32, size);
+        PEGASUS_TEST_ASSERT(strlen(result) == size);
+        PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+        PEGASUS_TEST_ASSERT(fabs(r32 - r64r) < r32/1000);
+    }
+    {
+        r32 = 10.0E+5;
+        const char* result = Real32ToString(buffer, r32, size);
+        PEGASUS_TEST_ASSERT(strlen(result) == size);
+        PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+        PEGASUS_TEST_ASSERT(fabs(r32 - r64r) < r32/1000);
+    }
+}
+
+void testReal64ToString()
+{
+    Real64 r64;
+    Real64 r64r;
+    char buffer[128];
+    Uint32 size;
+    {
+        r64 = 1.5;
+        const char* result = Real64ToString(buffer, r64, size);
+        PEGASUS_TEST_ASSERT(strlen(result) == size);
+        PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+        PEGASUS_TEST_ASSERT(fabs(r64 - r64r) < r64/1000);
+    }
+
+    {
+        r64 = 0;
+        const char* result = Real64ToString(buffer, r64, size);
+        PEGASUS_TEST_ASSERT(strlen(result) == size);
+        PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+        PEGASUS_TEST_ASSERT(fabs(r64 - r64r) < .0001);
+    }
+
+    {
+        r64 = 10.0E-0001;
+        const char* result = Real64ToString(buffer, r64, size);
+        PEGASUS_TEST_ASSERT(strlen(result) == size);
+        PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+        PEGASUS_TEST_ASSERT(fabs(r64 - r64r) < r64/1000);
+    }
+    {
+        r64 = 10.0E+5;
+        const char* result = Real64ToString(buffer, r64, size);
+        PEGASUS_TEST_ASSERT(strlen(result) == size);
+        PEGASUS_TEST_ASSERT(StringConversion::stringToReal64(result, r64r));
+        PEGASUS_TEST_ASSERT(fabs(r64 - r64r) < r64/1000);
+    }
+}
+
 int main(int argc, char** argv)
 {
     testIntegerToStringConversions();
@@ -524,6 +601,8 @@ int main(int argc, char** argv)
     testStringToSint64();
     testCheckSintBounds();
     testStringToReal64();
+    testReal32ToString();
+    testReal64ToString();
 
     cout << argv[0] << " +++++ passed all tests" << endl;