首次提交
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
#include "example.hpp"
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
namespace test_types {
|
||||
enum class Radio_Mode {
|
||||
receive,
|
||||
transmit
|
||||
};
|
||||
struct Enum_State {
|
||||
Radio_Mode mode{Radio_Mode::receive};
|
||||
};
|
||||
}
|
||||
namespace adminive {
|
||||
template <>
|
||||
struct Type_Descriptor<test_types::Enum_State> {
|
||||
static auto get() {
|
||||
using T = test_types::Enum_State;
|
||||
return object<T>("enum_state", ADMINIVE_FIELD(T, mode).creatable().editable());
|
||||
}
|
||||
};
|
||||
}
|
||||
int main() {
|
||||
using adminive::example::Radio_Item_Status;
|
||||
using adminive::example::Radio_State;
|
||||
Radio_State state;
|
||||
const auto descriptor = adminive::to_descriptor_json<Radio_State>();
|
||||
assert(descriptor.at("name") == "radio_state");
|
||||
assert(descriptor.at("fields").size() == 4);
|
||||
assert(descriptor.at("fields").at(0).at("name") == "port");
|
||||
assert(descriptor.at("fields").at(0).at("label") == "Port");
|
||||
assert(descriptor.at("fields").at(0).at("list_label") == "Listen Port");
|
||||
assert(descriptor.at("fields").at(1).at("label") == "Buffer Count");
|
||||
assert(descriptor.at("fields").at(1).at("list_label") == "Buffers");
|
||||
assert(descriptor.at("fields").at(0).at("order") == 20);
|
||||
assert(descriptor.at("fields").at(1).at("order") == 10);
|
||||
assert(descriptor.at("fields").at(0).at("sortable") == true);
|
||||
assert(descriptor.at("fields").at(2).at("sortable") == false);
|
||||
assert(descriptor.at("fields").at(0).at("minimum") == 1);
|
||||
assert(descriptor.at("fields").at(0).at("maximum") == 65535);
|
||||
assert(descriptor.at("fields").at(1).at("multiple_of") == 2);
|
||||
const auto initial = adminive::to_json(state);
|
||||
assert(initial.at("port") == 9999);
|
||||
Radio_State assigned;
|
||||
auto result = adminive::assign_json(assigned, adminive::Json{{"port", 7000}, {"buffer_count", 6}, {"low_watermark", 10}, {"high_watermark", 20}});
|
||||
assert(result.success);
|
||||
assert(assigned.port.value() == 7000);
|
||||
const auto constructed = adminive::from_json<Radio_State>(adminive::Json{{"port", 7100}, {"buffer_count", 8}, {"low_watermark", 11}, {"high_watermark", 22}});
|
||||
assert(constructed.port.value() == 7100);
|
||||
result = adminive::apply_json_patch(assigned, adminive::Json{{"port", 7200}});
|
||||
assert(result.success);
|
||||
assert(assigned.port.value() == 7200);
|
||||
result = adminive::apply_patch(state, adminive::Json{{"port", 9000}, {"buffer_count", 4}, {"low_watermark", 16}, {"high_watermark", 32}});
|
||||
assert(result.success);
|
||||
assert(state.port.value() == 9000);
|
||||
result = adminive::apply_patch(state, adminive::Json{{"buffer_count", 3}});
|
||||
assert(!result.success);
|
||||
assert(state.buffer_count.value() == 4);
|
||||
result = adminive::apply_patch(state, adminive::Json{{"low_watermark", 64}, {"high_watermark", 32}});
|
||||
assert(!result.success);
|
||||
assert(state.low_watermark == 16);
|
||||
result = adminive::apply_patch(state, adminive::Json{{"missing", 1}});
|
||||
assert(!result.success);
|
||||
assert(result.field_errors.contains("missing"));
|
||||
Radio_State created;
|
||||
result = adminive::apply_frontend_create(created, adminive::Json{{"port", 7300}, {"buffer_count", 10}, {"low_watermark", 12}, {"high_watermark", 24}});
|
||||
assert(result.success);
|
||||
result = adminive::apply_frontend_create(created, adminive::Json{{"port", 7300}});
|
||||
assert(!result.success);
|
||||
assert(result.field_errors.contains("buffer_count"));
|
||||
const auto form = adminive::to_amis_form_schema(state);
|
||||
assert(form.at("type") == "form");
|
||||
assert(form.at("body").size() == 4);
|
||||
assert(form.at("body").at(0).at("type") == "input-number");
|
||||
assert(form.at("body").at(1).at("step") == 2);
|
||||
const auto crud = adminive::to_amis_crud_schema<Radio_State>("/admin/radio_states");
|
||||
assert(crud.at("type") == "page");
|
||||
assert(crud.at("body").at("type") == "crud");
|
||||
assert(crud.at("body").at("columns").size() == 6);
|
||||
assert(crud.at("body").at("columns").at(1).at("name") == "buffer_count");
|
||||
assert(crud.at("body").at("columns").at(1).at("label") == "Buffers");
|
||||
assert(crud.at("body").at("columns").at(2).at("name") == "port");
|
||||
assert(crud.at("body").at("columns").at(2).at("label") == "Listen Port");
|
||||
assert(!crud.at("body").contains("interval"));
|
||||
const auto status_descriptor = adminive::to_status_descriptor_json<Radio_Item_Status>();
|
||||
assert(status_descriptor.at("protocol") == "adminive.status");
|
||||
assert(status_descriptor.at("fields").size() == 3);
|
||||
assert(status_descriptor.at("fields").at(0).at("name") == "operating_state");
|
||||
assert(status_descriptor.at("fields").at(0).at("value_type") == "enum");
|
||||
assert(status_descriptor.at("fields").at(0).at("color") == true);
|
||||
const auto first_status = adminive::to_status_json(state.status());
|
||||
const auto second_status = adminive::to_status_json(state.status());
|
||||
assert(first_status.at("operating_state").contains("color"));
|
||||
assert(!first_status.at("operating_state").at("color").get<std::string>().empty());
|
||||
assert(first_status.at("refresh_sequence").at("value") == 1);
|
||||
assert(second_status.at("refresh_sequence").at("value") == 2);
|
||||
const auto status_crud = adminive::to_amis_crud_status_schema<Radio_State>("/admin/radio_states", "/admin/status", &status_descriptor);
|
||||
assert(status_crud.at("body").is_array());
|
||||
assert(status_crud.at("body").at(0).at("type") == "service");
|
||||
assert(status_crud.at("body").at(0).at("api").at("url") == "/admin/status");
|
||||
assert(status_crud.at("body").at(1).at("type") == "crud");
|
||||
assert(status_crud.at("body").at(1).at("columns").size() == 7);
|
||||
const auto& status_column = status_crud.at("body").at(1).at("columns").at(5);
|
||||
assert(status_column.at("label") == "Runtime Status");
|
||||
assert(status_column.at("popOver").at("trigger") == "click");
|
||||
assert(status_column.at("popOver").at("body").at("type") == "service");
|
||||
assert(status_column.at("popOver").at("body").at("api").at("url") == "/admin/radio_states/${id}/status");
|
||||
assert(status_column.at("popOver").at("body").at("interval") == 2000);
|
||||
adminive::Http_Collection_Resource<Radio_State> resource("/admin/radio_states", std::vector<Radio_State>{state}, "/admin/status");
|
||||
resource.register_status<&Radio_State::status>(3000);
|
||||
const auto registered_schema = resource.amis_schema();
|
||||
const auto& registered_status_column = registered_schema.at("body").at(1).at("columns").at(5);
|
||||
assert(registered_status_column.at("popOver").at("body").at("interval") == 3000);
|
||||
adminive::example::Server_Status server_status;
|
||||
server_status.server_time = "2026-08-06T00:00:00Z";
|
||||
server_status.poll_sequence = 7;
|
||||
const auto status_json = adminive::to_frontend_json(server_status);
|
||||
assert(status_json.at("service_state") == "running");
|
||||
assert(status_json.at("poll_sequence") == 7);
|
||||
test_types::Enum_State enum_state;
|
||||
const auto enum_descriptor = adminive::to_descriptor_json<test_types::Enum_State>();
|
||||
assert(enum_descriptor.at("fields").at(0).at("options").size() == 2);
|
||||
result = adminive::apply_patch(enum_state, adminive::Json{{"mode", "transmit"}});
|
||||
assert(result.success);
|
||||
assert(enum_state.mode == test_types::Radio_Mode::transmit);
|
||||
assert(adminive::to_json(enum_state).at("mode") == "transmit");
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user