#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <math.h> /* for fabs */
#include <float.h> /* for FLT_EPSILON and DBL_EPSILON */

#include "rt_api.h"
#include "check.h"


int
main()
{
    /* will use default allocators and message handlers */
    rt_context ctx;
    rt_raster raster;
    const char* hexwkb, *out;
    uint32_t len;
    ctx = rt_context_new(NULL, NULL, NULL);

    /* ------------------------------------------------------ */
    /* No bands, 7x8 - little endian                          */
    /* ------------------------------------------------------ */

    hexwkb =
"01"               /* little endian (uint8 ndr) */
"0000"             /* version (uint16 0) */
"0000"             /* nBands (uint16 0) */
"000000000000F03F" /* scaleX (float64 1) */
"0000000000000040" /* scaleY (float64 2) */
"0000000000000840" /* ipX (float64 3) */
"0000000000001040" /* ipY (float64 4) */
"0000000000001440" /* skewX (float64 5) */
"0000000000001840" /* skewY (float64 6) */
"0A000000"         /* SRID (int32 10) */
"0700"             /* width (uint16 7) */
"0800"             /* height (uint16 8) */
    ;

    raster = rt_raster_from_hexwkb(ctx, hexwkb, strlen(hexwkb));
    CHECK(raster);
    CHECK_EQUALS(rt_raster_get_num_bands(ctx, raster), 0);
    CHECK_EQUALS(rt_raster_get_pixel_width(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_height(ctx, raster), 2);
    CHECK_EQUALS(rt_raster_get_x_offset(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_y_offset(ctx, raster), 4);
    CHECK_EQUALS(rt_raster_get_x_rotation(ctx, raster), 5);
    CHECK_EQUALS(rt_raster_get_y_rotation(ctx, raster), 6);
    CHECK_EQUALS(rt_raster_get_srid(ctx, raster), 10);
    CHECK_EQUALS(rt_raster_get_width(ctx, raster), 7);
    CHECK_EQUALS(rt_raster_get_height(ctx, raster), 8);

    out  = rt_raster_to_hexwkb(ctx, raster, &len);
/*
    printf(" in hexwkb len: %d\n", strlen(hexwkb));
    printf("out hexwkb len: %d\n", len);
    printf(" in hexwkb: %s\n", hexwkb);
    printf("out hexwkb: %s\n", out);
*/
    CHECK_EQUALS(len, strlen(hexwkb));
/* would depend on machine endian...
    CHECK( ! strcmp(hexwkb, out) );
*/
    free((/*no const*/ void*)out);

    { 
        void *serialized;
        rt_raster rast2;

        serialized = rt_raster_serialize(ctx, raster);
        rast2 = rt_raster_deserialize(ctx, serialized);

        rt_raster_destroy(ctx, rast2);
        free(serialized);
    }

    rt_raster_destroy(ctx, raster);

    /* ------------------------------------------------------ */
    /* No bands, 7x8 - big endian                             */
    /* ------------------------------------------------------ */

    hexwkb =
"00"               /* big endian (uint8 xdr) */
"0000"             /* version (uint16 0) */
"0000"             /* nBands (uint16 0) */
"3FF0000000000000" /* scaleX (float64 1) */
"4000000000000000" /* scaleY (float64 2) */
"4008000000000000" /* ipX (float64 3) */
"4010000000000000" /* ipY (float64 4) */
"4014000000000000" /* skewX (float64 5) */
"4018000000000000" /* skewY (float64 6) */
"0000000A"         /* SRID (int32 10) */
"0007"             /* width (uint16 7) */
"0008"             /* height (uint16 8) */
    ;

    raster = rt_raster_from_hexwkb(ctx, hexwkb, strlen(hexwkb));
    CHECK(raster);
    CHECK_EQUALS(rt_raster_get_num_bands(ctx, raster), 0);
    CHECK_EQUALS(rt_raster_get_pixel_width(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_height(ctx, raster), 2);
    CHECK_EQUALS(rt_raster_get_x_offset(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_y_offset(ctx, raster), 4);
    CHECK_EQUALS(rt_raster_get_x_rotation(ctx, raster), 5);
    CHECK_EQUALS(rt_raster_get_y_rotation(ctx, raster), 6);
    CHECK_EQUALS(rt_raster_get_srid(ctx, raster), 10);
    CHECK_EQUALS(rt_raster_get_width(ctx, raster), 7);
    CHECK_EQUALS(rt_raster_get_height(ctx, raster), 8);

    out  = rt_raster_to_hexwkb(ctx, raster, &len);
    printf(" in hexwkb len: %u\n", strlen(hexwkb));
    printf("out hexwkb len: %u\n", len);
    printf(" in hexwkb: %s\n", hexwkb);
    printf("out hexwkb: %s\n", out);
    CHECK_EQUALS(len, strlen(hexwkb));
/* would depend on machine endian...
    CHECK( ! strcmp(hexwkb, out) );
*/

    rt_raster_destroy(ctx, raster);
    free((/*no const*/ void*)out);

    /* ------------------------------------------------------ */
    /* 1x1, little endian, band0(1bb)                         */
    /* ------------------------------------------------------ */

    hexwkb =
"01"               /* little endian (uint8 ndr) */
"0000"             /* version (uint16 0) */
"0100"             /* nBands (uint16 1) */
"000000000000F03F" /* scaleX (float64 1) */
"0000000000000040" /* scaleY (float64 2) */
"0000000000000840" /* ipX (float64 3) */
"0000000000001040" /* ipY (float64 4) */
"0000000000001440" /* skewX (float64 5) */
"0000000000001840" /* skewY (float64 6) */
"0A000000"         /* SRID (int32 10) */
"0100"             /* width (uint16 1) */
"0100"             /* height (uint16 1) */
"00"               /* First band type (1BB, in memory) */
"00"               /* nodata value (0) */
"01"               /* pix(0,0) == 1 */
    ;

    raster = rt_raster_from_hexwkb(ctx, hexwkb, strlen(hexwkb));
    CHECK(raster);
    CHECK_EQUALS(rt_raster_get_num_bands(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_width(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_height(ctx, raster), 2);
    CHECK_EQUALS(rt_raster_get_x_offset(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_y_offset(ctx, raster), 4);
    CHECK_EQUALS(rt_raster_get_x_rotation(ctx, raster), 5);
    CHECK_EQUALS(rt_raster_get_y_rotation(ctx, raster), 6);
    CHECK_EQUALS(rt_raster_get_srid(ctx, raster), 10);
    CHECK_EQUALS(rt_raster_get_width(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_height(ctx, raster), 1);
    {
        rt_band band = rt_raster_get_band(ctx, raster, 0);
        CHECK(band);
        CHECK_EQUALS(rt_band_get_pixtype(ctx, band), PT_1BB);
        CHECK(!rt_band_is_offline(ctx, band));
        CHECK_EQUALS(rt_band_get_nodata(ctx, band), 0);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 0, 0), 1);
    }

    out  = rt_raster_to_hexwkb(ctx, raster, &len);
    printf(" in hexwkb len: %u\n", strlen(hexwkb));
    printf("out hexwkb len: %u\n", len);
    CHECK_EQUALS(len, strlen(hexwkb));
/* would depend on machine endian...
    CHECK( ! strcmp(hexwkb, out) );
*/

    rt_raster_destroy(ctx, raster);
    free((/*no const*/ void*)out);

    /* ------------------------------------------------------ */
    /* 3x2, big endian, band0(8BSI)                           */
    /* ------------------------------------------------------ */

    hexwkb =
"01"               /* little endian (uint8 ndr) */
"0000"             /* version (uint16 0) */
"0100"             /* nBands (uint16 1) */
"000000000000F03F" /* scaleX (float64 1) */
"0000000000000040" /* scaleY (float64 2) */
"0000000000000840" /* ipX (float64 3) */
"0000000000001040" /* ipY (float64 4) */
"0000000000001440" /* skewX (float64 5) */
"0000000000001840" /* skewY (float64 6) */
"0A000000"         /* SRID (int32 10) */
"0300"             /* width (uint16 3) */
"0200"             /* height (uint16 2) */
"03"               /* First band type (8BSI, in memory) */
"FF"               /* nodata value (-1) */
"FF"               /* pix(0,0) == -1 */
"00"               /* pix(1,0) ==  0 */
"01"               /* pix(2,0) == 1 */
"7F"               /* pix(0,1) == 127 */
"0A"               /* pix(1,1) == 10 */
"02"               /* pix(2,1) == 2 */
    ;

    raster = rt_raster_from_hexwkb(ctx, hexwkb, strlen(hexwkb));
    CHECK(raster);
    CHECK_EQUALS(rt_raster_get_num_bands(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_width(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_height(ctx, raster), 2);
    CHECK_EQUALS(rt_raster_get_x_offset(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_y_offset(ctx, raster), 4);
    CHECK_EQUALS(rt_raster_get_x_rotation(ctx, raster), 5);
    CHECK_EQUALS(rt_raster_get_y_rotation(ctx, raster), 6);
    CHECK_EQUALS(rt_raster_get_srid(ctx, raster), 10);
    CHECK_EQUALS(rt_raster_get_width(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_height(ctx, raster), 2);
    {
        rt_band band = rt_raster_get_band(ctx, raster, 0);
        CHECK(band);
        CHECK_EQUALS(rt_band_get_pixtype(ctx, band), PT_8BSI);
        CHECK(!rt_band_is_offline(ctx, band));
        CHECK_EQUALS(rt_band_get_nodata(ctx, band), -1);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 0, 0), -1);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 1, 0), 0);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 2, 0), 1);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 0, 1), 127);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 1, 1), 10);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 2, 1), 2);
    }

    out  = rt_raster_to_hexwkb(ctx, raster, &len);
    printf(" in hexwkb len: %u\n", strlen(hexwkb));
    printf("out hexwkb len: %u\n", len);
    CHECK_EQUALS(len, strlen(hexwkb));
