/*=========================================================================

  Program: GDCM (Grassroots DICOM). A DICOM library

  Copyright (c) 2006-2011 Mathieu Malaterre
  All rights reserved.
  See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
#include "gdcmPixelFormat.h"

struct frame_info {
  gdcm::PixelFormat pixeltype;
};

int TestPixelFormat(int , char *[])
{
  using gdcm::PixelFormat;
  gdcm::PixelFormat pf;
  pf.SetScalarType( gdcm::PixelFormat::UNKNOWN );
  if( pf.GetScalarType() != gdcm::PixelFormat::UNKNOWN )
    {
    return 1;
    }
  pf.SetScalarType( gdcm::PixelFormat::UINT32 );
  //pf.SetScalarType( gdcm::PixelFormat::UINT64 );
  static const int64_t values[][2] = {
     { 0LL,255LL },
     { 0LL,4095LL },
     { 0LL,65535LL },
     { 0LL,4294967295LL },
     { -128LL,127LL },
     { -2048LL,2047LL },
     { -32768LL,32767LL },
     { -2147483648LL,2147483647LL },
//     { -2147483648LL,2147483647LL }
  };
  static const size_t n = sizeof( values ) / sizeof( *values );
  size_t c = 0;
  pf.SetBitsStored( 8 );
  if( pf.GetMin() != values[c][0] || pf.GetMax() != values[c][1] )
    {
    std::cerr << pf.GetMin() << "," << pf.GetMax() << std::endl;
    return 1;
    }
  ++c;
  pf.SetBitsStored( 12 );
  if( pf.GetMin() != values[c][0] || pf.GetMax() != values[c][1] )
    {
    std::cerr << pf.GetMin() << "," << pf.GetMax() << std::endl;
    return 1;
    }
  ++c;
  pf.SetBitsStored( 16 );
  if( pf.GetMin() != values[c][0] || pf.GetMax() != values[c][1] )
    {
    std::cerr << pf.GetMin() << "," << pf.GetMax() << std::endl;
    return 1;
    }
  ++c;
  pf.SetBitsStored( 32 );
  if( pf.GetMin() != values[c][0] || pf.GetMax() != values[c][1] )
    {
    std::cerr << pf.GetMin() << "," << pf.GetMax() << std::endl;
    return 1;
    }
//  ++c;
//  pf.SetBitsStored( 64 );
//  if( pf.GetMin() != values[c][0] || pf.GetMax() != values[c][1] )
//    {
//    std::cerr << pf.GetMin() << "," << pf.GetMax() << std::endl;
//    return 1;
//    }

  pf.SetPixelRepresentation( 1 );

  ++c;
  pf.SetBitsStored( 8 );
  if( pf.GetMin() != values[c][0] || pf.GetMax() != values[c][1] )
    {
    std::cerr << pf.GetMin() << "," << pf.GetMax() << std::endl;
    return 1;
    }
  ++c;
  pf.SetBitsStored( 12 );
  if( pf.GetMin() != values[c][0] || pf.GetMax() != values[c][1] )
    {
    std::cerr << pf.GetMin() << "," << pf.GetMax() << std::endl;
    return 1;
    }
  ++c;
  pf.SetBitsStored( 16 );
  if( pf.GetMin() != values[c][0] || pf.GetMax() != values[c][1] )
    {
    std::cerr << pf.GetMin() << "," << pf.GetMax() << std::endl;
    return 1;
    }
  ++c;
  pf.SetBitsStored( 32 );
  if( pf.GetMin() != values[c][0] || pf.GetMax() != values[c][1] )
    {
    std::cerr << pf.GetMin() << "," << pf.GetMax() << std::endl;
    return 1;
    }
//  ++c;
//  pf.SetBitsStored( 64 );
//  if( pf.GetMin() != values[c][0] || pf.GetMax() != values[c][1] )
//    {
//    std::cerr << pf.GetMin() << "," << pf.GetMax() << std::endl;
//    return 1;
//    }
  ++c;
  if ( c != n ) return 1;

  for(unsigned int i = 0; i < PixelFormat::UNKNOWN; ++i)
    {
    PixelFormat::ScalarType st = (PixelFormat::ScalarType)i;
    pf.SetScalarType( st );
    gdcm::PixelFormat pf2 = st;
    std::cout << pf << std::endl;
    std::cout << pf.GetPixelRepresentation() << std::endl;
    std::cout << pf.GetScalarTypeAsString() << std::endl;
    if( pf2 != pf ) return 1;
    }

  // make to avoid user mistakes:
  gdcm::PixelFormat pf3 = PixelFormat::UINT8;
  if( pf3.GetBitsStored() != 8 ) return 1;
  pf3.SetBitsStored( 32 );
  // previous call should not execute
  if( pf3.GetBitsStored() != 8 ) return 1;
  pf3.SetHighBit( 8 );
  if( pf3.GetHighBit() != 7 ) return 1;

  gdcm::PixelFormat pf4 = PixelFormat::UINT16;
  pf4.SetBitsStored(8);
  if( pf4.GetScalarType() != gdcm::PixelFormat::UINT16 ) return 1;
  pf4.SetPixelRepresentation(1);
  if( pf4.GetScalarType() != gdcm::PixelFormat::INT16 ) return 1;

  frame_info fi = {};
  (void)fi;

  return 0;
}

