Procházet zdrojové kódy

Added a tests of a string with a double quote in it

Benoît Blanchon před 11 roky
rodič
revize
dd6fd6f198

+ 7 - 0
JsonGeneratorTests/JsonArrayTests.cpp

@@ -30,6 +30,13 @@ namespace JsonGeneratorTests
             AssertJsonIs("[\"hello\"]");
         }
 
+        TEST_METHOD(AddOneStringContainingDoubleQuote)
+        {
+            arr.add("\"");
+
+            AssertJsonIs("[\"\\\"\"]");
+        }
+
         TEST_METHOD(AddTwoStrings)
         {
             arr.add("hello");

+ 1 - 1
JsonGeneratorTests/JsonObjectBase.cpp

@@ -6,7 +6,7 @@ void JsonObjectBase::writeObjectTo(ObjectContainer& obj, StringBuilder& sb)
     {
     case JSON_STRING:
         if (obj.value.string)
-            sb.append("\"%s\"", obj.value.string);
+            sb.appendEscaped(obj.value.string);
         else
             sb.append("null");
         break;

+ 19 - 0
JsonGeneratorTests/StringBuilder.cpp

@@ -11,4 +11,23 @@ void StringBuilder::append(const char* format, ...)
     va_end(args);
 
     length += strlen(tail);
+}
+
+void StringBuilder::appendEscaped(const char* s)
+{
+    if (length > capacity - 3) return;
+
+    buffer[length++] = '"';
+
+    while (*s && length<capacity-2)
+    {
+        if (*s == '"')
+            buffer[length++] = '\\';
+
+        buffer[length++] = *s;
+
+        s++;
+    }
+
+    buffer[length++] = '"';
 }

+ 1 - 0
JsonGeneratorTests/StringBuilder.h

@@ -18,6 +18,7 @@ public:
     }
 
     void append(const char* format, ...);
+    void appendEscaped(const char* s);
 
 private:
     char* buffer;