/*
 * Copyright 2013 Google Inc.
 *
 * 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 com.google.gwt.junit.client;

import java.util.ArrayList;
import java.util.List;

/**
 * A test class that is inherited by {@link GWTTestCaseInheritanceTest}.
 */
class GWTTestCaseInheritanceTestBase extends GWTTestCaseTestBase {

  static List<String> executions = new ArrayList<String>();

  public void testBasic() { }

  public void testOverridden() { }

  public static void testStatic() { }
}
