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

import 'package:expect/expect.dart';

import 'config_corelib_general.dart'
    if (dart.library.io) 'config_corelib_io.dart'
    if (dart.library.http) 'config_corelib_http.dart' as lib;

class SubClassy extends lib.Classy {
  String get superName => super.name;
}

main() {
  var io = const bool.fromEnvironment("dart.library.io");
  var http = const bool.fromEnvironment("dart.library.http");

  var cy = new SubClassy();

  if (io) {
    Expect.isTrue(lib.general());
    Expect.equals("io", lib.name);
    Expect.equals("classy io", cy.name);

    Expect.isTrue(lib.ioSpecific());
    Expect.equals("classy io", cy.ioSpecific());

    Expect.isFalse(lib.httpSpecific());
    Expect.throws(cy.httpSpecific);
  } else if (http) {
    Expect.isTrue(lib.general());
    Expect.equals("http", lib.name);
    Expect.equals("classy http", cy.name);

    Expect.isFalse(lib.ioSpecific());
    Expect.throws(cy.ioSpecific);

    Expect.isTrue(lib.httpSpecific());
    Expect.equals("classy http", cy.httpSpecific());
  } else {
    Expect.isTrue(lib.general());
    Expect.equals("general", lib.name);
    Expect.equals("classy general", cy.name);

    Expect.isFalse(lib.ioSpecific());
    Expect.throws(cy.ioSpecific);

    Expect.isFalse(lib.httpSpecific());
    Expect.throws(cy.httpSpecific);
  }
}
