///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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 GenericRingBuffer_TestCases
{

// declares the ring buffer base type
#define EPTF_BASE_TYPE UserType

// defines the ring buffer base type
type record of integer UserType;

// instantiate the code for managing a ring buffer built from the base type
#include "EPTF_CLL_GenericRingBuffer_Functions.ttcnin"

// undef the base type to avoid error in case of multiple careless "#include"-s
#undef EPTF_BASE_TYPE 

type component MTC_CT {}

// helper method - dumps a ring buffer to simple array and compares it with an expected array
function f_checkBuffer(in UserTypeRingBuffer checkedRingBuffer, in UserTypeList expectedBuffer) 
{
  var UserTypeList dump;
  f_EPTF_UserType_RB_dump(checkedRingBuffer, dump);
  if (dump == expectedBuffer) 
  {
    setverdict(pass);
  }  
  else  
  {
    setverdict(fail);
  };
} 

// test ring buffer initialization
testcase tc_GRB_init() runs on MTC_CT system MTC_CT
{ 
  var UserTypeRingBuffer rb1, rb2, rb3, rb4;

  // initialise a ring buffer and check capacity and empty content
  f_EPTF_UserType_RB_init(rb1, 238);
  if (238 == f_EPTF_UserType_RB_capacity(rb1)) 
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }
  f_checkBuffer(rb1, {});

  // initialize to default capacity
  f_EPTF_UserType_RB_init(rb2);
  // initialize to invalid capacity values
  f_EPTF_UserType_RB_init(rb3, 0);
  f_EPTF_UserType_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_UserType_RB_capacity(rb4)) 
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // check that ring buffers are empty
  f_checkBuffer(rb2, {});
}

