#include "example.hpp" #include #include #include int main() { using adminive::example::Alert_Config; using adminive::example::Radio_Item_Status; using adminive::example::Radio_Mode; using adminive::example::Radio_Service_Config; using adminive::example::Radio_State; using Json = adminive::example::Json; Radio_State state; const auto descriptor = adminive::to_descriptor_json(); assert(descriptor.at("name") == "radio_state"); assert(descriptor.at("fields").size() == 5); assert(descriptor.at("fields").at(0).at("name") == "mode"); assert(descriptor.at("fields").at(0).at("label") == "Operating Mode"); assert(descriptor.at("fields").at(0).at("list_label") == "Mode"); assert(descriptor.at("fields").at(0).at("value_type") == "enum"); assert(descriptor.at("fields").at(0).at("options").size() == 4); assert(descriptor.at("fields").at(0).at("options").at(0).at("value") == "receive"); assert(descriptor.at("fields").at(0).at("options").at(2).at("value") == "duplex"); assert(descriptor.at("fields").at(0).at("order") == 5); assert(descriptor.at("fields").at(0).at("sortable") == true); assert(descriptor.at("fields").at(1).at("name") == "port"); assert(descriptor.at("fields").at(1).at("list_label") == "Listen Port"); assert(descriptor.at("fields").at(1).at("minimum") == 1); assert(descriptor.at("fields").at(1).at("maximum") == 65535); assert(descriptor.at("fields").at(2).at("name") == "buffer_count"); assert(descriptor.at("fields").at(2).at("multiple_of") == 2); const auto initial = adminive::to_json(state); assert(initial.at("mode") == "receive"); assert(initial.at("port") == 9999); Radio_State assigned; auto result = adminive::assign_json(assigned, Json{{"mode", "transmit"}, {"port", 7000}, {"buffer_count", 6}, {"low_watermark", 10}, {"high_watermark", 20}}); assert(result.success); assert(assigned.mode == Radio_Mode::transmit); assert(assigned.port.value() == 7000); result = adminive::apply_json_patch(assigned, Json{{"mode", "duplex"}, {"port", 7200}}); assert(result.success); assert(assigned.mode == Radio_Mode::duplex); assert(assigned.port.value() == 7200); result = adminive::apply_patch(state, Json{{"buffer_count", 3}}); assert(!result.success); assert(state.buffer_count.value() == 2); result = adminive::apply_patch(state, Json{{"low_watermark", 64}, {"high_watermark", 32}}); assert(!result.success); assert(state.low_watermark == 0); result = adminive::apply_patch(state, Json{{"missing", 1}}); assert(!result.success); assert(result.field_errors.contains("missing")); Radio_State created; result = adminive::apply_frontend_create(created, Json{{"mode", "maintenance"}, {"port", 7300}, {"buffer_count", 10}, {"low_watermark", 12}, {"high_watermark", 24}}); assert(result.success); assert(created.mode == Radio_Mode::maintenance); result = adminive::apply_frontend_create(created, Json{{"port", 7300}}); assert(!result.success); assert(result.field_errors.contains("mode")); assert(result.field_errors.contains("buffer_count")); const auto form = adminive::to_amis_form_schema(state, "/admin/radio_state", "Confirm Changes"); assert(form.at("type") == "form"); assert(form.at("body").size() == 5); assert(form.at("body").at(0).at("type") == "select"); assert(form.at("body").at(0).at("options").size() == 4); assert(form.at("body").at(1).at("type") == "input-number"); assert(form.at("body").at(2).at("step") == 2); assert(form.at("actions").size() == 2); assert(form.at("actions").at(0).at("type") == "reset"); assert(form.at("actions").at(1).at("type") == "submit"); assert(form.at("actions").at(1).at("label") == "Confirm Changes"); const auto crud = adminive::to_amis_crud_schema("/admin/radio_states"); assert(crud.at("type") == "page"); assert(crud.at("body").at("type") == "crud"); assert(crud.at("body").at("columns").size() == 7); assert(crud.at("body").at("columns").at(1).at("name") == "mode"); assert(crud.at("body").at("columns").at(1).at("type") == "mapping"); assert(crud.at("body").at("columns").at(1).at("map").at("duplex") == "Duplex"); assert(crud.at("body").at("columns").at(2).at("name") == "buffer_count"); assert(crud.at("body").at("columns").at(3).at("name") == "port"); assert(!crud.at("body").contains("interval")); const auto& create_form = crud.at("body").at("headerToolbar").at(2).at("dialog").at("body"); assert(create_form.at("actions").at(1).at("type") == "submit"); assert(create_form.at("actions").at(1).at("label") == "Create"); const auto status_descriptor = adminive::to_status_descriptor_json(); 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().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("/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(1).at("columns").size() == 8); const auto& status_column = status_crud.at("body").at(1).at("columns").at(6); assert(status_column.at("label") == "Runtime Status"); assert(status_column.at("popOver").at("trigger") == "click"); assert(status_column.at("popOver").at("body").at("api").at("url") == "/admin/radio_states/${id}/status"); adminive::example::Http_Collection_Resource collection_resource("/admin/radio_states", std::vector{state}, "/admin/status"); collection_resource.register_status<&Radio_State::status>(3000); const auto registered_schema = collection_resource.amis_schema(); const auto& registered_status_column = registered_schema.at("body").at(1).at("columns").at(6); assert(registered_status_column.at("popOver").at("body").at("interval") == 3000); Radio_Service_Config service_config; const auto service_descriptor = adminive::to_descriptor_json(); assert(service_descriptor.at("fields").size() == 7); assert(service_descriptor.at("fields").at(0).at("value_type") == "string"); assert(service_descriptor.at("fields").at(1).at("value_type") == "enum"); assert(service_descriptor.at("fields").at(2).at("value_type") == "integer"); assert(service_descriptor.at("fields").at(3).at("value_type") == "number"); assert(service_descriptor.at("fields").at(4).at("value_type") == "object"); assert(service_descriptor.at("fields").at(4).at("children").size() == 3); assert(service_descriptor.at("fields").at(5).at("visible_on") == "${mode == 'duplex'}"); assert(service_descriptor.at("fields").at(6).at("children").at(1).at("widget") == "input-date"); assert(service_descriptor.at("fields").at(6).at("children").at(2).at("widget") == "input-color"); const auto service_form = adminive::to_amis_form_schema(service_config, "/admin/config/radio/data", "Confirm Changes"); assert(service_form.at("body").at(0).at("type") == "input-text"); assert(service_form.at("body").at(1).at("type") == "select"); assert(service_form.at("body").at(2).at("type") == "input-number"); assert(service_form.at("body").at(3).at("type") == "input-number"); assert(service_form.at("body").at(4).at("type") == "fieldset"); assert(service_form.at("body").at(4).at("body").at(1).at("name") == "primary_endpoint.host"); assert(service_form.at("body").at(5).at("visibleOn") == "${mode == 'duplex'}"); assert(service_form.at("body").at(6).at("body").at(1).at("type") == "input-date"); assert(service_form.at("body").at(6).at("body").at(1).at("valueFormat") == "YYYY-MM-DD"); assert(service_form.at("body").at(6).at("body").at(2).at("type") == "input-color"); assert(service_form.at("actions").at(1).at("type") == "submit"); result = adminive::apply_frontend_patch(service_config, Json{{"profile_name", "Duplex Profile"}, {"mode", "duplex"}, {"worker_count", 8}, {"receive_gain", 2.5}, {"primary_endpoint", Json{{"enabled", true}, {"host", "10.0.0.1"}, {"port", 9200}}}, {"backup_endpoint", Json{{"enabled", true}, {"host", "10.0.0.2"}, {"port", 9201}}}, {"appearance", Json{{"panel_title", "Duplex Radio"}, {"effective_date", "2026-08-07"}, {"accent_color", "#16a34a"}}}}); assert(result.success); assert(service_config.mode == Radio_Mode::duplex); assert(service_config.primary_endpoint.host == "10.0.0.1"); assert(service_config.appearance.accent_color == "#16a34a"); Alert_Config alert_config; const auto alert_form = adminive::to_amis_form_schema(alert_config, "/admin/config/alerts/data", "Confirm Changes"); assert(alert_form.at("body").size() == 8); assert(alert_form.at("body").at(1).at("type") == "input-text"); assert(alert_form.at("body").at(2).at("type") == "select"); assert(alert_form.at("body").at(3).at("type") == "select"); assert(alert_form.at("body").at(4).at("type") == "input-number"); assert(alert_form.at("body").at(5).at("type") == "input-date"); assert(alert_form.at("body").at(6).at("type") == "input-color"); assert(alert_form.at("body").at(7).at("type") == "fieldset"); assert(alert_form.at("body").at(7).at("visibleOn") == "${enabled && channel == 'webhook'}"); adminive::example::Http_Resource service_resource(service_config, "/admin/config/radio"); const auto resource_form = service_resource.amis_schema(); assert(resource_form.at("api").at("method") == "post"); assert(resource_form.at("api").at("url") == "/admin/config/radio/data"); assert(resource_form.at("actions").at(1).at("label") == "Confirm Changes"); 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); return 0; }