1 /**
2 *
3 * Copyright 2007-2021 IMP Inventors. All rights reserved.
4 *
5 */
6
7 #include <avrocpp/api/Compiler.hh>
8 #include <avrocpp/api/Encoder.hh>
9 #include <boost/shared_ptr.hpp>
10 #include <generated/embed_jsons.h>
11 #include <algorithm>
12 #include <string>
13 #include <utility>
14 #include <vector>
15
16 #include "RMF/ID.h"
17 #include "RMF/Vector.h"
18 #include "RMF/enums.h"
19 #include "RMF/infrastructure_macros.h"
20 #include "RMF/types.h"
21 #include "avrocpp/api/Decoder.hh"
22 #include "avrocpp/api/Decoder.hh"
23 #include "avrocpp/api/Specific.hh"
24 #include "avrocpp/api/Specific.hh"
25 #include "avrocpp/api/Stream.hh"
26 #include "avrocpp/api/Stream.hh"
27 #include "avrocpp/api/ValidSchema.hh"
28 #include "avrocpp/api/ValidSchema.hh"
29 #include "backend/avro/encode_decode.h"
30 #include "backend/avro/raw_frame.h"
31 #include "backend/avro/types.h"
32
33 namespace {
34 using namespace RMF;
35 using namespace RMF::avro2;
36 template <class Tout, class Tin>
validate_one(Tout fr,Tin)37 void validate_one(Tout fr, Tin) {
38 fr.data.int_data[IntKey(0)][NodeID(0)] = 1;
39 fr.data.float_data[FloatKey(1)][NodeID(1)] = 2.0;
40 fr.data.string_data[StringKey(2)][NodeID(2)] = "hi";
41 fr.data.ints_data[IntsKey(3)][NodeID(3)] = Ints(2, 3);
42 fr.data.floats_data[FloatsKey(4)][NodeID(4)] = Floats(3, 2.0);
43 fr.data.strings_data[StringsKey(5)][NodeID(5)] = Strings(4, "his");
44 fr.data.vector3_data[Vector3Key(8)][NodeID(1)] = Vector3(2, 3, 4);
45 fr.data.vector4_data[Vector4Key(8)][NodeID(1)] = Vector4(2, 3, 4, 5);
46 fr.data.vector3s_data[Vector3sKey(9)][NodeID(1)] =
47 Vector3s(1, Vector3(2, 3, 4));
48 fr.keys.push_back(KeyInfo());
49 fr.keys.back().id = 1;
50 fr.keys.back().category = Category(0);
51 fr.keys.back().type = RMF::avro2::INT;
52
53 fr.nodes.push_back(HierarchyNode());
54 fr.nodes.back().id = NodeID(1);
55 fr.nodes.back().type = ROOT;
56 fr.nodes.back().parents.push_back(NodeID(1));
57 boost::shared_ptr<internal_avro::OutputStream> out_stream =
58 internal_avro::memoryOutputStream();
59 {
60 internal_avro::EncoderPtr encoder = internal_avro::binaryEncoder();
61 encoder->init(*out_stream);
62 internal_avro::EncoderPtr ve = internal_avro::validatingEncoder(
63 internal_avro::compileJsonSchemaFromString(data_avro::frame_json),
64 encoder);
65 internal_avro::encode(*ve, fr);
66 }
67 {
68 boost::shared_ptr<internal_avro::InputStream> in_stream =
69 internal_avro::memoryInputStream(*out_stream);
70 internal_avro::DecoderPtr decoder = internal_avro::binaryDecoder();
71 decoder->init(*in_stream);
72 internal_avro::DecoderPtr ve = internal_avro::validatingDecoder(
73 internal_avro::compileJsonSchemaFromString(data_avro::frame_json),
74 decoder);
75 Tin fd;
76 internal_avro::decode(*ve, fd);
77 }
78 }
79 template <class T>
validate_raw(T fr)80 void validate_raw(T fr) {
81 boost::shared_ptr<internal_avro::OutputStream> out_stream =
82 internal_avro::memoryOutputStream();
83 {
84 internal_avro::EncoderPtr encoder = internal_avro::binaryEncoder();
85 encoder->init(*out_stream);
86 internal_avro::EncoderPtr ve = internal_avro::validatingEncoder(
87 internal_avro::compileJsonSchemaFromString(data_avro::frame_json),
88 encoder);
89 internal_avro::encode(*ve, fr);
90 }
91 {
92 boost::shared_ptr<internal_avro::InputStream> in_stream =
93 internal_avro::memoryInputStream(*out_stream);
94 internal_avro::DecoderPtr decoder = internal_avro::binaryDecoder();
95 decoder->init(*in_stream);
96 internal_avro::DecoderPtr ve = internal_avro::validatingDecoder(
97 internal_avro::compileJsonSchemaFromString(data_avro::frame_json),
98 decoder);
99 rmf_raw_avro2::Frame fd;
100 internal_avro::decode(*ve, fd);
101 }
102 }
103
validate()104 void validate() {
105 Frame fr;
106 fr.parents.push_back(FrameID(2));
107 fr.id = FrameID(1);
108 validate_one(fr, Frame());
109 FileDataChanges changes;
110 changes.categories.push_back(std::make_pair(Category(0), "hi"));
111 changes.node_types.push_back(std::make_pair(ROOT, "root"));
112 changes.frame_types.push_back(std::make_pair(STATIC, "static"));
113 changes.node_sets.push_back(std::make_pair(1, NodeIDs(2, NodeID(10))));
114 FileData data;
115 validate_one(changes, data);
116 validate_raw(fr);
117 validate_raw(changes);
118 }
119 }
120
main(int,char * [])121 int main(int, char * []) {
122 validate();
123 return 0;
124 }
125