/* would depend on machine endian...
    CHECK( ! strcmp(hexwkb, out) );
*/

    free((/*no const*/ void*)out);

    { 
        void *serialized;
        rt_raster rast2;

        serialized = rt_raster_serialize(ctx, raster);
        rast2 = rt_raster_deserialize(ctx, serialized);

        rt_raster_destroy(ctx, rast2);
        free(serialized);
    
    }

    rt_raster_destroy(ctx, raster);

    /* ------------------------------------------------------ */
    /* 3x2, little endian, band0(16BSI)                       */
    /* ------------------------------------------------------ */

    hexwkb =
"01"               /* little endian (uint8 ndr) */
"0000"             /* version (uint16 0) */
"0100"             /* nBands (uint16 1) */
"000000000000F03F" /* scaleX (float64 1) */
"0000000000000040" /* scaleY (float64 2) */
"0000000000000840" /* ipX (float64 3) */
"0000000000001040" /* ipY (float64 4) */
"0000000000001440" /* skewX (float64 5) */
"0000000000001840" /* skewY (float64 6) */
"0A000000"         /* SRID (int32 10) */
"0300"             /* width (uint16 3) */
"0200"             /* height (uint16 2) */
"05"               /* First band type (16BSI, in memory) */
"FFFF"               /* nodata value (-1) */
"FFFF"               /* pix(0,0) == -1 */
"0000"               /* pix(1,0) ==  0 */
"F0FF"               /* pix(2,0) == -16 */
"7F00"               /* pix(0,1) == 127 */
"0A00"               /* pix(1,1) == 10 */
"0200"               /* pix(2,1) == 2 */
    ;

    raster = rt_raster_from_hexwkb(ctx, hexwkb, strlen(hexwkb));
    CHECK(raster);
    CHECK_EQUALS(rt_raster_get_num_bands(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_width(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_height(ctx, raster), 2);
    CHECK_EQUALS(rt_raster_get_x_offset(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_y_offset(ctx, raster), 4);
    CHECK_EQUALS(rt_raster_get_x_rotation(ctx, raster), 5);
    CHECK_EQUALS(rt_raster_get_y_rotation(ctx, raster), 6);
    CHECK_EQUALS(rt_raster_get_srid(ctx, raster), 10);
    CHECK_EQUALS(rt_raster_get_width(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_height(ctx, raster), 2);
    {
        rt_band band = rt_raster_get_band(ctx, raster, 0);
        CHECK(band);
        CHECK_EQUALS(rt_band_get_pixtype(ctx, band), PT_16BSI);
        CHECK(!rt_band_is_offline(ctx, band));
        CHECK_EQUALS(rt_band_get_nodata(ctx, band), -1);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 0, 0), -1);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 1, 0), 0);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 2, 0), -16);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 0, 1), 127);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 1, 1), 10);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 2, 1), 2);
    }

    out  = rt_raster_to_hexwkb(ctx, raster, &len);
    printf(" in hexwkb len: %u\n", strlen(hexwkb));
    printf("out hexwkb len: %u\n", len);
    CHECK_EQUALS(len, strlen(hexwkb));
