1import otherpackage.OtherPackagePublicEnum;
2
3import java.lang.reflect.*;
4
5public class Main {
6    /** used by {@link #basisCall} */
7    static private int basisTestValue = 12;
8
9    static public void main(String[] args) throws Exception {
10        try {
11            Class<?> enumClass = Enum.class;
12            Method enumValueOf = null;
13            for (Method m : enumClass.getDeclaredMethods()) {
14                if (m.getName().equals("valueOf")) {
15                    enumValueOf = m;
16                    break;
17                }
18            }
19            enumValueOf.invoke(null, String.class, "blah");
20            throw new AssertionError();
21        } catch (InvocationTargetException expected) {
22            IllegalArgumentException iae = (IllegalArgumentException) expected.getCause();
23            if (!iae.getMessage().equals("class java.lang.String is not an enum type.")) {
24                throw new AssertionError();
25            }
26        }
27
28        boolean timing = (args.length >= 1) && args[0].equals("--timing");
29        run(timing);
30    }
31
32    static public void run(boolean timing) {
33        preTest();
34
35        long time0 = System.nanoTime();
36        int count1 = test1(500);
37        long time1 = System.nanoTime();
38        int count2 = test2(500);
39        long time2 = System.nanoTime();
40        int count3 = test3(500);
41        long time3 = System.nanoTime();
42        int count4 = basis(500);
43        long time4 = System.nanoTime();
44
45        System.out.println("basis: performed " + count4 + " iterations");
46        System.out.println("test1: performed " + count1 + " iterations");
47        System.out.println("test2: performed " + count2 + " iterations");
48        System.out.println("test3: performed " + count3 + " iterations");
49
50        double msec1 = (time1 - time0) / (double) count1 / 1000000;
51        double msec2 = (time2 - time1) / (double) count2 / 1000000;
52        double msec3 = (time3 - time2) / (double) count3 / 1000000;
53        double basisMsec = (time4 - time3) / (double) count4 / 1000000;
54
55        double avg = (msec1 + msec2 + msec3) / 3;
56        if (avg < (basisMsec * 10)) {
57            System.out.println("Timing is acceptable.");
58        } else {
59            System.out.println("Iterations are taking too long!");
60            timing = true;
61        }
62
63        if (timing) {
64            System.out.printf("basis time: %.3g msec\n", basisMsec);
65            System.out.printf("test1: %.3g msec per iteration\n", msec1);
66            System.out.printf("test2: %.3g msec per iteration\n", msec2);
67            System.out.printf("test3: %.3g msec per iteration\n", msec3);
68        }
69
70    }
71
72    static public void preTest() {
73        /*
74         * This is meant to ensure that the basic enum functionality
75         * really is working.
76         */
77
78        Class<SamePackagePublicEnum> c = SamePackagePublicEnum.class;
79
80        System.out.println(Enum.valueOf(c, "FOUR"));
81        System.out.println(Enum.valueOf(c, "ONE"));
82        System.out.println(Enum.valueOf(c, "FOURTEEN"));
83        System.out.println(Enum.valueOf(c, "NINE"));
84        System.out.println(Enum.valueOf(c, "FIVE"));
85        System.out.println(Enum.valueOf(c, "TWELVE"));
86
87        System.out.println(Enum.valueOf(c, "ZERO").getClass().getName());
88    }
89
90    static final String[] BASIS_COMPARE_ARRAY = {
91        "ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT",
92        "NINE", "TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN",
93        "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"
94    };
95
96    static public int basis(int iters) {
97        for (int i = iters; i > 0; i--) {
98            basisValueOf("ZERO");
99            basisValueOf("ONE");
100            basisValueOf("TWO");
101            basisValueOf("THREE");
102            basisValueOf("FOUR");
103            basisValueOf("FIVE");
104            basisValueOf("SIX");
105            basisValueOf("SEVEN");
106            basisValueOf("EIGHT");
107            basisValueOf("NINE");
108            basisValueOf("TEN");
109            basisValueOf("ELEVEN");
110            basisValueOf("TWELVE");
111            basisValueOf("THIRTEEN");
112            basisValueOf("FOURTEEN");
113            basisValueOf("FIFTEEN");
114            basisValueOf("SIXTEEN");
115            basisValueOf("SEVENTEEN");
116            basisValueOf("EIGHTEEN");
117            basisValueOf("NINETEEN");
118        }
119
120        return iters * 20;
121    }
122
123    static String basisValueOf(String key) {
124        for (String s : BASIS_COMPARE_ARRAY) {
125            if (s.equals(key)) {
126                return s;
127            }
128        }
129        throw new IllegalArgumentException();
130    }
131
132    static public int test1(int iters) {
133        Class<SamePackagePublicEnum> c = SamePackagePublicEnum.class;
134        for (int i = iters; i > 0; i--) {
135            Enum.valueOf(c, "ZERO");
136            Enum.valueOf(c, "ONE");
137            Enum.valueOf(c, "TWO");
138            Enum.valueOf(c, "THREE");
139            Enum.valueOf(c, "FOUR");
140            Enum.valueOf(c, "FIVE");
141            Enum.valueOf(c, "SIX");
142            Enum.valueOf(c, "SEVEN");
143            Enum.valueOf(c, "EIGHT");
144            Enum.valueOf(c, "NINE");
145            Enum.valueOf(c, "TEN");
146            Enum.valueOf(c, "ELEVEN");
147            Enum.valueOf(c, "TWELVE");
148            Enum.valueOf(c, "THIRTEEN");
149            Enum.valueOf(c, "FOURTEEN");
150            Enum.valueOf(c, "FIFTEEN");
151            Enum.valueOf(c, "SIXTEEN");
152            Enum.valueOf(c, "SEVENTEEN");
153            Enum.valueOf(c, "EIGHTEEN");
154            Enum.valueOf(c, "NINETEEN");
155        }
156
157        return iters * 20;
158    }
159
160    static public int test2(int iters) {
161        Class<SamePackagePrivateEnum> c = SamePackagePrivateEnum.class;
162        for (int i = iters; i > 0; i--) {
163            Enum.valueOf(c, "ZERO");
164            Enum.valueOf(c, "ONE");
165            Enum.valueOf(c, "TWO");
166            Enum.valueOf(c, "THREE");
167            Enum.valueOf(c, "FOUR");
168            Enum.valueOf(c, "FIVE");
169            Enum.valueOf(c, "SIX");
170            Enum.valueOf(c, "SEVEN");
171            Enum.valueOf(c, "EIGHT");
172            Enum.valueOf(c, "NINE");
173            Enum.valueOf(c, "TEN");
174            Enum.valueOf(c, "ELEVEN");
175            Enum.valueOf(c, "TWELVE");
176            Enum.valueOf(c, "THIRTEEN");
177            Enum.valueOf(c, "FOURTEEN");
178            Enum.valueOf(c, "FIFTEEN");
179            Enum.valueOf(c, "SIXTEEN");
180            Enum.valueOf(c, "SEVENTEEN");
181            Enum.valueOf(c, "EIGHTEEN");
182            Enum.valueOf(c, "NINETEEN");
183        }
184
185        return iters * 20;
186    }
187
188    static public int test3(int iters) {
189        Class<OtherPackagePublicEnum> c = OtherPackagePublicEnum.class;
190        for (int i = iters; i > 0; i--) {
191            Enum.valueOf(c, "ZERO");
192            Enum.valueOf(c, "ONE");
193            Enum.valueOf(c, "TWO");
194            Enum.valueOf(c, "THREE");
195            Enum.valueOf(c, "FOUR");
196            Enum.valueOf(c, "FIVE");
197            Enum.valueOf(c, "SIX");
198            Enum.valueOf(c, "SEVEN");
199            Enum.valueOf(c, "EIGHT");
200            Enum.valueOf(c, "NINE");
201            Enum.valueOf(c, "TEN");
202            Enum.valueOf(c, "ELEVEN");
203            Enum.valueOf(c, "TWELVE");
204            Enum.valueOf(c, "THIRTEEN");
205            Enum.valueOf(c, "FOURTEEN");
206            Enum.valueOf(c, "FIFTEEN");
207            Enum.valueOf(c, "SIXTEEN");
208            Enum.valueOf(c, "SEVENTEEN");
209            Enum.valueOf(c, "EIGHTEEN");
210            Enum.valueOf(c, "NINETEEN");
211        }
212
213        return iters * 20;
214    }
215}
216