import java.util.Random;

public class TestDriver {
  public static void main (String [] arg) {
    TestDriver td = new TestDriver (arg);
  }
  private final static boolean TRACE = true;
  //  private final static boolean TRACE = false;
  private void trace (String s) {
    if (TRACE) {
      System.err.print ("Driver "+callsNumber+"-"+selection+": "+ s);
    }
  }
  private void traceln (String s) { trace (s+"\n"); }

  private int callsNumber = 1000;
  private Random random = new Random (0);
  private Vector vector;
  private int selection;

  class Vobject {
    int x;
    Vobject () { x = range (0,10); }
    public String toString () { return ""+x; }
    public boolean equals (Object o) { 
      return o != null && o instanceof Vobject && x == ((Vobject)o).x;
    }
  }

  TestDriver (String [] arg) {
    // process the command line argument(s)
    if (arg.length == 1) 
      try { callsNumber = Integer.parseInt (arg [0]); }
      catch (NumberFormatException er) {
        traceln ("Wrong number of calls " + arg [0]);
      }
    else if (arg.length > 1) {
      traceln ("Wrong number of arguments " + arg.length);
    }

    // CONSTRUCT
      int size = range (10, 20);
      int increment = range (10, 20);
      traceln("new Vector("+size+","+increment+")");
      vector = new Vector(size, increment);

    while (callsNumber-- > 0) {
      selection = range (0, 24);
      try {
        switch (selection) {
          case 0:
  // CONSTRUCTION
            break;
          case 1: {
  // COPY INTO
            break; }
          case 2: {
  // TRIM TO SIZE
            traceln ("trimToSize()");
            vector.trimToSize();
            break; }
          case 3: {
  // ENSURE CAPACITY
            break; }
          case 4: {
  // SET SIZE
            break; }
          case 5: {
  // CAPACITY
            traceln ("capacity() = "+vector.capacity());
            break; }
          case 6: {
  // SIZE
            traceln ("size() = "+vector.size());
            break; }
          case 7: {
  // IS EMPTY
            traceln ("isEmpty() = "+vector.isEmpty());
            break; }
  // ELEMENTS
          case 8: {
            break; }
          case 9: {
  // CONTAINS
            Vobject o = new Vobject ();
            traceln ("contains("+o.toString()+") = "+vector.contains(o));
            break; }
          case 10: {
  // INDEX OF
            Vobject o = new Vobject ();
            traceln ("indexOf("+o.toString()+") = "+vector.indexOf(o));
            break; }
          case 11: {
  // INDEX OF 2
            Vobject o = new Vobject ();
            int x = range (0, 1000);
            traceln ("indexOf("+o.toString()+","+x+") = "+vector.indexOf(o,x));
            break; }
          case 12: {
  // LAST INDEX OF 1
            Vobject o = new Vobject ();
            traceln ("lastIndexOf("+o.toString()+") = "+vector.lastIndexOf(o));
            break; }
          case 13: {
  // LAST INDEX OF 2
            Vobject o = new Vobject ();
            int x = range (0, 1000);
            trace ("lastIndexOf("+o.toString()+","+x+") = ");
            traceln (""+vector.lastIndexOf(o,x));
            break; }
          case 14: {
  // ELEMENT AT
            int x = range (0, 1000);
            trace ("elementAt("+x+") = ");
            traceln (""+vector.elementAt(x));
            break; }
          case 15: {
  // FIRST ELEMENT
            trace ("firstElement() = ");
            traceln (""+vector.firstElement());
            break; }
          case 16: {
  // LAST ELEMENT
            trace ("lastElement() = ");
            traceln (""+vector.lastElement());
            break; }
          case 17: {
  // SET ELEMENT AT
            Vobject o = new Vobject ();
            int x = range (0, 1000);
            traceln ("setElementAt("+o.toString()+","+x+")");
            vector.setElementAt(o, x);
            break; }
          case 18: {
  // REMOVE ELEMENT AT
            int x = range (0, 1000);
            traceln ("removeElementAt("+x+")");
            vector.removeElementAt(x);
            break; }
          case 19: {
  // INSERT ELEMENT AT
            Vobject o = new Vobject ();
            int x = range (0, 1000);
            traceln ("insertElementAt("+o.toString()+","+x+")");
            vector.insertElementAt(o, x);
            break; }
          case 20: {
  // ADD ELEMENT
            Vobject o = new Vobject ();
            traceln ("addElement("+o.toString()+")");
            vector.addElement(o);
            break; }
          case 21: {
  // REMOVE ELEMENT
            Vobject o = new Vobject ();
            traceln ("removeElement("+o.toString()+")");
            vector.removeElement(o);
            break; }
          case 22: {
  // REMOVE ALL ELEMENTS
            break; }
          case 23: {
  // CLONE
            break; }
          case 24: {
  // TO STRING
            trace ("toString() = ");
            traceln (vector.toString());
            break; }
          default:
            traceln ("skipping "+selection);
        }
      } catch (Exception x) { System.err.println (" ***"+selection+"*** "+x); }
    }
  }

  int range (int min, int max) {
    return min+ Math.abs (random.nextInt()) % (max - min + 1);
  }

}