/* would depend on machine endian
    CHECK( ! strcmp(hexwkb, out) );
*/

    rt_raster_destroy(ctx, raster);
    free((/*no const*/ void*)out);

    /* ------------------------------------------------------ */
    /* 3x2, big endian, band0(16BSI)                          */
    /* ------------------------------------------------------ */

    hexwkb =
"00"               /* big endian (uint8 xdr) */
"0000"             /* version (uint16 0) */
"0001"             /* nBands (uint16 1) */
"3FF0000000000000" /* scaleX (float64 1) */
"4000000000000000" /* scaleY (float64 2) */
"4008000000000000" /* ipX (float64 3) */
"4010000000000000" /* ipY (float64 4) */
"4014000000000000" /* skewX (float64 5) */
"4018000000000000" /* skewY (float64 6) */
"0000000A"         /* SRID (int32 10) */
"0003"             /* width (uint16 3) */
"0002"             /* height (uint16 2) */
"05"               /* First band type (16BSI, in memory) */
"FFFF"               /* nodata value (-1) */
"FFFF"               /* pix(0,0) == -1 */
"0000"               /* pix(1,0) ==  0 */
"FFF0"               /* pix(2,0) == -16 */
"007F"               /* pix(0,1) == 127 */
"000A"               /* pix(1,1) == 10 */
"0002"               /* pix(2,1) == 2 */
    ;

    raster = rt_raster_from_hexwkb(ctx, hexwkb, strlen(hexwkb));
    CHECK(raster);
    CHECK_EQUALS(rt_raster_get_num_bands(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_width(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_height(ctx, raster), 2);
    CHECK_EQUALS(rt_raster_get_x_offset(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_y_offset(ctx, raster), 4);
    CHECK_EQUALS(rt_raster_get_x_rotation(ctx, raster), 5);
    CHECK_EQUALS(rt_raster_get_y_rotation(ctx, raster), 6);
    CHECK_EQUALS(rt_raster_get_srid(ctx, raster), 10);
    CHECK_EQUALS(rt_raster_get_width(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_height(ctx, raster), 2);
    {
        rt_band band = rt_raster_get_band(ctx, raster, 0);
        CHECK(band);
        CHECK_EQUALS(rt_band_get_pixtype(ctx, band), PT_16BSI);
        CHECK(!rt_band_is_offline(ctx, band));
        CHECK_EQUALS(rt_band_get_nodata(ctx, band), -1);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 0, 0), -1);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 1, 0), 0);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 2, 0), -16);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 0, 1), 127);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 1, 1), 10);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 2, 1), 2);
    }

    out  = rt_raster_to_hexwkb(ctx, raster, &len);
    printf(" in hexwkb len: %u\n", strlen(hexwkb));
    printf("out hexwkb len: %u\n", len);
    CHECK_EQUALS(len, strlen(hexwkb));
