/*
 * Copyright (C) 2008 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.
 */

package tests.sql;

import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargetNew;

import junit.framework.TestCase;

import java.sql.Array;
import java.util.Map;

/**
 * @author andrea@google.com (Your Name Here)
 *
 */
@TestTargetClass(Array.class)
public class ArrayTest extends TestCase {

    /**
     * Test method for {@link java.sql.Array#getArray()}.
     */
    @TestTargetNew(
      level = TestLevel.NOT_FEASIBLE,
      notes = "",
      method = "getArray",
      args = {}
    )
    public void testGetArray() {
        fail("Not yet implemented");
    }

    /**
     * Test method for {@link java.sql.Array#getArray(long, int)}.
     */
    @TestTargetNew(
      level = TestLevel.NOT_FEASIBLE,
      notes = "",
      method = "getArray",
      args = {long.class, int.class}
    )
    public void testGetArrayLongInt() {
        fail("Not yet implemented");
    }

    /**
     * Test method for {@link java.sql.Array#getArray(long, int, java.util.Map)}.
     */
    @TestTargetNew(
      level = TestLevel.NOT_FEASIBLE,
      notes = "",
      method = "getArray",
      args = {long.class, int.class, Map.class}
    )
    public void testGetArrayLongIntMapOfStringClassOfQ() {
        fail("Not yet implemented");
    }

    /**
     * Test method for {@link java.sql.Array#getArray(java.util.Map)}.
     */
    @TestTargetNew(
      level = TestLevel.NOT_FEASIBLE,
      notes = "",
      method = "getArray",
      args = {Map.class}
    )
    public void testGetArrayMapOfStringClassOfQ() {
        fail("Not yet implemented");
    }

    /**
     * Test method for {@link java.sql.Array#getBaseType()}.
     */
    @TestTargetNew(
      level = TestLevel.NOT_FEASIBLE,
      notes = "",
      method = "getBaseType",
      args = {}
    )
    public void testGetBaseType() {
        fail("Not yet implemented");
    }

    /**
     * Test method for {@link java.sql.Array#getBaseTypeName()}.
     */
    @TestTargetNew(
      level = TestLevel.NOT_FEASIBLE,
      notes = "",
      method = "getBaseTypeName",
      args = {}
    )
    public void testGetBaseTypeName() {
        fail("Not yet implemented");
    }

    /**
     * Test method for {@link java.sql.Array#getResultSet()}.
     */
    @TestTargetNew(
      level = TestLevel.NOT_FEASIBLE,
      notes = "",
      method = "getResultSet",
      args = {}
    )
    public void testGetResultSet() {
        fail("Not yet implemented");
    }

    /**
     * Test method for {@link java.sql.Array#getResultSet(long, int)}.
     */
    @TestTargetNew(
      level = TestLevel.NOT_FEASIBLE,
      notes = "",
      method = "getResultSet",
      args = {long.class, int.class}
    )
    public void testGetResultSetLongInt() {
        fail("Not yet implemented");
    }

    /**
     * Test method for {@link java.sql.Array#getResultSet(long, int, java.util.Map)}.
     */
    @TestTargetNew(
      level = TestLevel.NOT_FEASIBLE,
      notes = "",
      method = "getResultSet",
      args = {long.class, int.class, Map.class}
    )
    public void testGetResultSetLongIntMapOfStringClassOfQ() {
        fail("Not yet implemented");
    }

    /**
     * Test method for {@link java.sql.Array#getResultSet(java.util.Map)}.
     */
    @TestTargetNew(
      level = TestLevel.NOT_FEASIBLE,
      notes = "",
      method = "getResultSet",
      args = {Map.class}
    )
    public void testGetResultSetMapOfStringClassOfQ() {
        fail("Not yet implemented");
    }

}
