/*
 * Copyright (C) 2007 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.Type;

/**
 * Throw a few things at the verifier, all of which are expected to pass.
 */
public class Main {
    static public void main(String[] args) {
        tryBlah(1);

        System.out.println("Zorch.");
    }

    /*
     * Make sure the verifier is handling type merge of arrays of
     * references correctly.
     */
    static Object[] arrayCheck1(int wanted) {
        String[] arrayOne;
        Integer[] arrayTwo;

        arrayOne = new String[1];
        arrayTwo = new Integer[1];

        switch (wanted) {
            case 0:     return arrayOne;
            case 1:     return arrayTwo;
            default:    return null;
        }
    }

    static Object arrayCheck1b(int wanted) {
        String[] arrayOne;
        Integer[] arrayTwo;
        int[] arrayThree;

        arrayOne = new String[1];
        arrayTwo = new Integer[1];
        arrayThree = new int[1];

        switch (wanted) {
            case 0:     return arrayOne;
            case 1:     return arrayTwo;
            case 2:     return arrayThree;
            default:    return null;
        }
    }

    static Object[] arrayCheck2(int wanted) {
        String[][] arrayOne;
        String[][] arrayTwo;
        Integer[][] arrayThree;

        arrayOne = new String[1][];
        arrayTwo = new String[1][];
        arrayThree = new Integer[1][];

        switch (wanted) {
            case 0:     return arrayOne;
            case 1:     return arrayTwo;
            case 2:     return arrayThree;
            default:    return null;
        }
    }

    static Object[] arrayCheck3(int wanted) {
        String[][] arrayTwo;
        String[][][][] arrayFour;

        arrayTwo = new String[1][];
        arrayFour = new String[1][][][];

        switch (wanted) {
            case 0:     return arrayTwo;
            case 1:     return arrayFour;
            default:    return null;
        }
    }

    /*
     * Check return type merge.
     */
    private Type[] typeTest() {
        if(this == null) {
            return (Class<?>[])null;
        }
        return (Type[])null;
    }


    /*
     * Exercise the blahs.
     */
    static void tryBlah(int num) {
        BlahFeature feature = null;     // interface ref

        switch (num) {
            case 1:
                feature = new BlahOne();
                break;
            default:
                feature = new BlahTwo();
                break;
        }

        feature.doStuff();
    }
}
