/*
 * Copyright 2014 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef DMJsonWriter_DEFINED
#define DMJsonWriter_DEFINED

#include "SkString.h"
#include "Test.h"

namespace DM {

/**
 *  Class for collecting results from DM and writing to a json file.
 *  All methods are thread-safe.
 */
class JsonWriter {
public:
    /**
     *  Info describing a single run.
     */
    struct BitmapResult {
        SkString name;            // E.g. "ninepatch-stretch", "desk_gws.skp"
        SkString config;          //      "gpu", "8888", "serialize", "pipe"
        SkString sourceType;      //      "gm", "skp", "image"
        SkString sourceOptions;   //      "image", "codec", "subset", "scanline"
        SkString md5;             // In ASCII, so 32 bytes long.
        SkString ext;             // Extension of file we wrote: "png", "pdf", ...
        bool gammaCorrect;        // Old configs are not gamma correct, some new ones are.
    };

    /**
     *  Add a result to the end of the list of results.
     */
    static void AddBitmapResult(const BitmapResult&);

    /**
     *  Add a Failure from a Test.
     */
    static void AddTestFailure(const skiatest::Failure&);

    /**
     *  Write all collected results to the file FLAGS_writePath[0]/dm.json.
     */
    static void DumpJson();

    /**
     * Read JSON file at path written by DumpJson, calling callback for each
     * BitmapResult recorded in the file.  Return success.
     */
    static bool ReadJson(const char* path, void(*callback)(BitmapResult));
};


} // namespace DM
#endif // DMJsonWriter_DEFINED
