library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/dart2js/conditional_import.dart:20:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
//  - 'HttpRequest' is from 'dart:html'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
//   request.certificate; // error (from dart:io)
//           ^^^^^^^^^^^
//
// pkg/front_end/testcases/dart2js/conditional_import.dart:27:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
//  - 'HttpRequest' is from 'dart:html'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
//   request.certificate; // error (from dart:io)
//           ^^^^^^^^^^^
//
// pkg/front_end/testcases/dart2js/conditional_import.dart:34:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
//   request.certificate; // error
//           ^^^^^^^^^^^
//
// pkg/front_end/testcases/dart2js/conditional_import.dart:35:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
//   request.response; // error
//           ^^^^^^^^
//
// pkg/front_end/testcases/dart2js/conditional_import.dart:36:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
//   request.readyState; // error
//           ^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
import "dart:html" as html;
import "dart:_interceptors" as _in;

import "dart:html" as a;
import "dart:html" as b;
import "org-dartlang-testcase:///conditional_import.dart" as c;

class HttpRequest extends core::Object {
  synthetic constructor •() → self::HttpRequest
    : super core::Object::•()
    ;
  static method _#new#tearOff() → self::HttpRequest
    return new self::HttpRequest::•();
}
static method testA(html::HttpRequest request) → dynamic {
  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:20:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
 - 'HttpRequest' is from 'dart:html'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
  request.certificate; // error (from dart:io)
          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
  request.{html::HttpRequest::response}{dynamic};
  request.{html::HttpRequest::readyState}{core::int};
  request.{_in::Interceptor::hashCode}{core::int};
}
static method testB(html::HttpRequest request) → dynamic {
  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:27:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
 - 'HttpRequest' is from 'dart:html'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
  request.certificate; // error (from dart:io)
          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
  request.{html::HttpRequest::response}{dynamic};
  request.{html::HttpRequest::readyState}{core::int};
  request.{_in::Interceptor::hashCode}{core::int};
}
static method testC(self::HttpRequest request) → dynamic {
  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:34:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
 - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
  request.certificate; // error
          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:35:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
 - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
  request.response; // error
          ^^^^^^^^" in request{<unresolved>}.response;
  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:36:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
 - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
  request.readyState; // error
          ^^^^^^^^^^" in request{<unresolved>}.readyState;
  request.{core::Object::hashCode}{core::int};
}
static method main() → void {
  self::expect(false, #C1);
  self::expect(true, #C2);
  self::expect(false, #C1);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

constants  {
  #C1 = false
  #C2 = true
}
