#!/bin/sh
set -e
trap 'rm -f o' 0
cflags="-Wall -Wextra -Wpedantic"
cflags="$cflags $(pkg-config --libs --cflags libimobiledevice-glue-1.0)"
cc -x c - -o o $cflags <<'EOF'
#include <libimobiledevice-glue/utils.h>
#include <libimobiledevice-glue/glue.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int valid_uuid(const char *uuid)
{
    if (!uuid || strlen(uuid) != 36)
        return 0;

    for (size_t i = 0; i < 36; i++) {
        if (i == 8 || i == 13 || i == 18 || i == 23) {
            if (uuid[i] != '-')
                return 0;
        } else if (!strchr("0123456789abcdefABCDEF", uuid[i])) {
            return 0;
        }
    }
    return 1;
}

int main(void)
{
    const struct {
        const char *uuid;
        int valid;
    } cases[] = {
        {"00112233-4455-6677-8899-aabbccddeeff", 1},
        {"00112233-4455-6677-8899-AABBCCDDEEFF", 1},
        {NULL, 0},
        {"", 0},
        {"XYZ", 0},
        {"00112233-4455-6677-8899-aabbccddeef", 0},
        {"00112233-4455-6677-8899-aabbccddeeff0", 0},
        {"G0112233-4455-6677-8899-aabbccddeeff", 0},
        {"0011223344455-6677-8899-aabbccddeeff", 0},
        {"00112233-4455-6677-8899-aabbccddeef-", 0},
        {"00112233445566778899aabbccddeeff", 0},
    };

    for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
        if (valid_uuid(cases[i].uuid) != cases[i].valid) {
            fprintf(stderr, "UUID validation self-check %zu failed\n", i);
            return 1;
        }
    }

    printf("Glue version: %s\n", libimobiledevice_glue_version());
    char *uuid = generate_uuid();
    if (!uuid) {
        fprintf(stderr, "Failed to generate a UUID\n");
        return 1;
    }
    printf("A random UUID: %s\n", uuid);
    /* Check the 36-character text representation of the 128-bit value. */
    int failed = !valid_uuid(uuid);
    if (failed)
        fprintf(stderr, "Generated UUID has an invalid format\n");
    free(uuid);
    return failed;
}
EOF
./o
