File: picojson_format_test.cpp

package info (click to toggle)
valijson 1.0.3%2Brepack-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 2,756 kB
  • sloc: cpp: 19,769; sh: 134; makefile: 24
file content (112 lines) | stat: -rw-r--r-- 3,380 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <iostream>
#include <string>

#define PICOJSON_USE_INT64
#include "picojson.h"

#include "valijson/adapters/picojson_adapter.hpp"
#include "valijson/validation_results.hpp"
#include "valijson/schema_parser.hpp"
#include "valijson/validator.hpp"

constexpr auto schemaStr = R"JSON({
  "additionalItems": false,
  "items": [
    {
      "format": "date-time",
      "type": "string"
    },
    {
      "format": "date-time",
      "type": "string"
    }
  ],
  "maxItems": 2,
  "minItems": 2,
  "type": "array"
})JSON";

constexpr auto validStr = R"JSON([
    "2023-07-18T14:46:22Z",
    "2023-07-18T14:46:22Z"
])JSON";

constexpr auto invalidStrs = R"JSON([
    ["um 12", "um 12"],
    ["2023-07-18T14:46:22Z"],
    ["2023-07-18T14:46:22Z", "2023-07-18T14:46:22Z", "2023-07-18T14:46:22Z", "2023-07-18T14:46:22Z"]
])JSON";

picojson::value Parse(std::string serialized, picojson::value def)
{
    picojson::value v;
    auto first = serialized.data();
    auto last = first + serialized.size();
    auto err = picojson::parse(v, first, last);

    if (!err.empty()) {
        return def;
    }

    return v;
}

int main(int argc, char **argv)
{
    auto validatorSchema = std::make_shared<valijson::Schema>();
    {
        auto schemaJson = Parse(schemaStr, picojson::value{});
        auto schemaAdapter = valijson::adapters::PicoJsonAdapter(schemaJson);
        valijson::SchemaParser parser;
        parser.populateSchema(schemaAdapter, *validatorSchema);
        std::cout << "Schema:" << std::endl << schemaStr << std::endl << std::endl;;
    }

    {
        // valid
        auto targetJson = Parse(validStr, picojson::value{});
        auto targetAdapter = valijson::adapters::PicoJsonAdapter(targetJson);
        std::cout << "Valid Target:" << std::endl << validStr << std::endl << std::endl;

        valijson::ValidationResults results;
        auto validator = valijson::Validator();
        auto isValid = validator.validate(
            *validatorSchema,
            targetAdapter,
            &results);

        std::cout << "Is valid: " << (isValid ? "YES" : "NO") << std::endl << std::endl;;
    }

    {
        // invalid
        auto targetJsonArray = Parse(invalidStrs, picojson::value{});
        std::cout << "Invalid Targets:" << std::endl << invalidStrs << std::endl << std::endl;

        for (auto &&testCase : targetJsonArray.get<picojson::array>()) {
            auto targetAdapter = valijson::adapters::PicoJsonAdapter(testCase);

            valijson::ValidationResults results;
            auto validator = valijson::Validator();
            auto isValid = validator.validate(
                *validatorSchema,
                targetAdapter,
                &results);

            std::cout << "Is valid: " << (isValid ? "YES" : "NO") << std::endl << std::endl;

            valijson::ValidationResults::Error error;
            unsigned int errorNum = 1;
            while (results.popError(error)) {
                std::cerr << "Error #" << errorNum << std::endl;
                std::cerr << "  ";
                for (const std::string &contextElement : error.context) {
                    std::cerr << contextElement << " ";
                }
                std::cerr << std::endl;
                std::cerr << "    - " << error.description << std::endl << std::endl;
                ++errorNum;
            }
        }
    }
}