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