/* would depend on machine endian
    CHECK( ! strcmp(hexwkb, out) );
*/

    rt_raster_destroy(ctx, raster);
    free((/*no const*/ void*)out);

    /* ------------------------------------------------------ */
    /* 3x2, bit endian, band0(16BSI ext: 3;/tmp/t.tif)        */
    /* ------------------------------------------------------ */

    hexwkb =
"00"               /* big endian (uint8 xdr) */
"0000"             /* version (uint16 0) */
"0001"             /* nBands (uint16 1) */
"3FF0000000000000" /* scaleX (float64 1) */
"4000000000000000" /* scaleY (float64 2) */
"4008000000000000" /* ipX (float64 3) */
"4010000000000000" /* ipY (float64 4) */
"4014000000000000" /* skewX (float64 5) */
"4018000000000000" /* skewY (float64 6) */
"0000000A"         /* SRID (int32 10) */
"0003"             /* width (uint16 3) */
"0002"             /* height (uint16 2) */
"85"               /* First band type (16BSI, on disk) */
"FFFF"             /* nodata value (-1) */
"03"               /* ext band num == 3 */
/* ext band path == /tmp/t.tif */
"2F746D702F742E74696600" 
    ;

    raster = rt_raster_from_hexwkb(ctx, hexwkb, strlen(hexwkb));
    CHECK(raster);
    CHECK_EQUALS(rt_raster_get_num_bands(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_width(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_height(ctx, raster), 2);
    CHECK_EQUALS(rt_raster_get_x_offset(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_y_offset(ctx, raster), 4);
    CHECK_EQUALS(rt_raster_get_x_rotation(ctx, raster), 5);
    CHECK_EQUALS(rt_raster_get_y_rotation(ctx, raster), 6);
    CHECK_EQUALS(rt_raster_get_srid(ctx, raster), 10);
    CHECK_EQUALS(rt_raster_get_width(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_height(ctx, raster), 2);
    {
        rt_band band = rt_raster_get_band(ctx, raster, 0);
        CHECK(band);
        CHECK_EQUALS(rt_band_get_pixtype(ctx, band), PT_16BSI);
        CHECK(rt_band_is_offline(ctx, band));
        CHECK_EQUALS(rt_band_get_nodata(ctx, band), -1);
        printf("ext band path: %s\n", rt_band_get_ext_path(ctx, band));
        printf("ext band  num: %u\n", rt_band_get_ext_band_num(ctx, band));
        CHECK( ! strcmp(rt_band_get_ext_path(ctx, band), "/tmp/t.tif"));
        CHECK_EQUALS(rt_band_get_ext_band_num(ctx, band), 3);
    }

    out  = rt_raster_to_hexwkb(ctx, raster, &len);
    printf(" in hexwkb len: %u\n", strlen(hexwkb));
    printf("out hexwkb len: %u\n", len);
    CHECK_EQUALS(len, strlen(hexwkb));
/* would depend on machine endian
    CHECK( ! strcmp(hexwkb, out) );
*/

    rt_raster_destroy(ctx, raster);
    free((/*no const*/ void*)out);

    /* ------------------------------------------------------ */
    /* 1x3, little endian, band0 16BSI, nodata 1, srid -1     */
    /* ------------------------------------------------------ */

    hexwkb =
"01"               /* little endian (uint8 ndr) */
"0000"             /* version (uint16 0) */
"0100"             /* nBands (uint16 1) */
"0000000000805640" /* scaleX (float64 90.0) */
"00000000008056C0" /* scaleY (float64 -90.0) */
"000000001C992D41" /* ipX (float64 969870.0) */
"00000000E49E2341" /* ipY (float64 642930.0) */
"0000000000000000" /* skewX (float64 0) */
"0000000000000000" /* skewY (float64 0) */
"FFFFFFFF"         /* SRID (int32 -1) */
"0300"             /* width (uint16 3) */
"0100"             /* height (uint16 1) */
"05"               /* First band type (16BSI, in memory) */
"0100"             /* nodata value (1) */
"0100"             /* pix(0,0) == 1 */
"B401"             /* pix(1,0) == 436 */
"AF01"             /* pix(2,0) == 431 */
    ;

    raster = rt_raster_from_hexwkb(ctx, hexwkb, strlen(hexwkb));
    CHECK(raster);
    CHECK_EQUALS(rt_raster_get_num_bands(ctx, raster), 1);
    CHECK_EQUALS(rt_raster_get_pixel_width(ctx, raster), 90);
    CHECK_EQUALS(rt_raster_get_pixel_height(ctx, raster), -90);
    CHECK_EQUALS(rt_raster_get_x_offset(ctx, raster), 969870.0);
    CHECK_EQUALS(rt_raster_get_y_offset(ctx, raster), 642930.0);
    CHECK_EQUALS(rt_raster_get_x_rotation(ctx, raster), 0);
    CHECK_EQUALS(rt_raster_get_y_rotation(ctx, raster), 0);
    CHECK_EQUALS(rt_raster_get_srid(ctx, raster), -1);
    CHECK_EQUALS(rt_raster_get_width(ctx, raster), 3);
    CHECK_EQUALS(rt_raster_get_height(ctx, raster), 1);
    {
        rt_band band = rt_raster_get_band(ctx, raster, 0);
        CHECK(band);
        CHECK_EQUALS(rt_band_get_pixtype(ctx, band), PT_16BSI);
        CHECK(!rt_band_is_offline(ctx, band));
        CHECK_EQUALS(rt_band_get_nodata(ctx, band), 1);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 0, 0), 1);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 1, 0), 436);
        CHECK_EQUALS(rt_band_get_pixel(ctx, band, 2, 0), 431);
    }

    out  = rt_raster_to_hexwkb(ctx, raster, &len);
/*
    printf(" in hexwkb len: %d\n", strlen(hexwkb));
    printf("out hexwkb len: %d\n", len);
    printf(" in hexwkb: %s\n", hexwkb);
    printf("out hexwkb: %s\n", out);
*/
    CHECK_EQUALS(len, strlen(hexwkb));
/* would depend on machine endian
    CHECK( ! strcmp(hexwkb, out) );
*/
    free((/*no const*/ void*)out);

    { 
        void *serialized;
        rt_raster rast2;

        serialized = rt_raster_serialize(ctx, raster);
        rast2 = rt_raster_deserialize(ctx, serialized);

        rt_raster_destroy(ctx, rast2);
        free(serialized);
    }

    rt_raster_destroy(ctx, raster);


    /* ------------------------------------------------------ */

    printf("All tests successful !\n");

    return EXIT_SUCCESS;
}

/* This is needed by liblwgeom */
void
lwgeom_init_allocators(void)
{
    lwgeom_install_default_allocators();
}
