// Copyright 2009 Google Inc. All Rights Reserved.

package com.google.gwt.dev.jjs.impl;

import com.google.gwt.dev.jjs.ast.JMethod;
import com.google.gwt.dev.jjs.ast.JProgram;

/**
 * Test for SameParameterValueOptimizer.
 */
public class SameParameterValueOptimizerTest extends OptimizerTestBase {
  public void testDifferentParameter() throws Exception {
    addSnippetClassDecl("static void foo(int i) { int j = i; }");
    optimizeMethod("foo", "void",
        "foo(1); foo(2);").intoString(
            "int j = i;");
  }

  public void testDifferentParameter_Null() throws Exception {
    addSnippetClassDecl("static void foo(String s) { String j = s; }");
    optimizeMethod("foo", "void",
        "foo(null); foo(\"\");").intoString(
        "String j = s;");
  }

  public void testNonConstParameter() throws Exception {
    addSnippetClassDecl("static int foo(int i) { return i; }");
    
    optimizeMethod("foo", "void", "foo(foo(1));").intoString(
        "return i;");
  }

  public void testNumericCast() throws Exception {
    addSnippetClassDecl("static void foo(long i) { long j = i; }");
    optimizeMethod("foo", "void",
        "foo(1); foo(1);").intoString(
        "long j = 1L;");
  }

  public void testOneParameterValue() throws Exception {
    addSnippetClassDecl("static void foo(int i) { int j = i; }");
    optimizeMethod("foo", "void",
        "foo(1);").intoString(
        "int j = 1;");
  }

  public void testSameParameter() throws Exception {
    addSnippetClassDecl("static void foo(int i) { int j = i; }");
    optimizeMethod("foo", "void",
        "foo(1); foo(1);").intoString(
        "int j = 1;");
  }

  public void testSameParameter_Null() throws Exception {
    addSnippetClassDecl("static void foo(String s) { String j = s; }");
    optimizeMethod("foo", "void",
        "foo(null); foo(null);").intoString(
        "String j = (String) null;");
  }

  public void testDontKillParameterValue_Binop() throws Exception {
    addSnippetClassDecl("static void foo(int i) { if (i == 2) {} int j = i; }");
    optimizeMethod("foo", "void",
        "foo(1); ").intoString(
            "if (1 == 2) {",
            "}",
            "int j = 1;");
  }

  public void testDontKillParameterValue_LocalPrefix() throws Exception {
    addSnippetClassDecl("static void foo(int i) { int j = i; ++j; }");
    optimizeMethod("foo", "void",
        "foo(1); ").intoString(
            "int j = 1;",
            "++j;");
  }

  public void testDontKillParameterValue_LocalPostfix() throws Exception {
    addSnippetClassDecl("static void foo(int i) { int j = i; j++; }");
    optimizeMethod("foo", "void",
        "foo(1); ").intoString(
            "int j = 1;",
            "j++;");
  }

  public void testKillParameterValue_Prefix() throws Exception {
    addSnippetClassDecl("static void foo(int i) { ++i; int j = i; }");
    optimizeMethod("foo", "void",
        "foo(1); ").intoString(
            "++i;",
            "int j = i;");
  }

  public void testKillParameterValue_Assign() throws Exception {
    addSnippetClassDecl("static void foo(int i) { i = 2; int j = i; }");
    optimizeMethod("foo", "void",
        "foo(1); ").intoString(
            "i = 2;",
            "int j = i;");
  }

  public void testKillParameterValue_Postfix() throws Exception {
    addSnippetClassDecl("static void foo(int i) { i++; int j = i; }");
    optimizeMethod("foo", "void",
    "foo(1); ").intoString(
        "i++;",
        "int j = i;");
  }

  public void testJsniReferenceSaveMethod() throws Exception {
    addSnippetClassDecl(
        "public static native void someStaticMethod() /*-{" +
        "  var foo = @test.EntryPoint::foo(Ljava/lang/String;)" +
        "}-*/");
    addSnippetClassDecl("static void foo(String s) { String p = s; }");
   
    optimizeMethod(
        "foo",
        "void",
        "foo(\"\"); foo(\"\");").intoString(
        "String p = s;");
  }

  public void testInstanceMethod_Poly() throws Exception {
    addSnippetClassDecl("void foo(int i) { int j = i; }");
    optimizeMethod("foo", "void", "new EntryPoint().foo(1);").intoString(
      "int j = i;");
  }

  public void testInstanceMethod_Final() throws Exception {
    addSnippetClassDecl("final void foo(int i) { int j = i; }");
    optimizeMethod("$foo", "void", "new EntryPoint().foo(1);").intoString(
      "int j = i;");
  }

  public void testOverrides() throws Exception {
    addSnippetClassDecl("void foo(int i) { int j = i; }");
    addSnippetClassDecl(
        "static class Override extends EntryPoint {",
        "  void foo(int i) { int j = i; }", // overrides
        "}");
    optimizeMethod("foo", "void", "new EntryPoint().foo(1);").intoString(
      "int j = i;");
  }
  
  @Override
  protected boolean optimizeMethod(JProgram program, JMethod method) {
    MakeCallsStatic.exec(program);
    return SameParameterValueOptimizer.exec(program).didChange();
  }
}
