/*
* Data Hub Service (DHuS) - For Space data distribution.
* Copyright (C) 2013,2014,2015,2016 GAEL Systems
*
* This file is part of DHuS software sources.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.gael.dhus.database.dao;
import fr.gael.dhus.database.dao.interfaces.Pageable;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
public class TestPagedIterator
{
private final String query = "*";
@Test
public void testReadIterator ()
{
List<Integer> list = Arrays.asList (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
Pageable<Integer> pageable = new Pageable4Test (list);
Iterator<Integer> iterator = new PagedIterator<> (pageable, query, 0, 3);
Integer count = 0;
while (iterator.hasNext ())
{
Assert.assertEquals (count, iterator.next(),
"Iterator failed to retrieve element #" + count.toString());
count ++;
}
Assert.assertEquals (count.intValue(), list.size ());
}
@Test
public void testReadIteratable ()
{
List<Integer> list = Arrays.asList (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
Pageable<Integer> pageable = new Pageable4Test (list);
Iterable<Integer> iterator = new PagedIterator<> (pageable, query, 0, 3);
Integer count = 0;
for (Integer value:iterator)
{
Assert.assertEquals (count, value,
"Iterator failed to retrieve element #" + count.toString());
count ++;
}
Assert.assertEquals (count.intValue(), list.size ());
}
@Test
public void testEmptyIterator ()
{
List<Integer> list = Collections.emptyList ();
Pageable4Test pageable = new Pageable4Test (list);
Iterator<Integer> iterator = new PagedIterator<> (pageable, query);
Assert.assertFalse (iterator.hasNext ());
try
{
iterator.next (); // throws NoSuchElementException
Assert.fail (
"iteration on empty list should raise NoSuchElementException.");
}
catch (NoSuchElementException e)
{
// iterator.next () on empty iterator should raise exception.
}
}
@Test
public void testRemove ()
{
// Initial mutable list
List<Integer> list = new ArrayList<> ();
list.addAll (Arrays.asList (0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
// Elements to remove from initial list: at least test first and last.
List<Integer> removed = Arrays.asList (0, 1, 5, 8 ,9);
int intial_list_size = list.size();
Pageable<Integer> pageable = new Pageable4Test (list);
PagedIterator<Integer> iterator =
new PagedIterator<Integer> (pageable, query, 0, 3);
// Test removing some elements
while (iterator.hasNext ())
{
Integer element = iterator.next ();
if (removed.contains (element))
{
iterator.remove ();
Assert.assertFalse (list.contains (element), "Removed element #" +
element + " still present in list.");
}
}
// Check if list contains 5 elements as expected
int expected_size = intial_list_size - removed.size(); // =5
Assert.assertEquals(list.size(), expected_size,
"Initial list size not reduced as expected");
// Reset the iterator with the reduced list
pageable = new Pageable4Test (list);
iterator = new PagedIterator<Integer> (pageable, query, 0, 3);
// Remove all the elements
while (iterator.hasNext())
{
iterator.next();
iterator.remove();
}
try
{
iterator.remove (); // throws IllegalStateException
Assert.fail ("Remove element from empty list should raise" +
" IllegalStateException.");
}
catch (IllegalStateException e)
{
// exception expected
}
}
private static class Pageable4Test implements Pageable<Integer>
{
private List<Integer> list;
private Pageable4Test (List<Integer> list)
{
this.list = list;
}
@Override
public List<Integer> getPage (String query, int skip, int top)
{
if (skip < list.size ())
{
int real_top = skip + top;
if (real_top < list.size ())
{
return new ArrayList<> (list.subList (skip, (skip + top)));
} else
{
return new ArrayList<> (list.subList (skip, list.size ()));
}
}
return Collections.emptyList ();
}
@Override
public void delete (Integer element)
{
list.remove (element);
}
}
}