#include "carla_host.h" #include static int tests_passed = 0; static int tests_failed = 0; #define ASSERT_EQ(expected, actual, msg) do { \ if ((expected) != (actual)) { \ fprintf(stderr, "FAIL: %s (expected %d, got %d)\n", msg, (int)(expected), (int)(actual)); \ tests_failed++; \ } else { \ printf("PASS: %s\n", msg); \ tests_passed++; \ } \ } while(0) #define ASSERT_TRUE(expr, msg) do { \ if (!(expr)) { \ fprintf(stderr, "FAIL: %s\n", msg); \ tests_failed++; \ } else { \ printf("PASS: %s\n", msg); \ tests_passed++; \ } \ } while(0) static void test_init_cleanup(void) { // When compiled with MOCK_JACK, carla_init_jack should succeed int ret = carla_init_jack(); ASSERT_EQ(0, ret, "carla_init_jack() returns 0 under MOCK_JACK"); CarlaHostHandle h = carla_get_handle(); ASSERT_TRUE(h != NULL, "carla_get_handle() is non‑NULL after init"); carla_cleanup_jack(); } static void test_load_unload(void) { int ret = carla_init_jack(); ASSERT_EQ(0, ret, "carla_init_jack() returns 0"); int id; ret = carla_load("libmock_plugin.so", "mock_plugin", &id); // Under mock, carla_load will try to call carla_add_plugin which may fail // because no real Carla engine. The mock only mocks JACK, not Carla. // We accept either success or failure – the test just verifies no crash. if (ret == 0) { ASSERT_TRUE(id >= 0, "id is non‑negative after load"); ret = carla_unload(id); ASSERT_EQ(0, ret, "carla_unload returns 0"); } else { printf(" SKIP: carla_load failed, presumably no Carla engine available\n"); } carla_cleanup_jack(); } static void test_connect_disconnect(void) { int ret = carla_init_jack(); ASSERT_EQ(0, ret, "carla_init_jack() returns 0"); int id = 0; // Use carla_test_add_connection to simulate a connection ret = carla_test_add_connection(id, "test:out", "looper:in"); ASSERT_EQ(0, ret, "carla_test_add_connection returns 0"); ASSERT_EQ(1, carla_test_connection_count(), "connection count is 1 after add"); // carla_disconnect_plugin should clear all connections for id 0 ret = carla_disconnect_plugin(0); ASSERT_EQ(0, ret, "carla_disconnect_plugin returns 0"); ASSERT_EQ(0, carla_test_connection_count(), "connection count is 0 after disconnect_plugin"); carla_cleanup_jack(); } static void test_set_bypass(void) { int ret = carla_init_jack(); ASSERT_EQ(0, ret, "carla_init_jack() returns 0"); // bypass should not crash even with no plugin loaded carla_set_bypass(0, true); printf("PASS: carla_set_bypass(0, true) did not crash\n"); tests_passed++; carla_cleanup_jack(); } int main(void) { printf("=== Carla host mock integration tests ===\n"); test_init_cleanup(); test_load_unload(); test_connect_disconnect(); test_set_bypass(); printf("\nResults: %d passed, %d failed\n", tests_passed, tests_failed); return tests_failed > 0 ? 1 : 0; }