/*******************************************************************************
 * Copyright (c) 2011 - 2012 ACIN, nxtControl, 2018 TU Vienna/ACIN
 *               2020 Johannes Kepler University Linz
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *   Martin Melik Merkumians, Ingo Hegny, Alois Zoitl, Stanislav Meduna - initial API and implementation and/or initial documentation
 *   Ernst Blecha - add at-variable tests
 *******************************************************************************/

#include <boost/test/unit_test.hpp>

#include "../../../src/core/datatypes/forte_array_at.h"

using namespace boost::unit_test;

BOOST_AUTO_TEST_SUITE(AT_VARIABLE)

BOOST_AUTO_TEST_SUITE(AT_VARIABLE_DWORD)

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_READ_BIT)
{
  CIEC_DWORD nTestDWord;

  nTestDWord = 0xFFFFFFFF;

  ARRAY_AT<CIEC_BOOL, CIEC_DWORD, 0, 31> testArray(nTestDWord);

  for(auto i=0;i<32;i++){
    BOOST_CHECK_EQUAL(testArray[i], true);
    BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), false);
  }

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_READ_BIT_OUTOFBOUNDS)
{
  CIEC_DWORD nTestDWord;
  ARRAY_AT<CIEC_BOOL, CIEC_DWORD, 0, 31> testArray(nTestDWord);

  BOOST_CHECK_EQUAL(testArray[32], testArray[32]);
  BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), true);

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_WRITE_BIT)
{
  CIEC_DWORD nTestDWord;

  ARRAY_AT<CIEC_BOOL, CIEC_DWORD, 0, 31> testArray(nTestDWord);

  for(auto i=0;i<32;i++){
    nTestDWord = 0xFFFFFFFF;
    testArray[i] = false;
    for(auto j=0;j<32;j++){
      BOOST_CHECK_EQUAL(testArray[j], i!=j);
    }
    BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), false);
  }

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_WRITE_BIT_OUTOFBOUNDS)
{
  CIEC_DWORD nTestDWord;
  ARRAY_AT<CIEC_BOOL, CIEC_DWORD, 0, 31> testArray(nTestDWord);

  testArray[32] = true;
  BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), true);
  BOOST_CHECK_EQUAL(testArray[32], testArray[32]);

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_READ_BYTE)
{
  CIEC_DWORD nTestDWord;

  nTestDWord = 0xFFFFFFFF;

  ARRAY_AT<CIEC_BYTE, CIEC_DWORD, 0, 3> testArray(nTestDWord);

  for(auto i=0;i<4;i++){
    BOOST_CHECK_EQUAL((int)testArray[i], 0xFF);
    BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), false);
  }

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_READ_BYTE_OUTOFBOUNDS)
{
  CIEC_DWORD nTestDWord;
  ARRAY_AT<CIEC_BYTE, CIEC_DWORD, 0, 3> testArray(nTestDWord);

  BOOST_CHECK_EQUAL((int)testArray[4], (int)testArray[4]);
  BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), true);

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_WRITE_BYTE)
{
  CIEC_DWORD nTestDWord;

  ARRAY_AT<CIEC_BYTE, CIEC_DWORD, 0, 3> testArray(nTestDWord);

  for(auto i=0;i<4;i++){
    nTestDWord = 0xFFFFFFFF;
    testArray[i] = false;
    for(auto j=0;j<4;j++){
      BOOST_CHECK_EQUAL(testArray[j], i!=j ? 0xFF : false);
    }
    BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), false);
  }

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_WRITE_BYTE_OUTOFBOUNDS)
{
  CIEC_DWORD nTestDWord;
  ARRAY_AT<CIEC_BYTE, CIEC_DWORD, 0, 3> testArray(nTestDWord);

  testArray[4] = true;
  BOOST_CHECK_EQUAL(testArray[4], testArray[4]);
  BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), true);

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_READ_WORD)
{
  CIEC_DWORD nTestDWord;

  nTestDWord = 0xFFFFFFFF;

  ARRAY_AT<CIEC_WORD, CIEC_DWORD, 0, 1> testArray(nTestDWord);

  for(auto i=0;i<2;i++){
    BOOST_CHECK_EQUAL((int)testArray[i], 0xFFFF);
    BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), false);
  }

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_READ_WORD_OUTOFBOUNDS)
{
  CIEC_DWORD nTestDWord;
  ARRAY_AT<CIEC_WORD, CIEC_DWORD, 0, 1> testArray(nTestDWord);

  BOOST_CHECK_EQUAL((int)testArray[2], (int)testArray[2]);
  BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), true);

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_WRITE_WORD)
{
  CIEC_DWORD nTestDWord;

  ARRAY_AT<CIEC_WORD, CIEC_DWORD, 0, 1> testArray(nTestDWord);

  for(auto i=0;i<2;i++){
    nTestDWord = 0xFFFFFFFF;
    testArray[i] = false;
    for(auto j=0;j<2;j++){
      BOOST_CHECK_EQUAL(testArray[j], i!=j ? 0xFFFF : false);
    }
    BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), false);
  }

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_WRITE_WORD_OUTOFBOUNDS)
{
  CIEC_DWORD nTestDWord;
  ARRAY_AT<CIEC_WORD, CIEC_DWORD, 0, 1> testArray(nTestDWord);

  testArray[2] = true;
  BOOST_CHECK_EQUAL(testArray[2], testArray[2]);
  BOOST_CHECK_EQUAL(testArray.getAccessedOutOfBounds(), true);

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_MOVING_BIT)
{
  CIEC_DWORD nTestDWord;

  nTestDWord = 0x0;

  ARRAY_AT<CIEC_BOOL, CIEC_DWORD, 0, 31> testArray(nTestDWord);

  for (size_t i=0; i < 32; i++) {
    testArray[i] = true;
    BOOST_CHECK_EQUAL(nTestDWord, (TForteDWord)1 << i);
    testArray[i] = false;
  }

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_MOVING_BYTE)
{
  CIEC_DWORD nTestDWord;

  nTestDWord = 0x0;

  ARRAY_AT<CIEC_BYTE, CIEC_DWORD, 0, 3> testArray(nTestDWord);

  for (size_t i=0; i < 4; i++) {
    testArray[i] = 0xFF;
    BOOST_CHECK_EQUAL(nTestDWord, (TForteDWord)0xFF << i*8);
    testArray[i] = 0;
  }

}

BOOST_AUTO_TEST_CASE(AT_VARIABLE_DWORD_MOVING_WORD)
{
  CIEC_DWORD nTestDWord;

  nTestDWord = 0x0;

  ARRAY_AT<CIEC_WORD, CIEC_DWORD, 0, 1> testArray(nTestDWord);

  for (size_t i=0; i < 2; i++) {
    testArray[i] = 0xF00D;
    BOOST_CHECK_EQUAL(nTestDWord, (TForteDWord)0xF00D << i*16);
    testArray[i] = 0;
  }

}

BOOST_AUTO_TEST_SUITE_END()

BOOST_AUTO_TEST_SUITE_END()
