pdftract/crates/pdftract-libpdftract/tests/c-client/simple_test.c
jedarden dfdfb9de79 test(pdftract-1eaxm): add distribution templates and C conformance tests
- Add Homebrew formula template (homebrew-formula.rb.erb)
- Add vcpkg port template with submission instructions
- Add C conformance test (conformance.c) with thread safety verification
- Add simple link test (simple_test.c) to verify library linkage
- Add hash test (test_hash.c) for hash API verification
- Add parse debug test (test_parse.rs) for development
- Add test fixtures (test-minimal.pdf, valid-minimal.pdf)
- Add PROVENANCE.md entry for valid-minimal.pdf

All tests pass: version, abi_version, free(NULL), hash, extract methods.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-05-23 09:20:22 -04:00

102 lines
3.4 KiB
C

/* Copyright 2026 Jed Cabanino. MIT OR Apache-2.0 */
/* Simple test for libpdftract C FFI API linking */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../include/pdftract.h"
int main(void) {
int failures = 0;
/* Test 1: pdftract_version returns a valid string */
{
const char *version = pdftract_version();
if (version == NULL || strlen(version) == 0) {
fprintf(stderr, "FAIL: pdftract_version returned NULL or empty\n");
failures++;
} else {
printf("PASS: pdftract_version() = %s\n", version);
}
}
/* Test 2: pdftract_abi_version returns a non-zero value */
{
uint32_t abi = pdftract_abi_version();
if (abi == 0) {
fprintf(stderr, "FAIL: pdftract_abi_version returned 0\n");
failures++;
} else {
printf("PASS: pdftract_abi_version() = 0x%08x\n", abi);
}
}
/* Test 3: pdftract_free(NULL) is safe */
{
pdftract_free(NULL);
printf("PASS: pdftract_free(NULL) is safe\n");
}
/* Test 4: pdftract_free works on allocated strings */
{
char *result = pdftract_hash("/dev/null");
if (result != NULL) {
/* Even if it's an error, it should be a valid string we can free */
size_t len = strlen(result);
printf("PASS: pdftract_hash returned string of length %zu\n", len);
pdftract_free(result);
} else {
/* NULL is also acceptable for error cases */
printf("PASS: pdftract_hash returned NULL (acceptable for error)\n");
}
}
/* Test 5: All 9 contract methods are callable */
{
/* These may return NULL (errors), but the symbols should exist */
char *r1 = pdftract_extract("/nonexistent.pdf", "{}");
if (r1) pdftract_free(r1);
printf("PASS: pdftract_extract is callable\n");
char *r2 = pdftract_extract_text("/nonexistent.pdf", "{}");
if (r2) pdftract_free(r2);
printf("PASS: pdftract_extract_text is callable\n");
char *r3 = pdftract_extract_markdown("/nonexistent.pdf", "{}");
if (r3) pdftract_free(r3);
printf("PASS: pdftract_extract_markdown is callable\n");
void *handle = pdftract_extract_stream_open("/nonexistent.pdf", "{}");
if (handle) pdftract_stream_close(handle);
printf("PASS: pdftract_extract_stream_open is callable\n");
char *r4 = pdftract_search("/nonexistent.pdf", "test", "{}");
if (r4) pdftract_free(r4);
printf("PASS: pdftract_search is callable\n");
char *r5 = pdftract_get_metadata("/nonexistent.pdf", "{}");
if (r5) pdftract_free(r5);
printf("PASS: pdftract_get_metadata is callable\n");
char *r6 = pdftract_hash("/nonexistent.pdf");
if (r6) pdftract_free(r6);
printf("PASS: pdftract_hash is callable\n");
char *r7 = pdftract_classify("/nonexistent.pdf");
if (r7) pdftract_free(r7);
printf("PASS: pdftract_classify is callable\n");
int32_t r8 = pdftract_verify_receipt("/nonexistent.pdf", "{}");
(void)r8; /* suppress unused warning */
printf("PASS: pdftract_verify_receipt is callable\n");
}
printf("\n=== Test Summary ===\n");
if (failures == 0) {
printf("All tests passed!\n");
return 0;
} else {
printf("%d test(s) failed\n", failures);
return 1;
}
}