// 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 SwitchingOrdinals$TestBase extends SwitchingOrdinals {
  @override
  $async.Future<void> ordinalFive() {
    return $async.Future.error(UnimplementedError());
  }

  @override
  $async.Future<void> onlyGeneratedOrdinal() {
    return $async.Future.error(UnimplementedError());
  }

  @override
  $async.Stream<void> get eventOrdinalFifteen {
    return $async.Stream.fromFuture($async.Future.error(UnimplementedError()));
  }

  @override
  $async.Stream<void> get eventOnlyGeneratedOrdinal {
    return $async.Stream.fromFuture($async.Future.error(UnimplementedError()));
  }
}
