#include "gnuplotpp/gnuplot_backend.hpp"
#include "gnuplotpp/plot.hpp"
#include "gnuplotpp/presets.hpp"
#include
#include
#include
#include
#include
namespace {
std::string read_file(const std::filesystem::path& path) {
std::ifstream in(path);
return std::string((std::istreambuf_iterator(in)), std::istreambuf_iterator());
}
} // namespace
int main() {
using namespace gnuplotpp;
FigureSpec spec;
spec.preset = Preset::IEEE_DoubleColumn;
apply_preset_defaults(spec);
spec.rows = 1;
spec.cols = 2;
spec.formats = {OutputFormat::Pdf};
spec.export_policy.drop_line_alpha_for_vector = false;
Figure fig(spec);
AxesSpec ax0;
ax0.title = "Position Error";
ax0.xlabel = "t [s]";
ax0.ylabel = "||e_p|| [m]";
ax0.grid = true;
AxesSpec ax1 = ax0;
ax1.title = "Velocity Error";
ax1.ylabel = "||e_v|| [m/s]";
fig.axes(0, 0).set(ax0);
fig.axes(0, 1).set(ax1);
const std::vector t{0.0, 1.0, 2.0};
const std::vector ep{2.0, 1.0, 0.5};
const std::vector ev{0.4, 0.3, 0.2};
const std::vector ep_mc{1.8, 1.1, 0.6};
fig.axes(0, 0).add_series(SeriesSpec{.label = "SRIF"}, t, ep);
fig.axes(0, 0).add_series(SeriesSpec{.label = "MC",
.has_line_width = true,
.line_width_pt = 0.6,
.has_color = true,
.color = "#000000",
.has_opacity = true,
.opacity = 0.25},
t,
ep_mc);
fig.axes(0, 1).add_series(SeriesSpec{.label = "SRIF"}, t, ev);
const auto out_dir = std::filesystem::temp_directory_path() / "gnuplotpp_backend_test";
std::filesystem::remove_all(out_dir);
fig.set_backend(make_gnuplot_backend("__gnuplot_missing__"));
const auto result = fig.save(out_dir);
assert(!result.ok);
assert(result.status == RenderStatus::ExternalToolMissing);
assert(std::filesystem::exists(result.script_path));
const auto script = read_file(result.script_path);
assert(script.find("set multiplot layout 1,2") != std::string::npos);
assert(script.find("set terminal pdfcairo") != std::string::npos);
assert(script.find("set monochrome") == std::string::npos);
assert(script.find("dt 1") != std::string::npos);
assert(script.find("lc rgb '#bf000000'") != std::string::npos);
assert(script.find("plot") != std::string::npos);
const auto data0 = out_dir / "tmp" / "ax0_series0.dat";
const auto data_text = read_file(data0);
assert(data_text.find("0.0000000000000000e+00") != std::string::npos);
assert(data_text.find("2.0000000000000000e+00") != std::string::npos);
std::filesystem::remove_all(out_dir);
return 0;
}