/*
 * Copyright 2008 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.javac.testing.impl;

/**
 * Contains standard Java source files for testing.
 */
public class JavaResourceBase {

  public static final MockJavaResource ANNOTATION = new MockJavaResource(
      "java.lang.annotation.Annotation") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang.annotation;\n");
      code.append("public interface Annotation {\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource BAR = new MockJavaResource("test.Bar") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package test;\n");
      code.append("public class Bar extends Foo {\n");
      code.append("  public String value() { return \"Bar\"; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource BOOLEAN = new MockJavaResource("java.lang.Boolean") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Boolean {\n");
      code.append("  private boolean value;\n");
      code.append("  public Boolean(boolean value) {\n");
      code.append("    this.value = value;\n");
      code.append("  }\n");
      code.append("  public static Boolean valueOf(boolean b) { return new Boolean(b); }\n");
      code.append("  public boolean booleanValue() { return value; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource BYTE = new MockJavaResource("java.lang.Byte") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Byte extends Number {\n");
      code.append("  private byte value;\n");
      code.append("  public Byte(byte value) {\n");
      code.append("    this.value = value;\n");
      code.append("  }\n");
      code.append("  public static Byte valueOf(byte b) { return new Byte(b); }\n");
      code.append("  public byte byteValue() { return value; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource CHARACTER = new MockJavaResource("java.lang.Character") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Character {\n");
      code.append("  private char value;\n");
      code.append("  public Character(char value) {\n");
      code.append("    this.value = value;\n");
      code.append("  }\n");
      code.append("  public static Character valueOf(char c) { return new Character(c); }\n");
      code.append("  public char charValue() { return value; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource CLASS = new MockJavaResource("java.lang.Class") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Class<T> {\n");
      code.append("  public String getName() { return null; }\n");
      code.append("  public String getSimpleName() { return null; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource CLASS_NOT_FOUND_EXCEPTION = new MockJavaResource(
      "java.lang.ClassNotFoundException") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class ClassNotFoundException extends Exception {\n");
      code.append("  public ClassNotFoundException() {}\n");
      code.append("  public ClassNotFoundException(String msg) {}\n");
      code.append("  public ClassNotFoundException(String msg, Throwable t) {}\n");
      code.append("  public Throwable getCause() { return null; }\n");
      code.append("  public Throwable getException() { return null; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource COLLECTION = new MockJavaResource("java.util.Collection") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.util;\n");
      code.append("public interface Collection<E> {\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource DOUBLE = new MockJavaResource("java.lang.Double") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Double extends Number {\n");
      code.append("  private double value;\n");
      code.append("  public Double(double value) {\n");
      code.append("    this.value = value;\n");
      code.append("  }\n");
      code.append("  public static boolean isNaN(double d) { return false; }\n");
      code.append("  public static Double valueOf(double d) { return new Double(d); }\n");
      code.append("  public double doubleValue() { return value; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource ENUM = new MockJavaResource("java.lang.Enum") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("import java.io.Serializable;\n");
      code.append("public abstract class Enum<E extends Enum<E>> implements Serializable {\n");
      code.append("  protected Enum(String name, int ordinal) {}\n");
      code.append("  protected static Object createValueOfMap(Enum[] constants) { return null; }\n");
      code.append("  protected static Enum valueOf(Object map, String name) { return null; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource ERROR = new MockJavaResource("java.lang.Error") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Error extends Throwable {\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource EXCEPTION = new MockJavaResource("java.lang.Exception") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Exception extends Throwable {\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource FLOAT = new MockJavaResource("java.lang.Float") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Float extends Number {\n");
      code.append("  private float value;\n");
      code.append("  public Float(float value) {\n");
      code.append("    this.value = value;\n");
      code.append("  }\n");
      code.append("  public static Float valueOf(float f) { return new Float(f); }\n");
      code.append("  public float floatValue() { return value; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource FOO = new MockJavaResource("test.Foo") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package test;\n");
      code.append("public class Foo {\n");
      code.append("  public String value() { return \"Foo\"; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource INTEGER = new MockJavaResource("java.lang.Integer") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Integer extends Number {\n");
      code.append("  private int value;\n");
      code.append("  public Integer(int value) {\n");
      code.append("    this.value = value;\n");
      code.append("  }\n");
      code.append("  public static Integer valueOf(int i) { return new Integer(i); }\n");
      code.append("  public int intValue() { return value; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource IS_SERIALIZABLE = new MockJavaResource(
      "com.google.gwt.user.client.rpc.IsSerializable") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package com.google.gwt.user.client.rpc;\n");
      code.append("public interface IsSerializable {\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource JAVASCRIPTOBJECT = new MockJavaResource(
      "com.google.gwt.core.client.JavaScriptObject") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package com.google.gwt.core.client;\n");
      code.append("public class JavaScriptObject {\n");
      code.append("  public static native JavaScriptObject createObject() /*-{ return {}; }-*/;\n");
      code.append("  protected JavaScriptObject() { }\n");
      code.append("  public final String toString() { return \"JavaScriptObject\"; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource LONG = new MockJavaResource("java.lang.Long") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Long extends Number {\n");
      code.append("  private long value;\n");
      code.append("  public Long(long value) {\n");
      code.append("    this.value = value;\n");
      code.append("  }\n");
      code.append("  public static Long valueOf(long l) { return new Long(l); }\n");
      code.append("  public long longValue() { return value; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource MAP = new MockJavaResource("java.util.Map") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.util;\n");
      code.append("public interface Map<K,V> { }\n");
      return code;
    }
  };
  public static final MockJavaResource NO_CLASS_DEF_FOUND_ERROR = new MockJavaResource(
      "java.lang.NoClassDefFoundError") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class NoClassDefFoundError extends Error {\n");
      code.append("  public NoClassDefFoundError() {}\n");
      code.append("  public NoClassDefFoundError(String msg) {}\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource NUMBER = new MockJavaResource("java.lang.Number") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Number implements java.io.Serializable {\n");
      code.append("}\n");
      return code;
    }
  };

  public static final MockJavaResource OBJECT = new MockJavaResource("java.lang.Object") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Object {\n");
      code.append("  public boolean equals(Object that){return this == that;}");
      code.append("  public int hashCode() { return 0; }\n");
      code.append("  public String toString() { return \"Object\"; }\n");
      code.append("  public Object clone() { return this; } ");
      code.append("  public Class<?> getClass() { return Object.class; } ");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource SERIALIZABLE = new MockJavaResource("java.io.Serializable") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.io;\n");
      code.append("public interface Serializable { }\n");
      return code;
    }
  };
  public static final MockJavaResource SHORT = new MockJavaResource("java.lang.Short") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Short extends Number {\n");
      code.append("  private short value;\n");
      code.append("  public Short(short value) {\n");
      code.append("    this.value = value;\n");
      code.append("  }\n");
      code.append("  public static Short valueOf(short s) { return new Short(s); }\n");
      code.append("  public short shortValue() { return value; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource STRING = new MockJavaResource("java.lang.String") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("import java.io.Serializable;\n");
      code.append("public final class String implements Serializable {\n");
      code.append("  public String() { }\n");
      code.append("  public String(char c) { }\n");
      code.append("  public String(String s) { }\n");
      code.append("  public static String _String() { return \"\"; }\n");
      code.append("  public static String _String(char c) { return \"\" + c; }\n");
      code.append("  public static String _String(String s) { return s; }\n");
      code.append("  private static final long serialVersionUID = 0L;\n");
      code.append("  public char charAt(int index) { return 'a'; }\n");
      code.append("  public boolean equals(Object obj) { return false; }\n");
      code.append("  public boolean equalsIgnoreCase(String str) { return false; }\n");
      code.append("  public int length() { return 0; }\n");
      code.append("  public static String valueOf(int i) { return \"\" + i; }\n");
      code.append("  public static String valueOf(char c) { return \"\" + c; }\n");
      code.append("  public static String valueOf(long l) { return \"\" + l; }\n");
      code.append("  public int hashCode() { return 0; }\n");
      code.append("  public String replace(char c1, char c2) { return null; }\n");
      code.append("  public boolean startsWith(String str) { return false; }\n");
      code.append("  public String toLowerCase() { return null; }\n");
      code.append("  public static String valueOf(boolean b) { return null; }\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource STRING_BUILDER = new MockJavaResource(
      "java.lang.StringBuilder") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public final class StringBuilder {\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource SUPPRESS_WARNINGS = new MockJavaResource(
      "java.lang.SuppressWarnings") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public @interface SuppressWarnings {\n");
      code.append("  String[] value();\n");
      code.append("}\n");
      return code;
    }
  };
  public static final MockJavaResource THROWABLE = new MockJavaResource("java.lang.Throwable") {
    @Override
    public CharSequence getContent() {
      StringBuilder code = new StringBuilder();
      code.append("package java.lang;\n");
      code.append("public class Throwable {\n");
      code.append("  public String getMessage() { return \"\"; }\n");
      code.append("  public Throwable getCause() { return null; }\n");
      code.append("}\n");
      return code;
    }
  };

  public static MockJavaResource[] getStandardResources() {
    return new MockJavaResource[]{
        ANNOTATION, BYTE, BOOLEAN, CHARACTER, CLASS, CLASS_NOT_FOUND_EXCEPTION, COLLECTION, DOUBLE,
        ENUM, EXCEPTION, ERROR, FLOAT, INTEGER, IS_SERIALIZABLE, JAVASCRIPTOBJECT, LONG, MAP,
        NO_CLASS_DEF_FOUND_ERROR, NUMBER, OBJECT, SERIALIZABLE, SHORT, STRING, STRING_BUILDER,
        SUPPRESS_WARNINGS, THROWABLE};
  }
}
