import java.util.Arrays;
import java.util.NoSuchElementException;

public class TestBag {

    public static void main(String[] args) {
        // test constructor
        Bag<Integer> numbers = new ArrayBag<>(10);

        // test size/isEmpty/getFrequency/contains
        testOthers(numbers);

        // test add
        for (int i = 0; i < 12; ++i) {
            if (numbers.add(i)) {
                System.out.println("Added " + i);
            } else {
                System.out.println("Failed to add " + i);
            }
        }

        // test toString
        System.out.println(numbers);

        // test toArray(...)
        testArray(numbers);

        // test size/isEmpty/getFrequency/contains
        numbers.add(6);
        testOthers(numbers);

        // test remove(T)
        for (int i = 0; i < 20; i += 3) {
            if (numbers.remove(i)) {
                System.out.println("Removed " + i);
            } else {
                System.out.println("Failed to remove " + i);
            }
        }
        System.out.println(numbers);

        // test size/isEmpty/getFrequency/contains
        testOthers(numbers);

        // test remove()
        try {
            while (true) {
                System.out.println("Removing " + numbers.remove());
            }
        } catch (NoSuchElementException nsee) {
            System.out.println("No more to remove!");
        }
        System.out.println(numbers);

        // test size/isEmpty/getFrequency/contains
        testOthers(numbers);
    }

    private static void testArray(Bag<Integer> bag) {
        // toArray()
        Object[] numbers = bag.toArray();
        System.out.println(bag + ".toArray() == " + Arrays.toString(numbers));

        // toArray(T[]) -- big array
        Integer[] big = new Integer[20];
        Arrays.fill(big, -1);
        System.out.println("Array 'big' before: " + Arrays.toString(big));
        Integer[] returnedBig = bag.toArray(big);
        System.out.println(bag + ".toArray(big) == " 
                + Arrays.toString(returnedBig));
        System.out.println("Array 'big' after: " + Arrays.toString(big));

        // toArray(T[]) -- small array
        Integer[] small = new Integer[2];
        Arrays.fill(small, -1);
        System.out.println("Array 'small' before: " + Arrays.toString(small));
        Integer[] returnedSmall = bag.toArray(small);
        System.out.println(bag + ".toArray(small) == " 
                + Arrays.toString(returnedSmall));
        System.out.println("Array 'small' after: " + Arrays.toString(small));
    }

    private static void testOthers(Bag<Integer> bag) {
        System.out.println(bag + ".size() == " + bag.size());
        System.out.println(bag + ".isEmpty() == " + bag.isEmpty());
        System.out.println(bag + ".contains(6) == " + bag.contains(6));
        System.out.println(bag + ".contains(7) == " + bag.contains(7));
        System.out.println(bag + ".getFrequency(6) == " + bag.getFrequency(6));
        System.out.println(bag + ".getFrequency(7) == " + bag.getFrequency(7));
    }

}
