Add pretty print for DOM
Add pretty print for DOM with documentation.
Currently, the indentation is fixed to four spaces.

Close #1329.

{"label": "simdjson:master", "ref": "master", "sha": "c5c43e9c7ff613bf01ca14b9b9083d38a6efd5fc"}
**Is your feature request related to a problem? Please describe.**
There is no way to pretty print a `simdjson::dom::element` to a string (or at least I did not find one). There is only a way to minify it to a string (or a stream).

**Describe the solution you'd like**
A function like `to_pretty_string()` or a configurable stream manipulator `pretty` or a stand-alone class `PrettyPrinter`. Whatever fits.

Pretty-printing json is a very common task used in various places. Basically, whenever a human needs to take a look on the stored json, it is better to display it with proper structure and indentation. 

**Describe alternatives you've considered**
Using minified version is ok in some cases,  but sometimes you really want a pretty verion. I see no other way than writing my own formatter.

** Are you willing to contribute code or documentation toward this new feature? **
Probably, but not sure. Nothing to contribute as of yet.
Pretty print for DOM
diff --git a/doc/dom.md b/doc/dom.md
index 1fc7bd76fe..8cc9c287f4 100644
--- a/doc/dom.md
+++ b/doc/dom.md
@@ -105,7 +105,7 @@ Once you have an element, you can navigate it with idiomatic C++ iterators, oper
   with the `size()` method.
 * **Checking an Element Type:** You can check an element's type with `element.type()`. It
   returns an `element_type` with values such as `simdjson::dom::element_type::ARRAY`, `simdjson::dom::element_type::OBJECT`, `simdjson::dom::element_type::INT64`,  `simdjson::dom::element_type::UINT64`,`simdjson::dom::element_type::DOUBLE`, `simdjson::dom::element_type::STRING`, `simdjson::dom::element_type::BOOL` or, `simdjson::dom::element_type::NULL_VALUE`.
-* **Output to streams and strings:** Given a document or an element (or node) out of a JSON document, you can output a minified string version using the C++ stream idiom (`out << element`). You can also request the construction of a minified string version (`simdjson::minify(element)`). Numbers are serialized as 64-bit floating-point numbers (`double`).
+* **Output to streams and strings:** Given a document or an element (or node) out of a JSON document, you can output a minified string version using the C++ stream idiom (`out << element`). You can also request the construction of a minified string version (`simdjson::minify(element)`) or a prettified string version (`simdjson::prettify(element)`). Numbers are serialized as 64-bit floating-point numbers (`double`).
 
 ### Examples
 
diff --git a/include/simdjson/dom/serialization-inl.h b/include/simdjson/dom/serialization-inl.h
index 7299bb5d36..f5ec355592 100644
--- a/include/simdjson/dom/serialization-inl.h
+++ b/include/simdjson/dom/serialization-inl.h
@@ -100,6 +100,8 @@ char *fast_itoa(char *output, uint64_t value) noexcept {
   std::memcpy(output, write_pointer, len);
   return output + len;
 }
