// 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.
// Dart test program for testing static const fields.

// @dart = 2.9

import "package:expect/expect.dart";

abstract class Spain {
  static const AG = "Antoni Gaudi";
  static const SD = "Salvador Dali";
}

abstract class Switzerland {
  static const AG = "Alberto Giacometti";
  static const LC = "Le Corbusier";
}

class A implements Switzerland {
  const A() : n = 5;
  final n;
  static const a = const A();
  static const b = 3 + 5;
  static const c = A.b + 7;
  static const d = const A();
  static const s1 = "hula";
  static const s2 = "hula";
  static const s3 = "hop";
  static const d1 = 1.1;
  static const d2 = 0.55 + 0.55;
  static const artist2 = Switzerland.AG;
  static const architect1 = Spain.AG;
  static const array1 = const <int>[1, 2];
  static const map1 = const {
    "Monday": 1,
    "Tuesday": 2,
  };
}

class StaticFinalFieldTest {
  static testMain() {
    Expect.equals(15, A.c);
    Expect.equals(8, A.b);
    Expect.equals(5, A.a.n);
    Expect.equals(true, identical(8, A.b));
    Expect.equals(true, identical(A.a, A.d));
    Expect.equals(true, identical(A.s1, A.s2));
    Expect.equals(false, identical(A.s1, A.s3));
    Expect.equals(false, identical(A.s1, A.b));
    Expect.equals(true, identical(A.d1, A.d2));
    Expect.equals(true, Spain.SD == "Salvador Dali");
    Expect.equals(true, A.artist2 == "Alberto Giacometti");
    Expect.equals(true, A.architect1 == "Antoni Gaudi");
    Expect.equals(2, A.map1["Tuesday"]);
  }
}

main() {
  StaticFinalFieldTest.testMain();
}
