// WARNING: This file is machine generated by fidlgen.

library fidl_test_name_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 $zx;

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

  @override
  $async.Future<$fidl.InterfaceRequest<Child>> getChildRequest() {
    return $async.Future.error(UnimplementedError());
  }

  @override
  $async.Future<void> takeChild($fidl.InterfaceHandle<Child> c) {
    return $async.Future.error(UnimplementedError());
  }

  @override
  $async.Future<void> takeChildRequest($fidl.InterfaceRequest<Child> r) {
    return $async.Future.error(UnimplementedError());
  }
}