+
+
 } // anonymous namespace
 namespace internal {
 
@@ -107,19 +109,22 @@ namespace internal {
  * Minifier/formatter code.
  **/
 
-simdjson_inline void mini_formatter::number(uint64_t x) {
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::number(uint64_t x) {
   char number_buffer[24];
   char *newp = fast_itoa(number_buffer, x);
   buffer.insert(buffer.end(), number_buffer, newp);
 }
 
-simdjson_inline void mini_formatter::number(int64_t x) {
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::number(int64_t x) {
   char number_buffer[24];
   char *newp = fast_itoa(number_buffer, x);
   buffer.insert(buffer.end(), number_buffer, newp);
 }
 
-simdjson_inline void mini_formatter::number(double x) {
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::number(double x) {
   char number_buffer[24];
   // Currently, passing the nullptr to the second argument is
   // safe because our implementation does not check the second
@@ -128,31 +133,51 @@ simdjson_inline void mini_formatter::number(double x) {
   buffer.insert(buffer.end(), number_buffer, newp);
 }
 
-simdjson_inline void mini_formatter::start_array() { one_char('['); }
-simdjson_inline void mini_formatter::end_array() { one_char(']'); }
-simdjson_inline void mini_formatter::start_object() { one_char('{'); }
-simdjson_inline void mini_formatter::end_object() { one_char('}'); }
-simdjson_inline void mini_formatter::comma() { one_char(','); }
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::start_array() { one_char('['); }
+
+
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::end_array() { one_char(']'); }
 
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::start_object() { one_char('{'); }
 
-simdjson_inline void mini_formatter::true_atom() {
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::end_object() { one_char('}'); }
+
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::comma() { one_char(','); }
+
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::true_atom() {
   const char * s = "true";
   buffer.insert(buffer.end(), s, s + 4);
 }
-simdjson_inline void mini_formatter::false_atom() {
+
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::false_atom() {
   const char * s = "false";
   buffer.insert(buffer.end(), s, s + 5);
 }
-simdjson_inline void mini_formatter::null_atom() {
+
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::null_atom() {
   const char * s = "null";
   buffer.insert(buffer.end(), s, s + 4);
 }
-simdjson_inline void mini_formatter::one_char(char c) { buffer.push_back(c); }
-simdjson_inline void mini_formatter::key(std::string_view unescaped) {
+
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::one_char(char c) { buffer.push_back(c); }
+
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::key(std::string_view unescaped) {
   string(unescaped);
   one_char(':');
 }
-simdjson_inline void mini_formatter::string(std::string_view unescaped) {
+
+template<class formatter>
+simdjson_inline void base_formatter<formatter>::string(std::string_view unescaped) {
   one_char('\"');
   size_t i = 0;
   // Fast path for the case where we have no control character, no ", and no backslash.
@@ -231,14 +256,46 @@ simdjson_inline void mini_formatter::string(std::string_view unescaped) {
   one_char('\"');
 }
 
-inline void mini_formatter::clear() {
+
+template<class formatter>
+inline void base_formatter<formatter>::clear() {
   buffer.clear();
 }
 
-simdjson_inline std::string_view mini_formatter::str() const {
+template<class formatter>
+simdjson_inline std::string_view base_formatter<formatter>::str() const {
   return std::string_view(buffer.data(), buffer.size());
 }
 
+simdjson_inline void mini_formatter::print_newline() {
+    return;
+}
+
+simdjson_inline void mini_formatter::print_indents(size_t depth) {
+    (void)depth;
+    return;
+}
+
+simdjson_inline void mini_formatter::print_space() {
+    return;
+}
+
+simdjson_inline void pretty_formatter::print_newline() {
+    one_char('\n');
+}
+
+simdjson_inline void pretty_formatter::print_indents(size_t depth) {
+    if(this->indent_step <= 0) {
+        return;
+    }
+    for(size_t i = 0; i < this->indent_step * depth; i++) {
+        one_char(' ');
+    }
+}
+
+simdjson_inline void pretty_formatter::print_space() {
+    one_char(' ');
+}
 
 /***
  * String building code.
@@ -258,11 +315,16 @@ inline void string_builder<serializer>::append(simdjson::dom::element value) {
     // print commas after each value
     if (after_value) {
       format.comma();
+      format.print_newline();
     }
+
+    format.print_indents(depth);
+
     // If we are in an object, print the next key and :, and skip to the next
     // value.
     if (is_object[depth]) {
       format.key(iter.get_string_view());
+      format.print_space();
       iter.json_index++;
     }
     switch (iter.tape_ref_type()) {
@@ -291,6 +353,7 @@ inline void string_builder<serializer>::append(simdjson::dom::element value) {
 
       is_object[depth] = false;
       after_value = false;
+      format.print_newline();
       continue;
     }
 
@@ -318,6 +381,7 @@ inline void string_builder<serializer>::append(simdjson::dom::element value) {
 
       is_object[depth] = true;
       after_value = false;
+      format.print_newline();
       continue;
     }
 
@@ -362,17 +426,21 @@ inline void string_builder<serializer>::append(simdjson::dom::element value) {
     // Handle multiple ends in a row
     while (depth != 0 && (iter.tape_ref_type() == tape_type::END_ARRAY ||
                           iter.tape_ref_type() == tape_type::END_OBJECT)) {
+      format.print_newline();
+      depth--;
+      format.print_indents(depth);
       if (iter.tape_ref_type() == tape_type::END_ARRAY) {
         format.end_array();
       } else {
         format.end_object();
       }
-      depth--;
       iter.json_index++;
     }
 
     // Stop when we're at depth 0
   } while (depth != 0);
+
+  format.print_newline();
 }
 
 template <class serializer>
diff --git a/include/simdjson/dom/serialization.h b/include/simdjson/dom/serialization.h
index aa28622cf0..61407ab425 100644
--- a/include/simdjson/dom/serialization.h
+++ b/include/simdjson/dom/serialization.h
@@ -19,50 +19,9 @@ namespace simdjson {
  */
 namespace internal {
 
-class mini_formatter;
-
-/**
- * @private The string_builder template allows us to construct
- * a string from a document element. It is parametrized
- * by a "formatter" which handles the details. Thus
- * the string_builder template could support both minification
- * and prettification, and various other tradeoffs.
- */
-template <class formatter = mini_formatter>
-class string_builder {
+template<class formatter>
+class base_formatter {
 public:
-  /** Construct an initially empty builder, would print the empty string **/
-  string_builder() = default;
-  /** Append an element to the builder (to be printed) **/
-  inline void append(simdjson::dom::element value);
-  /** Append an array to the builder (to be printed) **/
-  inline void append(simdjson::dom::array value);
-  /** Append an object to the builder (to be printed) **/
-  inline void append(simdjson::dom::object value);
-  /** Reset the builder (so that it would print the empty string) **/
-  simdjson_inline void clear();
-  /**
-   * Get access to the string. The string_view is owned by the builder
-   * and it is invalid to use it after the string_builder has been
-   * destroyed.
-   * However you can make a copy of the string_view on memory that you
-   * own.
-   */
-  simdjson_inline std::string_view str() const;
-  /** Append a key_value_pair to the builder (to be printed) **/
-  simdjson_inline void append(simdjson::dom::key_value_pair value);
-private:
-  formatter format{};
-};
-
-/**
- * @private This is the class that we expect to use with the string_builder
- * template. It tries to produce a compact version of the JSON element
- * as quickly as possible.
- */
-class mini_formatter {
-public:
-  mini_formatter() = default;
   /** Add a comma **/
   simdjson_inline void comma();
   /** Start an array, prints [ **/
@@ -97,14 +56,88 @@ class mini_formatter {
    **/
   simdjson_inline std::string_view str() const;
 
-private:
-  // implementation details (subject to change)
   /** Prints one character **/
   simdjson_inline void one_char(char c);
+
+  simdjson_inline void call_print_newline() {
+      this->print_newline();
+  }
+
+  simdjson_inline void call_print_indents(size_t depth) {
+      this->print_indents(depth);
+  }
+
+  simdjson_inline void call_print_space() {
+      this->print_space();
+  }
+
+protected:
+  // implementation details (subject to change)
   /** Backing buffer **/
   std::vector<char> buffer{}; // not ideal!
 };
 
+
+/**
+ * @private This is the class that we expect to use with the string_builder
+ * template. It tries to produce a compact version of the JSON element
+ * as quickly as possible.
+ */
+class mini_formatter : public base_formatter<mini_formatter> {
+public:
+  simdjson_inline void print_newline();
+
+  simdjson_inline void print_indents(size_t depth);
+
+  simdjson_inline void print_space();
+};
+
+class pretty_formatter : public base_formatter<pretty_formatter> {
+public:
+  simdjson_inline void print_newline();
+
+  simdjson_inline void print_indents(size_t depth);
+
+  simdjson_inline void print_space();
+
+protected:
+  int indent_step = 4;
+};
+
+/**
+ * @private The string_builder template allows us to construct
+ * a string from a document element. It is parametrized
+ * by a "formatter" which handles the details. Thus
+ * the string_builder template could support both minification
+ * and prettification, and various other tradeoffs.
+ */
+template <class formatter = mini_formatter>
+class string_builder {
+public:
+  /** Construct an initially empty builder, would print the empty string **/
+  string_builder() = default;
+  /** Append an element to the builder (to be printed) **/
+  inline void append(simdjson::dom::element value);
+  /** Append an array to the builder (to be printed) **/
+  inline void append(simdjson::dom::array value);
+  /** Append an object to the builder (to be printed) **/
+  inline void append(simdjson::dom::object value);
+  /** Reset the builder (so that it would print the empty string) **/
+  simdjson_inline void clear();
+  /**
+   * Get access to the string. The string_view is owned by the builder
+   * and it is invalid to use it after the string_builder has been
+   * destroyed.
+   * However you can make a copy of the string_view on memory that you
+   * own.
+   */
+  simdjson_inline std::string_view str() const;
+  /** Append a key_value_pair to the builder (to be printed) **/
+  simdjson_inline void append(simdjson::dom::key_value_pair value);
+private:
+  formatter format{};
+};
+
 } // internal
 
 namespace dom {
@@ -212,6 +245,38 @@ std::string minify(simdjson_result<T> x) {
 }
 #endif
 
+/**
+ * Prettifies a JSON element or document, printing the valid JSON with indentation.
+ *
+ *   dom::parser parser;
+ *   element doc = parser.parse("   [ 1 , 2 , 3 ] "_padded);
+ *
+ *   // Prints:
+ *   // {
+ *   //     [
+ *   //         1,
+ *   //         2,
+ *   //         3
+ *   //     ]
+ *   // }
+ *   cout << prettify(doc) << endl;
+ *
+ */
+template <class T>
+std::string prettify(T x)  {
+    simdjson::internal::string_builder<simdjson::internal::pretty_formatter> sb;
+    sb.append(x);
+    std::string_view answer = sb.str();
+    return std::string(answer.data(), answer.size());
+}
+
+#if SIMDJSON_EXCEPTIONS
+template <class T>
+std::string prettify(simdjson_result<T> x) {
+    if (x.error()) { throw simdjson_error(x.error()); }
+    return to_string(x.value());
+}
+#endif
 
 } // namespace simdjson
 

diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index fe0f9dbdfc..8e098fdd53 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -11,6 +11,7 @@ link_libraries(simdjson)
 add_cpp_test(unicode_tests       LABELS dom acceptance per_implementation)
 add_cpp_test(minify_tests        LABELS other acceptance per_implementation)
 add_cpp_test(padded_string_tests LABELS other acceptance                   )
+add_cpp_test(prettify_tests      LABELS other acceptance per_implementation)
 
 if(MSVC AND BUILD_SHARED_LIBS)
   # Copy the simdjson dll into the tests directory
diff --git a/tests/prettify_tests.cpp b/tests/prettify_tests.cpp
new file mode 100644
index 0000000000..d99c220211
--- /dev/null
+++ b/tests/prettify_tests.cpp
@@ -0,0 +1,63 @@
+#include <cinttypes>
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <iostream>
+#include <set>
+#include <sstream>
+#include <string>
+#include <unistd.h>
+#include <utility>
+#include <vector>
+
+#include "cast_tester.h"
+#include "simdjson.h"
+#include "test_macros.h"
+
+const char *test_files[] = {
+    TWITTER_JSON, TWITTER_TIMELINE_JSON, REPEAT_JSON, CANADA_JSON,
+    MESH_JSON,    APACHE_JSON,           GSOC_JSON};
+
+/**
+ * The general idea of these tests if that if you take a JSON file,
+ * load it, then convert it into a string, then parse that, and
+ * convert it again into a second string, then the two strings should
+ * be  identifical. If not, then something was lost or added in the
+ * process.
+ */
+
+bool load_prettify(const char *filename) {
+  std::cout << "Loading " << filename << std::endl;
+  simdjson::dom::parser parser;
+  simdjson::dom::element doc;
+  auto error = parser.load(filename).get(doc);
+  if (error) { std::cerr << error << std::endl; return false; }
+  auto serial1 = simdjson::prettify(doc);
+  error = parser.parse(serial1).get(doc);
+  if (error) { std::cerr << error << std::endl; return false; }
+  auto serial2 = simdjson::prettify(doc);
+  bool match = (serial1 == serial2);
+  if (match) {
+    std::cout << "Parsing prettify and calling prettify again results in the same "
+                 "content."
+              << std::endl;
+  } else {
+    std::cout << "The content differs!" << std::endl;
+  }
+  return match;
+}
+
+bool prettify_test() {
+  std::cout << "Running " << __func__ << std::endl;
+
+  for (size_t i = 0; i < sizeof(test_files) / sizeof(test_files[0]); i++) {
+    bool ok = load_prettify(test_files[i]);
+    if (!ok) {
+      return false;
+    }
+  }
+  return true;
+}
+
+int main() { return prettify_test() ? EXIT_SUCCESS : EXIT_FAILURE; }

{"readme_examples11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_temporary_buffer_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_array_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_ondemand": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_scalar_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "unicode_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "readme_examples_will_fail_with_exceptions_off": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_twitter_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "document_stream_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_error_location_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "random_string_number_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_uint8_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "readme_examples": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_load_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_ondemand11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_string_view_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_wrong_type_error_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_misc_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_ordering_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_char_star_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "minefieldcheck": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "stringparsingcheck": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "basictests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "first_second_access_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_number_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_padstring_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_array_error_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart2_noexceptions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_document_stream_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_ondemand14": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_readme_examples": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart2_noexceptions11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "errortests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart14": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_cerr": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_log_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_uchar_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trivially_copyable_test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_printf": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_parse_api_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_char_star_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "readme_examples_noexceptions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_json_pointer_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "simdjson_force_implementation_error": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "parse_many_test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_uint8_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "checkimplementation": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_noexceptions11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_compilation_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_stdout": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "first_second_access_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "unsafe_parse_many_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_cout": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_active_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "example_compiletest_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_uchar_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_log_error_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "jsoncheck": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_stderr": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "extracting_values_example": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "simdjson-singleheader": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_error_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_stdstring_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "pointercheck": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_object_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "integer_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "minify_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_ondemand_noexceptions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_iterate_many_csv": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "prettify_tests": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "testjson2json": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "document_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "example_compiletest_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "padded_string_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "json2json": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_assert_out_of_order_values": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_key_string_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "bad_array_count_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_abort": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_number_in_string_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_ondemand_noexceptions11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_load_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "numberparsingcheck": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "readme_examples_noexceptions11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_noexceptions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "amalgamate_demo_direct_from_repository": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_tostring_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "unsafe_parse_many_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_stdstring_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_string_view_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_temporary_buffer_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "amalgamate_demo": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_padstring_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "bad_array_count_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_object_error_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"readme_examples11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_temporary_buffer_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_array_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_ondemand": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_scalar_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "unicode_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "readme_examples_will_fail_with_exceptions_off": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_twitter_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "document_stream_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_error_location_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "random_string_number_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_uint8_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "readme_examples": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_load_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_ondemand11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_string_view_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_wrong_type_error_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_misc_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_ordering_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_char_star_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "minefieldcheck": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "stringparsingcheck": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "basictests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "first_second_access_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_number_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_padstring_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_array_error_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart2_noexceptions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_document_stream_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_ondemand14": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_readme_examples": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart2_noexceptions11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "errortests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart14": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_cerr": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_log_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_uchar_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trivially_copyable_test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_printf": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_parse_api_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_char_star_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "readme_examples_noexceptions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_json_pointer_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "simdjson_force_implementation_error": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "parse_many_test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_uint8_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "checkimplementation": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_noexceptions11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_compilation_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_stdout": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "first_second_access_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "unsafe_parse_many_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_cout": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_active_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "example_compiletest_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_uchar_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_log_error_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "jsoncheck": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_stderr": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "extracting_values_example": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "simdjson-singleheader": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_error_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_stdstring_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "pointercheck": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_object_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "integer_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "minify_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_ondemand_noexceptions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_iterate_many_csv": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "prettify_tests": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "testjson2json": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "document_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "example_compiletest_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "padded_string_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "json2json": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_assert_out_of_order_values": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_key_string_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "bad_array_count_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "avoid_abort": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_number_in_string_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_ondemand_noexceptions11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_load_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "numberparsingcheck": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "readme_examples_noexceptions11": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "quickstart_noexceptions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "amalgamate_demo_direct_from_repository": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_tostring_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "unsafe_parse_many_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_stdstring_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_string_view_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "iterate_temporary_buffer_should_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "amalgamate_demo": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dangling_parser_parse_padstring_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "bad_array_count_should_not_compile": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "ondemand_object_error_tests": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"passed_count": 96, "failed_count": 0, "skipped_count": 0, "passed_tests": ["ondemand_array_tests", "unicode_tests", "readme_examples_will_fail_with_exceptions_off", "ondemand_twitter_tests", "document_stream_tests", "random_string_number_tests", "dangling_parser_parse_uint8_should_not_compile", "quickstart_ondemand11", "iterate_string_view_should_not_compile", "ondemand_misc_tests", "minefieldcheck", "ondemand_number_tests", "dangling_parser_parse_padstring_should_compile", "ondemand_array_error_tests", "quickstart_ondemand14", "ondemand_readme_examples", "quickstart14", "ondemand_log_tests", "dangling_parser_parse_uchar_should_compile", "iterate_char_star_should_compile", "readme_examples_noexceptions", "ondemand_json_pointer_tests", "dangling_parser_parse_uint8_should_compile", "checkimplementation", "quickstart_noexceptions11", "ondemand_compilation_tests", "avoid_stdout", "first_second_access_should_compile", "unsafe_parse_many_should_compile", "avoid_cout", "ondemand_active_tests", "example_compiletest_should_compile", "dangling_parser_parse_uchar_should_not_compile", "jsoncheck", "ondemand_error_tests", "pointercheck", "ondemand_object_tests", "quickstart_ondemand_noexceptions", "ondemand_iterate_many_csv", "quickstart11", "quickstart", "testjson2json", "bad_array_count_should_compile", "readme_examples_noexceptions11", "ondemand_tostring_tests", "unsafe_parse_many_should_not_compile", "dangling_parser_parse_stdstring_should_compile", "iterate_string_view_should_compile", "amalgamate_demo", "dangling_parser_parse_padstring_should_not_compile", "ondemand_object_error_tests", "readme_examples11", "iterate_temporary_buffer_should_not_compile", "quickstart_ondemand", "ondemand_scalar_tests", "ondemand_error_location_tests", "readme_examples", "dangling_parser_load_should_not_compile", "ondemand_wrong_type_error_tests", "ondemand_ordering_tests", "iterate_char_star_should_not_compile", "stringparsingcheck", "basictests", "first_second_access_should_not_compile", "quickstart2_noexceptions", "ondemand_document_stream_tests", "quickstart2_noexceptions11", "errortests", "avoid_cerr", "trivially_copyable_test", "avoid_printf", "ondemand_parse_api_tests", "simdjson_force_implementation_error", "parse_many_test", "ondemand_log_error_tests", "avoid_stderr", "extracting_values_example", "simdjson-singleheader", "dangling_parser_parse_stdstring_should_not_compile", "integer_tests", "minify_tests", "document_tests", "example_compiletest_should_not_compile", "padded_string_tests", "json2json", "ondemand_assert_out_of_order_values", "ondemand_key_string_tests", "avoid_abort", "ondemand_number_in_string_tests", "quickstart_ondemand_noexceptions11", "dangling_parser_load_should_compile", "numberparsingcheck", "quickstart_noexceptions", "amalgamate_demo_direct_from_repository", "iterate_temporary_buffer_should_compile", "bad_array_count_should_not_compile"], "failed_tests": [], "skipped_tests": []}
{"passed_count": 0, "failed_count": 0, "skipped_count": 0, "passed_tests": [], "failed_tests": [], "skipped_tests": []}
{"passed_count": 97, "failed_count": 0, "skipped_count": 0, "passed_tests": ["ondemand_array_tests", "unicode_tests", "readme_examples_will_fail_with_exceptions_off", "ondemand_twitter_tests", "document_stream_tests", "random_string_number_tests", "dangling_parser_parse_uint8_should_not_compile", "quickstart_ondemand11", "iterate_string_view_should_not_compile", "ondemand_misc_tests", "minefieldcheck", "ondemand_number_tests", "dangling_parser_parse_padstring_should_compile", "ondemand_array_error_tests", "quickstart_ondemand14", "ondemand_readme_examples", "quickstart14", "ondemand_log_tests", "dangling_parser_parse_uchar_should_compile", "iterate_char_star_should_compile", "readme_examples_noexceptions", "ondemand_json_pointer_tests", "dangling_parser_parse_uint8_should_compile", "checkimplementation", "quickstart_noexceptions11", "ondemand_compilation_tests", "avoid_stdout", "first_second_access_should_compile", "unsafe_parse_many_should_compile", "avoid_cout", "ondemand_active_tests", "example_compiletest_should_compile", "dangling_parser_parse_uchar_should_not_compile", "jsoncheck", "ondemand_error_tests", "pointercheck", "ondemand_object_tests", "quickstart_ondemand_noexceptions", "ondemand_iterate_many_csv", "quickstart11", "quickstart", "prettify_tests", "testjson2json", "bad_array_count_should_compile", "readme_examples_noexceptions11", "ondemand_tostring_tests", "unsafe_parse_many_should_not_compile", "dangling_parser_parse_stdstring_should_compile", "iterate_string_view_should_compile", "amalgamate_demo", "dangling_parser_parse_padstring_should_not_compile", "ondemand_object_error_tests", "readme_examples11", "iterate_temporary_buffer_should_not_compile", "quickstart_ondemand", "ondemand_scalar_tests", "ondemand_error_location_tests", "readme_examples", "dangling_parser_load_should_not_compile", "ondemand_wrong_type_error_tests", "ondemand_ordering_tests", "iterate_char_star_should_not_compile", "stringparsingcheck", "basictests", "first_second_access_should_not_compile", "quickstart2_noexceptions", "ondemand_document_stream_tests", "quickstart2_noexceptions11", "errortests", "avoid_cerr", "trivially_copyable_test", "avoid_printf", "ondemand_parse_api_tests", "simdjson_force_implementation_error", "parse_many_test", "ondemand_log_error_tests", "avoid_stderr", "extracting_values_example", "simdjson-singleheader", "dangling_parser_parse_stdstring_should_not_compile", "integer_tests", "minify_tests", "document_tests", "example_compiletest_should_not_compile", "padded_string_tests", "json2json", "ondemand_assert_out_of_order_values", "ondemand_key_string_tests", "avoid_abort", "ondemand_number_in_string_tests", "quickstart_ondemand_noexceptions11", "dangling_parser_load_should_compile", "numberparsingcheck", "quickstart_noexceptions", "amalgamate_demo_direct_from_repository", "iterate_temporary_buffer_should_compile", "bad_array_count_should_not_compile"], "failed_tests": [], "skipped_tests": []}