1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package libcore.java.lang;
18
19import junit.framework.TestCase;
20
21public class OldStackTraceElementTest extends TestCase {
22
23    public class Original extends TestCase {
24
25        public void pureJavaMethod(Object test) throws Exception {
26            throw new Exception("pure java method");
27        }
28
29        native public void pureNativeMethod(Object test);
30    }
31
32    private Original original;
33
34    @Override
35    protected void setUp() throws Exception {
36        original = new Original();
37        super.setUp();
38    }
39
40    @Override
41    protected void tearDown() throws Exception {
42        super.tearDown();
43    }
44
45    public void test_ConstructorLjava_lang_StringLjava_lang_StringLjava_lang_StringI() {
46        StackTraceElement ste2 = null;
47        try {
48            original.pureJavaMethod(new Object());
49            fail();
50        } catch (Exception e) {
51            StackTraceElement ste1 = e.getStackTrace()[0];
52            ste2 = new StackTraceElement(ste1.getClassName(),
53                    ste1.getMethodName(),
54                    ste1.getFileName(),
55                    ste1.getLineNumber());
56            assertEquals("Incorrect value of class name",
57                    ste1.getClassName(), ste2.getClassName());
58            assertEquals("Incorrect value of method name",
59                    ste1.getMethodName(), ste2.getMethodName());
60            assertEquals("Incorrect value of file name",
61                    ste1.getFileName(), ste2.getFileName());
62            assertEquals("Incorrect value of line number",
63                    ste1.getLineNumber(), ste2.getLineNumber());
64        }
65        assertNotNull("Incorrect stack trace object", ste2);
66        try {
67            new StackTraceElement(null,
68                    ste2.getMethodName(),
69                    ste2.getFileName(),
70                    ste2.getLineNumber());
71            fail("Expected NullPointerException was not thrown");
72        } catch (NullPointerException e) {
73            // expected
74        }
75        try {
76            new StackTraceElement(ste2.getClassName(),
77                    null,
78                    ste2.getFileName(),
79                    ste2.getLineNumber());
80            fail("Expected NullPointerException was not thrown");
81        } catch (NullPointerException e) {
82            // expected
83        }
84        try {
85            new StackTraceElement(ste2.getClassName(),
86                    ste2.getMethodName(),
87                    null,
88                    ste2.getLineNumber());
89        } catch (NullPointerException e) {
90            fail("Unexpected exception " + e.toString());
91        }
92    }
93
94    public void test_equalsLjava_lang_Object() {
95        try {
96            original.pureJavaMethod(new Object());
97            fail();
98        } catch (Exception e) {
99            StackTraceElement ste1 = e.getStackTrace()[0];
100            StackTraceElement ste2 =
101                new StackTraceElement(ste1.getClassName(),
102                        ste1.getMethodName(),
103                        ste1.getFileName(),
104                        ste1.getLineNumber());
105            assertEquals("Objects are equaled", ste1, ste2);
106        }
107    }
108
109    public void test_getClassName() {
110        try {
111            original.pureJavaMethod(new Object());
112            fail();
113        } catch (Exception e) {
114            assertEquals("Incorrect class name",
115                    "libcore.java.lang.OldStackTraceElementTest$Original",
116                    e.getStackTrace()[0].getClassName());
117            assertEquals("Incorrect class name",
118                    "libcore.java.lang.OldStackTraceElementTest",
119                    e.getStackTrace()[1].getClassName());
120        }
121    }
122
123    public void test_getFileName() {
124        try {
125            original.pureJavaMethod(new Object());
126            fail();
127        } catch (Exception e) {
128            assertEquals("Incorrect file name",
129                    "OldStackTraceElementTest.java",
130                    e.getStackTrace()[0].getFileName());
131            assertEquals("Incorrect file name",
132                    "OldStackTraceElementTest.java",
133                    e.getStackTrace()[1].getFileName());
134        }
135    }
136
137    public void test_getLineNumber() {
138        try {
139            original.pureJavaMethod(new Object());
140            fail();
141        } catch (Exception e) {
142            assertEquals("Incorrect line number",
143                    26, e.getStackTrace()[0].getLineNumber());
144        }
145    }
146
147    public void test_getMethodName() {
148        try {
149            original.pureJavaMethod(new Object());
150            fail();
151        } catch (Exception e) {
152            assertEquals("Incorrect method name",
153                    "pureJavaMethod",
154                    e.getStackTrace()[0].getMethodName());
155            assertEquals("Incorrect method name",
156                    "test_getMethodName",
157                    e.getStackTrace()[1].getMethodName());
158        }
159    }
160
161    public void test_hashCode() {
162        try {
163            original.pureJavaMethod(new Object());
164            fail();
165        } catch (Exception e) {
166            StackTraceElement ste1 = e.getStackTrace()[0];
167            StackTraceElement ste2 =
168                new StackTraceElement(ste1.getClassName(),
169                        ste1.getMethodName(),
170                        ste1.getFileName(),
171                        ste1.getLineNumber());
172            assertEquals("Incorrect value of hash code",
173                    ste1.hashCode(), ste2.hashCode());
174            assertFalse("Incorrect value of hash code",
175                    ste1.hashCode() == e.getStackTrace()[1].hashCode());
176        }
177    }
178
179    public void test_isNativeMethod() {
180        try {
181            original.pureJavaMethod(new Object());
182            fail();
183        } catch (Exception e) {
184            assertFalse("Incorrect method type",
185                    e.getStackTrace()[0].isNativeMethod());
186        }
187        try {
188            original.pureNativeMethod(new Object());
189            fail();
190        } catch (Error e) {
191            assertTrue("Incorrect method type",
192                    e.getStackTrace()[0].isNativeMethod());
193        }
194    }
195
196    public void test_toString() {
197        try {
198            original.pureJavaMethod(new Object());
199            fail();
200        } catch (Exception e) {
201            StackTraceElement ste = e.getStackTrace()[0];
202            assertTrue("String representation doesn't contain a package name",
203                    ste.toString().contains(getClass().getPackage().getName()));
204            assertTrue("String representation doesn't contain a class name",
205                    ste.toString().contains("Original"));
206            assertTrue("String representation doesn't contain a file name",
207                    ste.toString().contains("OldStackTraceElementTest.java"));
208            assertTrue("String representation doesn't contain a line number",
209                    ste.toString().contains("26"));
210            assertTrue("String representation doesn't contain a method name",
211                    ste.toString().contains("pureJavaMethod"));
212        }
213    }
214}
215