// Mocks generated by Mockito 5.2.0 from annotations
// in auto_submit/test/utilities/mocks.dart.
// Do not manually edit this file.

import 'dart:async' as _i6;
import 'dart:typed_data' as _i7;

import 'package:auto_submit/service/approver_service.dart' as _i5;
import 'package:auto_submit/service/config.dart' as _i2;
import 'package:github/github.dart' as _i4;
import 'package:http/http.dart' as _i3;
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

class _FakeConfig_0 extends _i1.Fake implements _i2.Config {}

class _FakeClient_1 extends _i1.Fake implements _i3.Client {}

class _FakeActivityService_2 extends _i1.Fake implements _i4.ActivityService {}

class _FakeAuthorizationsService_3 extends _i1.Fake implements _i4.AuthorizationsService {}

class _FakeGistsService_4 extends _i1.Fake implements _i4.GistsService {}

class _FakeGitService_5 extends _i1.Fake implements _i4.GitService {}

class _FakeIssuesService_6 extends _i1.Fake implements _i4.IssuesService {}

class _FakeMiscService_7 extends _i1.Fake implements _i4.MiscService {}

class _FakeOrganizationsService_8 extends _i1.Fake implements _i4.OrganizationsService {}

class _FakePullRequestsService_9 extends _i1.Fake implements _i4.PullRequestsService {}

class _FakeRepositoriesService_10 extends _i1.Fake implements _i4.RepositoriesService {}

class _FakeSearchService_11 extends _i1.Fake implements _i4.SearchService {}

class _FakeUrlShortenerService_12 extends _i1.Fake implements _i4.UrlShortenerService {}

class _FakeUsersService_13 extends _i1.Fake implements _i4.UsersService {}

class _FakeChecksService_14 extends _i1.Fake implements _i4.ChecksService {}

class _FakeResponse_15 extends _i1.Fake implements _i3.Response {}

class _FakeGitHub_16 extends _i1.Fake implements _i4.GitHub {}

class _FakePullRequest_17 extends _i1.Fake implements _i4.PullRequest {}

class _FakePullRequestMerge_18 extends _i1.Fake implements _i4.PullRequestMerge {}

class _FakePullRequestComment_19 extends _i1.Fake implements _i4.PullRequestComment {}

class _FakePullRequestReview_20 extends _i1.Fake implements _i4.PullRequestReview {}

class _FakeRepository_21 extends _i1.Fake implements _i4.Repository {}

class _FakeLicenseDetails_22 extends _i1.Fake implements _i4.LicenseDetails {}

class _FakeLanguageBreakdown_23 extends _i1.Fake implements _i4.LanguageBreakdown {}

class _FakeBranch_24 extends _i1.Fake implements _i4.Branch {}

class _FakeCommitComment_25 extends _i1.Fake implements _i4.CommitComment {}

class _FakeRepositoryCommit_26 extends _i1.Fake implements _i4.RepositoryCommit {}

class _FakeGitHubComparison_27 extends _i1.Fake implements _i4.GitHubComparison {}

class _FakeGitHubFile_28 extends _i1.Fake implements _i4.GitHubFile {}

class _FakeRepositoryContents_29 extends _i1.Fake implements _i4.RepositoryContents {}

class _FakeContentCreation_30 extends _i1.Fake implements _i4.ContentCreation {}

class _FakeHook_31 extends _i1.Fake implements _i4.Hook {}

class _FakePublicKey_32 extends _i1.Fake implements _i4.PublicKey {}

class _FakeRepositoryPages_33 extends _i1.Fake implements _i4.RepositoryPages {}

class _FakePageBuild_34 extends _i1.Fake implements _i4.PageBuild {}

class _FakeRelease_35 extends _i1.Fake implements _i4.Release {}

class _FakeReleaseAsset_36 extends _i1.Fake implements _i4.ReleaseAsset {}

class _FakeContributorParticipation_37 extends _i1.Fake implements _i4.ContributorParticipation {}

class _FakeRepositoryStatus_38 extends _i1.Fake implements _i4.RepositoryStatus {}

class _FakeCombinedRepositoryStatus_39 extends _i1.Fake implements _i4.CombinedRepositoryStatus {}

class _FakeReleaseNotes_40 extends _i1.Fake implements _i4.ReleaseNotes {}

