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