// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// 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());
  }
}