// test empty and size methods
testcase tc_GRB_size() runs on MTC_CT system MTC_CT 
{
  var UserTypeRingBuffer rb;

  // new ring buffer shall be empty
  f_EPTF_UserType_RB_init(rb, 5);
  if (f_EPTF_UserType_RB_empty(rb) and 0 == f_EPTF_UserType_RB_size(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // after adding 3 items buffer is not empty and shall contain 3 items
  f_EPTF_UserType_RB_push_back( rb, {1,1} );
  f_EPTF_UserType_RB_push_back( rb, {1,1} );
  f_EPTF_UserType_RB_push_back( rb, {1,1} );
  if (not f_EPTF_UserType_RB_empty(rb) and 3 == f_EPTF_UserType_RB_size(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }
  
  // after adding 3 more items buffer shall contain 5 items
  f_EPTF_UserType_RB_push_back( rb, {1,1} );
  f_EPTF_UserType_RB_push_back( rb, {1,1} );
  f_EPTF_UserType_RB_push_back( rb, {1,1} );
  if (5 == f_EPTF_UserType_RB_size(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // after removing 2 items buffer shall contain 3 items
  f_EPTF_UserType_RB_pop_front(rb);
  f_EPTF_UserType_RB_pop_front(rb);
  if (3 == f_EPTF_UserType_RB_size(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // after clear operation buffer shall be empty
  f_EPTF_UserType_RB_clear(rb);
  if (f_EPTF_UserType_RB_empty(rb) and 0 == f_EPTF_UserType_RB_size(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }
}

// test adding and removing elements to/from ring buffer
testcase tc_GRB_push_pop() runs on MTC_CT system MTC_CT 
{ 
  var UserTypeRingBuffer buffer;
  var UserTypeList myData;

  // init buffer with capacity of 5 elements...
  f_EPTF_UserType_RB_init(buffer, 5);

  //////////////////////////////////////////////
  //      Test push_back() and pop_front()    //

  // push 3 items into buffer and check content...
  f_EPTF_UserType_RB_push_back( buffer, {1,1} );
  f_EPTF_UserType_RB_push_back( buffer, {2,2} );
  f_EPTF_UserType_RB_push_back( buffer, {3,3} );
  myData := {{1,1}, {2,2}, {3,3}};
  f_checkBuffer(buffer,myData);

  // pop 2 items from buffer and check content...
  f_EPTF_UserType_RB_pop_front(buffer);
  f_EPTF_UserType_RB_pop_front(buffer);
  myData := {{3,3}};
  f_checkBuffer(buffer,myData);

  // push 6 items into buffer and check content...
  f_EPTF_UserType_RB_push_back( buffer, {4,4} );
  f_EPTF_UserType_RB_push_back( buffer, {5,5} );
  f_EPTF_UserType_RB_push_back( buffer, {6,6} );
  f_EPTF_UserType_RB_push_back( buffer, {7,7} );
  f_EPTF_UserType_RB_push_back( buffer, {8,8} );
  f_EPTF_UserType_RB_push_back( buffer, {9,9} );
  myData := { {5,5}, {6,6}, {7,7}, {8,8}, {9,9} };
  f_checkBuffer(buffer,myData);

  // pop 3 items from buffer and check content...
  f_EPTF_UserType_RB_pop_front(buffer);
  f_EPTF_UserType_RB_pop_front(buffer);
  f_EPTF_UserType_RB_pop_front(buffer);
  myData := {{8,8}, {9,9}};
  f_checkBuffer(buffer,myData);

  // pop other 2 items from buffer and check buffer is empty...
  f_EPTF_UserType_RB_pop_front(buffer);
  f_EPTF_UserType_RB_pop_front(buffer);
  myData := {};
  f_checkBuffer(buffer,myData);

  // pop from empty buffer shall not couse ant effect...
  f_EPTF_UserType_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_UserType_RB_push_front(buffer, {2,2});
  f_EPTF_UserType_RB_push_back(buffer, {3,3});
  f_EPTF_UserType_RB_push_front(buffer, {1,1});
  myData := {{1,1}, {2,2}, {3,3}};
  f_checkBuffer(buffer,myData);

  // pop 2 items from buffer and check content...
  f_EPTF_UserType_RB_pop_back(buffer);
  f_EPTF_UserType_RB_pop_back(buffer);
  myData := {{1,1}};
  f_checkBuffer(buffer,myData);

  // push 6 items into buffer and check content...
  f_EPTF_UserType_RB_push_front(buffer, {2,2});
  f_EPTF_UserType_RB_push_front(buffer, {3,3});
  f_EPTF_UserType_RB_push_front(buffer, {4,4});
  f_EPTF_UserType_RB_push_front(buffer, {5,5});
  f_EPTF_UserType_RB_push_front(buffer, {6,6});
  f_EPTF_UserType_RB_push_front(buffer, {7,7});
  myData := {{7,7}, {6,6}, {5,5}, {4,4}, {3,3}};
  f_checkBuffer(buffer,myData);

  // pop 3 items from buffer and check content...
  f_EPTF_UserType_RB_pop_back(buffer);
  f_EPTF_UserType_RB_pop_back(buffer);
  f_EPTF_UserType_RB_pop_back(buffer);
  myData := {{7,7}, {6,6}};
  f_checkBuffer(buffer,myData);

  // pop other 2 items from buffer and check buffer is empty...
  f_EPTF_UserType_RB_pop_back(buffer);
  f_EPTF_UserType_RB_pop_back(buffer);
  myData := {};
  f_checkBuffer(buffer,myData);

  // pop from empty buffer shall not couse ant effect...
  f_EPTF_UserType_RB_pop_back(buffer);
  myData := {};
  f_checkBuffer(buffer,myData);
} 

// test accessing elements of ring buffer
testcase tc_GRB_access() runs on MTC_CT system MTC_CT 
{
  var UserTypeRingBuffer rb;
  var UserType item;

  // init ring buffer
  f_EPTF_UserType_RB_init(rb, 5);

  // checked access to empty buffer shall return false
  if (not f_EPTF_UserType_RB_at(rb, 0, item))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // push an item into buffer...
  f_EPTF_UserType_RB_push_back(rb, {42,43,44} );

  // verify checked access...
  if (f_EPTF_UserType_RB_at(rb, 0, item) and {42,43,44} == item)
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // verify checked access at invalid index...
  if ( not f_EPTF_UserType_RB_at(rb, -100, item) and 
       not f_EPTF_UserType_RB_at(rb, 2, item) and 
       not f_EPTF_UserType_RB_at(rb, 5, item) )
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // verify unchecked access...
  if ( {42,43,44} == f_EPTF_UserType_RB_front(rb) and 
       {42,43,44} == f_EPTF_UserType_RB_back(rb) and 
       {42,43,44} == f_EPTF_UserType_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_UserType_RB_push_back(rb, {1,1} );
  f_EPTF_UserType_RB_push_back(rb, {2,2} );
  f_EPTF_UserType_RB_push_back(rb, {3,3} );
  f_EPTF_UserType_RB_push_back(rb, {4,4} );
  f_EPTF_UserType_RB_push_back(rb, {5,5} );
  f_EPTF_UserType_RB_push_back(rb, {6,6} );
  f_EPTF_UserType_RB_pop_front(rb);
  f_EPTF_UserType_RB_pop_front(rb);

  // check access...
  if ( {4,4} == f_EPTF_UserType_RB_front(rb)  and 
       {6,6} == f_EPTF_UserType_RB_back(rb)   and 
       {4,4} == f_EPTF_UserType_RB_get(rb, 0) and 
       {6,6} == f_EPTF_UserType_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_GRB_HK72355() runs on MTC_CT system MTC_CT 
{
  var UserTypeRingBuffer rb;

  // check RB with capacity=1

  // calling front after init and push_back caused dynamic error in case capacity=1
  f_EPTF_UserType_RB_init(rb, 1);
  f_EPTF_UserType_RB_push_back(rb, {42, 42});
  if ( {42, 42} == f_EPTF_UserType_RB_front(rb) and  {42, 42} == f_EPTF_UserType_RB_back(rb) )
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // inverse test: back after push_front
  f_EPTF_UserType_RB_init(rb, 1);
  f_EPTF_UserType_RB_push_front(rb, {4242, 4242});
  if ({4242, 4242} == f_EPTF_UserType_RB_back(rb) and {4242, 4242} == f_EPTF_UserType_RB_front(rb))
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }

  // adding more values
  f_EPTF_UserType_RB_push_front(rb, {1,1});
  f_EPTF_UserType_RB_push_back(rb, {2,2});
  f_EPTF_UserType_RB_push_back(rb, {3,3});
  if ({3,3} == f_EPTF_UserType_RB_back(rb) and {3,3} == f_EPTF_UserType_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_UserType_RB_init(rb, 2);
  f_EPTF_UserType_RB_push_back(rb, {42,42});
  if ( {42,42} == f_EPTF_UserType_RB_front(rb) and {42,42} == f_EPTF_UserType_RB_back(rb) and  //< check content correct
       rb.data[0] == {42,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_UserType_RB_init(rb, 5);
  f_EPTF_UserType_RB_push_back(rb, {42,42});
  if ( {42,42} == f_EPTF_UserType_RB_front(rb) and {42,42} == f_EPTF_UserType_RB_back(rb) and  //< check content correct
       rb.data[0] == {42,42}  and //< check 0. item not unbound
       lengthof(rb.data) <= 5)
  { 
    setverdict(pass); 
  } 
  else 
  { 
    setverdict(fail); 
  }
}

control
{
  execute(tc_GRB_init());
  execute(tc_GRB_size());
  execute(tc_GRB_push_pop());
  execute(tc_GRB_access());
  execute(tc_GRB_HK72355());
} 

} //module
