// 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 Date.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());
}
