// WARNING: This file is machine generated by fidlgen_dart.
// @dart = 2.12

library fidl_fidl_test_doccomments_test;

import 'dart:async' as $async;
import 'dart:core' hide Error, Future, Match, Set, Stream, Type;
import 'dart:typed_data';

import 'package:fidl/fidl.dart' as $fidl;
import 'package:meta/meta.dart';
import 'package:zircon/zircon.dart' as $zircon;

import './fidl_async.dart';

// ignore_for_file: always_specify_types
// ignore_for_file: constant_identifier_names
// ignore_for_file: one_member_abstracts
// ignore_for_file: public_member_api_docs
// ignore_for_file: unused_import
// ignore_for_file: library_prefixes
// ignore_for_file: unused_shown_name

class Interface$TestBase extends Interface {
  @override
  $async.Future<void> method() {
    return $async.Future.error(
        UnimplementedError(
            r'method not implemented on Interface test base. Please implement.'),
        StackTrace.current);
  }

  @override
  $async.Stream<void> get onEvent {
    return $async.Stream.fromFuture($async.Future.error(
        UnimplementedError(
            r'onEvent not implemented on Interface test base. Please implement.'),
        StackTrace.current));
  }
}
