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

library fidl_fidl_test_protocolrequest_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 Child$TestBase extends Child {}

class Parent$TestBase extends Parent {
  @override
  $async.Future<$fidl.InterfaceHandle<Child>> getChild() {
    return $async.Future.error(
        UnimplementedError(
            r'getChild not implemented on Parent test base. Please implement.'),
        StackTrace.current);
  }

  @override
  $async.Future<$fidl.InterfaceRequest<Child>> getChildRequest() {
    return $async.Future.error(
        UnimplementedError(
            r'getChildRequest not implemented on Parent test base. Please implement.'),
        StackTrace.current);
  }

  @override
  $async.Future<void> takeChild($fidl.InterfaceHandle<Child> c) {
    return $async.Future.error(
        UnimplementedError(
            r'takeChild not implemented on Parent test base. Please implement.'),
        StackTrace.current);
  }

  @override
  $async.Future<void> takeChildRequest($fidl.InterfaceRequest<Child> r) {
    return $async.Future.error(
        UnimplementedError(
            r'takeChildRequest not implemented on Parent test base. Please implement.'),
        StackTrace.current);
  }
}
