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

library fidl_fidl_test_union_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 TestProtocol$TestBase extends TestProtocol {
  @override
  $async.Future<StrictBoundedXUnion>
      strictXUnionHenceResponseMayBeStackAllocated() {
    return $async.Future.error(
        UnimplementedError(
            r'strictXUnionHenceResponseMayBeStackAllocated not implemented on TestProtocol test base. Please implement.'),
        StackTrace.current);
  }

  @override
  $async.Future<OlderSimpleUnion>
      flexibleXUnionHenceResponseMustBeHeapAllocated() {
    return $async.Future.error(
        UnimplementedError(
            r'flexibleXUnionHenceResponseMustBeHeapAllocated not implemented on TestProtocol test base. Please implement.'),
        StackTrace.current);
  }
}
