/*
 * Copyright 2014 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.dev.jjs.test;

import com.google.gwt.dev.util.arg.SourceLevel;
import com.google.gwt.junit.DoNotRunWith;
import com.google.gwt.junit.JUnitShell;
import com.google.gwt.junit.Platform;
import com.google.gwt.junit.client.GWTTestCase;

/**
 * Dummy test case. Java8Test is super sourced so that GWT can be compiled by Java 6.
 *
 * NOTE: Make sure this class has the same test methods of its supersourced variant.
 */
@DoNotRunWith(Platform.Devel)
public class Java8Test extends GWTTestCase {

  @Override
  public String getModuleName() {
    return "com.google.gwt.dev.jjs.Java8Test";
  }

  @Override
  public void runTest() throws Throwable {
    // Only run these tests if -sourceLevel 8 (or greater) is enabled.
    if (isGwtSourceLevel8()) {
      super.runTest();
    }
  }

  public void testLambdaNoCapture() {
    // Make sure we are using the right Java8Test if the source compatibility level is set to Java 8
    // or above.
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaCaptureLocal() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaCaptureLocalWithInnerClass() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaCaptureLocalAndField() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaCaptureLocalAndFieldWithInnerClass() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testCompileLambdaCaptureOuterInnerField() throws Exception {
    assertFalse(isGwtSourceLevel8());
  }

  public void testStaticReferenceBinding() throws Exception {
    assertFalse(isGwtSourceLevel8());
  }

  public void testInstanceReferenceBinding() throws Exception {
    assertFalse(isGwtSourceLevel8());
  }

  public void testImplicitQualifierReferenceBinding() throws Exception {
    assertFalse(isGwtSourceLevel8());
  }

  public void testConstructorReferenceBinding() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testStaticInterfaceMethod() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testArrayConstructorReference() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testArrayConstructorReferenceBoxed() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testVarArgsReferenceBinding() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testVarArgsPassthroughReferenceBinding() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testVarArgsPassthroughReferenceBindingProvidedArray() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testSuperReferenceExpression() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testSuperReferenceExpressionWithVarArgs() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testPrivateConstructorReference() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testDefaultInterfaceMethod() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testDefaultInterfaceMethodVirtualUpRef() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testInterfaceWithDefaultMethodsInitialization() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testDefaultInterfaceMethodMultiple() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testDefaultMethodReference() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testDefenderMethodByInterfaceInstance() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testDefaultMethod_staticInitializer() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testThisRefInDefenderMethod() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testClassImplementsTwoInterfacesWithSameDefenderMethod() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testAbstractClassImplementsInterface() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testSuperRefInDefenderMethod() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testSuperThisRefsInDefenderMethod() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testNestedInterfaceClass() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testBaseIntersectionCast() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testIntersectionCastWithLambdaExpr() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testIntersectionCastPolymorphism() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaCaptureParameter() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaNestingCaptureLocal() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaNestingInAnonymousCaptureLocal() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaNestingInMultipleMixedAnonymousCaptureLocal() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaNestingInMultipleMixedAnonymousCaptureLocal_withInterference() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaNestingInMultipleMixedAnonymousCaptureLocalAndField() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaNestingInMultipleAnonymousCaptureLocal() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaNestingCaptureField_InnerClassCapturingOuterClassVariable() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testInnerClassCaptureLocalFromOuterLambda() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaNestingCaptureField() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaMultipleNestingCaptureFieldAndLocal() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaMultipleNestingCaptureFieldAndLocalInnerClass() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMethodRefWithSameName() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMultipleDefaults_fromInterfaces_left() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMultipleDefaults_fromInterfaces_right() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMultipleDefaults_superclass_left() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMultipleDefaults_superclass_right() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMultipleDefaults_defaultShadowsOverSyntheticAbstractStub() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMultipleDefaults_defaultShadowsOverDefaultOnSuperAbstract() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testInterfaceThis() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMethodReference_generics() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testNativeJsTypeWithStaticInitializer() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testJsVarargsLambda() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMethodReference_implementedInSuperclass() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMethodReference_genericTypeParameters() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMethodReference_autoboxing() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testMethodReference_varargs() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testNativeJsOverlay_lambda() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaCapturingThis_onDefaultMethod() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testJsFunction_withOverlay() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testFunctionalExpressionBridges() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testCorrectNaming() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testInterfaceWithOverlayAndNativeSubclass() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLocalClassConstructorReferenceInStaticMethod() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testDefaultMethodDevirtualizationOrder() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testVarargsFunctionalConversion() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testJSOLivenessSingleImplErasure() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaErasureCasts() {
    assertFalse(isGwtSourceLevel8());
  }

  public void testLambdaBoxing() {
    assertFalse(isGwtSourceLevel8());
  }

  private boolean isGwtSourceLevel8() {
    return JUnitShell.getCompilerOptions().getSourceLevel().compareTo(SourceLevel.JAVA8) >= 0;
  }
}
