// 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 = null;

  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));

}
