1 #include "bej_dictionary.h"
2 #include "bej_encoder_core.h"
3 #include "bej_tree.h"
4
5 #include "nlohmann/json.hpp"
6
7 #include <fstream>
8 #include <iostream>
9 #include <optional>
10 #include <span>
11
12 namespace libbej
13 {
14
15 // Buffer size for storing a single binary file data.
16 constexpr uint32_t maxBufferSize = 16 * 1024;
17
18 struct BejTestInputFiles
19 {
20 const char* jsonFile;
21 const char* schemaDictionaryFile;
22 const char* annotationDictionaryFile;
23 const char* errorDictionaryFile;
24 const char* encodedStreamFile;
25 };
26
27 struct BejTestInputs
28 {
29 nlohmann::json expectedJson;
30 const uint8_t* schemaDictionary;
31 const uint8_t* annotationDictionary;
32 const uint8_t* errorDictionary;
33 std::span<const uint8_t> encodedStream;
34 };
35
readBinaryFile(const char * fileName,std::span<uint8_t> buffer)36 std::streamsize readBinaryFile(const char* fileName, std::span<uint8_t> buffer)
37 {
38 std::ifstream inputStream(fileName, std::ios::binary);
39 if (!inputStream.is_open())
40 {
41 std::cerr << "Cannot open file: " << fileName << "\n";
42 return 0;
43 }
44 auto readLength = inputStream.readsome(
45 reinterpret_cast<char*>(buffer.data()), buffer.size_bytes());
46 if (inputStream.peek() != EOF)
47 {
48 std::cerr << "Failed to read the complete file: " << fileName
49 << " read length: " << readLength << "\n";
50 return 0;
51 }
52 return readLength;
53 }
54
loadInputs(const BejTestInputFiles & files,bool readErrorDictionary=false)55 std::optional<BejTestInputs> loadInputs(const BejTestInputFiles& files,
56 bool readErrorDictionary = false)
57 {
58 std::ifstream jsonInput(files.jsonFile);
59 if (!jsonInput.is_open())
60 {
61 std::cerr << "Cannot open file: " << files.jsonFile << "\n";
62 return std::nullopt;
63 }
64 nlohmann::json expJson;
65 jsonInput >> expJson;
66
67 static uint8_t schemaDictBuffer[maxBufferSize];
68 if (readBinaryFile(files.schemaDictionaryFile,
69 std::span(schemaDictBuffer, maxBufferSize)) == 0)
70 {
71 return std::nullopt;
72 }
73
74 static uint8_t annoDictBuffer[maxBufferSize];
75 if (readBinaryFile(files.annotationDictionaryFile,
76 std::span(annoDictBuffer, maxBufferSize)) == 0)
77 {
78 return std::nullopt;
79 }
80
81 static uint8_t encBuffer[maxBufferSize];
82 auto encLen = readBinaryFile(files.encodedStreamFile,
83 std::span(encBuffer, maxBufferSize));
84 if (encLen == 0)
85 {
86 return std::nullopt;
87 }
88
89 static uint8_t errorDict[maxBufferSize];
90 if (readErrorDictionary)
91 {
92 if (readBinaryFile(files.errorDictionaryFile,
93 std::span(errorDict, maxBufferSize)) == 0)
94 {
95 return std::nullopt;
96 }
97 }
98
99 BejTestInputs inputs = {
100 .expectedJson = expJson,
101 .schemaDictionary = schemaDictBuffer,
102 .annotationDictionary = annoDictBuffer,
103 .errorDictionary = errorDict,
104 .encodedStream = std::span(encBuffer, encLen),
105 };
106 return inputs;
107 }
108
109 } // namespace libbej
110