/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.lang.reflect.Method;
public class Main {
// Workaround for b/18051191.
class InnerClass {}
public enum TestPath {
ExceptionalFlow1(true, false, 3),
ExceptionalFlow2(false, true, 8),
NormalFlow(false, false, 42);
TestPath(boolean arg1, boolean arg2, int expected) {
this.arg1 = arg1;
this.arg2 = arg2;
this.expected = expected;
}
public boolean arg1;
public boolean arg2;
public int expected;
}
public static void testMethod(String method) throws Exception {
Class<?> c = Class.forName("Runtime");
Method m = c.getMethod(method, boolean.class, boolean.class);
for (TestPath path : TestPath.values()) {
Object[] arguments = new Object[] { path.arg1, path.arg2 };
int actual = (Integer) m.invoke(null, arguments);
if (actual != path.expected) {
throw new Error("Method: \"" + method + "\", path: " + path + ", " +
"expected: " + path.expected + ", actual: " + actual);
}
}
}
public static void main(String[] args) throws Exception {
testMethod("testUseAfterCatch_int");
testMethod("testUseAfterCatch_long");
testMethod("testUseAfterCatch_float");
testMethod("testUseAfterCatch_double");
testMethod("testCatchPhi_const");
testMethod("testCatchPhi_int");
testMethod("testCatchPhi_long");
testMethod("testCatchPhi_float");
testMethod("testCatchPhi_double");
testMethod("testCatchPhi_singleSlot");
testMethod("testCatchPhi_doubleSlot");
}
}