mirror of
https://github.com/logos-co/logos-test-modules.git
synced 2026-08-30 19:51:16 +00:00
* feat: full_api test chain — providers, proxies, and a UI plugin
Adds a hermetic test chain that exercises the entire supported type surface
(every method param/return + event param type) end to end, replacing the
network-dependent cross-version checks:
- test_fullapi_cpp universal C++ provider (reference impl of full_api)
- test_fullapi_rust Rust cdylib provider, same contract (cross-language parity)
- test_fullapi_proxy universal C++ consumer/proxy via interface dependency
(forwards every method, re-emits every event)
- test_fullapi_proxy_rust Rust mirror of the proxy
- test_fullapi_ui universal ui_qml plugin consuming full_api via an
interface dependency; drives every method type + all
events, surfaced to QML for a headless UI doctest
All five build; the core chain (both providers + both proxies, incl. cross-
language method calls and event round-trips) is proven at runtime under
logoscore, and the UI plugin is proven in Basecamp (method calls + typed event
delivery). Requires the cpp-sdk/rust-sdk codegen fixes (bstr/composite type
handling) re-pinned through module-builder.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* test(fullapi-ui): verify echoAny too; document the typed-scalar-array gap
The UI backend now also verifies echoAny (any round-trips) in the ALL_OK token,
and documents that typed-scalar arrays ([int]/[uint]/[float64]/[bool], and [any]
carrying numbers) still round-trip empty over the ui-host QtRO transport — a
Qt-path marshaling gap partially addressed by logos-protocol's container int-
preservation fix but not fully resolved. They are exercised but kept out of the
token so the basecamp UI doctest stays green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* test(fullapi): add fullapi-tests check proving every array type round-trips
Adds a proxy probeArrays() method that round-trips one array of EVERY array type
([int]/[uint]/[float64]/[bool]/[tstr]/[any]) through the bound provider over the
lp path, plus a 'fullapi' group in run_tests.sh and a checks.fullapi-tests
derivation. This is CLI-observable (logoscore can't pass a list arg directly)
and proves both the C++ and Rust providers decode every array type identically.
Result: 5/5 green — probeArrays returns intList=3 uintList=2 doubleList=2
boolList=2 stringList=2 anyList=3 against both providers, plus scalar forwarding
and an event round-trip through the proxy. This isolates the earlier UI
[int]-empties symptom to the Qt-path host-side qvariantToNlohmann conversion
(fixed in logos-protocol), NOT the provider decode.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* test(fullapi): package + exercise the Rust proxy in fullapi-tests
Copilot review: the fullapi-tests modulesDir aggregated only the C++
provider/proxy installs, so test_fullapi_proxy_rust wasn't built/packaged by the
check. Add it to modulesDir and load + exercise it in the fullapi group (echoInt
forwarding + intEvent round-trip). 7/7 green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* chore: re-lock module-builder (brings the full_api SDK fixes)
Bumps logos-module-builder to 206c364 (#150), which re-pins cpp-sdk/qt-sdk/
rust-sdk/protocol to the merged full_api fixes. The five full_api modules now
build with no SDK overrides; checks.fullapi-tests is 7/7 green against master.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
84 lines
3.9 KiB
C++
84 lines
3.9 KiB
C++
#pragma once
|
|
|
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
// full_api — a DEPENDENCY INTERFACE (method + event contract) decoupled from any
|
|
// concrete module. It names NO module; any module whose API is a superset of
|
|
// this satisfies it. A consumer binds it to a concrete module name at runtime
|
|
// via modules().bind_full_api("some_module").
|
|
//
|
|
// Both test_fullapi_cpp and test_fullapi_rust implement exactly this surface, so
|
|
// the same bound handle drives either provider (and this proxy, which re-exposes
|
|
// it, satisfies it too).
|
|
//
|
|
// Types are std (the consuming module is universal); the generated bound wrapper
|
|
// inherits that api-style. NO trailing `// comments` on declaration lines — the
|
|
// header parser only accepts a line ending in `;`.
|
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
|
|
#include <cstdint>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <logos_json.h> // LogosMap, LogosList, nlohmann::json
|
|
#include <logos_module_context.h> // defines the `logos_events` token
|
|
#include <logos_result.h> // StdLogosResult
|
|
|
|
class IFullApi {
|
|
public:
|
|
std::string whoAmI();
|
|
|
|
// Scalar echoes: tstr / bstr / int / uint / float64 / bool / any
|
|
std::string echoString(const std::string& v);
|
|
std::vector<uint8_t> echoBytes(const std::vector<uint8_t>& v);
|
|
int64_t echoInt(int64_t v);
|
|
uint64_t echoUint(uint64_t v);
|
|
double echoDouble(double v);
|
|
bool echoBool(bool v);
|
|
nlohmann::json echoAny(const nlohmann::json& v);
|
|
|
|
// Container echoes: [tstr] / [int] / [uint] / [float64] / [bool] / [any] / {tstr:any}
|
|
std::vector<std::string> echoStringList(const std::vector<std::string>& v);
|
|
std::vector<int64_t> echoIntList(const std::vector<int64_t>& v);
|
|
std::vector<uint64_t> echoUintList(const std::vector<uint64_t>& v);
|
|
std::vector<double> echoDoubleList(const std::vector<double>& v);
|
|
std::vector<bool> echoBoolList(const std::vector<bool>& v);
|
|
LogosList echoList(const LogosList& v);
|
|
LogosMap echoMap(const LogosMap& v);
|
|
|
|
// Return-only: void / result
|
|
void doVoid();
|
|
StdLogosResult makeResult(bool ok);
|
|
|
|
// Event trigger drivers (return bool)
|
|
bool fireStringEvent(const std::string& v);
|
|
bool fireBytesEvent(const std::vector<uint8_t>& v);
|
|
bool fireIntEvent(int64_t v);
|
|
bool fireUintEvent(uint64_t v);
|
|
bool fireDoubleEvent(double v);
|
|
bool fireBoolEvent(bool v);
|
|
bool fireAnyEvent(const nlohmann::json& v);
|
|
bool fireStringListEvent(const std::vector<std::string>& v);
|
|
bool fireIntListEvent(const std::vector<int64_t>& v);
|
|
bool fireUintListEvent(const std::vector<uint64_t>& v);
|
|
bool fireDoubleListEvent(const std::vector<double>& v);
|
|
bool fireBoolListEvent(const std::vector<bool>& v);
|
|
bool fireListEvent(const LogosList& v);
|
|
bool fireMapEvent(const LogosMap& v);
|
|
|
|
logos_events:
|
|
void stringEvent(const std::string& v);
|
|
void bytesEvent(const std::vector<uint8_t>& v);
|
|
void intEvent(int64_t v);
|
|
void uintEvent(uint64_t v);
|
|
void doubleEvent(double v);
|
|
void boolEvent(bool v);
|
|
void anyEvent(const nlohmann::json& v);
|
|
void stringListEvent(const std::vector<std::string>& v);
|
|
void intListEvent(const std::vector<int64_t>& v);
|
|
void uintListEvent(const std::vector<uint64_t>& v);
|
|
void doubleListEvent(const std::vector<double>& v);
|
|
void boolListEvent(const std::vector<bool>& v);
|
|
void listEvent(const LogosList& v);
|
|
void mapEvent(const LogosMap& v);
|
|
};
|