#include "IntelMetadataBuffer.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SUCCESS "PASS IntelMetadataBuffer Unit Test\n"
#define FAIL "Fail IntelMetadataBuffer Unit Test\n"

int main(int argc, char* argv[])
{
    IntelMetadataBuffer *mb1, *mb2;
    uint8_t* bytes;
    uint32_t size;
    IMB_Result ret;

    IntelMetadataBufferType t1 = IntelMetadataBufferTypeCameraSource;
    IntelMetadataBufferType t2;
    intptr_t v1 = 0x00000010;
    intptr_t v2 = 0;
    ValueInfo vi1, *vi2 = NULL;
    intptr_t ev1[10];
    intptr_t *ev2 = NULL;
    unsigned int count;

    if (argc > 1)
        t1 = (IntelMetadataBufferType) atoi(argv[1]);

    if (argc > 2)
        v1 = atoi(argv[2]);

    memset(&vi1, 0, sizeof(ValueInfo));
    
    mb1 = new IntelMetadataBuffer();
    ret = mb1->SetType(t1);
    ret = mb1->SetValue(v1);
    mb1->GetMaxBufferSize();
    if (t1 != IntelMetadataBufferTypeGrallocSource) {
        ret = mb1->SetValueInfo(&vi1);
        ret = mb1->SetExtraValues(ev1, 10);
        ret = mb1->SetExtraValues(ev1, 10);
    }
//  ret = mb1->GetBytes(bytes, size);
    ret = mb1->Serialize(bytes, size);
    printf("assembling IntelMetadataBuffer %s, ret = %d\n", (ret == IMB_SUCCESS)?"Success":"Fail", ret );    

    printf("size = %d, bytes = ", size);
    for(int i=0; i<size; i++)
    {
        printf("%02x ", bytes[i]);
    }
    printf("\n");

    mb2 = new IntelMetadataBuffer();
//  ret = mb2->SetBytes(bytes, size);
    ret = mb2->UnSerialize(bytes, size);
    printf("parsing IntelMetadataBuffer %s, ret = %d\n", (ret == IMB_SUCCESS)?"Success":"Fail", ret );    
    
    ret = mb2->GetType(t2);
    ret = mb2->GetValue(v2);
    ret = mb2->GetValueInfo(vi2);
    ret = mb1->SetExtraValues(ev1, 10);
    ret = mb2->GetExtraValues(ev2, count);

    IntelMetadataBuffer mb3;;
//  mb3 = new IntelMetadataBuffer();
    ret = mb3.SetType(t1);
    ret = mb3.SetValue(v1);
    ret = mb3.SetExtraValues(ev1, 10);
    ret = mb3.SetValueInfo(&vi1);
    ret = mb3.UnSerialize(bytes, size);

    IntelMetadataBuffer *mb4 = new IntelMetadataBuffer(mb3);
    IntelMetadataBuffer *mb5;
    mb5 = mb4;

    printf("t2=%d, v2=%d, vi2=%x, ev2=%x\n", t2, v2, vi2, ev2);
    if (v1 == v2 && t1 == t2 ) {
       if (vi2) {
            if (memcmp(&vi1, vi2, sizeof(ValueInfo)) == 0) {
                if (ev2) {
                   if (memcmp(ev1, ev2, count) == 0)
                       printf(SUCCESS);
                   else
                       printf(FAIL);
                }else
                    printf(SUCCESS);
            }else
                printf(FAIL);
       }else
           printf(SUCCESS);
    }else
        printf(SUCCESS);

    return 1;
}
