/*
 * 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 AUTOCLOSEABLE =
      createMockJavaResource("java.lang.AutoCloseable",
          "package java.lang;",
          "import java.lang.Exception;",
          "public interface AutoCloseable {",
          "  void close() throws Exception; ",
          "}");

  public static final MockJavaResource ANNOTATION =
      createMockJavaResource("java.lang.annotation.Annotation",
          "package java.lang.annotation;",
          "public interface Annotation {",
          "}");

  public static final MockJavaResource BAR =
      createMockJavaResource("test.Bar",
          "package test;",
          "public class Bar extends Foo {",
          "  public String value() { return \"Bar\"; }",
          "}");

  public static final MockJavaResource BOOLEAN =
      createMockJavaResource("java.lang.Boolean",
          "package java.lang;",
          "public class Boolean {",
          "  private boolean value;",
          "  public Boolean(boolean value) {",
          "    this.value = value;",
          "  }",
          "  public static Boolean valueOf(boolean b) { return new Boolean(b); }",
          "  public boolean booleanValue() { return value; }",
          "}");

  public static final MockJavaResource BYTE =
      createMockJavaResource("java.lang.Byte",
          "package java.lang;",
          "public class Byte extends Number {",
          "  private byte value;",
          "  public Byte(byte value) {",
          "    this.value = value;",
          "  }",
          "  public static Byte valueOf(byte b) { return new Byte(b); }",
          "  public byte byteValue() { return value; }",
          "}\n");

  public static final MockJavaResource CHARACTER =
      createMockJavaResource("java.lang.Character",
          "package java.lang;",
          "public class Character {",
          "  private char value;",
          "  public Character(char value) {",
          "    this.value = value;",
          "  }",
          "  public static Character valueOf(char c) { return new Character(c); }",
          "  public char charValue() { return value; }",
          "}");

  public static final MockJavaResource CHAR_SEQUENCE =
      createMockJavaResource("java.lang.CharSequence",
          "package java.lang;",
          "public interface CharSequence {",
          "  char charAt(int index);",
          "  int length();",
          "  String toString();",
          "}");

  public static final MockJavaResource CLASS =
      createMockJavaResource("java.lang.Class",
          "package java.lang;",
          "public class Class<T> {",
          "  public String getName() { return null; }",
          "  public String getSimpleName() { return null; }",
          "}");

  public static final MockJavaResource CLASS_NOT_FOUND_EXCEPTION =
      createMockJavaResource("java.lang.ClassNotFoundException",
          "package java.lang;",
          "public class ClassNotFoundException extends Exception {",
          "  public ClassNotFoundException() {}",
          "  public ClassNotFoundException(String msg) {}",
          "  public ClassNotFoundException(String msg, Throwable t) {}",
          "  public Throwable getCause() { return null; }",
          "  public Throwable getException() { return null; }",
          "}");

  public static final MockJavaResource CLONEABLE =
      createMockJavaResource("java.lang.Cloneable",
          "package java.lang;",
          "public interface Cloneable {}");

  public static final MockJavaResource COLLECTION =
      createMockJavaResource("java.util.Collection",
          "package java.util;",
          "public interface Collection<E> {",
          "}");

  public static final MockJavaResource COMPARABLE =
      createMockJavaResource("java.lang.Comparable",
          "package java.lang;",
          "public interface Comparable<T> {",
          "  public int compareTo(T other);",
          "}");

  public static final MockJavaResource DOUBLE =
      createMockJavaResource("java.lang.Double",
          "package java.lang;",
          "public class Double extends Number {",
          "  private double value;",
          "  public Double(double value) {",
          "    this.value = value;",
          "  }",
          "  public static boolean isNaN(double d) { return false; }",
          "  public static Double valueOf(double d) { return new Double(d); }",
          "  public double doubleValue() { return value; }",
          "}");

  public static final MockJavaResource ENUM =
      createMockJavaResource("java.lang.Enum",
          "package java.lang;",
          "import java.io.Serializable;",
          "public abstract class Enum<E extends Enum<E>> implements Serializable {",
          "  protected Enum(String name, int ordinal) {}",
          "  protected static Object createValueOfMap(Enum[] constants) { return null; }",
          "  protected static Enum valueOf(Object map, String name) { return null; }",
          "}");

  public static final MockJavaResource ERROR =
      createMockJavaResource("java.lang.Error",
          "package java.lang;",
          "public class Error extends Throwable {",
          "}");

  public static final MockJavaResource EXCEPTION =
      createMockJavaResource("java.lang.Exception",
          "package java.lang;",
          "public class Exception extends Throwable {",
          "}");

  public static final MockJavaResource FLOAT =
      createMockJavaResource("java.lang.Float",
          "package java.lang;",
          "public class Float extends Number {",
          "  private float value;",
          "  public Float(float value) {",
          "    this.value = value;",
          "  }",
          "  public static Float valueOf(float f) { return new Float(f); }",
          "  public float floatValue() { return value; }",
          "}");

  public static final MockJavaResource FOO =
      createMockJavaResource("test.Foo",
          "package test;",
          "public class Foo {",
          "  public String value() { return \"Foo\"; }",
          "}");

  public static final MockJavaResource FUNCTIONALINTERFACE =
      createMockJavaResource("java.lang.FunctionalInterface",
          "package java.lang;",
          "public @interface FunctionalInterface {",
          "}");

  public static final MockJavaResource INTEGER =
      createMockJavaResource("java.lang.Integer",
          "package java.lang;",
          "public class Integer extends Number {",
          "  private int value;",
          "  public Integer(int value) {",
          "    this.value = value;",
          "  }",
          "  public static Integer valueOf(int i) { return new Integer(i); }",
          "  public int intValue() { return value; }",
          "}");

  public static final MockJavaResource IS_SERIALIZABLE =
      createMockJavaResource("com.google.gwt.user.client.rpc.IsSerializable",
          "package com.google.gwt.user.client.rpc;",
          "public interface IsSerializable {",
          "}");

  public static final MockJavaResource JAVASCRIPTEXCEPTION =
      createMockJavaResource("com.google.gwt.core.client.JavaScriptException",
          "package com.google.gwt.core.client;",
          "public class JavaScriptException extends RuntimeException {",
          "}");

  public static final MockJavaResource JAVASCRIPTOBJECT =
      createMockJavaResource("com.google.gwt.core.client.JavaScriptObject",
          "package com.google.gwt.core.client;",
          "public class JavaScriptObject {",
          "  public static Object createArray() {return null;}",
          "  public static native JavaScriptObject createObject() /*-{ return {}; }-*/;",
          "  protected JavaScriptObject() { }",
          "  public final String toString() { return \"JavaScriptObject\"; }",
          "}");

  public static final MockJavaResource LIST =
      createMockJavaResource("java.util.List",
          "package java.util;",
          "public interface List<T> extends Collection<T> {",
          "  public T get(int i);",
          "}");

  public static final MockJavaResource ARRAY_LIST =
      createMockJavaResource("java.util.ArrayList",
          "package java.util;",
          "public class ArrayList<T> implements List<T> {",
          "  public T get(int i) { return null; }",
          "}");

  public static final MockJavaResource LONG =
      createMockJavaResource("java.lang.Long",
          "package java.lang;",
          "public class Long extends Number {",
          "  private long value;",
          "  public Long(long value) {",
          "    this.value = value;",
          "  }",
          "  public static Long valueOf(long l) { return new Long(l); }",
          "  public long longValue() { return value; }",
          "}");

  public static final MockJavaResource MAP =
      createMockJavaResource("java.util.Map",
          "package java.util;",
          "public interface Map<K,V> { }");

  public static final MockJavaResource NO_CLASS_DEF_FOUND_ERROR =
      createMockJavaResource("java.lang.NoClassDefFoundError",
          "package java.lang;",
          "public class NoClassDefFoundError extends Error {",
          "  public NoClassDefFoundError() {}",
          "  public NoClassDefFoundError(String msg) {}",
          "}");

  public static final MockJavaResource NUMBER =
      createMockJavaResource("java.lang.Number",
          "package java.lang;",
          "public class Number implements java.io.Serializable {",
          "  public double doubleValue() { return 0; }",
          "}");

  public static final MockJavaResource OBJECT =
      createMockJavaResource("java.lang.Object",
          "package java.lang;",
          "public class Object {",
          "  private Class<?> ___clazz;",
          "  public Object castableTypeMap = null;",
          "  public Object typeMarker = null;",
          "  public boolean equals(Object that){return this == that;}",
          "  public int hashCode() { return 0; }",
          "  public String toString() { return \"Object\"; }",
          "  public Class<?> getClass() { return ___clazz; }",
          "}");

  public static final MockJavaResource RUNTIME_EXCEPTION =
      createMockJavaResource("java.lang.RuntimeException",
          "package java.lang;",
          "public class RuntimeException extends Exception {",
          "  public RuntimeException() {}",
          "  public RuntimeException(String message) {}",
          "}");

  public static final MockJavaResource SERIALIZABLE =
      createMockJavaResource("java.io.Serializable",
          "package java.io;",
          "public interface Serializable { }");

  public static final MockJavaResource SHORT =
      createMockJavaResource("java.lang.Short",
          "package java.lang;",
          "public class Short extends Number {",
          "  private short value;",
          "  public Short(short value) {",
          "    this.value = value;",
          "  }",
          "  public static Short valueOf(short s) { return new Short(s); }",
          "  public short shortValue() { return value; }",
          "}");

  public static final MockJavaResource STRING =
      createMockJavaResource("java.lang.String",
          "package java.lang;",
          "import java.io.Serializable;",
          "import javaemul.internal.annotations.SpecializeMethod;",
          "public final class String implements Comparable<String>, CharSequence, Serializable {",
          "  public String() { }",
          "  public String(char c) { }",
          "  public String(String s) { }",
          "  public static String _String() { return \"\"; }",
          "  public static String _String(char c) { return \"\" + c; }",
          "  public static String _String(String s) { return s; }",
          "  public char charAt(int index) { return 'a'; }",
          "  public int compareTo(String other) { return -1; }",
          "  @SpecializeMethod(params = String.class, target = \"equals\")",
          "  public boolean equals(Object other) {",
          "    return (other instanceof String) && equals((String) other);",
          "  }",
          "  private native boolean equals(String obj) /*-{ return false; }-*/;",
          "  public boolean equalsIgnoreCase(String str) { return false; }",
          "  public native boolean isEmpty() /*-{ return true; }-*/;",
          "  public int length() { return 0; }",
          "  public static String valueOf(int i) { return \"\" + i; }",
          "  public static String valueOf(char c) { return \"\" + c; }",
          "  public int hashCode() { return 0; }",
          "  public String replace(char c1, char c2) { return null; }",
          "  public boolean startsWith(String str) { return false; }",
          "  public native String substring(int start, int len) /*-{ return \"\"; }-*/;",
          "  public String toLowerCase() { return null; }",
          "  public String toString() { return this; }",
          "  public static String valueOf(boolean b) { return null; }",
          "}");

  public static final MockJavaResource STRING_BUILDER =
      createMockJavaResource("java.lang.StringBuilder",
          "package java.lang;",
          "public final class StringBuilder {",
          "}");

  public static final MockJavaResource SUPPRESS_WARNINGS =
      createMockJavaResource("java.lang.SuppressWarnings",
          "package java.lang;",
          "public @interface SuppressWarnings {",
          "  String[] value();",
          "}");

  public static final MockJavaResource SYSTEM =
      createMockJavaResource("java.lang.System",
          "package java.lang;",
          "public class System {",
          "  public static String getProperty(String propertyName) { return null; }",
          "  public static String getProperty(String propertyName, String defaultValue) {",
          "    return defaultValue;",
          "  }",
          "}");

  public static final MockJavaResource THROWABLE =
      createMockJavaResource("java.lang.Throwable",
          "package java.lang;",
          "public class Throwable {",
          "  public String getMessage() { return \"\"; }",
          "  public Throwable getCause() { return null; }",
          "  public void addSuppressed(Throwable ex) { }",
          "}");

  public static final MockJavaResource SPECIALIZE_METHOD =
      createMockJavaResource("javaemul.internal.annotations.SpecializeMethod",
          "package javaemul.internal.annotations;",
          "public @interface SpecializeMethod {",
          "  Class<?>[] params();",
          "  String target();",
          "}"
      );

  public static final MockJavaResource DO_NOT_AUTOBOX =
      createMockJavaResource("javaemul.internal.annotations.DoNotAutobox",
          "package javaemul.internal.annotations;",
          "public @interface DoNotAutobox {\n",
          "}"
      );
  // TODO: move JS* annotations to intrinsic mock resource base
  public static final MockJavaResource JSTYPE =
      createMockJavaResource("jsinterop.annotations.JsType",
          "package jsinterop.annotations;",
          "public @interface JsType {",
          "  String namespace() default \"\";",
          "  String name() default \"\";",
          "  boolean isNative() default false;",
          "}"
      );
  public static final MockJavaResource JSCONSTRUCTOR =
      createMockJavaResource("jsinterop.annotations.JsConstructor",
          "package jsinterop.annotations;",
          "public @interface JsConstructor {",
          "}");
  public static final MockJavaResource JSPACKAGE =
      createMockJavaResource("jsinterop.annotations.JsPackage",
          "package jsinterop.annotations;",
          "public @interface JsPackage {",
          "  String GLOBAL = \"<global>\";",
          "  String namespace();",
          "}");
  public static final MockJavaResource JSPROPERTY =
      createMockJavaResource("jsinterop.annotations.JsProperty",
          "package jsinterop.annotations;",
          "public @interface JsProperty {",
          "  String namespace() default \"\";",
          "  String name() default \"\";",
          "}");
  public static final MockJavaResource JSMETHOD =
      createMockJavaResource("jsinterop.annotations.JsMethod",
          "package jsinterop.annotations;",
          "public @interface JsMethod {\n",
          "  String namespace() default \"\";",
          "  String name() default \"\";",
          "}");
  public static final MockJavaResource JSIGNORE =
      createMockJavaResource("jsinterop.annotations.JsIgnore",
          "package jsinterop.annotations;",
          "public @interface JsIgnore {",
          "}");
  public static final MockJavaResource JSFUNCTION =
      createMockJavaResource("jsinterop.annotations.JsFunction",
          "package jsinterop.annotations;",
          "public @interface JsFunction {",
          "}");
  public static final MockJavaResource JSOPTIONAL =
      createMockJavaResource("jsinterop.annotations.JsOptional",
          "package jsinterop.annotations;",
          "public @interface JsOptional {",
          "}");
  public static final MockJavaResource JSOVERLAY =
      createMockJavaResource("jsinterop.annotations.JsOverlay",
          "package jsinterop.annotations;",
          "public @interface JsOverlay {",
          "}");

  public static MockJavaResource[] getStandardResources() {
    return new MockJavaResource[] {
        AUTOCLOSEABLE, ANNOTATION, ARRAY_LIST, BYTE, BOOLEAN, CHARACTER, CHAR_SEQUENCE, CLASS,
        CLASS_NOT_FOUND_EXCEPTION, CLONEABLE, COLLECTION, COMPARABLE, DOUBLE, ENUM, EXCEPTION,
        ERROR, FUNCTIONALINTERFACE, FLOAT, INTEGER, IS_SERIALIZABLE, JAVASCRIPTEXCEPTION,
        JAVASCRIPTOBJECT, LIST, LONG, MAP, NO_CLASS_DEF_FOUND_ERROR, NUMBER, OBJECT,
        RUNTIME_EXCEPTION, SERIALIZABLE, SHORT, STRING, STRING_BUILDER, SUPPRESS_WARNINGS, SYSTEM,
        THROWABLE, SPECIALIZE_METHOD, DO_NOT_AUTOBOX, JSTYPE, JSCONSTRUCTOR, JSPACKAGE, JSPROPERTY,
        JSMETHOD, JSIGNORE, JSFUNCTION, JSOVERLAY, JSOPTIONAL};
  }

  /**
   * Creates a new MockJavaResource.
   */
  public static MockJavaResource createMockJavaResource(String resourceName,
      final String... lines) {
    return new MockJavaResource(resourceName) {
      @Override
      public CharSequence getContent() {
        StringBuilder code = new StringBuilder();
        for (String line : lines) {
          code.append(line + "\n");
        }
        return code;
      }
    };
  }

  /**
   * Creates a new MockResource.
   */
  public static MockResource createMockResource(String resourceName,
      final String... lines) {
    return new MockResource(resourceName) {
      @Override
      public CharSequence getContent() {
        StringBuilder code = new StringBuilder();
        for (String line : lines) {
          code.append(line + "\n");
        }
        return code;
      }
    };
  }
}
