1#include "centipede/centipede.hpp"
5#include <gtest/gtest.h>
12namespace fs = std::filesystem;
14TEST(writer, constructor)
16 auto writer =
Binary{ Config{ .out_filename =
"binary_writer_constructor.bin" } };
17 EXPECT_FALSE(fs::exists(fs::path(writer.get_config().out_filename)));
22 auto writer =
Binary{ Config{ .out_filename =
"binary_writer_init.bin" } };
23 auto error = writer.
init();
25 EXPECT_TRUE(error.has_value());
26 EXPECT_TRUE(fs::exists(fs::path(writer.get_config().out_filename)));
28 const auto& buffer = writer.get_buffer();
29 EXPECT_EQ(buffer.first, std::vector{ 0U });
30 EXPECT_EQ(buffer.second, std::vector{ 0.F });
33TEST(writer, init_error)
35 auto writer =
Binary{ Config{ .out_filename =
"" } };
36 auto error = writer.
init();
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)));
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;
50 .global_derivs = valid_global_derivs,
51 .measurement = valid_meas,
52 .sigma = valid_sigma };
54TEST(writer, read_entrypoint_normal)
56 auto writer =
Binary{ Config{} };
57 [[maybe_unused]]
auto init_err = writer.
init();
59 auto err = writer.add_entrypoint(valid_entry_point);
60 ASSERT_TRUE(err.has_value());
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);
69TEST(writer, read_entrypoint_reject)
71 auto writer =
Binary{ Config{} };
72 [[maybe_unused]]
auto init_err = writer.
init();
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;
79 .local_derivs = local_derivs, .global_derivs = global_derivs, .measurement = meas, .sigma = sigma
81 auto err = writer.add_entrypoint(entry_point);
82 ASSERT_FALSE(err.has_value());
83 EXPECT_TRUE(err.error() == ErrorCode::writer_entrypoint_rejected);
85 auto size = writer.write_current_entry();
86 ASSERT_TRUE(size.has_value());
87 EXPECT_EQ(size.value(), 0);
90TEST(writer, uninitialized)
92 auto writer =
Binary{ Config{} };
96 ASSERT_FALSE(err.has_value());
97 EXPECT_EQ(err.error(), ErrorCode::writer_uninitialized);
99 auto size = writer.write_current_entry();
100 ASSERT_FALSE(size.has_value());
101 EXPECT_EQ(size.error(), ErrorCode::writer_uninitialized);
104TEST(writer, read_entrypoint_zero_sigma)
106 auto writer =
Binary{ Config{} };
107 auto init_err = writer.
init();
108 ASSERT_TRUE(init_err.has_value());
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;
115 .local_derivs = local_derivs, .global_derivs = global_derivs, .measurement = meas, .sigma = sigma
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);
122TEST(writer, read_entrypoint_buffer_overflow)
124 auto writer =
Binary{ Config{ .max_bufferpoint_size = 1 } };
125 auto init_err = writer.
init();
126 ASSERT_TRUE(init_err.has_value());
128 auto err = writer.add_entrypoint(valid_entry_point);
129 ASSERT_FALSE(err.has_value());
130 EXPECT_TRUE(err.error() == ErrorCode::writer_buffer_overflow);
133TEST(writer, write_current_entry)
135 auto writer =
Binary{ Config{} };
136 auto init_err = writer.
init();
137 ASSERT_TRUE(init_err.has_value());
139 auto err = writer.add_entrypoint(valid_entry_point);
141 ASSERT_TRUE(err.has_value());
142 auto size = writer.write_current_entry();
144 ASSERT_TRUE(size.has_value());
145 ASSERT_GT(size.value(), 0);
147 const auto& buffer = writer.get_buffer();
148 EXPECT_EQ(buffer.first, std::vector{ 0U });
149 EXPECT_EQ(buffer.second, std::vector{ 0.F });
153 auto filename = writer.get_config().out_filename;
154 ASSERT_TRUE(fs::exists(filename));
155 EXPECT_GT(fs::file_size(filename), 0);
Class for writing binary files.
auto add_entrypoint(const EntryPoint< NLocals, NGlobals > &entry_point) -> EnumError<>
Add an entrypoint to the internal data buffer.
auto init() -> EnumError<>
Initialization.
ErrorCode
Enumerations for the centipede program.
Structure of a entrypoint.
Class for configuring the binary writer class (Binary).