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

import 'package:expect/expect.dart';

main() {
  const NOT_PRESENT = false;

  Expect.isTrue(const bool.fromEnvironment("dart.library.async"));
  Expect.isTrue(const bool.fromEnvironment("dart.library.collection"));
  Expect.isTrue(const bool.fromEnvironment("dart.library.convert"));
  Expect.isTrue(const bool.fromEnvironment("dart.library.core"));
  Expect.isTrue(const bool.fromEnvironment("dart.library.typed_data"));
  Expect.isTrue(const bool.fromEnvironment("dart.library.developer"));

  // Internal libraries should not be exposed.
  Expect.equals(NOT_PRESENT,
      const bool.fromEnvironment("dart.library._internal",
          defaultValue: NOT_PRESENT));


  bool hasHtmlSupport;
  hasHtmlSupport = true;   /// has_html_support: ok
  hasHtmlSupport = false;  /// has_no_html_support: ok

  if (hasHtmlSupport != null) {
    bool expectedResult = hasHtmlSupport ? true : NOT_PRESENT;

    Expect.equals(expectedResult,
        const bool.fromEnvironment("dart.library.html",
            defaultValue: NOT_PRESENT));
    Expect.equals(expectedResult,
        const bool.fromEnvironment("dart.library.indexed_db",
            defaultValue: NOT_PRESENT));
    Expect.equals(expectedResult,
        const bool.fromEnvironment("dart.library.svg",
            defaultValue: NOT_PRESENT));
    Expect.equals(expectedResult,
        const bool.fromEnvironment("dart.library.web_audio",
            defaultValue: NOT_PRESENT));
    Expect.equals(expectedResult,
        const bool.fromEnvironment("dart.library.web_gl",
            defaultValue: NOT_PRESENT));
    Expect.equals(expectedResult,
        const bool.fromEnvironment("dart.library.web_sql",
            defaultValue: NOT_PRESENT));
  }

  bool hasIoSupport;
  hasIoSupport = true;   /// has_io_support: ok
  hasIoSupport = false;  /// has_no_io_support: ok

  if (hasIoSupport != null) {
    // Dartium overrides 'dart.library.io' to return "false".
    // We don't test for the non-existance, but just make sure that
    // dart.library.io is not set to true.
    Expect.equals(hasIoSupport,
        const bool.fromEnvironment("dart.library.io",
            defaultValue: false));
  }

  bool hasMirrorSupport;
  hasMirrorSupport = true;   /// has_mirror_support: ok
  hasMirrorSupport = false;  /// has_no_mirror_support: ok

  if (hasMirrorSupport != null) {
    bool expectedResult = hasMirrorSupport ? true : NOT_PRESENT;

    Expect.equals(expectedResult,
        const bool.fromEnvironment("dart.library.mirrors",
            defaultValue: NOT_PRESENT));
  }

  Expect.equals(NOT_PRESENT,
      const bool.fromEnvironment("dart.library.XYZ",
          defaultValue: NOT_PRESENT));
  Expect.equals(NOT_PRESENT,
      const bool.fromEnvironment("dart.library.Collection",
          defaultValue: NOT_PRESENT));
  Expect.equals(NOT_PRESENT,
      const bool.fromEnvironment("dart.library.converT",
          defaultValue: NOT_PRESENT));
  Expect.equals(NOT_PRESENT,
      const bool.fromEnvironment("dart.library.",
          defaultValue: NOT_PRESENT));
  Expect.equals(NOT_PRESENT,
      const bool.fromEnvironment("dart.library.core ",
          defaultValue: NOT_PRESENT));

}
