// Copyright (c) 2012, 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.

// Test that various type errors doesn't invoke user-defined code
// during error reporting.

class MyClass {}

class IntTypeError {
  toString() {
    int value = wrap(this);
    return super.toString();
  }
}

class StringTypeError {
  toString() {
    String value = wrap(this);
    return super.toString();
  }
}

class DoubleTypeError {
  toString() {
    double value = wrap(this);
    return super.toString();
  }
}

class NumTypeError {
  toString() {
    num value = wrap(this);
    return super.toString();
  }
}

class BoolTypeError {
  toString() {
    bool value = wrap(this);
    return super.toString();
  }
}

class FunctionTypeError {
  toString() {
    Function value = wrap(this);
    return super.toString();
  }
}

class MyClassTypeError {
  toString() {
    MyClass value = wrap(this);
    return super.toString();
  }
}

class ListTypeError {
  toString() {
    List value = wrap(this);
    return super.toString();
  }
}

class IntCastError {
  toString() {
    wrap(this) as int;
    return super.toString();
  }
}

class StringCastError {
  toString() {
    wrap(this) as String;
    return super.toString();
  }
}

class DoubleCastError {
  toString() {
    wrap(this) as double;
    return super.toString();
  }
}

class NumCastError {
  toString() {
    wrap(this) as num;
    return super.toString();
  }
}

class BoolCastError {
  toString() {
    wrap(this) as bool;
    return super.toString();
  }
}

class FunctionCastError {
  toString() {
    wrap(this) as Function;
    return super.toString();
  }
}

class MyClassCastError {
  toString() {
    wrap(this) as MyClass;
    return super.toString();
  }
}

class ListCastError {
  toString() {
    wrap(this) as List;
    return super.toString();
  }
}

/// Defeat optimizations of type checks.
wrap(e) {
  if (new DateTime.now().year == 1980) return null;
  return e;
}

checkTypeError(o) {
  try {
    print(o);
  } on TypeError catch (e) {
    print(e); // This might provoke an error.
    if (assertionsEnabled) return; // Expected type error.
    throw; // Rethrow unexpected type error.
  }
  if (assertionsEnabled) {
    throw 'expected TypeError';
  }
}

checkAssert(o) {
  try {
    assert(o);
  } on TypeError catch (e) {
    print(e); // This might provoke an error.
    if (!assertionsEnabled) throw; // Unexpected error.
  }
}

checkCastError(o) {
  try {
    print(o);
  } on TypeError catch (e) {
    print('unexpected type error: ${Error.safeToString(e)}');
    throw; // Unexpected type error.
  } on CastError catch (e) {
    print(e); // This might provoke an error.
    return; // Expected a cast error.
  }
  throw 'expected CastError';
}

bool assertionsEnabled = false;

main() {
  assert(assertionsEnabled = true);

  checkTypeError(new IntTypeError());
  checkTypeError(new StringTypeError());
  checkTypeError(new DoubleTypeError());
  checkTypeError(new NumTypeError());
  checkTypeError(new BoolTypeError());
  checkTypeError(new FunctionTypeError());
  checkTypeError(new MyClassTypeError());
  checkTypeError(new ListTypeError());

  checkAssert(new IntTypeError());
  checkAssert(new StringTypeError());
  checkAssert(new DoubleTypeError());
  checkAssert(new NumTypeError());
  checkAssert(new BoolTypeError());
  checkAssert(new FunctionTypeError());
  checkAssert(new MyClassTypeError());
  checkAssert(new ListTypeError());

  checkCastError(new IntCastError());
  checkCastError(new StringCastError());
  checkCastError(new DoubleCastError());
  checkCastError(new NumCastError());
  checkCastError(new BoolCastError());
  checkCastError(new FunctionCastError());
  checkCastError(new MyClassCastError());
  checkCastError(new ListCastError());
}
