ppforest2 v0.1.0
Projection Pursuit Decision Trees and Random Forests
Loading...
Searching...
No Matches
CLI.integration.hpp
Go to the documentation of this file.
1
9#pragma once
10
11#include <gtest/gtest.h>
12
13#include "io/TempFile.hpp"
14
15#include <cstdio>
16#include <cstdlib>
17#include <fstream>
18#include <string>
19#include <sstream>
20#include <filesystem>
21
22#include <nlohmann/json.hpp>
23
24using json = nlohmann::json;
25
26#ifndef PPFOREST2_BINARY_PATH
27#error "PPFOREST2_BINARY_PATH must be defined"
28#endif
29
30#ifndef PPFOREST2_DATA_DIR
31#error "PPFOREST2_DATA_DIR must be defined"
32#endif
33
34#ifndef PPFOREST2_GOLDEN_DIR
35#error "PPFOREST2_GOLDEN_DIR must be defined"
36#endif
37
38inline const std::string BINARY = PPFOREST2_BINARY_PATH;
39inline std::string const DATA_DIR = PPFOREST2_DATA_DIR;
40inline std::string const GOLDEN_DIR = PPFOREST2_GOLDEN_DIR;
41inline std::string const IRIS_CSV = DATA_DIR + "/iris.csv";
42inline std::string const CRAB_CSV = DATA_DIR + "/crab.csv";
43inline std::string const WINE_CSV = DATA_DIR + "/wine.csv";
44inline std::string const GLASS_CSV = DATA_DIR + "/glass.csv";
45
54 std::string stdout_output;
55 std::string stderr_output;
56};
57
67inline ProcessResult run_ppforest2(std::string const& args) {
68 ppforest2::io::TempFile stderr_file;
69
70#ifdef _WIN32
71 std::string cmd = BINARY + " " + args + " 2>\"" + stderr_file.path() + "\"";
72 FILE* pipe = _popen(cmd.c_str(), "r");
73#else
74 std::string cmd = BINARY + " " + args + " 2>\"" + stderr_file.path() + "\"";
75 FILE* pipe = popen(cmd.c_str(), "r");
76#endif
77
78 if (!pipe) {
79 return {-1, "", ""};
80 }
81
82 std::string output;
83 char buffer[4096];
84
85 while (fgets(buffer, sizeof(buffer), pipe))
86 output += buffer;
87
88#ifdef _WIN32
89 int exit_code = _pclose(pipe);
90#else
91 int status = pclose(pipe);
92 int exit_code = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
93#endif
94
95 return {exit_code, output, stderr_file.read()};
96}
97
100
107class SavedModelTest : public ::testing::Test {
108protected:
109 void SetUp() override {
110 model_.reset(new TempFile());
111 model_->clear();
112 auto result = run_ppforest2("-q train -d " + IRIS_CSV + " -n 5 -r 0 -s " + model_->path());
113 ASSERT_EQ(result.exit_code, 0);
114 model_json_ = json::parse(model_->read());
115 }
116
117 std::unique_ptr<TempFile> model_;
119};
std::string const DATA_DIR
Definition CLI.integration.hpp:39
std::string const CRAB_CSV
Definition CLI.integration.hpp:42
std::string const IRIS_CSV
Definition CLI.integration.hpp:41
ProcessResult run_ppforest2(std::string const &args)
Spawn the ppforest2 binary with the given argument string.
Definition CLI.integration.hpp:67
std::string const GLASS_CSV
Definition CLI.integration.hpp:44
nlohmann::json json
Definition CLI.integration.hpp:24
const std::string BINARY
Definition CLI.integration.hpp:38
std::string const WINE_CSV
Definition CLI.integration.hpp:43
std::string const GOLDEN_DIR
Definition CLI.integration.hpp:40
RAII temporary file and directory with automatic cleanup.
Test fixture that trains a forest model once in SetUp().
Definition CLI.integration.hpp:107
void SetUp() override
Definition CLI.integration.hpp:109
std::unique_ptr< TempFile > model_
Definition CLI.integration.hpp:117
json model_json_
Definition CLI.integration.hpp:118
RAII temporary directory with automatic cleanup.
Definition TempFile.hpp:104
RAII temporary file with automatic cleanup.
Definition TempFile.hpp:28
std::string read() const
Read the entire file contents as a string.
Definition TempFile.hpp:87
std::string const & path() const
Definition TempFile.hpp:81
Captured output of a child-process invocation.
Definition CLI.integration.hpp:52
int exit_code
Definition CLI.integration.hpp:53
std::string stdout_output
Definition CLI.integration.hpp:54
std::string stderr_output
Definition CLI.integration.hpp:55