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

// @dart = 2.7

// This program has many similar constants that should all have distinct
// identities. They are sufficiently similar to have name collisions and need
// ordering by constant value.

import "package:expect/expect.dart";

enum E { A, B, C, D }

class Z {
  final a, b, c, d, e, f;
  const Z({this.a: 1, this.b: 1, this.c: 1, this.d: 1, this.e: 1, this.f: 1});
}

const c1 = const {};
const c2 = const <int, int>{};
const c3 = const <dynamic, int>{};
const c4 = const <int, dynamic>{};
const l1 = const [];
const l2 = const <int>[];
const l3 = const <String>[];
const l4 = const <num>[];

const ll1 = const [1, 2, 3, 4, 5, 6, 7];
const ll2 = const [1, 8, 3, 4, 5, 6, 7];
const ll3 = const [1, 2, 8, 4, 5, 6, 7];
const ll4 = const [1, 2, 3, 4, 8, 6, 7];

const m1 = const <dynamic, dynamic>{1: 1, 2: 2};
const m2 = const <dynamic, dynamic>{1: 2, 2: 1};
const m3 = const <dynamic, dynamic>{1: 1, 2: 1};
const m4 = const <dynamic, dynamic>{1: 2, 2: 2};
const m5 = const <dynamic, dynamic>{2: 1, 1: 2};
const m6 = const <dynamic, dynamic>{2: 2, 1: 1};
const m7 = const <dynamic, dynamic>{2: 1, 1: 1};
const m8 = const <dynamic, dynamic>{2: 2, 1: 2};
const m9 = const <int, int>{1: 1, 2: 2};
const mA = const <int, int>{1: 2, 2: 1};
const mB = const <int, int>{1: 1, 2: 1};
const mC = const <int, int>{1: 2, 2: 2};

const mE1 = const {E.A: E.B};
const mE2 = const {E.A: E.C};
const mE3 = const {E.A: 0, E.B: 0};
const mE4 = const {E.A: 0, E.C: 0};
const mE5 = const {E.A: 0, E.B: 0, E.C: 4};
const mE6 = const {E.A: 0, E.B: 0, E.C: 2};
const mE7 = const {E.A: 0, E.B: 0, E.C: 3};
const mE8 = const {E.A: 0, E.B: 0, E.C: 1};

const z1 = const Z(f: 3);
const z2 = const Z(f: 2);
const z3 = const Z(f: 1);
const z4 = const Z(e: 2);
const z5 = const Z(d: 3);
const z6 = const Z(d: 2);

makeAll() => {
      'E.A': E.A,
      'E.B': E.B,
      'E.C': E.C,
      'E.D': E.D,
      'c1': c1,
      'c2': c2,
      'c3': c3,
      'c4': c4,
      'l1': l1,
      'l2': l2,
      'l3': l3,
      'l4': l4,
      'll1': ll1,
      'll2': ll2,
      'll3': ll3,
      'l4': ll4,
      'm1': m1,
      'm2': m2,
      'm3': m3,
      'm4': m4,
      'm5': m5,
      'm6': m6,
      'm7': m7,
      'm8': m8,
      'm9': m9,
      'mA': mA,
      'mB': mB,
      'mC': mC,
      'mE1': mE1,
      'mE2': mE2,
      'mE3': mE3,
      'mE4': mE4,
      'mE5': mE5,
      'mE6': mE6,
      'mE7': mE7,
      'mE8': mE8,
      'z1': z1,
      'z2': z2,
      'z3': z3,
      'z4': z4,
      'z5': z5,
      'z6': z6,
    };

main() {
  var all1 = makeAll();
  var all2 = makeAll();

  for (var name1 in all1.keys) {
    var e1 = all1[name1];
    for (var name2 in all2.keys) {
      if (name1 == name2) continue;
      var e2 = all2[name2];
      Expect.isFalse(
          identical(e1, e2), 'Different instances  $name1: $e1  $name2: $e2');
    }
  }
}
