/*
 *
 *  Copyright (C) 2015-2018, OFFIS e.V.
 *  All rights reserved.  See COPYRIGHT file for details.
 *
 *  This software and supporting documentation were developed by
 *
 *    OFFIS e.V.
 *    R&D Division Health
 *    Escherweg 2
 *    D-26121 Oldenburg, Germany
 *
 *
 *  Module:  dcmseg
 *
 *  Author:  Michael Onken
 *
 *  Purpose: tests for dcmseg's DcmSegUtils functionalities
 *
 */

#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */

#include "dcmtk/dcmiod/iodutil.h"
#include "dcmtk/dcmseg/segutils.h"
#include "dcmtk/ofstd/oftest.h"

#define bufLen 4

static void resetBuf(Uint8* buf, const size_t length)
{
    if (length != bufLen)
        return;
    buf[0] = 170; // 10101010
    buf[1] = 204; // 11001100
    buf[2] = 240; // 11110000
    buf[3] = 15;  // 00001111
}

OFTEST(dcmseg_utils)
{
    // buf, always initialized/reset with: 10101010 11001100 11110000 00001111
    Uint8 buf[bufLen];

    resetBuf(buf, bufLen);
    DcmSegUtils::alignFrameOnBitPosition(buf, 4, 2);
    OFCHECK(buf[0] == 168); // 10101000
    OFCHECK(buf[1] == 50);  // 00110010
    OFCHECK(buf[2] == 195); // 11000011
    OFCHECK(buf[3] == 63);  // 00111111

    resetBuf(buf, bufLen);
    DcmSegUtils::alignFrameOnByteBoundary(buf, 4, 2);
    OFCHECK(buf[0] == 42);  // 00101010
    OFCHECK(buf[1] == 51);  // 00110011
    OFCHECK(buf[2] == 252); // 11111100
    OFCHECK(buf[3] == 3);   // 00000011

    resetBuf(buf, bufLen);
    DcmSegUtils::alignFrameOnBitPosition(buf, 4, 7);
    OFCHECK(buf[0] == 0);
    OFCHECK(buf[1] == 85);  // 01010101
    OFCHECK(buf[2] == 102); // 01100110
    OFCHECK(buf[3] == 248); // 11111000

    resetBuf(buf, bufLen);
    DcmSegUtils::alignFrameOnByteBoundary(buf, 4, 7);
    OFCHECK(buf[0] == 153); // 10011001
    OFCHECK(buf[1] == 225); // 11100001
    OFCHECK(buf[2] == 31);  // 00011111
    OFCHECK(buf[3] == 0);
}
