///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright (c) 2000-2019 Ericsson Telecom AB                               //
//                                                                           //
// All rights reserved. This program and the accompanying materials          //
// are made available under the terms of the Eclipse Public License v2.0     //
// which accompanies this distribution, and is available at                  //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
///////////////////////////////////////////////////////////////////////////////

module IntegerRingBuffer_TestCases
{

import from EPTF_CLL_RingBuffer_Definitions all;
import from EPTF_CLL_RingBuffer_PrivateFunctions all;
import from EPTF_CLL_IntegerRingBuffer_Functions all;

type component MTC_CT {}

// helper method - dumps a ring buffer to simple array and compares it with an expected array
function f_checkBuffer(
  in EPTF_IntegerRingBuffer  checkedRingBuffer, 
  in EPTF_RingBufferDataList expectedBuffer) 
{
  var EPTF_RingBufferDataList dump;
  f_EPTF_RB_dump(checkedRingBuffer, dump);
  if (dump == expectedBuffer) 
  {
    setverdict(pass);
  }  
  else  
  {
    setverdict(fail);
  };
} 

// test ring buffer initialization
testcase tc_RB_init() runs on MTC_CT system MTC_CT
{ 
  var EPTF_IntegerRingBuffer rb1, rb2, rb3, rb4;

  // initialise a ring buffer and check capacity and empty content
  f_EPTF_RB_init(rb1, 238);
  if (238 == f_EPTF_RB_capacity(rb1)) 
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }
  f_checkBuffer(rb1, {});

  // initialize to default capacity
  f_EPTF_RB_init(rb2);
  // initialize to invalid capacity values
  f_EPTF_RB_init(rb3, 0);
  f_EPTF_RB_init(rb4, -100);

  // check that ring buffers are initialized to default capacity
  if (rb2 == rb3 and rb2 == rb4 and c_EPTF_RB_default_capacity == f_EPTF_RB_capacity(rb4)) 
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // check that ring buffers are empty
  f_checkBuffer(rb2, {});
}

