// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// VMOptions=--enable_type_checks --no_show_internal_names
// Dart test program testing type checks.
import "package:expect/expect.dart";

class TypeTest {
  static test() {
    int result = 0;
    try {
      int i = "hello";  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result = 1;
      Expect.equals("int", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("i", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(12, error.line);
      Expect.equals(15, error.column);
    }
    return result;
  }

  static testSideEffect() {
    int result = 0;
    int index() {
      result++;
      return 0;
    }
    try {
      List<int> a = new List<int>(1);
      a[0] = 0;
      a[index()]++;  // Type check succeeds, but does not create side effects.
      Expect.equals(1, a[0]);
    } on TypeError catch (error) {
      result = 100;
    }
    return result;
  }

  static testArgument() {
    int result = 0;
    int f(int i) {
      return i;
    }
    try {
      int i = f("hello");  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result = 1;
      Expect.equals("int", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("i", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(49, error.line);
      Expect.equals(15, error.column);
    }
    return result;
  }

  static testReturn() {
    int result = 0;
    int f(String s) {
      return s;
    }
    try {
      int i = f("hello");  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result = 1;
      Expect.equals("int", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("function result", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(74, error.line);
      Expect.equals(14, error.column);
    }
    return result;
  }

  static int field;
  static testField() {
    int result = 0;
    try {
      field = "hello";  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result = 1;
      Expect.equals("int", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("field", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(99, error.line);
      Expect.equals(15, error.column);
    }
    return result;
  }

  static testAnyFunction() {
    int result = 0;
    Function anyFunction;
    f() { };
    anyFunction = f;  // No error.
    try {
      int i = f;  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result = 1;
      Expect.equals("int", error.dstType);
      Expect.equals("() => dynamic", error.srcType);
      Expect.equals("i", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(123, error.line);
      Expect.equals(15, error.column);
    }
    return result;
  }

  static testVoidFunction() {
    int result = 0;
    Function anyFunction;
    void acceptVoidFunObj(void voidFunObj(Object obj)) { };
    void acceptObjFunObj(Object objFunObj(Object obj)) { };
    void voidFunObj(Object obj) { };
    Object objFunObj(Object obj) { return obj; };
    anyFunction = voidFunObj;  // No error.
    anyFunction = objFunObj;  // No error.
    acceptVoidFunObj(voidFunObj);
    acceptVoidFunObj(objFunObj);
    acceptObjFunObj(objFunObj);
    try {
      acceptObjFunObj(voidFunObj);  // Throws a TypeError.
    } on TypeError catch (error) {
      result = 1;
      Expect.equals("(Object) => Object", error.dstType);
      Expect.equals("(Object) => void", error.srcType);
      Expect.equals("objFunObj", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(145, error.line);
      Expect.equals(33, error.column);
    }
    return result;
  }

  static testFunctionNum() {
    int result = 0;
    Function anyFunction;
    void acceptFunNum(void funNum(num n)) { };
    void funObj(Object obj) { };
    void funNum(num n) { };
    void funInt(int i) { };
    void funString(String s) { };
    anyFunction = funObj;  // No error.
    anyFunction = funNum;  // No error.
    anyFunction = funInt;  // No error.
    anyFunction = funString;  // No error.
    acceptFunNum(funObj);  // No error.
    acceptFunNum(funNum);  // No error.
    acceptFunNum(funInt);  // No error.
    try {
      acceptFunNum(funString);  // Throws an error.
    } on TypeError catch (error) {
      result = 1;
      Expect.equals("(num) => void", error.dstType);
      Expect.equals("(String) => void", error.srcType);
      Expect.equals("funNum", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(175, error.line);
      Expect.equals(28, error.column);
    }
    return result;
  }

  static testBoolCheck() {
    int result = 0;
    try {
      bool i = !"hello";  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result++;
      Expect.equals("bool", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("boolean expression", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(209, error.line);
      Expect.equals(17, error.column);
    }
    try {
      while ("hello") {};  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result++;
      Expect.equals("bool", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("boolean expression", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(225, error.line);
      Expect.equals(14, error.column);
    }
    try {
      do {} while ("hello");  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result++;
      Expect.equals("bool", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("boolean expression", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(241, error.line);
      Expect.equals(20, error.column);
    }
    try {
      for (;"hello";) {};  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result++;
      Expect.equals("bool", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("boolean expression", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(257, error.line);
      Expect.equals(13, error.column);
    }
    try {
      int i = "hello" ? 1 : 0;  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result++;
      Expect.equals("bool", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("boolean expression", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(273, error.line);
      Expect.equals(15, error.column);
    }
    try {
      if ("hello") {};  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result++;
      Expect.equals("bool", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("boolean expression", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(289, error.line);
      Expect.equals(11, error.column);
    }
    try {
      if ("hello" || false) {};  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result++;
      Expect.equals("bool", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("boolean expression", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(305, error.line);
      Expect.equals(11, error.column);
    }
    try {
      if (false || "hello") {};  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result++;
      Expect.equals("bool", error.dstType);
      Expect.equals("String", error.srcType);
      Expect.equals("boolean expression", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(321, error.line);
      Expect.equals(20, error.column);
    }
    try {
      if (null) {};  // Throws a TypeError if type checks are enabled.
    } on TypeError catch (error) {
      result++;
      Expect.equals("bool", error.dstType);
      Expect.equals("Null", error.srcType);
      Expect.equals("boolean expression", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(337, error.line);
      Expect.equals(11, error.column);
    }
    return result;
  }


  static int testFactory() {
    int result = 0;
    try {
      var x = new C();
    } on TypeError catch (error) {
      result++;
      Expect.equals("C", error.dstType);
      Expect.equals("int", error.srcType);
      Expect.equals("function result", error.dstName);
      int pos = error.url.lastIndexOf("/", error.url.length);
      if (pos == -1) {
        pos = error.url.lastIndexOf("\\", error.url.length);
      }
      String subs = error.url.substring(pos + 1, error.url.length);
      Expect.equals("type_vm_test.dart", subs);
      Expect.equals(560, error.line);
      Expect.equals(12, error.column);
    }
    return result;
  }

  static int testListAssigment() {
    int result = 0;
    {
      var a = new List(5);
      List a0 = a;
      List<Object> ao = a;
      List<int> ai = a;
      List<num> an = a;
      List<String> as = a;
    }
    {
      var a = new List<Object>(5);
      List a0 = a;
      List<Object> ao = a;
      try {
        List<int> ai = a;
      } on TypeError catch (error) {
        result++;
        Expect.equals("List<int>", error.dstType);
        Expect.equals("List<Object>", error.srcType);
        Expect.equals("ai", error.dstName);
        int pos = error.url.lastIndexOf("/", error.url.length);
        if (pos == -1) {
          pos = error.url.lastIndexOf("\\", error.url.length);
        }
        String subs = error.url.substring(pos + 1, error.url.length);
        Expect.equals("type_vm_test.dart", subs);
        Expect.equals(392, error.line);
        Expect.equals(24, error.column);
      }
      try {
        List<num> an = a;
      } on TypeError catch (error) {
        result++;
        Expect.equals("List<num>", error.dstType);
        Expect.equals("List<Object>", error.srcType);
        Expect.equals("an", error.dstName);
        int pos = error.url.lastIndexOf("/", error.url.length);
        if (pos == -1) {
          pos = error.url.lastIndexOf("\\", error.url.length);
        }
        String subs = error.url.substring(pos + 1, error.url.length);
        Expect.equals("type_vm_test.dart", subs);
        Expect.equals(408, error.line);
        Expect.equals(24, error.column);
      }
      try {
        List<String> as = a;
      } on TypeError catch (error) {
        result++;
        Expect.equals("List<String>", error.dstType);
        Expect.equals("List<Object>", error.srcType);
        Expect.equals("as", error.dstName);
        int pos = error.url.lastIndexOf("/", error.url.length);
        if (pos == -1) {
          pos = error.url.lastIndexOf("\\", error.url.length);
        }
        String subs = error.url.substring(pos + 1, error.url.length);
        Expect.equals("type_vm_test.dart", subs);
        Expect.equals(424, error.line);
        Expect.equals(27, error.column);
      }
    }
    {
      var a = new List<int>(5);
      List a0 = a;
      List<Object> ao = a;
      List<int> ai = a;
      List<num> an = a;
      try {
        List<String> as = a;
      } on TypeError catch (error) {
        result++;
        Expect.equals("List<String>", error.dstType);
        Expect.equals("List<int>", error.srcType);
        Expect.equals("as", error.dstName);
        int pos = error.url.lastIndexOf("/", error.url.length);
        if (pos == -1) {
          pos = error.url.lastIndexOf("\\", error.url.length);
        }
        String subs = error.url.substring(pos + 1, error.url.length);
        Expect.equals("type_vm_test.dart", subs);
        Expect.equals(447, error.line);
        Expect.equals(27, error.column);
      }
    }
    {
      var a = new List<num>(5);
      List a0 = a;
      List<Object> ao = a;
      try {
        List<int> ai = a;
      } on TypeError catch (error) {
        result++;
        Expect.equals("List<int>", error.dstType);
        Expect.equals("List<num>", error.srcType);
        Expect.equals("ai", error.dstName);
        int pos = error.url.lastIndexOf("/", error.url.length);
        if (pos == -1) {
          pos = error.url.lastIndexOf("\\", error.url.length);
        }
        String subs = error.url.substring(pos + 1, error.url.length);
        Expect.equals("type_vm_test.dart", subs);
        Expect.equals(468, error.line);
        Expect.equals(24, error.column);
      }
      List<num> an = a;
      try {
        List<String> as = a;
      } on TypeError catch (error) {
        result++;
        Expect.equals("List<String>", error.dstType);
        Expect.equals("List<num>", error.srcType);
        Expect.equals("as", error.dstName);
        int pos = error.url.lastIndexOf("/", error.url.length);
        if (pos == -1) {
          pos = error.url.lastIndexOf("\\", error.url.length);
        }
        String subs = error.url.substring(pos + 1, error.url.length);
        Expect.equals("type_vm_test.dart", subs);
        Expect.equals(485, error.line);
        Expect.equals(27, error.column);
      }
    }
    {
      var a = new List<String>(5);
      List a0 = a;
      List<Object> ao = a;
      try {
        List<int> ai = a;
      } on TypeError catch (error) {
        result++;
        Expect.equals("List<int>", error.dstType);
        Expect.equals("List<String>", error.srcType);
        Expect.equals("ai", error.dstName);
        int pos = error.url.lastIndexOf("/", error.url.length);
        if (pos == -1) {
          pos = error.url.lastIndexOf("\\", error.url.length);
        }
        String subs = error.url.substring(pos + 1, error.url.length);
        Expect.equals("type_vm_test.dart", subs);
        Expect.equals(506, error.line);
        Expect.equals(24, error.column);
      }
      try {
        List<num> an = a;
      } on TypeError catch (error) {
        result++;
        Expect.equals("List<num>", error.dstType);
        Expect.equals("List<String>", error.srcType);
        Expect.equals("an", error.dstName);
        int pos = error.url.lastIndexOf("/", error.url.length);
        if (pos == -1) {
          pos = error.url.lastIndexOf("\\", error.url.length);
        }
        String subs = error.url.substring(pos + 1, error.url.length);
        Expect.equals("type_vm_test.dart", subs);
        Expect.equals(522, error.line);
        Expect.equals(24, error.column);
      }
      List<String> as = a;
    }
    return result;
  }

  static testMain() {
    Expect.equals(1, test());
    Expect.equals(1, testSideEffect());
    Expect.equals(1, testArgument());
    Expect.equals(1, testReturn());
    Expect.equals(1, testField());
    Expect.equals(1, testAnyFunction());
    Expect.equals(1, testVoidFunction());
    Expect.equals(1, testFunctionNum());
    Expect.equals(9, testBoolCheck());
    Expect.equals(1, testFactory());
    Expect.equals(8, testListAssigment());
  }
}


class C {
  factory C() {
    return 1;  // Implicit result type is 'C', not int.
  }
}


main() {
  TypeTest.testMain();
}
