dequebash.java

来自「SRI international 发布的OAA框架软件」· Java 代码 · 共 388 行 · 第 1/2 页

JAVA
388
字号
/*
 * Written by Josh Bloch of Google Inc. and released to the public domain,
 * as explained at http://creativecommons.org/licenses/publicdomain.
 */

import java.util.*;
import java.io.*;
import edu.emory.mathcs.backport.java.util.*;

/**
 * Interface-based Deque tester.  This test currently makes three
 * assumptions about the implementation under test:
 *
 *   1) It has no size limitation.
 *   2) It implements Serializable.
 *   3) It has a conventional (Collection) constructor.
 *
 * All of these assumptions could be relaxed.
 */
public class DequeBash {
    static int seed = 7;
    static int nextTail =  0;
    static int nextHead = -1;
    static int size() { return nextTail - nextHead - 1; }


    static int random(int bound) {
        int x = seed;
        int t = (x % 127773) * 16807 - (x / 127773) * 2836;
        seed = (t > 0)? t : t + 0x7fffffff;
        return (t & 0x7fffffff) % bound;
    }

    static int random() {
        int x = seed;
        int t = (x % 127773) * 16807 - (x / 127773) * 2836;
        seed = (t > 0)? t : t + 0x7fffffff;
        return (t & 0x7fffffff);
    }

    public static void main(String args[]) throws Exception {
        Class cls = Class.forName(args[0]);
        int n = 1000000;

        for (int j = 0; j < 3; ++j) {
            Deque deque = (Deque) cls.newInstance();
            nextTail =  0;
            nextHead = -1;
            long start = System.currentTimeMillis();
            mainTest(deque, n);
            long end = System.currentTimeMillis();
            System.out.println("Time: " + (end - start) + "ms");
            if (deque.isEmpty()) System.out.print(" ");
        }

    }

    static void mainTest(Deque deque, int n) throws Exception {
        /*
         * Perform a random sequence of operations, keeping contiguous
         * sequence of integers on the deque.
         */
        for (int i = 0; i < n; i++) {
            sizeTests(deque);
            randomOp(deque);

            // Test iterator occasionally
            if ((i & 1023) == 0)
                testIter(deque);

            // Test serialization and copying
            if ((i & 4095) == 0) {
                testEqual(deque, (Deque)deepCopy(deque));
                testEqual(deque, (Deque) deque.getClass().
                          getConstructor(new Class[] { Collection.class }).
                              newInstance(new Object[] { deque }));
            }

            // Test fancy removal stuff once in a blue moon
            if ((i & 8191) == 0)
                testRemove(deque);

         }

        // Stupid tests for clear, toString
        deque.clear();
        testEmpty(deque);
        Collection c = Arrays.asList(new Integer[] {new Integer(1), new Integer(2), new Integer(3)});
        deque.addAll(c);
        if (!deque.toString().equals("[1, 2, 3]"))
            throw new Exception("Deque.toString():  " + deque.toString());
    }

    static void testIter(Deque deque) throws Exception {
        int next = nextHead + 1;
        int count = 0;
        for (Iterator jitr = deque.iterator(); jitr.hasNext();) {
            int j = ((Integer)jitr.next()).intValue();
            if (j != next++)
                throw new Exception("Element "+ j + " != " + (next-1));
            count++;
        }
        if (count != size())
            throw new Exception("Count " + count + " != " + size());
    }

    static void sizeTests(Deque deque) throws Exception {
        if (deque.size() != size())
            throw new Exception("Size: " + deque.size() +
                                ", expecting " + size());
        if (deque.isEmpty() != (size() == 0))
            throw new Exception(
                                "IsEmpty " + deque.isEmpty() + ", size " + size());
        // Check head and tail
        if (size() == 0)
            testEmpty(deque);
        else
            nonEmptyTest(deque);

    }

    static void nonEmptyTest(Deque deque) throws Exception {
        if (((Integer)deque.getFirst()).intValue() != nextHead + 1)
            throw new Exception("getFirst got: " +
                                deque.getFirst() + " expecting " + (nextHead + 1));
        if (((Integer)deque.element()).intValue() != nextHead + 1)
            throw new Exception("element got: " + deque.element() +
                                " expecting " + (nextHead + 1));
        if (((Integer)deque.peekFirst()).intValue() != nextHead + 1)
            throw new Exception("peekFirst got: "+deque.peekFirst() +
                                " expecting " + (nextHead + 1));
        if (((Integer)deque.peek()).intValue() != nextHead + 1)
            throw new Exception("peek got: " +  deque.peek() +
                                " expecting " + (nextHead + 1));

        if (((Integer)deque.peekLast()).intValue() != nextTail - 1)
            throw new Exception("peekLast got: " + deque.peekLast() +
                                " expecting " + (nextTail - 1));
        if (((Integer)deque.getLast()).intValue() != nextTail - 1)
            throw new Exception("getLast got: " +
                                deque.getLast() + " expecting " + (nextTail - 1));
    }


    static void randomOp(Deque deque) throws Exception {

        // Perform a random operation
        switch(random() & 3) {
        case 0:
            switch(random() & 3) {
            case 0: deque.addLast(new Integer(nextTail++));   break;
            case 1: deque.offerLast(new Integer(nextTail++)); break;
            case 2: deque.offer(new Integer(nextTail++));     break;
            case 3: deque.add(new Integer(nextTail++));       break;
            default: throw new Exception("How'd we get here");
            }
            break;
        case 1:
            if (size() == 0) {
                int result = 666;
                boolean threw = false;
                try {
                    switch(random(3)) {
                    case 0: result = ((Integer)deque.removeFirst()).intValue(); break;
                    case 1: result = ((Integer)deque.remove()).intValue();      break;
                    case 2: result = ((Integer)deque.pop()).intValue();         break;
                    default: throw new Exception("How'd we get here");
                    }
                } catch(NoSuchElementException e) {
                    threw = true;
                }
                if (!threw)
                    throw new Exception("Remove-no exception: " + result);
            } else { // deque nonempty
                int result = -1;
                switch(random(5)) {
                case 0: result = ((Integer)deque.removeFirst()).intValue(); break;
                case 1: result = ((Integer)deque.remove()).intValue();      break;
                case 2: result = ((Integer)deque.pop()).intValue();         break;
                case 3: result = ((Integer)deque.pollFirst()).intValue();   break;
                case 4: result = ((Integer)deque.poll()).intValue();        break;
                default: throw new Exception("How'd we get here");
                }
                if (result != ++nextHead)
                    throw new Exception(
                                        "Removed "+ result + " expecting "+(nextHead - 1));
            }
            break;
        case 2:
            switch(random(3)) {
            case 0: deque.addFirst(new Integer(nextHead--));   break;
            case 1: deque.offerFirst(new Integer(nextHead--)); break;
            case 2: deque.push(new Integer(nextHead--));       break;
            default: throw new Exception("How'd we get here");

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?