12637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin/*
22637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin * Copyright (c) 2016 Mockito contributors
32637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin * This program is made available under the terms of the MIT License.
42637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin */
52637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinpackage org.mockito.internal.matchers.text;
62637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
72637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport java.lang.reflect.Array;
82637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport java.util.Iterator;
92637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
102637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin/**
112637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin * Inspired on hamcrest, internal package class,
122637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin * TODO add specific unit tests instead of relying on higher level unit tests
132637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin */
142637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinclass ArrayIterator implements Iterator<Object> {
152637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
162637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    private final Object array;
172637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    private int currentIndex = 0;
182637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
192637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public ArrayIterator(Object array) {
202637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        if (array == null) {
212637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            //TODO extract a small utility for null-checking
222637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            throw new IllegalArgumentException("Expected array instance but got null");
232637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        }
242637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        if (!array.getClass().isArray()) {
252637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            throw new IllegalArgumentException("Expected array but got object of type: "
262637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin                    + array.getClass() + ", the object: " + array.toString());
272637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        }
282637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        this.array = array;
292637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
302637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
312637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public boolean hasNext() {
322637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return currentIndex < Array.getLength(array);
332637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
342637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
352637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public Object next() {
362637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return Array.get(array, currentIndex++);
372637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
382637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
392637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public void remove() {
402637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        throw new UnsupportedOperationException("cannot remove items from an array");
412637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
422637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin}
43