// Mocks generated by Mockito 5.3.0 from annotations
// in symbolizer/test/bot_test.dart.
// Do not manually edit this file.

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i4;

import 'package:github/src/common.dart' as _i3;
import 'package:http/http.dart' as _i2;
import 'package:mockito/mockito.dart' as _i1;

// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class

class _FakeClient_0 extends _i1.SmartFake implements _i2.Client {
  _FakeClient_0(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeActivityService_1 extends _i1.SmartFake
    implements _i3.ActivityService {
  _FakeActivityService_1(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeAuthorizationsService_2 extends _i1.SmartFake
    implements _i3.AuthorizationsService {
  _FakeAuthorizationsService_2(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeGistsService_3 extends _i1.SmartFake implements _i3.GistsService {
  _FakeGistsService_3(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeGitService_4 extends _i1.SmartFake implements _i3.GitService {
  _FakeGitService_4(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeIssuesService_5 extends _i1.SmartFake implements _i3.IssuesService {
  _FakeIssuesService_5(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeMiscService_6 extends _i1.SmartFake implements _i3.MiscService {
  _FakeMiscService_6(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeOrganizationsService_7 extends _i1.SmartFake
    implements _i3.OrganizationsService {
  _FakeOrganizationsService_7(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakePullRequestsService_8 extends _i1.SmartFake
    implements _i3.PullRequestsService {
  _FakePullRequestsService_8(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeRepositoriesService_9 extends _i1.SmartFake
    implements _i3.RepositoriesService {
  _FakeRepositoriesService_9(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeSearchService_10 extends _i1.SmartFake implements _i3.SearchService {
  _FakeSearchService_10(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeUrlShortenerService_11 extends _i1.SmartFake
    implements _i3.UrlShortenerService {
  _FakeUrlShortenerService_11(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeUsersService_12 extends _i1.SmartFake implements _i3.UsersService {
  _FakeUsersService_12(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeChecksService_13 extends _i1.SmartFake implements _i3.ChecksService {
  _FakeChecksService_13(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeResponse_14 extends _i1.SmartFake implements _i2.Response {
  _FakeResponse_14(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeGitHub_15 extends _i1.SmartFake implements _i3.GitHub {
  _FakeGitHub_15(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeIssue_16 extends _i1.SmartFake implements _i3.Issue {
  _FakeIssue_16(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeIssueComment_17 extends _i1.SmartFake implements _i3.IssueComment {
  _FakeIssueComment_17(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeIssueLabel_18 extends _i1.SmartFake implements _i3.IssueLabel {
  _FakeIssueLabel_18(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

class _FakeMilestone_19 extends _i1.SmartFake implements _i3.Milestone {
  _FakeMilestone_19(Object parent, Invocation parentInvocation)
      : super(parent, parentInvocation);
}

/// A class which mocks [GitHub].
///
/// See the documentation for Mockito's code generation for more information.
class MockGitHub extends _i1.Mock implements _i3.GitHub {
  @override
  set auth(_i3.Authentication? _auth) =>
      super.noSuchMethod(Invocation.setter(#auth, _auth),
          returnValueForMissingStub: null);
  @override
  String get endpoint => (super.noSuchMethod(Invocation.getter(#endpoint),
      returnValue: '', returnValueForMissingStub: '') as String);
  @override
  _i2.Client get client => (super.noSuchMethod(Invocation.getter(#client),
      returnValue: _FakeClient_0(this, Invocation.getter(#client)),
      returnValueForMissingStub:
          _FakeClient_0(this, Invocation.getter(#client))) as _i2.Client);
  @override
  _i3.ActivityService get activity => (super.noSuchMethod(
      Invocation.getter(#activity),
      returnValue: _FakeActivityService_1(this, Invocation.getter(#activity)),
      returnValueForMissingStub: _FakeActivityService_1(
          this, Invocation.getter(#activity))) as _i3.ActivityService);
  @override
  _i3.AuthorizationsService get authorizations =>
      (super.noSuchMethod(Invocation.getter(#authorizations),
              returnValue: _FakeAuthorizationsService_2(
                  this, Invocation.getter(#authorizations)),
              returnValueForMissingStub: _FakeAuthorizationsService_2(
                  this, Invocation.getter(#authorizations)))
          as _i3.AuthorizationsService);
  @override
  _i3.GistsService get gists => (super.noSuchMethod(Invocation.getter(#gists),
          returnValue: _FakeGistsService_3(this, Invocation.getter(#gists)),
          returnValueForMissingStub:
              _FakeGistsService_3(this, Invocation.getter(#gists)))
      as _i3.GistsService);
  @override
  _i3.GitService get git => (super.noSuchMethod(Invocation.getter(#git),
      returnValue: _FakeGitService_4(this, Invocation.getter(#git)),
      returnValueForMissingStub:
          _FakeGitService_4(this, Invocation.getter(#git))) as _i3.GitService);
  @override
  _i3.IssuesService get issues => (super.noSuchMethod(
          Invocation.getter(#issues),
          returnValue: _FakeIssuesService_5(this, Invocation.getter(#issues)),
          returnValueForMissingStub:
              _FakeIssuesService_5(this, Invocation.getter(#issues)))
      as _i3.IssuesService);
  @override
  _i3.MiscService get misc => (super.noSuchMethod(Invocation.getter(#misc),
          returnValue: _FakeMiscService_6(this, Invocation.getter(#misc)),
          returnValueForMissingStub:
              _FakeMiscService_6(this, Invocation.getter(#misc)))
      as _i3.MiscService);
  @override
  _i3.OrganizationsService get organizations => (super.noSuchMethod(
      Invocation.getter(#organizations),
      returnValue:
          _FakeOrganizationsService_7(this, Invocation.getter(#organizations)),
      returnValueForMissingStub: _FakeOrganizationsService_7(
          this, Invocation.getter(#organizations))) as _i3
      .OrganizationsService);
  @override
  _i3.PullRequestsService get pullRequests => (super.noSuchMethod(
      Invocation.getter(#pullRequests),
      returnValue:
          _FakePullRequestsService_8(this, Invocation.getter(#pullRequests)),
      returnValueForMissingStub: _FakePullRequestsService_8(
          this, Invocation.getter(#pullRequests))) as _i3.PullRequestsService);
  @override
  _i3.RepositoriesService get repositories => (super.noSuchMethod(
      Invocation.getter(#repositories),
      returnValue:
          _FakeRepositoriesService_9(this, Invocation.getter(#repositories)),
      returnValueForMissingStub: _FakeRepositoriesService_9(
          this, Invocation.getter(#repositories))) as _i3.RepositoriesService);
  @override
  _i3.SearchService get search => (super.noSuchMethod(
          Invocation.getter(#search),
          returnValue: _FakeSearchService_10(this, Invocation.getter(#search)),
          returnValueForMissingStub:
              _FakeSearchService_10(this, Invocation.getter(#search)))
      as _i3.SearchService);
  @override
  _i3.UrlShortenerService get urlShortener => (super.noSuchMethod(
      Invocation.getter(#urlShortener),
      returnValue:
          _FakeUrlShortenerService_11(this, Invocation.getter(#urlShortener)),
      returnValueForMissingStub: _FakeUrlShortenerService_11(
          this, Invocation.getter(#urlShortener))) as _i3.UrlShortenerService);
  @override
  _i3.UsersService get users => (super.noSuchMethod(Invocation.getter(#users),
          returnValue: _FakeUsersService_12(this, Invocation.getter(#users)),
          returnValueForMissingStub:
              _FakeUsersService_12(this, Invocation.getter(#users)))
      as _i3.UsersService);
  @override
  _i3.ChecksService get checks => (super.noSuchMethod(
          Invocation.getter(#checks),
          returnValue: _FakeChecksService_13(this, Invocation.getter(#checks)),
          returnValueForMissingStub:
              _FakeChecksService_13(this, Invocation.getter(#checks)))
      as _i3.ChecksService);
  @override
  _i4.Future<T> getJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i2.Response)? fail,
          Map<String, String>? headers,
          Map<String, String>? params,
          _i3.JSONConverter<S, T>? convert,
          String? preview}) =>
      (super.noSuchMethod(
              Invocation.method(#getJSON, [
                path
              ], {
                #statusCode: statusCode,
                #fail: fail,
                #headers: headers,
                #params: params,
                #convert: convert,
                #preview: preview
              }),
              returnValue: _i4.Future<T>.value(null),
              returnValueForMissingStub: _i4.Future<T>.value(null))
          as _i4.Future<T>);
  @override
  _i4.Future<T> postJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i2.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i3.JSONConverter<S, T>? convert,
          dynamic body,
          String? preview}) =>
      (super.noSuchMethod(
              Invocation.method(#postJSON, [
                path
              ], {
                #statusCode: statusCode,
                #fail: fail,
                #headers: headers,
                #params: params,
                #convert: convert,
                #body: body,
                #preview: preview
              }),
              returnValue: _i4.Future<T>.value(null),
              returnValueForMissingStub: _i4.Future<T>.value(null))
          as _i4.Future<T>);
  @override
  _i4.Future<T> putJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i2.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i3.JSONConverter<S, T>? convert,
          dynamic body,
          String? preview}) =>
      (super.noSuchMethod(
              Invocation.method(#putJSON, [
                path
              ], {
                #statusCode: statusCode,
                #fail: fail,
                #headers: headers,
                #params: params,
                #convert: convert,
                #body: body,
                #preview: preview
              }),
              returnValue: _i4.Future<T>.value(null),
              returnValueForMissingStub: _i4.Future<T>.value(null))
          as _i4.Future<T>);
  @override
  _i4.Future<T> patchJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i2.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i3.JSONConverter<S, T>? convert,
          dynamic body,
          String? preview}) =>
      (super.noSuchMethod(
              Invocation.method(#patchJSON, [
                path
              ], {
                #statusCode: statusCode,
                #fail: fail,
                #headers: headers,
                #params: params,
                #convert: convert,
                #body: body,
                #preview: preview
              }),
              returnValue: _i4.Future<T>.value(null),
              returnValueForMissingStub: _i4.Future<T>.value(null))
          as _i4.Future<T>);
  @override
  _i4.Future<T> requestJson<S, T>(String? method, String? path,
          {int? statusCode,
          void Function(_i2.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i3.JSONConverter<S, T?>? convert,
          dynamic body,
          String? preview}) =>
      (super.noSuchMethod(
              Invocation.method(#requestJson, [
                method,
                path
              ], {
                #statusCode: statusCode,
                #fail: fail,
                #headers: headers,
                #params: params,
                #convert: convert,
                #body: body,
                #preview: preview
              }),
              returnValue: _i4.Future<T>.value(null),
              returnValueForMissingStub: _i4.Future<T>.value(null))
          as _i4.Future<T>);
  @override
  _i4.Future<_i2.Response> request(String? method, String? path,
          {Map<String, String>? headers,
          Map<String, dynamic>? params,
          dynamic body,
          int? statusCode,
          void Function(_i2.Response)? fail,
          String? preview}) =>
      (super.noSuchMethod(
          Invocation.method(#request, [
            method,
            path
          ], {
            #headers: headers,
            #params: params,
            #body: body,
            #statusCode: statusCode,
            #fail: fail,
            #preview: preview
          }),
          returnValue: _i4.Future<_i2.Response>.value(_FakeResponse_14(
              this,
              Invocation.method(#request, [
                method,
                path
              ], {
                #headers: headers,
                #params: params,
                #body: body,
                #statusCode: statusCode,
                #fail: fail,
                #preview: preview
              }))),
          returnValueForMissingStub:
              _i4.Future<_i2.Response>.value(_FakeResponse_14(
                  this,
                  Invocation.method(#request, [
                    method,
                    path
                  ], {
                    #headers: headers,
                    #params: params,
                    #body: body,
                    #statusCode: statusCode,
                    #fail: fail,
                    #preview: preview
                  })))) as _i4.Future<_i2.Response>);
  @override
  void handleStatusCode(_i2.Response? response) =>
      super.noSuchMethod(Invocation.method(#handleStatusCode, [response]),
          returnValueForMissingStub: null);
  @override
  void dispose() => super.noSuchMethod(Invocation.method(#dispose, []),
      returnValueForMissingStub: null);
}

/// A class which mocks [IssuesService].
///
/// See the documentation for Mockito's code generation for more information.
class MockIssuesService extends _i1.Mock implements _i3.IssuesService {
  @override
  _i3.GitHub get github => (super.noSuchMethod(Invocation.getter(#github),
      returnValue: _FakeGitHub_15(this, Invocation.getter(#github)),
      returnValueForMissingStub:
          _FakeGitHub_15(this, Invocation.getter(#github))) as _i3.GitHub);
  @override
  _i4.Stream<_i3.Issue> listAll(
          {int? milestoneNumber,
          String? state,
          String? direction,
          String? sort,
          DateTime? since,
          int? perPage,
          List<String>? labels}) =>
      (super.noSuchMethod(
              Invocation.method(#listAll, [], {
                #milestoneNumber: milestoneNumber,
                #state: state,
                #direction: direction,
                #sort: sort,
                #since: since,
                #perPage: perPage,
                #labels: labels
              }),
              returnValue: _i4.Stream<_i3.Issue>.empty(),
              returnValueForMissingStub: _i4.Stream<_i3.Issue>.empty())
          as _i4.Stream<_i3.Issue>);
  @override
  _i4.Stream<_i3.Issue> listByUser(
          {int? milestoneNumber,
          String? state,
          String? direction,
          String? sort,
          DateTime? since,
          int? perPage,
          List<String>? labels}) =>
      (super.noSuchMethod(
              Invocation.method(#listByUser, [], {
                #milestoneNumber: milestoneNumber,
                #state: state,
                #direction: direction,
                #sort: sort,
                #since: since,
                #perPage: perPage,
                #labels: labels
              }),
              returnValue: _i4.Stream<_i3.Issue>.empty(),
              returnValueForMissingStub: _i4.Stream<_i3.Issue>.empty())
          as _i4.Stream<_i3.Issue>);
  @override
  _i4.Stream<_i3.Issue> listByOrg(String? org,
          {int? milestoneNumber,
          String? state,
          String? direction,
          String? sort,
          DateTime? since,
          int? perPage,
          List<String>? labels}) =>
      (super.noSuchMethod(
              Invocation.method(#listByOrg, [
                org
              ], {
                #milestoneNumber: milestoneNumber,
                #state: state,
                #direction: direction,
                #sort: sort,
                #since: since,
                #perPage: perPage,
                #labels: labels
              }),
              returnValue: _i4.Stream<_i3.Issue>.empty(),
              returnValueForMissingStub: _i4.Stream<_i3.Issue>.empty())
          as _i4.Stream<_i3.Issue>);
  @override
  _i4.Stream<_i3.Issue> listByRepo(_i3.RepositorySlug? slug,
          {int? milestoneNumber,
          String? state,
          String? direction,
          String? sort,
          DateTime? since,
          int? perPage,
          List<String>? labels}) =>
      (super.noSuchMethod(
              Invocation.method(#listByRepo, [
                slug
              ], {
                #milestoneNumber: milestoneNumber,
                #state: state,
                #direction: direction,
                #sort: sort,
                #since: since,
                #perPage: perPage,
                #labels: labels
              }),
              returnValue: _i4.Stream<_i3.Issue>.empty(),
              returnValueForMissingStub: _i4.Stream<_i3.Issue>.empty())
          as _i4.Stream<_i3.Issue>);
  @override
  _i4.Stream<_i3.Reaction> listReactions(
          _i3.RepositorySlug? slug, int? issueNumber,
          {_i3.ReactionType? content}) =>
      (super.noSuchMethod(
              Invocation.method(
                  #listReactions, [slug, issueNumber], {#content: content}),
              returnValue: _i4.Stream<_i3.Reaction>.empty(),
              returnValueForMissingStub: _i4.Stream<_i3.Reaction>.empty())
          as _i4.Stream<_i3.Reaction>);
  @override
  _i4.Future<_i3.Issue> edit(_i3.RepositorySlug? slug, int? issueNumber,
          _i3.IssueRequest? issue) =>
      (super.noSuchMethod(Invocation.method(#edit, [slug, issueNumber, issue]),
          returnValue: _i4.Future<_i3.Issue>.value(_FakeIssue_16(
              this, Invocation.method(#edit, [slug, issueNumber, issue]))),
          returnValueForMissingStub: _i4.Future<_i3.Issue>.value(_FakeIssue_16(
              this, Invocation.method(#edit, [slug, issueNumber, issue])))) as _i4
          .Future<_i3.Issue>);
  @override
  _i4.Future<_i3.Issue> get(_i3.RepositorySlug? slug, int? issueNumber) =>
      (super.noSuchMethod(Invocation.method(#get, [slug, issueNumber]),
          returnValue: _i4.Future<_i3.Issue>.value(_FakeIssue_16(
              this, Invocation.method(#get, [slug, issueNumber]))),
          returnValueForMissingStub: _i4.Future<_i3.Issue>.value(_FakeIssue_16(
              this, Invocation.method(#get, [slug, issueNumber])))) as _i4
          .Future<_i3.Issue>);
  @override
  _i4.Future<_i3.Issue> create(
          _i3.RepositorySlug? slug, _i3.IssueRequest? issue) =>
      (super.noSuchMethod(Invocation.method(#create, [slug, issue]),
          returnValue: _i4.Future<_i3.Issue>.value(
              _FakeIssue_16(this, Invocation.method(#create, [slug, issue]))),
          returnValueForMissingStub: _i4.Future<_i3.Issue>.value(_FakeIssue_16(
              this, Invocation.method(#create, [slug, issue])))) as _i4
          .Future<_i3.Issue>);
  @override
  _i4.Stream<_i3.User> listAssignees(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listAssignees, [slug]),
              returnValue: _i4.Stream<_i3.User>.empty(),
              returnValueForMissingStub: _i4.Stream<_i3.User>.empty())
          as _i4.Stream<_i3.User>);
  @override
  _i4.Future<bool> isAssignee(_i3.RepositorySlug? slug, String? repoName) =>
      (super.noSuchMethod(Invocation.method(#isAssignee, [slug, repoName]),
              returnValue: _i4.Future<bool>.value(false),
              returnValueForMissingStub: _i4.Future<bool>.value(false))
          as _i4.Future<bool>);
  @override
  _i4.Stream<_i3.IssueComment> listCommentsByIssue(
          _i3.RepositorySlug? slug, int? issueNumber) =>
      (super.noSuchMethod(
              Invocation.method(#listCommentsByIssue, [slug, issueNumber]),
              returnValue: _i4.Stream<_i3.IssueComment>.empty(),
              returnValueForMissingStub: _i4.Stream<_i3.IssueComment>.empty())
          as _i4.Stream<_i3.IssueComment>);
  @override
  _i4.Stream<_i3.IssueComment> listCommentsByRepo(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listCommentsByRepo, [slug]),
              returnValue: _i4.Stream<_i3.IssueComment>.empty(),
              returnValueForMissingStub: _i4.Stream<_i3.IssueComment>.empty())
          as _i4.Stream<_i3.IssueComment>);
  @override
  _i4.Future<_i3.IssueComment> getComment(_i3.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#getComment, [slug, id]),
          returnValue: _i4.Future<_i3.IssueComment>.value(_FakeIssueComment_17(
              this, Invocation.method(#getComment, [slug, id]))),
          returnValueForMissingStub: _i4.Future<_i3.IssueComment>.value(
              _FakeIssueComment_17(
                  this, Invocation.method(#getComment, [slug, id])))) as _i4
          .Future<_i3.IssueComment>);
  @override
  _i4.Future<_i3.IssueComment> createComment(
          _i3.RepositorySlug? slug, int? issueNumber, String? body) =>
      (super.noSuchMethod(
          Invocation.method(#createComment, [slug, issueNumber, body]),
          returnValue: _i4.Future<_i3.IssueComment>.value(_FakeIssueComment_17(
              this,
              Invocation.method(#createComment, [slug, issueNumber, body]))),
          returnValueForMissingStub: _i4.Future<_i3.IssueComment>.value(
              _FakeIssueComment_17(this, Invocation.method(#createComment, [slug, issueNumber, body])))) as _i4
          .Future<_i3.IssueComment>);
  @override
  _i4.Future<_i3.IssueComment> updateComment(
          _i3.RepositorySlug? slug, int? id, String? body) =>
      (super.noSuchMethod(Invocation.method(#updateComment, [slug, id, body]),
              returnValue: _i4.Future<_i3.IssueComment>.value(
                  _FakeIssueComment_17(
                      this, Invocation.method(#updateComment, [slug, id, body]))),
              returnValueForMissingStub: _i4.Future<_i3.IssueComment>.value(
                  _FakeIssueComment_17(
                      this, Invocation.method(#updateComment, [slug, id, body]))))
          as _i4.Future<_i3.IssueComment>);
  @override
  _i4.Future<bool> deleteComment(_i3.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#deleteComment, [slug, id]),
              returnValue: _i4.Future<bool>.value(false),
              returnValueForMissingStub: _i4.Future<bool>.value(false))
          as _i4.Future<bool>);
  @override
  _i4.Stream<_i3.IssueLabel> listLabels(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listLabels, [slug]),
              returnValue: _i4.Stream<_i3.IssueLabel>.empty(),
              returnValueForMissingStub: _i4.Stream<_i3.IssueLabel>.empty())
          as _i4.Stream<_i3.IssueLabel>);
  @override
  _i4.Future<_i3.IssueLabel> getLabel(_i3.RepositorySlug? slug, String? name) =>
      (super.noSuchMethod(Invocation.method(#getLabel, [slug, name]),
              returnValue: _i4.Future<_i3.IssueLabel>.value(_FakeIssueLabel_18(
                  this, Invocation.method(#getLabel, [slug, name]))),
              returnValueForMissingStub: _i4.Future<_i3.IssueLabel>.value(
                  _FakeIssueLabel_18(
                      this, Invocation.method(#getLabel, [slug, name]))))
          as _i4.Future<_i3.IssueLabel>);
  @override
  _i4.Future<_i3.IssueLabel> createLabel(
          _i3.RepositorySlug? slug, String? name, String? color) =>
      (super.noSuchMethod(Invocation.method(#createLabel, [slug, name, color]),
              returnValue: _i4.Future<_i3.IssueLabel>.value(_FakeIssueLabel_18(
                  this, Invocation.method(#createLabel, [slug, name, color]))),
              returnValueForMissingStub: _i4.Future<_i3.IssueLabel>.value(
                  _FakeIssueLabel_18(
                      this, Invocation.method(#createLabel, [slug, name, color]))))
          as _i4.Future<_i3.IssueLabel>);
  @override
  _i4.Future<_i3.IssueLabel> editLabel(
          _i3.RepositorySlug? slug, String? name, String? color) =>
      (super.noSuchMethod(Invocation.method(#editLabel, [slug, name, color]),
              returnValue: _i4.Future<_i3.IssueLabel>.value(_FakeIssueLabel_18(
                  this, Invocation.method(#editLabel, [slug, name, color]))),
              returnValueForMissingStub: _i4.Future<_i3.IssueLabel>.value(
                  _FakeIssueLabel_18(
                      this, Invocation.method(#editLabel, [slug, name, color]))))
          as _i4.Future<_i3.IssueLabel>);
  @override
  _i4.Future<bool> deleteLabel(_i3.RepositorySlug? slug, String? name) =>
      (super.noSuchMethod(Invocation.method(#deleteLabel, [slug, name]),
              returnValue: _i4.Future<bool>.value(false),
              returnValueForMissingStub: _i4.Future<bool>.value(false))
          as _i4.Future<bool>);
  @override
  _i4.Stream<_i3.IssueLabel> listLabelsByIssue(
          _i3.RepositorySlug? slug, int? issueNumber) =>
      (super.noSuchMethod(
              Invocation.method(#listLabelsByIssue, [slug, issueNumber]),
              returnValue: _i4.Stream<_i3.IssueLabel>.empty(),
              returnValueForMissingStub: _i4.Stream<_i3.IssueLabel>.empty())
          as _i4.Stream<_i3.IssueLabel>);
  @override
  _i4.Future<List<_i3.IssueLabel>> addLabelsToIssue(
          _i3.RepositorySlug? slug, int? issueNumber, List<String>? labels) =>
      (super.noSuchMethod(
              Invocation.method(#addLabelsToIssue, [slug, issueNumber, labels]),
              returnValue:
                  _i4.Future<List<_i3.IssueLabel>>.value(<_i3.IssueLabel>[]),
              returnValueForMissingStub:
                  _i4.Future<List<_i3.IssueLabel>>.value(<_i3.IssueLabel>[]))
          as _i4.Future<List<_i3.IssueLabel>>);
  @override
  _i4.Future<List<_i3.IssueLabel>> replaceLabelsForIssue(
          _i3.RepositorySlug? slug, int? issueNumber, List<String>? labels) =>
      (super.noSuchMethod(
              Invocation.method(
                  #replaceLabelsForIssue, [slug, issueNumber, labels]),
              returnValue:
                  _i4.Future<List<_i3.IssueLabel>>.value(<_i3.IssueLabel>[]),
              returnValueForMissingStub:
                  _i4.Future<List<_i3.IssueLabel>>.value(<_i3.IssueLabel>[]))
          as _i4.Future<List<_i3.IssueLabel>>);
  @override
  _i4.Future<bool> removeLabelForIssue(
          _i3.RepositorySlug? slug, int? issueNumber, String? label) =>
      (super.noSuchMethod(
          Invocation.method(#removeLabelForIssue, [slug, issueNumber, label]),
          returnValue: _i4.Future<bool>.value(false),
          returnValueForMissingStub:
              _i4.Future<bool>.value(false)) as _i4.Future<bool>);
  @override
  _i4.Future<bool> removeAllLabelsForIssue(
          _i3.RepositorySlug? slug, int? issueNumber) =>
      (super.noSuchMethod(
              Invocation.method(#removeAllLabelsForIssue, [slug, issueNumber]),
              returnValue: _i4.Future<bool>.value(false),
              returnValueForMissingStub: _i4.Future<bool>.value(false))
          as _i4.Future<bool>);
  @override
  _i4.Stream<_i3.Milestone> listMilestones(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listMilestones, [slug]),
              returnValue: _i4.Stream<_i3.Milestone>.empty(),
              returnValueForMissingStub: _i4.Stream<_i3.Milestone>.empty())
          as _i4.Stream<_i3.Milestone>);
  @override
  _i4.Future<_i3.Milestone> createMilestone(
          _i3.RepositorySlug? slug, _i3.CreateMilestone? request) =>
      (super.noSuchMethod(Invocation.method(#createMilestone, [slug, request]),
              returnValue: _i4.Future<_i3.Milestone>.value(_FakeMilestone_19(
                  this, Invocation.method(#createMilestone, [slug, request]))),
              returnValueForMissingStub: _i4.Future<_i3.Milestone>.value(
                  _FakeMilestone_19(
                      this, Invocation.method(#createMilestone, [slug, request]))))
          as _i4.Future<_i3.Milestone>);
  @override
  _i4.Future<bool> deleteMilestone(_i3.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#deleteMilestone, [slug, number]),
              returnValue: _i4.Future<bool>.value(false),
              returnValueForMissingStub: _i4.Future<bool>.value(false))
          as _i4.Future<bool>);
}
