Centipede 0.0.1
Centipede program
Loading...
Searching...
No Matches
test_binary_writer.cpp
1#include "centipede/centipede.hpp"
2#include <array>
3#include <cstdint>
4#include <filesystem>
5#include <gtest/gtest.h>
6#include <utility>
7#include <vector>
8
12namespace fs = std::filesystem;
13
14TEST(writer, constructor)
15{
16 auto writer = Binary{ Config{ .out_filename = "binary_writer_constructor.bin" } };
17 EXPECT_FALSE(fs::exists(fs::path(writer.get_config().out_filename)));
18}
19
20TEST(writer, init)
21{
22 auto writer = Binary{ Config{ .out_filename = "binary_writer_init.bin" } };
23 auto error = writer.init();
24
25 EXPECT_TRUE(error.has_value());
26 EXPECT_TRUE(fs::exists(fs::path(writer.get_config().out_filename)));
27
28 const auto& buffer = writer.get_buffer();
29 EXPECT_EQ(buffer.first, std::vector{ 0U });
30 EXPECT_EQ(buffer.second, std::vector{ 0.F });
31}
32
33TEST(writer, init_error)
34{
35 auto writer = Binary{ Config{ .out_filename = "" } };
36 auto error = writer.init();
37
38 EXPECT_TRUE(not error.has_value());
39 EXPECT_EQ(error.error(), ErrorCode::writer_file_fail_to_open);
40 EXPECT_FALSE(fs::exists(fs::path(writer.get_config().out_filename)));
41}
42
43namespace
44{
45 const auto valid_local_derivs = std::array{ 1.F, 2.F, 3.F };
46 const auto valid_global_derivs = std::array{ std::pair{ 10U, 2.F }, std::pair{ 11U, 3.F } };
47 const auto valid_meas = 1.F;
48 const auto valid_sigma = 1.F;
49 const auto valid_entry_point = centipede::EntryPoint{ .local_derivs = valid_local_derivs,
50 .global_derivs = valid_global_derivs,
51 .measurement = valid_meas,
52 .sigma = valid_sigma };
53} // namespace
54TEST(writer, read_entrypoint_normal)
55{
56 auto writer = Binary{ Config{} };
57 [[maybe_unused]] auto init_err = writer.init();
58
59 auto err = writer.add_entrypoint(valid_entry_point);
60 ASSERT_TRUE(err.has_value());
61
62 const auto& buffer = writer.get_buffer();
63 const auto idx_vec = std::vector<uint32_t>{ 0U, 0U, 1U, 2U, 3U, 0U, 11U, 12U };
64 const auto val_vec = std::vector<float>{ 0.F, valid_meas, 1.F, 2.F, 3.F, valid_sigma, 2.F, 3.F };
65 EXPECT_EQ(buffer.first, idx_vec);
66 EXPECT_EQ(buffer.second, val_vec);
67}
68
69TEST(writer, read_entrypoint_reject)
70{
71 auto writer = Binary{ Config{} };
72 [[maybe_unused]] auto init_err = writer.init();
73
74 const auto local_derivs = std::array{ 0.F };
75 const auto global_derivs = std::array{ std::pair{ 10U, 0.F }, std::pair{ 11U, 0.F } };
76 const auto meas = 1.F;
77 const auto sigma = 1.F;
78 auto entry_point = centipede::EntryPoint{
79 .local_derivs = local_derivs, .global_derivs = global_derivs, .measurement = meas, .sigma = sigma
80 };
81 auto err = writer.add_entrypoint(entry_point);
82 ASSERT_FALSE(err.has_value());
83 EXPECT_TRUE(err.error() == ErrorCode::writer_entrypoint_rejected);
84
85 auto size = writer.write_current_entry();
86 ASSERT_TRUE(size.has_value());
87 EXPECT_EQ(size.value(), 0);
88}
89
90TEST(writer, uninitialized)
91{
92 auto writer = Binary{ Config{} };
93
94 auto err = writer.add_entrypoint(valid_entry_point);
95
96 ASSERT_FALSE(err.has_value());
97 EXPECT_EQ(err.error(), ErrorCode::writer_uninitialized);
98
99 auto size = writer.write_current_entry();
100 ASSERT_FALSE(size.has_value());
101 EXPECT_EQ(size.error(), ErrorCode::writer_uninitialized);
102}
103
104TEST(writer, read_entrypoint_zero_sigma)
105{
106 auto writer = Binary{ Config{} };
107 auto init_err = writer.init();
108 ASSERT_TRUE(init_err.has_value());
109
110 const auto local_derivs = std::array{ 1.F, 2.F, 3.F };
111 const auto global_derivs = std::array{ std::pair{ 10U, 2.F }, std::pair{ 11U, 3.F } };
112 const auto meas = 1.F;
113 const auto sigma = -1.F;
114 auto entry_point = centipede::EntryPoint{
115 .local_derivs = local_derivs, .global_derivs = global_derivs, .measurement = meas, .sigma = sigma
116 };
117 auto err = writer.add_entrypoint(entry_point);
118 ASSERT_FALSE(err.has_value());
119 EXPECT_TRUE(err.error() == ErrorCode::writer_neg_or_zero_sigma);
120}
121
122TEST(writer, read_entrypoint_buffer_overflow)
123{
124 auto writer = Binary{ Config{ .max_bufferpoint_size = 1 } };
125 auto init_err = writer.init();
126 ASSERT_TRUE(init_err.has_value());
127
128 auto err = writer.add_entrypoint(valid_entry_point);
129 ASSERT_FALSE(err.has_value());
130 EXPECT_TRUE(err.error() == ErrorCode::writer_buffer_overflow);
131}
132
133TEST(writer, write_current_entry)
134{
135 auto writer = Binary{ Config{} };
136 auto init_err = writer.init();
137 ASSERT_TRUE(init_err.has_value());
138
139 auto err = writer.add_entrypoint(valid_entry_point);
140
141 ASSERT_TRUE(err.has_value());
142 auto size = writer.write_current_entry();
143
144 ASSERT_TRUE(size.has_value());
145 ASSERT_GT(size.value(), 0);
146
147 const auto& buffer = writer.get_buffer();
148 EXPECT_EQ(buffer.first, std::vector{ 0U });
149 EXPECT_EQ(buffer.second, std::vector{ 0.F });
150
151 writer.close();
152
153 auto filename = writer.get_config().out_filename;
154 ASSERT_TRUE(fs::exists(filename));
155 EXPECT_GT(fs::file_size(filename), 0);
156}
157// TEST(writer, format) {}
Class for writing binary files.
Definition binary.hpp:63
auto add_entrypoint(const EntryPoint< NLocals, NGlobals > &entry_point) -> EnumError<>
Add an entrypoint to the internal data buffer.
Definition binary.hpp:183
auto init() -> EnumError<>
Initialization.
Definition binary.cpp:50
ErrorCode
Enumerations for the centipede program.
Structure of a entrypoint.
Definition entry.hpp:20
Class for configuring the binary writer class (Binary).
Definition binary.hpp:78