001: /*
002: * Copyright 2003,2004 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package net.sf.cglib.util;
017:
018: import net.sf.cglib.CodeGenTestCase;
019: import junit.framework.*;
020:
021: public class TestXmlParsing extends CodeGenTestCase {
022: private static final String ATTRIBUTE_STR = "attribute";
023: private static final String ATTRIBUTE_DIRECTIVE_STR = "directive.attribute";
024: private static final String BODY_STR = "body";
025: private static final String DECLARATION_STR = "declaration";
026: private static final String DOBODY_STR = "doBody";
027: private static final String ELEMENT_STR = "element";
028: private static final String FALLBACK_STR = "fallback";
029: private static final String FORWARD_STR = "forward";
030: private static final String GET_PROPERTY_STR = "getProperty";
031: private static final String INCLUDE_STR = "include";
032: private static final String INCLUDE_DIRECTIVE_STR = "directive.include";
033: private static final String INVOKE_STR = "invoke";
034: private static final String OUTPUT_STR = "output";
035: private static final String PAGE_DIRECTIVE_STR = "directive.page";
036: private static final String PARAMS_STR = "params";
037: private static final String PARAM_STR = "param";
038: private static final String PLUGIN_STR = "plugin";
039: private static final String ROOT_STR = "root";
040: private static final String SET_PROPERTY_STR = "setProperty";
041: private static final String TAG_DIRECTIVE_STR = "directive.tag";
042: private static final String TEXT_STR = "text";
043: private static final String USE_BEAN_STR = "useBean";
044: private static final String VARIABLE_DIRECTIVE_STR = "variable";
045:
046: private static final int ATTRIBUTE_IDX = 0;
047: private static final int ATTRIBUTE_DIRECTIVE_IDX = 1;
048: private static final int BODY_IDX = 2;
049: private static final int DECLARATION_IDX = 3;
050: private static final int DOBODY_IDX = 4;
051: private static final int ELEMENT_IDX = 5;
052: private static final int FALLBACK_IDX = 6;
053: private static final int FORWARD_IDX = 7;
054: private static final int GET_PROPERTY_IDX = 8;
055: private static final int INCLUDE_IDX = 9;
056: private static final int INCLUDE_DIRECTIVE_IDX = 10;
057: private static final int INVOKE_IDX = 11;
058: private static final int OUTPUT_IDX = 12;
059: private static final int PAGE_DIRECTIVE_IDX = 13;
060: private static final int PARAMS_IDX = 14;
061: private static final int PARAM_IDX = 15;
062: private static final int PLUGIN_IDX = 16;
063: private static final int ROOT_IDX = 17;
064: private static final int SET_PROPERTY_IDX = 18;
065: private static final int TAG_DIRECTIVE_IDX = 19;
066: private static final int TEXT_IDX = 20;
067: private static final int USE_BEAN_IDX = 21;
068: private static final int VARIABLE_DIRECTIVE_IDX = 22;
069:
070: private static final String[] M1 = { ATTRIBUTE_STR,
071: ATTRIBUTE_DIRECTIVE_STR, BODY_STR, DECLARATION_STR,
072: DOBODY_STR, ELEMENT_STR, FALLBACK_STR, FORWARD_STR,
073: GET_PROPERTY_STR, INCLUDE_STR, INCLUDE_DIRECTIVE_STR,
074: INVOKE_STR, OUTPUT_STR, PAGE_DIRECTIVE_STR, PARAMS_STR,
075: PARAM_STR, PLUGIN_STR, ROOT_STR, SET_PROPERTY_STR,
076: TAG_DIRECTIVE_STR, TEXT_STR, USE_BEAN_STR,
077: VARIABLE_DIRECTIVE_STR };
078:
079: private static final int[] M2 = { ATTRIBUTE_IDX,
080: ATTRIBUTE_DIRECTIVE_IDX, BODY_IDX, DECLARATION_IDX,
081: DOBODY_IDX, ELEMENT_IDX, FALLBACK_IDX, FORWARD_IDX,
082: GET_PROPERTY_IDX, INCLUDE_IDX, INCLUDE_DIRECTIVE_IDX,
083: INVOKE_IDX, OUTPUT_IDX, PAGE_DIRECTIVE_IDX, PARAMS_IDX,
084: PARAM_IDX, PLUGIN_IDX, ROOT_IDX, SET_PROPERTY_IDX,
085: TAG_DIRECTIVE_IDX, TEXT_IDX, USE_BEAN_IDX,
086: VARIABLE_DIRECTIVE_IDX };
087:
088: private static final StringSwitcher SWITCHER = StringSwitcher
089: .create(M1, M2, true);
090:
091: public int switcher(String s) {
092: return SWITCHER.intValue(s);
093: }
094:
095: public int interned(String s) {
096: if (s == ATTRIBUTE_STR) {
097: return ATTRIBUTE_IDX;
098: } else if (s == ATTRIBUTE_DIRECTIVE_STR) {
099: return ATTRIBUTE_DIRECTIVE_IDX;
100: } else if (s == BODY_STR) {
101: return BODY_IDX;
102: } else if (s == DECLARATION_STR) {
103: return DECLARATION_IDX;
104: } else if (s == DOBODY_STR) {
105: return DOBODY_IDX;
106: } else if (s == ELEMENT_STR) {
107: return ELEMENT_IDX;
108: } else if (s == FALLBACK_STR) {
109: return FALLBACK_IDX;
110: } else if (s == FORWARD_STR) {
111: return FORWARD_IDX;
112: } else if (s == GET_PROPERTY_STR) {
113: return GET_PROPERTY_IDX;
114: } else if (s == INCLUDE_STR) {
115: return INCLUDE_IDX;
116: } else if (s == INCLUDE_DIRECTIVE_STR) {
117: return INCLUDE_DIRECTIVE_IDX;
118: } else if (s == INVOKE_STR) {
119: return INVOKE_IDX;
120: } else if (s == OUTPUT_STR) {
121: return OUTPUT_IDX;
122: } else if (s == PAGE_DIRECTIVE_STR) {
123: return PAGE_DIRECTIVE_IDX;
124: } else if (s == PARAMS_STR) {
125: return PARAMS_IDX;
126: } else if (s == PARAM_STR) {
127: return PARAM_IDX;
128: } else if (s == PLUGIN_STR) {
129: return PLUGIN_IDX;
130: } else if (s == ROOT_STR) {
131: return ROOT_IDX;
132: } else if (s == SET_PROPERTY_STR) {
133: return SET_PROPERTY_IDX;
134: } else if (s == TAG_DIRECTIVE_STR) {
135: return TAG_DIRECTIVE_IDX;
136: } else if (s == TEXT_STR) {
137: return TEXT_IDX;
138: } else if (s == USE_BEAN_STR) {
139: return USE_BEAN_IDX;
140: } else if (s == VARIABLE_DIRECTIVE_STR) {
141: return VARIABLE_DIRECTIVE_IDX;
142: }
143: return -1;
144: }
145:
146: public int elseIf(String s) {
147: if (s.equals(ATTRIBUTE_STR)) {
148: return ATTRIBUTE_IDX;
149: } else if (s.equals(ATTRIBUTE_DIRECTIVE_STR)) {
150: return ATTRIBUTE_DIRECTIVE_IDX;
151: } else if (s.equals(BODY_STR)) {
152: return BODY_IDX;
153: } else if (s.equals(DECLARATION_STR)) {
154: return DECLARATION_IDX;
155: } else if (s.equals(DOBODY_STR)) {
156: return DOBODY_IDX;
157: } else if (s.equals(ELEMENT_STR)) {
158: return ELEMENT_IDX;
159: } else if (s.equals(FALLBACK_STR)) {
160: return FALLBACK_IDX;
161: } else if (s.equals(FORWARD_STR)) {
162: return FORWARD_IDX;
163: } else if (s.equals(GET_PROPERTY_STR)) {
164: return GET_PROPERTY_IDX;
165: } else if (s.equals(INCLUDE_STR)) {
166: return INCLUDE_IDX;
167: } else if (s.equals(INCLUDE_DIRECTIVE_STR)) {
168: return INCLUDE_DIRECTIVE_IDX;
169: } else if (s.equals(INVOKE_STR)) {
170: return INVOKE_IDX;
171: } else if (s.equals(OUTPUT_STR)) {
172: return OUTPUT_IDX;
173: } else if (s.equals(PAGE_DIRECTIVE_STR)) {
174: return PAGE_DIRECTIVE_IDX;
175: } else if (s.equals(PARAMS_STR)) {
176: return PARAMS_IDX;
177: } else if (s.equals(PARAM_STR)) {
178: return PARAM_IDX;
179: } else if (s.equals(PLUGIN_STR)) {
180: return PLUGIN_IDX;
181: } else if (s.equals(ROOT_STR)) {
182: return ROOT_IDX;
183: } else if (s.equals(SET_PROPERTY_STR)) {
184: return SET_PROPERTY_IDX;
185: } else if (s.equals(TAG_DIRECTIVE_STR)) {
186: return TAG_DIRECTIVE_IDX;
187: } else if (s.equals(TEXT_STR)) {
188: return TEXT_IDX;
189: } else if (s.equals(USE_BEAN_STR)) {
190: return USE_BEAN_IDX;
191: } else if (s.equals(VARIABLE_DIRECTIVE_STR)) {
192: return VARIABLE_DIRECTIVE_IDX;
193: }
194: return -1;
195: }
196:
197: public void testStartElement() throws Throwable {
198: int numWords = 10000;
199: int reps = 1000;
200:
201: String[] words = new String[numWords];
202: String[] interned = new String[numWords];
203: for (int i = 0; i < words.length; i++) {
204: interned[i] = M1[(int) (Math.random() * M1.length)]
205: .intern();
206: words[i] = new String(interned[i]);
207: }
208: long total1 = 0;
209: long total2 = 0;
210: long total3 = 0;
211: // warm-up
212: for (int i = 0; i < reps; i++) {
213: for (int j = 0; j < numWords; j++) {
214: total1 += elseIf(words[j]);
215: total2 += interned(interned[j]);
216: total3 += switcher(words[j]);
217: }
218: }
219: if (total1 != total2 || total1 != total3) {
220: fail("totals are not equal");
221: }
222:
223: long t0 = System.currentTimeMillis();
224: for (int i = 0; i < reps; i++) {
225: for (int j = 0; j < numWords; j++) {
226: elseIf(words[j]);
227: }
228: }
229: long t1 = System.currentTimeMillis();
230: for (int i = 0; i < reps; i++) {
231: for (int j = 0; j < numWords; j++) {
232: interned(interned[j]);
233: }
234: }
235: long t2 = System.currentTimeMillis();
236: for (int i = 0; i < reps; i++) {
237: for (int j = 0; j < numWords; j++) {
238: switcher(words[j]);
239: }
240: }
241: long t3 = System.currentTimeMillis();
242:
243: System.err.println("elseif: " + (t1 - t0) + "ms");
244: System.err.println("intern: " + (t2 - t1) + "ms");
245: System.err.println("switch: " + (t3 - t2) + "ms");
246: }
247:
248: public TestXmlParsing(String testName) {
249: super (testName);
250: }
251:
252: public static void main(String[] args) {
253: junit.textui.TestRunner.run(suite());
254: }
255:
256: public static Test suite() {
257: return new TestSuite(TestXmlParsing.class);
258: }
259:
260: public void perform(ClassLoader loader) throws Throwable {
261: }
262:
263: public void testFailOnMemoryLeak() throws Throwable {
264: }
265:
266: }
|