// 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.

/// @assertion Evaluation of e proceeds as follows:
/// First, if e is of the form
/// const T.id(a1, ..., an, xn+1: an+1, ..., xn+k: an+k) then let i be the
/// value of the expression new T.id(a1, ..., an, xn+1: an+1, ..., xn+k: an+k).
/// Otherwise, e must be of the form
/// const T(a1, ..., an, xn+1: an+1, ..., xn+k: an+k), in which case let i be
/// the result of evaluating new T(a1, ..., an, xn+1: an+1, ..., xn+k: an+k).
/// Then:
/// • If during execution of the program, a constant object expression has
///   already evaluated to an instance j of class R with type arguments Vi,
///   1 <= i <= m, then:
///   – For each instance variable f of i, let vif be the value of the field f
///     in i, and let vjf be the value of the field f in j.
///     If identical(vif, vjf ) for all fields f in i, then the value of e is j,
///     otherwise the value of e is i.
/// • Otherwise the value of e is i.
/// In other words, constant objects are canonicalized.
/// @description Checks that result of an expression of the form
/// T(a1, ..., an, xn+1: an+1, ..., xn+k: an+k) is an instance of T.
/// @author msyabro

import '../../../../Utils/expect.dart';

class A {
  const A();
}

class B {
  const B(p1);
}

class C {
  const C({p1, p2});
}

class D {
  const D(p1, [p2]);
}

main() {
  Expect.isTrue(const A() is A);
  Expect.isTrue(const B(0) is B);
  Expect.isTrue(const C(p2: true, p1: "") is C);
  Expect.isTrue(const D(0, 0) is D);
  Expect.runtimeIsType<A>(const A());
  Expect.runtimeIsType<B>(const B(0));
  Expect.runtimeIsType<C>(const C(p2: true, p1: ""));
  Expect.runtimeIsType<D>(const D(0, 0));
}
