File: static_reflection_custom_tests.cpp

package info (click to toggle)
simdjson 4.3.1%2Breally4.3.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 31,400 kB
  • sloc: cpp: 195,760; ansic: 20,954; sh: 1,126; python: 885; makefile: 47; ruby: 25; javascript: 13
file content (138 lines) | stat: -rw-r--r-- 4,001 bytes parent folder | download
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138



#include "simdjson.h"
#include "test_builder.h"
#include <charconv>
#include <string>

using namespace simdjson;

// Suppose that we want to serialize/deserialize Car using
// strings for the year
struct Car {
  std::string make;
  std::string model;
  int64_t year;
  std::vector<float> tire_pressure;
};



namespace simdjson {
// This tag_invoke MUST be inside simdjson namespace
template <typename simdjson_value>
auto tag_invoke(deserialize_tag, simdjson_value &val, Car& car) {
  ondemand::object obj;
  auto error = val.get_object().get(obj);
  if (error) {
    return error;
  }
  if ((error = obj["make"].get_string(car.make))) {
    return error;
  }
  if ((error = obj["model"].get_string(car.model))) {
    return error;
  }
  std::string_view year_str;
  if ((error = obj["year"].get(year_str))) {
    return error;
  }
  int64_t year_value;
  auto [ptr, ec] = std::from_chars(year_str.data(), year_str.data() + year_str.size(), year_value);
  if (ec != std::errc{}) {
    return INCORRECT_TYPE;
  }
  car.year = year_value;
  if ((error = obj["tire_pressure"].get<std::vector<float>>().get(
           car.tire_pressure))) {
    return error;
  }
  return simdjson::SUCCESS;
}

template <typename builder_type>
void tag_invoke(serialize_tag, builder_type &builder, const Car& car) {
  builder.start_object();
  builder.append_key_value("make", car.make);
  builder.append_comma();
  builder.append_key_value("model", car.model);
  builder.append_comma();
  builder.append_key_value("year", std::to_string(car.year));
  builder.append_comma();
  builder.append_key_value("tire_pressure", car.tire_pressure);
  builder.end_object();
}

} // namespace simdjson
namespace custom_tests {

  bool test_car_deserialization() {
    TEST_START();
    auto json = R"({"make":"Toyota","model":"Camry","year":"2018","tire_pressure":[30.5,30.6,30.7,30.8]})"_padded;
    ondemand::parser parser;
    auto doc_result = parser.iterate(json);
    ASSERT_SUCCESS(doc_result);
    Car car;
    ASSERT_SUCCESS(doc_result.get(car));
    if (car.make != "Toyota" || car.model != "Camry" || std::to_string(car.year) != "2018" || car.tire_pressure.size() != 4 || car.tire_pressure[0] != 30.5f) {
      return false;
    }
    TEST_SUCCEED();
  }
  bool test_car_serialization() {
    TEST_START();
    Car car{"Toyota", "Camry", 2018, {30.5f,30.6f,30.7f,30.8f}};
    simdjson::builder::string_builder builder;
    builder.append(car);
    std::string_view json;
    ASSERT_SUCCESS(builder.view().get(json));
    TEST_SUCCEED();
  }
  bool test_car_roundtrip() {
    TEST_START();
    Car car{"Toyota", "Camry", 2018, {30.5f,30.6f,30.7f,30.8f}};
    simdjson::builder::string_builder builder;
    builder.append(car);
    std::string json;
    ASSERT_SUCCESS(builder.view().get(json));
    ondemand::parser parser;
    auto doc_result = parser.iterate(json);
    ASSERT_SUCCESS(doc_result);
    Car carback;
    ASSERT_SUCCESS(doc_result.get(carback));

    if (carback.make != car.make || carback.model != car.model || carback.year != car.year || carback.tire_pressure != car.tire_pressure) {
      return false;
    }

    TEST_SUCCEED();
  }

  bool test_car_roundtrip_to_json() {
    TEST_START();
    Car car{"Toyota", "Camry", 2018, {30.5f,30.6f,30.7f,30.8f}};
    std::string json;
    ASSERT_SUCCESS(simdjson::to_json(car).get(json));
    simdjson::builder::string_builder builder;
    ondemand::parser parser;
    auto doc_result = parser.iterate(json);
    ASSERT_SUCCESS(doc_result);
    Car carback;
    ASSERT_SUCCESS(doc_result.get(carback));

    if (carback.make != car.make || carback.model != car.model || carback.year != car.year || carback.tire_pressure != car.tire_pressure) {
      return false;
    }

    TEST_SUCCEED();
  }
  bool run() {
    return test_car_deserialization() && test_car_serialization() && test_car_roundtrip() && test_car_roundtrip_to_json();
  }

} // namespace builder_tests

int main(int argc, char *argv[]) {
  return test_main(argc, argv, custom_tests::run);
}