/// A class which mocks [ApproverService].
///
/// See the documentation for Mockito's code generation for more information.
class MockApproverService extends _i1.Mock implements _i5.ApproverService {
  MockApproverService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i2.Config get config => (super.noSuchMethod(Invocation.getter(#config), returnValue: _FakeConfig_0()) as _i2.Config);
  @override
  _i6.Future<void> approve(_i4.PullRequest? pullRequest) =>
      (super.noSuchMethod(Invocation.method(#approve, [pullRequest]),
          returnValue: Future<void>.value(), returnValueForMissingStub: Future<void>.value()) as _i6.Future<void>);
}

/// A class which mocks [GitHub].
///
/// See the documentation for Mockito's code generation for more information.
class MockGitHub extends _i1.Mock implements _i4.GitHub {
  MockGitHub() {
    _i1.throwOnMissingStub(this);
  }

  @override
  set auth(_i4.Authentication? _auth) =>
      super.noSuchMethod(Invocation.setter(#auth, _auth), returnValueForMissingStub: null);
  @override
  String get endpoint => (super.noSuchMethod(Invocation.getter(#endpoint), returnValue: '') as String);
  @override
  _i3.Client get client => (super.noSuchMethod(Invocation.getter(#client), returnValue: _FakeClient_1()) as _i3.Client);
  @override
  _i4.ActivityService get activity =>
      (super.noSuchMethod(Invocation.getter(#activity), returnValue: _FakeActivityService_2()) as _i4.ActivityService);
  @override
  _i4.AuthorizationsService get authorizations =>
      (super.noSuchMethod(Invocation.getter(#authorizations), returnValue: _FakeAuthorizationsService_3())
          as _i4.AuthorizationsService);
  @override
  _i4.GistsService get gists =>
      (super.noSuchMethod(Invocation.getter(#gists), returnValue: _FakeGistsService_4()) as _i4.GistsService);
  @override
  _i4.GitService get git =>
      (super.noSuchMethod(Invocation.getter(#git), returnValue: _FakeGitService_5()) as _i4.GitService);
  @override
  _i4.IssuesService get issues =>
      (super.noSuchMethod(Invocation.getter(#issues), returnValue: _FakeIssuesService_6()) as _i4.IssuesService);
  @override
  _i4.MiscService get misc =>
      (super.noSuchMethod(Invocation.getter(#misc), returnValue: _FakeMiscService_7()) as _i4.MiscService);
  @override
  _i4.OrganizationsService get organizations =>
      (super.noSuchMethod(Invocation.getter(#organizations), returnValue: _FakeOrganizationsService_8())
          as _i4.OrganizationsService);
  @override
  _i4.PullRequestsService get pullRequests =>
      (super.noSuchMethod(Invocation.getter(#pullRequests), returnValue: _FakePullRequestsService_9())
          as _i4.PullRequestsService);
  @override
  _i4.RepositoriesService get repositories =>
      (super.noSuchMethod(Invocation.getter(#repositories), returnValue: _FakeRepositoriesService_10())
          as _i4.RepositoriesService);
  @override
  _i4.SearchService get search =>
      (super.noSuchMethod(Invocation.getter(#search), returnValue: _FakeSearchService_11()) as _i4.SearchService);
  @override
  _i4.UrlShortenerService get urlShortener =>
      (super.noSuchMethod(Invocation.getter(#urlShortener), returnValue: _FakeUrlShortenerService_12())
          as _i4.UrlShortenerService);
  @override
  _i4.UsersService get users =>
      (super.noSuchMethod(Invocation.getter(#users), returnValue: _FakeUsersService_13()) as _i4.UsersService);
  @override
  _i4.ChecksService get checks =>
      (super.noSuchMethod(Invocation.getter(#checks), returnValue: _FakeChecksService_14()) as _i4.ChecksService);
  @override
  _i6.Future<T> getJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i3.Response)? fail,
          Map<String, String>? headers,
          Map<String, String>? params,
          _i4.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: Future<T>.value(null)) as _i6.Future<T>);
  @override
  _i6.Future<T> postJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i3.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i4.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: Future<T>.value(null)) as _i6.Future<T>);
  @override
  _i6.Future<T> putJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i3.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i4.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: Future<T>.value(null)) as _i6.Future<T>);
  @override
  _i6.Future<T> patchJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i3.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i4.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: Future<T>.value(null)) as _i6.Future<T>);
  @override
  _i6.Future<T> requestJson<S, T>(String? method, String? path,
          {int? statusCode,
          void Function(_i3.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i4.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: Future<T>.value(null)) as _i6.Future<T>);
  @override
  _i6.Future<_i3.Response> request(String? method, String? path,
          {Map<String, String>? headers,
          Map<String, dynamic>? params,
          dynamic body,
          int? statusCode,
          void Function(_i3.Response)? fail,
          String? preview}) =>
      (super.noSuchMethod(
          Invocation.method(#request, [
            method,
            path
          ], {
            #headers: headers,
            #params: params,
            #body: body,
            #statusCode: statusCode,
            #fail: fail,
            #preview: preview
          }),
          returnValue: Future<_i3.Response>.value(_FakeResponse_15())) as _i6.Future<_i3.Response>);
  @override
  void handleStatusCode(_i3.Response? response) =>
      super.noSuchMethod(Invocation.method(#handleStatusCode, [response]), returnValueForMissingStub: null);
  @override
  void dispose() => super.noSuchMethod(Invocation.method(#dispose, []), returnValueForMissingStub: null);
}

/// A class which mocks [PullRequestsService].
///
/// See the documentation for Mockito's code generation for more information.
class MockPullRequestsService extends _i1.Mock implements _i4.PullRequestsService {
  MockPullRequestsService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i4.GitHub get github =>
      (super.noSuchMethod(Invocation.getter(#github), returnValue: _FakeGitHub_16()) as _i4.GitHub);
  @override
  _i6.Stream<_i4.PullRequest> list(_i4.RepositorySlug? slug,
          {int? pages,
          String? base,
          String? direction = r'desc',
          String? head,
          String? sort = r'created',
          String? state = r'open'}) =>
      (super.noSuchMethod(
          Invocation.method(#list, [slug],
              {#pages: pages, #base: base, #direction: direction, #head: head, #sort: sort, #state: state}),
          returnValue: Stream<_i4.PullRequest>.empty()) as _i6.Stream<_i4.PullRequest>);
  @override
  _i6.Future<_i4.PullRequest> get(_i4.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#get, [slug, number]),
          returnValue: Future<_i4.PullRequest>.value(_FakePullRequest_17())) as _i6.Future<_i4.PullRequest>);
  @override
  _i6.Future<_i4.PullRequest> create(_i4.RepositorySlug? slug, _i4.CreatePullRequest? request) =>
      (super.noSuchMethod(Invocation.method(#create, [slug, request]),
          returnValue: Future<_i4.PullRequest>.value(_FakePullRequest_17())) as _i6.Future<_i4.PullRequest>);
  @override
  _i6.Future<_i4.PullRequest> edit(_i4.RepositorySlug? slug, int? number,
          {String? title, String? body, String? state, String? base}) =>
      (super.noSuchMethod(
          Invocation.method(#edit, [slug, number], {#title: title, #body: body, #state: state, #base: base}),
          returnValue: Future<_i4.PullRequest>.value(_FakePullRequest_17())) as _i6.Future<_i4.PullRequest>);
  @override
  _i6.Stream<_i4.RepositoryCommit> listCommits(_i4.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#listCommits, [slug, number]),
          returnValue: Stream<_i4.RepositoryCommit>.empty()) as _i6.Stream<_i4.RepositoryCommit>);
  @override
  _i6.Stream<_i4.PullRequestFile> listFiles(_i4.RepositorySlug? slug, int? number) => (super
          .noSuchMethod(Invocation.method(#listFiles, [slug, number]), returnValue: Stream<_i4.PullRequestFile>.empty())
      as _i6.Stream<_i4.PullRequestFile>);
  @override
  _i6.Stream<_i4.PullRequestReview> listReviews(_i4.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#listReviews, [slug, number]),
          returnValue: Stream<_i4.PullRequestReview>.empty()) as _i6.Stream<_i4.PullRequestReview>);
  @override
  _i6.Future<bool> isMerged(_i4.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#isMerged, [slug, number]), returnValue: Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Future<_i4.PullRequestMerge> merge(_i4.RepositorySlug? slug, int? number, {String? message}) =>
      (super.noSuchMethod(Invocation.method(#merge, [slug, number], {#message: message}),
              returnValue: Future<_i4.PullRequestMerge>.value(_FakePullRequestMerge_18()))
          as _i6.Future<_i4.PullRequestMerge>);
  @override
  _i6.Stream<_i4.PullRequestComment> listCommentsByPullRequest(_i4.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#listCommentsByPullRequest, [slug, number]),
          returnValue: Stream<_i4.PullRequestComment>.empty()) as _i6.Stream<_i4.PullRequestComment>);
  @override
  _i6.Stream<_i4.PullRequestComment> listComments(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listComments, [slug]), returnValue: Stream<_i4.PullRequestComment>.empty())
          as _i6.Stream<_i4.PullRequestComment>);
  @override
  _i6.Future<_i4.PullRequestComment> createComment(
          _i4.RepositorySlug? slug, int? number, _i4.CreatePullRequestComment? comment) =>
      (super.noSuchMethod(Invocation.method(#createComment, [slug, number, comment]),
              returnValue: Future<_i4.PullRequestComment>.value(_FakePullRequestComment_19()))
          as _i6.Future<_i4.PullRequestComment>);
  @override
  _i6.Future<_i4.PullRequestReview> createReview(_i4.RepositorySlug? slug, _i4.CreatePullRequestReview? review) =>
      (super.noSuchMethod(Invocation.method(#createReview, [slug, review]),
              returnValue: Future<_i4.PullRequestReview>.value(_FakePullRequestReview_20()))
          as _i6.Future<_i4.PullRequestReview>);
}

/// A class which mocks [RepositoriesService].
///
/// See the documentation for Mockito's code generation for more information.
class MockRepositoriesService extends _i1.Mock implements _i4.RepositoriesService {
  MockRepositoriesService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i4.GitHub get github =>
      (super.noSuchMethod(Invocation.getter(#github), returnValue: _FakeGitHub_16()) as _i4.GitHub);
  @override
  _i6.Stream<_i4.Repository> listRepositories(
          {String? type = r'owner', String? sort = r'full_name', String? direction = r'asc'}) =>
      (super.noSuchMethod(Invocation.method(#listRepositories, [], {#type: type, #sort: sort, #direction: direction}),
          returnValue: Stream<_i4.Repository>.empty()) as _i6.Stream<_i4.Repository>);
  @override
  _i6.Stream<_i4.Repository> listUserRepositories(String? user,
          {String? type = r'owner', String? sort = r'full_name', String? direction = r'asc'}) =>
      (super.noSuchMethod(
          Invocation.method(#listUserRepositories, [user], {#type: type, #sort: sort, #direction: direction}),
          returnValue: Stream<_i4.Repository>.empty()) as _i6.Stream<_i4.Repository>);
  @override
  _i6.Stream<_i4.Repository> listOrganizationRepositories(String? org, {String? type = r'all'}) =>
      (super.noSuchMethod(Invocation.method(#listOrganizationRepositories, [org], {#type: type}),
          returnValue: Stream<_i4.Repository>.empty()) as _i6.Stream<_i4.Repository>);
  @override
  _i6.Stream<_i4.Repository> listPublicRepositories({int? limit = 50, DateTime? since}) =>
      (super.noSuchMethod(Invocation.method(#listPublicRepositories, [], {#limit: limit, #since: since}),
          returnValue: Stream<_i4.Repository>.empty()) as _i6.Stream<_i4.Repository>);
  @override
  _i6.Future<_i4.Repository> createRepository(_i4.CreateRepository? repository, {String? org}) =>
      (super.noSuchMethod(Invocation.method(#createRepository, [repository], {#org: org}),
          returnValue: Future<_i4.Repository>.value(_FakeRepository_21())) as _i6.Future<_i4.Repository>);
  @override
  _i6.Future<_i4.LicenseDetails> getLicense(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#getLicense, [slug]),
          returnValue: Future<_i4.LicenseDetails>.value(_FakeLicenseDetails_22())) as _i6.Future<_i4.LicenseDetails>);
  @override
  _i6.Future<_i4.Repository> getRepository(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#getRepository, [slug]),
          returnValue: Future<_i4.Repository>.value(_FakeRepository_21())) as _i6.Future<_i4.Repository>);
  @override
  _i6.Stream<_i4.Repository> getRepositories(List<_i4.RepositorySlug>? slugs) =>
      (super.noSuchMethod(Invocation.method(#getRepositories, [slugs]), returnValue: Stream<_i4.Repository>.empty())
          as _i6.Stream<_i4.Repository>);
  @override
  _i6.Future<_i4.Repository> editRepository(_i4.RepositorySlug? slug,
          {String? name,
          String? description,
          String? homepage,
          bool? private,
          bool? hasIssues,
          bool? hasWiki,
          bool? hasDownloads}) =>
      (super.noSuchMethod(
          Invocation.method(#editRepository, [
            slug
          ], {
            #name: name,
            #description: description,
            #homepage: homepage,
            #private: private,
            #hasIssues: hasIssues,
            #hasWiki: hasWiki,
            #hasDownloads: hasDownloads
          }),
          returnValue: Future<_i4.Repository>.value(_FakeRepository_21())) as _i6.Future<_i4.Repository>);
  @override
  _i6.Future<bool> deleteRepository(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#deleteRepository, [slug]), returnValue: Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Stream<_i4.Contributor> listContributors(_i4.RepositorySlug? slug, {bool? anon = false}) =>
      (super.noSuchMethod(Invocation.method(#listContributors, [slug], {#anon: anon}),
          returnValue: Stream<_i4.Contributor>.empty()) as _i6.Stream<_i4.Contributor>);
  @override
  _i6.Stream<_i4.Team> listTeams(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listTeams, [slug]), returnValue: Stream<_i4.Team>.empty())
          as _i6.Stream<_i4.Team>);
  @override
  _i6.Future<_i4.LanguageBreakdown> listLanguages(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listLanguages, [slug]),
              returnValue: Future<_i4.LanguageBreakdown>.value(_FakeLanguageBreakdown_23()))
          as _i6.Future<_i4.LanguageBreakdown>);
  @override
  _i6.Stream<_i4.Tag> listTags(_i4.RepositorySlug? slug, {int? page = 1, int? pages, int? perPage = 30}) =>
      (super.noSuchMethod(Invocation.method(#listTags, [slug], {#page: page, #pages: pages, #perPage: perPage}),
          returnValue: Stream<_i4.Tag>.empty()) as _i6.Stream<_i4.Tag>);
  @override
  _i6.Stream<_i4.Branch> listBranches(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listBranches, [slug]), returnValue: Stream<_i4.Branch>.empty())
          as _i6.Stream<_i4.Branch>);
  @override
  _i6.Future<_i4.Branch> getBranch(_i4.RepositorySlug? slug, String? branch) =>
      (super.noSuchMethod(Invocation.method(#getBranch, [slug, branch]),
          returnValue: Future<_i4.Branch>.value(_FakeBranch_24())) as _i6.Future<_i4.Branch>);
  @override
  _i6.Stream<_i4.Collaborator> listCollaborators(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listCollaborators, [slug]), returnValue: Stream<_i4.Collaborator>.empty())
          as _i6.Stream<_i4.Collaborator>);
  @override
  _i6.Future<bool> isCollaborator(_i4.RepositorySlug? slug, String? user) =>
      (super.noSuchMethod(Invocation.method(#isCollaborator, [slug, user]), returnValue: Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Future<bool> addCollaborator(_i4.RepositorySlug? slug, String? user) =>
      (super.noSuchMethod(Invocation.method(#addCollaborator, [slug, user]), returnValue: Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Future<bool> removeCollaborator(_i4.RepositorySlug? slug, String? user) =>
      (super.noSuchMethod(Invocation.method(#removeCollaborator, [slug, user]), returnValue: Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Stream<_i4.CommitComment> listSingleCommitComments(_i4.RepositorySlug? slug, _i4.RepositoryCommit? commit) =>
      (super.noSuchMethod(Invocation.method(#listSingleCommitComments, [slug, commit]),
          returnValue: Stream<_i4.CommitComment>.empty()) as _i6.Stream<_i4.CommitComment>);
  @override
  _i6.Stream<_i4.CommitComment> listCommitComments(_i4.RepositorySlug? slug) => (super
          .noSuchMethod(Invocation.method(#listCommitComments, [slug]), returnValue: Stream<_i4.CommitComment>.empty())
      as _i6.Stream<_i4.CommitComment>);
  @override
  _i6.Future<_i4.CommitComment> createCommitComment(_i4.RepositorySlug? slug, _i4.RepositoryCommit? commit,
          {String? body, String? path, int? position, int? line}) =>
      (super.noSuchMethod(
          Invocation.method(
              #createCommitComment, [slug, commit], {#body: body, #path: path, #position: position, #line: line}),
          returnValue: Future<_i4.CommitComment>.value(_FakeCommitComment_25())) as _i6.Future<_i4.CommitComment>);
  @override
  _i6.Future<_i4.CommitComment> getCommitComment(_i4.RepositorySlug? slug, {int? id}) =>
      (super.noSuchMethod(Invocation.method(#getCommitComment, [slug], {#id: id}),
          returnValue: Future<_i4.CommitComment>.value(_FakeCommitComment_25())) as _i6.Future<_i4.CommitComment>);
  @override
  _i6.Future<_i4.CommitComment> updateCommitComment(_i4.RepositorySlug? slug, {int? id, String? body}) =>
      (super.noSuchMethod(Invocation.method(#updateCommitComment, [slug], {#id: id, #body: body}),
          returnValue: Future<_i4.CommitComment>.value(_FakeCommitComment_25())) as _i6.Future<_i4.CommitComment>);
  @override
  _i6.Future<bool> deleteCommitComment(_i4.RepositorySlug? slug, {int? id}) =>
      (super.noSuchMethod(Invocation.method(#deleteCommitComment, [slug], {#id: id}),
          returnValue: Future<bool>.value(false)) as _i6.Future<bool>);
  @override
  _i6.Stream<_i4.RepositoryCommit> listCommits(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listCommits, [slug]), returnValue: Stream<_i4.RepositoryCommit>.empty())
          as _i6.Stream<_i4.RepositoryCommit>);
  @override
  _i6.Future<_i4.RepositoryCommit> getCommit(_i4.RepositorySlug? slug, String? sha) => (super.noSuchMethod(
      Invocation.method(#getCommit, [slug, sha]),
      returnValue: Future<_i4.RepositoryCommit>.value(_FakeRepositoryCommit_26())) as _i6.Future<_i4.RepositoryCommit>);
  @override
  _i6.Future<String> getCommitDiff(_i4.RepositorySlug? slug, String? sha) =>
      (super.noSuchMethod(Invocation.method(#getCommitDiff, [slug, sha]), returnValue: Future<String>.value(''))
          as _i6.Future<String>);
  @override
  _i6.Future<_i4.GitHubComparison> compareCommits(_i4.RepositorySlug? slug, String? refBase, String? refHead) =>
      (super.noSuchMethod(Invocation.method(#compareCommits, [slug, refBase, refHead]),
              returnValue: Future<_i4.GitHubComparison>.value(_FakeGitHubComparison_27()))
          as _i6.Future<_i4.GitHubComparison>);
  @override
  _i6.Future<_i4.GitHubFile> getReadme(_i4.RepositorySlug? slug, {String? ref}) =>
      (super.noSuchMethod(Invocation.method(#getReadme, [slug], {#ref: ref}),
          returnValue: Future<_i4.GitHubFile>.value(_FakeGitHubFile_28())) as _i6.Future<_i4.GitHubFile>);
  @override
  _i6.Future<_i4.RepositoryContents> getContents(_i4.RepositorySlug? slug, String? path, {String? ref}) =>
      (super.noSuchMethod(Invocation.method(#getContents, [slug, path], {#ref: ref}),
              returnValue: Future<_i4.RepositoryContents>.value(_FakeRepositoryContents_29()))
          as _i6.Future<_i4.RepositoryContents>);
  @override
  _i6.Future<_i4.ContentCreation> createFile(_i4.RepositorySlug? slug, _i4.CreateFile? file) => (super.noSuchMethod(
      Invocation.method(#createFile, [slug, file]),
      returnValue: Future<_i4.ContentCreation>.value(_FakeContentCreation_30())) as _i6.Future<_i4.ContentCreation>);
  @override
  _i6.Future<_i4.ContentCreation> updateFile(
          _i4.RepositorySlug? slug, String? path, String? message, String? content, String? sha, {String? branch}) =>
      (super.noSuchMethod(Invocation.method(#updateFile, [slug, path, message, content, sha], {#branch: branch}),
              returnValue: Future<_i4.ContentCreation>.value(_FakeContentCreation_30()))
          as _i6.Future<_i4.ContentCreation>);
  @override
  _i6.Future<_i4.ContentCreation> deleteFile(
          _i4.RepositorySlug? slug, String? path, String? message, String? sha, String? branch) =>
      (super.noSuchMethod(Invocation.method(#deleteFile, [slug, path, message, sha, branch]),
              returnValue: Future<_i4.ContentCreation>.value(_FakeContentCreation_30()))
          as _i6.Future<_i4.ContentCreation>);
  @override
  _i6.Future<String?> getArchiveLink(_i4.RepositorySlug? slug, String? ref, {String? format = r'tarball'}) =>
      (super.noSuchMethod(Invocation.method(#getArchiveLink, [slug, ref], {#format: format}),
          returnValue: Future<String?>.value()) as _i6.Future<String?>);
  @override
  _i6.Stream<_i4.Repository> listForks(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listForks, [slug]), returnValue: Stream<_i4.Repository>.empty())
          as _i6.Stream<_i4.Repository>);
  @override
  _i6.Future<_i4.Repository> createFork(_i4.RepositorySlug? slug, [_i4.CreateFork? fork]) =>
      (super.noSuchMethod(Invocation.method(#createFork, [slug, fork]),
          returnValue: Future<_i4.Repository>.value(_FakeRepository_21())) as _i6.Future<_i4.Repository>);
  @override
  _i6.Stream<_i4.Hook> listHooks(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listHooks, [slug]), returnValue: Stream<_i4.Hook>.empty())
          as _i6.Stream<_i4.Hook>);
  @override
  _i6.Future<_i4.Hook> getHook(_i4.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#getHook, [slug, id]), returnValue: Future<_i4.Hook>.value(_FakeHook_31()))
          as _i6.Future<_i4.Hook>);
  @override
  _i6.Future<_i4.Hook> createHook(_i4.RepositorySlug? slug, _i4.CreateHook? hook) =>
      (super.noSuchMethod(Invocation.method(#createHook, [slug, hook]),
          returnValue: Future<_i4.Hook>.value(_FakeHook_31())) as _i6.Future<_i4.Hook>);
  @override
  _i6.Future<_i4.Hook> editHook(_i4.RepositorySlug? slug, _i4.Hook? hookToEdit,
          {String? configUrl,
          String? configContentType,
          String? configSecret,
          bool? configInsecureSsl,
          List<String>? events,
          List<String>? addEvents,
          List<String>? removeEvents,
          bool? active}) =>
      (super.noSuchMethod(
          Invocation.method(#editHook, [
            slug,
            hookToEdit
          ], {
            #configUrl: configUrl,
            #configContentType: configContentType,
            #configSecret: configSecret,
            #configInsecureSsl: configInsecureSsl,
            #events: events,
            #addEvents: addEvents,
            #removeEvents: removeEvents,
            #active: active
          }),
          returnValue: Future<_i4.Hook>.value(_FakeHook_31())) as _i6.Future<_i4.Hook>);
  @override
  _i6.Future<bool> testPushHook(_i4.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#testPushHook, [slug, id]), returnValue: Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Future<bool> pingHook(_i4.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#pingHook, [slug, id]), returnValue: Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Future<bool> deleteHook(_i4.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#deleteHook, [slug, id]), returnValue: Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Stream<_i4.PublicKey> listDeployKeys(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listDeployKeys, [slug]), returnValue: Stream<_i4.PublicKey>.empty())
          as _i6.Stream<_i4.PublicKey>);
  @override
  _i6.Future<_i4.PublicKey> getDeployKey(_i4.RepositorySlug? slug, {int? id}) =>
      (super.noSuchMethod(Invocation.method(#getDeployKey, [slug], {#id: id}),
          returnValue: Future<_i4.PublicKey>.value(_FakePublicKey_32())) as _i6.Future<_i4.PublicKey>);
  @override
  _i6.Future<_i4.PublicKey> createDeployKey(_i4.RepositorySlug? slug, _i4.CreatePublicKey? key) =>
      (super.noSuchMethod(Invocation.method(#createDeployKey, [slug, key]),
          returnValue: Future<_i4.PublicKey>.value(_FakePublicKey_32())) as _i6.Future<_i4.PublicKey>);
  @override
  _i6.Future<bool> deleteDeployKey({_i4.RepositorySlug? slug, _i4.PublicKey? key}) =>
      (super.noSuchMethod(Invocation.method(#deleteDeployKey, [], {#slug: slug, #key: key}),
          returnValue: Future<bool>.value(false)) as _i6.Future<bool>);
  @override
  _i6.Future<_i4.RepositoryCommit> merge(_i4.RepositorySlug? slug, _i4.CreateMerge? merge) => (super.noSuchMethod(
      Invocation.method(#merge, [slug, merge]),
      returnValue: Future<_i4.RepositoryCommit>.value(_FakeRepositoryCommit_26())) as _i6.Future<_i4.RepositoryCommit>);
  @override
  _i6.Future<_i4.RepositoryPages> getPagesInfo(_i4.RepositorySlug? slug) => (super.noSuchMethod(
      Invocation.method(#getPagesInfo, [slug]),
      returnValue: Future<_i4.RepositoryPages>.value(_FakeRepositoryPages_33())) as _i6.Future<_i4.RepositoryPages>);
  @override
  _i6.Stream<_i4.PageBuild> listPagesBuilds(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listPagesBuilds, [slug]), returnValue: Stream<_i4.PageBuild>.empty())
          as _i6.Stream<_i4.PageBuild>);
  @override
  _i6.Future<_i4.PageBuild> getLatestPagesBuild(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#getLatestPagesBuild, [slug]),
          returnValue: Future<_i4.PageBuild>.value(_FakePageBuild_34())) as _i6.Future<_i4.PageBuild>);
  @override
  _i6.Stream<_i4.Release> listReleases(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listReleases, [slug]), returnValue: Stream<_i4.Release>.empty())
          as _i6.Stream<_i4.Release>);
  @override
  _i6.Future<_i4.Release> getLatestRelease(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#getLatestRelease, [slug]),
          returnValue: Future<_i4.Release>.value(_FakeRelease_35())) as _i6.Future<_i4.Release>);
  @override
  _i6.Future<_i4.Release> getReleaseById(_i4.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#getReleaseById, [slug, id]),
          returnValue: Future<_i4.Release>.value(_FakeRelease_35())) as _i6.Future<_i4.Release>);
  @override
  _i6.Future<_i4.Release> getReleaseByTagName(_i4.RepositorySlug? slug, String? tagName) =>
      (super.noSuchMethod(Invocation.method(#getReleaseByTagName, [slug, tagName]),
          returnValue: Future<_i4.Release>.value(_FakeRelease_35())) as _i6.Future<_i4.Release>);
  @override
  _i6.Future<_i4.Release> createRelease(_i4.RepositorySlug? slug, _i4.CreateRelease? createRelease,
          {bool? getIfExists = true}) =>
      (super.noSuchMethod(Invocation.method(#createRelease, [slug, createRelease], {#getIfExists: getIfExists}),
          returnValue: Future<_i4.Release>.value(_FakeRelease_35())) as _i6.Future<_i4.Release>);
  @override
  _i6.Future<_i4.Release> editRelease(_i4.RepositorySlug? slug, _i4.Release? releaseToEdit,
          {String? tagName, String? targetCommitish, String? name, String? body, bool? draft, bool? preRelease}) =>
      (super.noSuchMethod(
          Invocation.method(#editRelease, [
            slug,
            releaseToEdit
          ], {
            #tagName: tagName,
            #targetCommitish: targetCommitish,
            #name: name,
            #body: body,
            #draft: draft,
            #preRelease: preRelease
          }),
          returnValue: Future<_i4.Release>.value(_FakeRelease_35())) as _i6.Future<_i4.Release>);
  @override
  _i6.Future<bool> deleteRelease(_i4.RepositorySlug? slug, _i4.Release? release) =>
      (super.noSuchMethod(Invocation.method(#deleteRelease, [slug, release]), returnValue: Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Stream<_i4.ReleaseAsset> listReleaseAssets(_i4.RepositorySlug? slug, _i4.Release? release) =>
      (super.noSuchMethod(Invocation.method(#listReleaseAssets, [slug, release]),
          returnValue: Stream<_i4.ReleaseAsset>.empty()) as _i6.Stream<_i4.ReleaseAsset>);
  @override
  _i6.Future<_i4.ReleaseAsset> getReleaseAsset(_i4.RepositorySlug? slug, _i4.Release? release, {int? assetId}) =>
      (super.noSuchMethod(Invocation.method(#getReleaseAsset, [slug, release], {#assetId: assetId}),
          returnValue: Future<_i4.ReleaseAsset>.value(_FakeReleaseAsset_36())) as _i6.Future<_i4.ReleaseAsset>);
  @override
  _i6.Future<_i4.ReleaseAsset> editReleaseAsset(_i4.RepositorySlug? slug, _i4.ReleaseAsset? assetToEdit,
          {String? name, String? label}) =>
      (super.noSuchMethod(Invocation.method(#editReleaseAsset, [slug, assetToEdit], {#name: name, #label: label}),
          returnValue: Future<_i4.ReleaseAsset>.value(_FakeReleaseAsset_36())) as _i6.Future<_i4.ReleaseAsset>);
  @override
  _i6.Future<bool> deleteReleaseAsset(_i4.RepositorySlug? slug, _i4.ReleaseAsset? asset) =>
      (super.noSuchMethod(Invocation.method(#deleteReleaseAsset, [slug, asset]), returnValue: Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Future<List<_i4.ReleaseAsset>> uploadReleaseAssets(
          _i4.Release? release, Iterable<_i4.CreateReleaseAsset>? createReleaseAssets) =>
      (super.noSuchMethod(Invocation.method(#uploadReleaseAssets, [release, createReleaseAssets]),
              returnValue: Future<List<_i4.ReleaseAsset>>.value(<_i4.ReleaseAsset>[]))
          as _i6.Future<List<_i4.ReleaseAsset>>);
  @override
  _i6.Future<List<_i4.ContributorStatistics>> listContributorStats(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listContributorStats, [slug]),
              returnValue: Future<List<_i4.ContributorStatistics>>.value(<_i4.ContributorStatistics>[]))
          as _i6.Future<List<_i4.ContributorStatistics>>);
  @override
  _i6.Stream<_i4.YearCommitCountWeek> listCommitActivity(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listCommitActivity, [slug]),
          returnValue: Stream<_i4.YearCommitCountWeek>.empty()) as _i6.Stream<_i4.YearCommitCountWeek>);
  @override
  _i6.Stream<_i4.WeeklyChangesCount> listCodeFrequency(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listCodeFrequency, [slug]),
          returnValue: Stream<_i4.WeeklyChangesCount>.empty()) as _i6.Stream<_i4.WeeklyChangesCount>);
  @override
  _i6.Future<_i4.ContributorParticipation> getParticipation(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#getParticipation, [slug]),
              returnValue: Future<_i4.ContributorParticipation>.value(_FakeContributorParticipation_37()))
          as _i6.Future<_i4.ContributorParticipation>);
  @override
  _i6.Stream<_i4.PunchcardEntry> listPunchcard(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listPunchcard, [slug]), returnValue: Stream<_i4.PunchcardEntry>.empty())
          as _i6.Stream<_i4.PunchcardEntry>);
  @override
  _i6.Stream<_i4.RepositoryStatus> listStatuses(_i4.RepositorySlug? slug, String? ref) =>
      (super.noSuchMethod(Invocation.method(#listStatuses, [slug, ref]),
          returnValue: Stream<_i4.RepositoryStatus>.empty()) as _i6.Stream<_i4.RepositoryStatus>);
  @override
  _i6.Future<_i4.RepositoryStatus> createStatus(_i4.RepositorySlug? slug, String? ref, _i4.CreateStatus? request) =>
      (super.noSuchMethod(Invocation.method(#createStatus, [slug, ref, request]),
              returnValue: Future<_i4.RepositoryStatus>.value(_FakeRepositoryStatus_38()))
          as _i6.Future<_i4.RepositoryStatus>);
  @override
  _i6.Future<_i4.CombinedRepositoryStatus> getCombinedStatus(_i4.RepositorySlug? slug, String? ref) =>
      (super.noSuchMethod(Invocation.method(#getCombinedStatus, [slug, ref]),
              returnValue: Future<_i4.CombinedRepositoryStatus>.value(_FakeCombinedRepositoryStatus_39()))
          as _i6.Future<_i4.CombinedRepositoryStatus>);
  @override
  _i6.Future<_i4.ReleaseNotes> generateReleaseNotes(_i4.CreateReleaseNotes? crn) =>
      (super.noSuchMethod(Invocation.method(#generateReleaseNotes, [crn]),
          returnValue: Future<_i4.ReleaseNotes>.value(_FakeReleaseNotes_40())) as _i6.Future<_i4.ReleaseNotes>);
}

/// A class which mocks [GitHubComparison].
///
/// See the documentation for Mockito's code generation for more information.
class MockGitHubComparison extends _i1.Mock implements _i4.GitHubComparison {
  MockGitHubComparison() {
    _i1.throwOnMissingStub(this);
  }

  @override
  Map<String, dynamic> toJson() =>
      (super.noSuchMethod(Invocation.method(#toJson, []), returnValue: <String, dynamic>{}) as Map<String, dynamic>);
}

/// A class which mocks [Response].
///
/// See the documentation for Mockito's code generation for more information.
class MockResponse extends _i1.Mock implements _i3.Response {
  MockResponse() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i7.Uint8List get bodyBytes =>
      (super.noSuchMethod(Invocation.getter(#bodyBytes), returnValue: _i7.Uint8List(0)) as _i7.Uint8List);
  @override
  String get body => (super.noSuchMethod(Invocation.getter(#body), returnValue: '') as String);
  @override
  int get statusCode => (super.noSuchMethod(Invocation.getter(#statusCode), returnValue: 0) as int);
  @override
  Map<String, String> get headers =>
      (super.noSuchMethod(Invocation.getter(#headers), returnValue: <String, String>{}) as Map<String, String>);
  @override
  bool get isRedirect => (super.noSuchMethod(Invocation.getter(#isRedirect), returnValue: false) as bool);
  @override
  bool get persistentConnection =>
      (super.noSuchMethod(Invocation.getter(#persistentConnection), returnValue: false) as bool);
}