// test empty and size methods
testcase tc_RB_size() runs on MTC_CT system MTC_CT 
{
  var EPTF_IntegerRingBuffer rb;

  // new ring buffer shall be empty
  f_EPTF_RB_init(rb, 5);
  if (f_EPTF_RB_empty(rb) and 0 == f_EPTF_RB_size(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // after adding 3 items buffer is not empty and shall contain 3 items
  f_EPTF_RB_push_back(rb, 1);
  f_EPTF_RB_push_back(rb, 1);
  f_EPTF_RB_push_back(rb, 1);
  if (not f_EPTF_RB_empty(rb) and 3 == f_EPTF_RB_size(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }
  
  // after adding 3 more items buffer shall contain 5 items
  f_EPTF_RB_push_back(rb, 1);
  f_EPTF_RB_push_back(rb, 1);
  f_EPTF_RB_push_back(rb, 1);
  if (5 == f_EPTF_RB_size(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // after removing 2 items buffer shall contain 3 items
  f_EPTF_RB_pop_front(rb);
  f_EPTF_RB_pop_front(rb);
  if (3 == f_EPTF_RB_size(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // after clear operation buffer shall be empty
  f_EPTF_RB_clear(rb);
  if (f_EPTF_RB_empty(rb) and 0 == f_EPTF_RB_size(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }
}

// test adding and removing elements to/from ring buffer
testcase tc_RB_push_pop() runs on MTC_CT system MTC_CT 
{ 
  var EPTF_IntegerRingBuffer buffer;
  var EPTF_RingBufferDataList myData;

  // init buffer with capacity of 5 elements...
  f_EPTF_RB_init(buffer, 5);


  //////////////////////////////////////////////
  //      Test push_back() and pop_front()    //
  
  // push 3 items into buffer and check content...
  f_EPTF_RB_push_back(buffer, 1);
  f_EPTF_RB_push_back(buffer, 2);
  f_EPTF_RB_push_back(buffer, 3);
  myData := {1, 2, 3};
  f_checkBuffer(buffer,myData);

  // pop 2 items from buffer and check content...
  f_EPTF_RB_pop_front(buffer);
  f_EPTF_RB_pop_front(buffer);
  myData := {3};
  f_checkBuffer(buffer,myData);

  // push 6 items into buffer and check content...
  f_EPTF_RB_push_back(buffer, 4);
  f_EPTF_RB_push_back(buffer, 5);
  f_EPTF_RB_push_back(buffer, 6);
  f_EPTF_RB_push_back(buffer, 7);
  f_EPTF_RB_push_back(buffer, 8);
  f_EPTF_RB_push_back(buffer, 9);
  myData := {5, 6, 7, 8, 9};
  f_checkBuffer(buffer,myData);

  // pop 3 items from buffer and check content...
  f_EPTF_RB_pop_front(buffer);
  f_EPTF_RB_pop_front(buffer);
  f_EPTF_RB_pop_front(buffer);
  myData := {8, 9};
  f_checkBuffer(buffer,myData);

  // pop other 2 items from buffer and check buffer is empty...
  f_EPTF_RB_pop_front(buffer);
  f_EPTF_RB_pop_front(buffer);
  myData := {};
  f_checkBuffer(buffer,myData);

  // pop from empty buffer shall not couse ant effect...
  f_EPTF_RB_pop_front(buffer);
  myData := {};
  f_checkBuffer(buffer,myData);


  //////////////////////////////////////////////
  //      Test push_front() and pop_back()    //

  // push 3 items into buffer and check content...
  f_EPTF_RB_push_front(buffer, 2);
  f_EPTF_RB_push_back(buffer, 3);
  f_EPTF_RB_push_front(buffer, 1);
  myData := {1, 2, 3};
  f_checkBuffer(buffer,myData);

  // pop 2 items from buffer and check content...
  f_EPTF_RB_pop_back(buffer);
  f_EPTF_RB_pop_back(buffer);
  myData := {1};
  f_checkBuffer(buffer,myData);

  // push 6 items into buffer and check content...
  f_EPTF_RB_push_front(buffer, 2);
  f_EPTF_RB_push_front(buffer, 3);
  f_EPTF_RB_push_front(buffer, 4);
  f_EPTF_RB_push_front(buffer, 5);
  f_EPTF_RB_push_front(buffer, 6);
  f_EPTF_RB_push_front(buffer, 7);
  myData := {7, 6, 5, 4, 3};
  f_checkBuffer(buffer,myData);

  // pop 3 items from buffer and check content...
  f_EPTF_RB_pop_back(buffer);
  f_EPTF_RB_pop_back(buffer);
  f_EPTF_RB_pop_back(buffer);
  myData := {7, 6};
  f_checkBuffer(buffer,myData);

  // pop other 2 items from buffer and check buffer is empty...
  f_EPTF_RB_pop_back(buffer);
  f_EPTF_RB_pop_back(buffer);
  myData := {};
  f_checkBuffer(buffer,myData);

  // pop from empty buffer shall not couse ant effect...
  f_EPTF_RB_pop_back(buffer);
  myData := {};
  f_checkBuffer(buffer,myData);
} 

// test accessing elements of ring buffer
testcase tc_RB_access() runs on MTC_CT system MTC_CT 
{
  var EPTF_IntegerRingBuffer rb;
  var EPTF_RingBufferDataItem item;

  // init ring buffer
  f_EPTF_RB_init(rb, 5);

  // checked access to empty buffer shall return false
  if (not f_EPTF_RB_at(rb, 0, item))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // push an item into buffer...
  f_EPTF_RB_push_back(rb, 42);

  // verify checked access...
  if (f_EPTF_RB_at(rb, 0, item) and 42 == item)
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // verify checked access at invalid index...
  if ( not f_EPTF_RB_at(rb, -100, item) and not f_EPTF_RB_at(rb, 2, item) and not f_EPTF_RB_at(rb, 5, item) )
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // verify unchecked access...
  if (42 == f_EPTF_RB_front(rb) and 42 == f_EPTF_RB_back(rb) and 42 == f_EPTF_RB_get(rb, 0))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // push 6 items into buffer and pop 2 item
  // rb.data should contain: {5,6,x,x,4}
  f_EPTF_RB_push_back(rb, 1);
  f_EPTF_RB_push_back(rb, 2);
  f_EPTF_RB_push_back(rb, 3);
  f_EPTF_RB_push_back(rb, 4);
  f_EPTF_RB_push_back(rb, 5);
  f_EPTF_RB_push_back(rb, 6);
  f_EPTF_RB_pop_front(rb);
  f_EPTF_RB_pop_front(rb);

  // check access...
  if ( 4 == f_EPTF_RB_front(rb)  and 
       6 == f_EPTF_RB_back(rb)   and 
       4 == f_EPTF_RB_get(rb, 0) and 
       6 == f_EPTF_RB_get(rb, 2) )
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }
}

// test solution for HK72355
// - check RB works fine with capacity=1 (head points to valid place after init)
// - check no unbound value at beginnning of data buffer after push_bach if capacity>1
testcase tc_RB_HK72355() runs on MTC_CT system MTC_CT 
{
  var EPTF_IntegerRingBuffer rb;

  // check RB with capacity=1

  // calling front after init and push_back caused dynamic error in case capacity=1
  f_EPTF_RB_init(rb, 1);
  f_EPTF_RB_push_back(rb, 42);
  if (42 == f_EPTF_RB_front(rb) and 42 == f_EPTF_RB_back(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // inverse test: back after push_front
  f_EPTF_RB_init(rb, 1);
  f_EPTF_RB_push_front(rb, 4242);
  if (4242 == f_EPTF_RB_back(rb) and 4242 == f_EPTF_RB_front(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // adding more values
  f_EPTF_RB_push_front(rb, 1);
  f_EPTF_RB_push_back(rb, 2);
  f_EPTF_RB_push_back(rb, 3);
  if (3 == f_EPTF_RB_back(rb) and 3 == f_EPTF_RB_front(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }
  // check length of data buffer
  if (lengthof(rb.data) <= 1)
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // check RB with capacity=2

  // check that data_buffer[0] is not unbound after first push_back
  // NOTE: data can contain unbound items in other cases, e.g. after push_front!
  f_EPTF_RB_init(rb, 2);
  f_EPTF_RB_push_back(rb, 42);
  if ( 42 == f_EPTF_RB_front(rb) and 42 == f_EPTF_RB_back(rb) and  //< check content correct
       rb.data[0] == 42  and //< check 0. item not unbound
       lengthof(rb.data) <= 2)
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // check RB with capacity>2

  // check that data_buffer[0] is not unbound after first push_back
  // NOTE: data can contain unbound items in other cases, e.g. after push_front!
  f_EPTF_RB_init(rb, 5);
  f_EPTF_RB_push_back(rb, 42);
  if ( 42 == f_EPTF_RB_front(rb) and 42 == f_EPTF_RB_back(rb) and  //< check content correct
       rb.data[0] == 42  and //< check 0. item not unbound
       lengthof(rb.data) <= 5)
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }
}

control
{
  execute(tc_RB_init());
  execute(tc_RB_size());
  execute(tc_RB_push_pop());
  execute(tc_RB_access());
  execute(tc_RB_HK72355());
} 

} //module
