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

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i7;
import 'dart:typed_data' as _i11;

import 'package:_discoveryapis_commons/_discoveryapis_commons.dart' as _i8;
import 'package:auto_submit/model/auto_submit_query_result.dart' as _i10;
import 'package:auto_submit/service/access_client_provider.dart' as _i6;
import 'package:auto_submit/service/approver_service.dart' as _i9;
import 'package:auto_submit/service/config.dart' as _i4;
import 'package:github/github.dart' as _i5;
import 'package:googleapis/bigquery/v2.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 _FakeJobCancelResponse_1 extends _i1.SmartFake implements _i3.JobCancelResponse {
  _FakeJobCancelResponse_1(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

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

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

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

class _FakeConfig_6 extends _i1.SmartFake implements _i4.Config {
  _FakeConfig_6(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class _FakePullRequest_22 extends _i1.SmartFake implements _i5.PullRequest {
  _FakePullRequest_22(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePullRequestMerge_23 extends _i1.SmartFake implements _i5.PullRequestMerge {
  _FakePullRequestMerge_23(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePullRequestComment_24 extends _i1.SmartFake implements _i5.PullRequestComment {
  _FakePullRequestComment_24(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePullRequestReview_25 extends _i1.SmartFake implements _i5.PullRequestReview {
  _FakePullRequestReview_25(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRepository_26 extends _i1.SmartFake implements _i5.Repository {
  _FakeRepository_26(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeLicenseDetails_27 extends _i1.SmartFake implements _i5.LicenseDetails {
  _FakeLicenseDetails_27(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeLanguageBreakdown_28 extends _i1.SmartFake implements _i5.LanguageBreakdown {
  _FakeLanguageBreakdown_28(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeBranch_29 extends _i1.SmartFake implements _i5.Branch {
  _FakeBranch_29(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCommitComment_30 extends _i1.SmartFake implements _i5.CommitComment {
  _FakeCommitComment_30(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRepositoryCommit_31 extends _i1.SmartFake implements _i5.RepositoryCommit {
  _FakeRepositoryCommit_31(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGitHubComparison_32 extends _i1.SmartFake implements _i5.GitHubComparison {
  _FakeGitHubComparison_32(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGitHubFile_33 extends _i1.SmartFake implements _i5.GitHubFile {
  _FakeGitHubFile_33(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRepositoryContents_34 extends _i1.SmartFake implements _i5.RepositoryContents {
  _FakeRepositoryContents_34(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeContentCreation_35 extends _i1.SmartFake implements _i5.ContentCreation {
  _FakeContentCreation_35(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeHook_36 extends _i1.SmartFake implements _i5.Hook {
  _FakeHook_36(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePublicKey_37 extends _i1.SmartFake implements _i5.PublicKey {
  _FakePublicKey_37(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRepositoryPages_38 extends _i1.SmartFake implements _i5.RepositoryPages {
  _FakeRepositoryPages_38(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePageBuild_39 extends _i1.SmartFake implements _i5.PageBuild {
  _FakePageBuild_39(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRelease_40 extends _i1.SmartFake implements _i5.Release {
  _FakeRelease_40(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeReleaseAsset_41 extends _i1.SmartFake implements _i5.ReleaseAsset {
  _FakeReleaseAsset_41(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeContributorParticipation_42 extends _i1.SmartFake implements _i5.ContributorParticipation {
  _FakeContributorParticipation_42(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRepositoryStatus_43 extends _i1.SmartFake implements _i5.RepositoryStatus {
  _FakeRepositoryStatus_43(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCombinedRepositoryStatus_44 extends _i1.SmartFake implements _i5.CombinedRepositoryStatus {
  _FakeCombinedRepositoryStatus_44(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeReleaseNotes_45 extends _i1.SmartFake implements _i5.ReleaseNotes {
  _FakeReleaseNotes_45(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

  @override
  _i7.Future<_i2.Client> createAccessClient(
          {List<String>? scopes = const [r'https://www.googleapis.com/auth/cloud-platform']}) =>
      (super.noSuchMethod(
        Invocation.method(
          #createAccessClient,
          [],
          {#scopes: scopes},
        ),
        returnValue: _i7.Future<_i2.Client>.value(_FakeClient_0(
          this,
          Invocation.method(
            #createAccessClient,
            [],
            {#scopes: scopes},
          ),
        )),
      ) as _i7.Future<_i2.Client>);
}

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

  @override
  _i7.Future<_i3.JobCancelResponse> cancel(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #cancel,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i7.Future<_i3.JobCancelResponse>.value(_FakeJobCancelResponse_1(
          this,
          Invocation.method(
            #cancel,
            [
              projectId,
              jobId,
            ],
            {
              #location: location,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i7.Future<_i3.JobCancelResponse>);
  @override
  _i7.Future<void> delete(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #delete,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<_i3.Job> get(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i7.Future<_i3.Job>.value(_FakeJob_2(
          this,
          Invocation.method(
            #get,
            [
              projectId,
              jobId,
            ],
            {
              #location: location,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i7.Future<_i3.Job>);
  @override
  _i7.Future<_i3.GetQueryResultsResponse> getQueryResults(
    String? projectId,
    String? jobId, {
    String? location,
    int? maxResults,
    String? pageToken,
    String? startIndex,
    int? timeoutMs,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getQueryResults,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #maxResults: maxResults,
            #pageToken: pageToken,
            #startIndex: startIndex,
            #timeoutMs: timeoutMs,
            #$fields: $fields,
          },
        ),
        returnValue: _i7.Future<_i3.GetQueryResultsResponse>.value(_FakeGetQueryResultsResponse_3(
          this,
          Invocation.method(
            #getQueryResults,
            [
              projectId,
              jobId,
            ],
            {
              #location: location,
              #maxResults: maxResults,
              #pageToken: pageToken,
              #startIndex: startIndex,
              #timeoutMs: timeoutMs,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i7.Future<_i3.GetQueryResultsResponse>);
  @override
  _i7.Future<_i3.Job> insert(
    _i3.Job? request,
    String? projectId, {
    String? $fields,
    _i8.UploadOptions? uploadOptions = _i8.UploadOptions.defaultOptions,
    _i8.Media? uploadMedia,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #insert,
          [
            request,
            projectId,
          ],
          {
            #$fields: $fields,
            #uploadOptions: uploadOptions,
            #uploadMedia: uploadMedia,
          },
        ),
        returnValue: _i7.Future<_i3.Job>.value(_FakeJob_2(
          this,
          Invocation.method(
            #insert,
            [
              request,
              projectId,
            ],
            {
              #$fields: $fields,
              #uploadOptions: uploadOptions,
              #uploadMedia: uploadMedia,
            },
          ),
        )),
      ) as _i7.Future<_i3.Job>);
  @override
  _i7.Future<_i3.JobList> list(
    String? projectId, {
    bool? allUsers,
    String? maxCreationTime,
    int? maxResults,
    String? minCreationTime,
    String? pageToken,
    String? parentJobId,
    String? projection,
    List<String>? stateFilter,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #list,
          [projectId],
          {
            #allUsers: allUsers,
            #maxCreationTime: maxCreationTime,
            #maxResults: maxResults,
            #minCreationTime: minCreationTime,
            #pageToken: pageToken,
            #parentJobId: parentJobId,
            #projection: projection,
            #stateFilter: stateFilter,
            #$fields: $fields,
          },
        ),
        returnValue: _i7.Future<_i3.JobList>.value(_FakeJobList_4(
          this,
          Invocation.method(
            #list,
            [projectId],
            {
              #allUsers: allUsers,
              #maxCreationTime: maxCreationTime,
              #maxResults: maxResults,
              #minCreationTime: minCreationTime,
              #pageToken: pageToken,
              #parentJobId: parentJobId,
              #projection: projection,
              #stateFilter: stateFilter,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i7.Future<_i3.JobList>);
  @override
  _i7.Future<_i3.QueryResponse> query(
    _i3.QueryRequest? request,
    String? projectId, {
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #query,
          [
            request,
            projectId,
          ],
          {#$fields: $fields},
        ),
        returnValue: _i7.Future<_i3.QueryResponse>.value(_FakeQueryResponse_5(
          this,
          Invocation.method(
            #query,
            [
              request,
              projectId,
            ],
            {#$fields: $fields},
          ),
        )),
      ) as _i7.Future<_i3.QueryResponse>);
}

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

  @override
  _i4.Config get config => (super.noSuchMethod(
        Invocation.getter(#config),
        returnValue: _FakeConfig_6(
          this,
          Invocation.getter(#config),
        ),
      ) as _i4.Config);
  @override
  _i7.Future<void> autoApproval(_i5.PullRequest? pullRequest) => (super.noSuchMethod(
        Invocation.method(
          #autoApproval,
          [pullRequest],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> revertApproval(
    _i10.QueryResult? queryResult,
    _i5.PullRequest? pullRequest,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #revertApproval,
          [
            queryResult,
            pullRequest,
          ],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
}

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

  @override
  set auth(_i5.Authentication? _auth) => super.noSuchMethod(
        Invocation.setter(
          #auth,
          _auth,
        ),
        returnValueForMissingStub: null,
      );
  @override
  String get endpoint => (super.noSuchMethod(
        Invocation.getter(#endpoint),
        returnValue: '',
      ) as String);
  @override
  String get version => (super.noSuchMethod(
        Invocation.getter(#version),
        returnValue: '',
      ) as String);
  @override
  _i2.Client get client => (super.noSuchMethod(
        Invocation.getter(#client),
        returnValue: _FakeClient_0(
          this,
          Invocation.getter(#client),
        ),
      ) as _i2.Client);
  @override
  _i5.ActivityService get activity => (super.noSuchMethod(
        Invocation.getter(#activity),
        returnValue: _FakeActivityService_7(
          this,
          Invocation.getter(#activity),
        ),
      ) as _i5.ActivityService);
  @override
  _i5.AuthorizationsService get authorizations => (super.noSuchMethod(
        Invocation.getter(#authorizations),
        returnValue: _FakeAuthorizationsService_8(
          this,
          Invocation.getter(#authorizations),
        ),
      ) as _i5.AuthorizationsService);
  @override
  _i5.GistsService get gists => (super.noSuchMethod(
        Invocation.getter(#gists),
        returnValue: _FakeGistsService_9(
          this,
          Invocation.getter(#gists),
        ),
      ) as _i5.GistsService);
  @override
  _i5.GitService get git => (super.noSuchMethod(
        Invocation.getter(#git),
        returnValue: _FakeGitService_10(
          this,
          Invocation.getter(#git),
        ),
      ) as _i5.GitService);
  @override
  _i5.IssuesService get issues => (super.noSuchMethod(
        Invocation.getter(#issues),
        returnValue: _FakeIssuesService_11(
          this,
          Invocation.getter(#issues),
        ),
      ) as _i5.IssuesService);
  @override
  _i5.MiscService get misc => (super.noSuchMethod(
        Invocation.getter(#misc),
        returnValue: _FakeMiscService_12(
          this,
          Invocation.getter(#misc),
        ),
      ) as _i5.MiscService);
  @override
  _i5.OrganizationsService get organizations => (super.noSuchMethod(
        Invocation.getter(#organizations),
        returnValue: _FakeOrganizationsService_13(
          this,
          Invocation.getter(#organizations),
        ),
      ) as _i5.OrganizationsService);
  @override
  _i5.PullRequestsService get pullRequests => (super.noSuchMethod(
        Invocation.getter(#pullRequests),
        returnValue: _FakePullRequestsService_14(
          this,
          Invocation.getter(#pullRequests),
        ),
      ) as _i5.PullRequestsService);
  @override
  _i5.RepositoriesService get repositories => (super.noSuchMethod(
        Invocation.getter(#repositories),
        returnValue: _FakeRepositoriesService_15(
          this,
          Invocation.getter(#repositories),
        ),
      ) as _i5.RepositoriesService);
  @override
  _i5.SearchService get search => (super.noSuchMethod(
        Invocation.getter(#search),
        returnValue: _FakeSearchService_16(
          this,
          Invocation.getter(#search),
        ),
      ) as _i5.SearchService);
  @override
  _i5.UrlShortenerService get urlShortener => (super.noSuchMethod(
        Invocation.getter(#urlShortener),
        returnValue: _FakeUrlShortenerService_17(
          this,
          Invocation.getter(#urlShortener),
        ),
      ) as _i5.UrlShortenerService);
  @override
  _i5.UsersService get users => (super.noSuchMethod(
        Invocation.getter(#users),
        returnValue: _FakeUsersService_18(
          this,
          Invocation.getter(#users),
        ),
      ) as _i5.UsersService);
  @override
  _i5.ChecksService get checks => (super.noSuchMethod(
        Invocation.getter(#checks),
        returnValue: _FakeChecksService_19(
          this,
          Invocation.getter(#checks),
        ),
      ) as _i5.ChecksService);
  @override
  _i7.Future<T> getJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, String>? params,
    _i5.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: _i7.Future<T>.value(null),
      ) as _i7.Future<T>);
  @override
  _i7.Future<T> postJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i5.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: _i7.Future<T>.value(null),
      ) as _i7.Future<T>);
  @override
  _i7.Future<T> putJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i5.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: _i7.Future<T>.value(null),
      ) as _i7.Future<T>);
  @override
  _i7.Future<T> patchJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i5.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: _i7.Future<T>.value(null),
      ) as _i7.Future<T>);
  @override
  _i7.Future<T> requestJson<S, T>(
    String? method,
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i5.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: _i7.Future<T>.value(null),
      ) as _i7.Future<T>);
  @override
  _i7.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: _i7.Future<_i2.Response>.value(_FakeResponse_20(
          this,
          Invocation.method(
            #request,
            [
              method,
              path,
            ],
            {
              #headers: headers,
              #params: params,
              #body: body,
              #statusCode: statusCode,
              #fail: fail,
              #preview: preview,
            },
          ),
        )),
      ) as _i7.Future<_i2.Response>);
  @override
  Never handleStatusCode(_i2.Response? response) => (super.noSuchMethod(
        Invocation.method(
          #handleStatusCode,
          [response],
        ),
        returnValue: null,
      ) as Never);
  @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 _i5.PullRequestsService {
  MockPullRequestsService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i5.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_21(
          this,
          Invocation.getter(#github),
        ),
      ) as _i5.GitHub);
  @override
  _i7.Stream<_i5.PullRequest> list(
    _i5.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: _i7.Stream<_i5.PullRequest>.empty(),
      ) as _i7.Stream<_i5.PullRequest>);
  @override
  _i7.Future<_i5.PullRequest> get(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i7.Future<_i5.PullRequest>.value(_FakePullRequest_22(
          this,
          Invocation.method(
            #get,
            [
              slug,
              number,
            ],
          ),
        )),
      ) as _i7.Future<_i5.PullRequest>);
  @override
  _i7.Future<_i5.PullRequest> create(
    _i5.RepositorySlug? slug,
    _i5.CreatePullRequest? request,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #create,
          [
            slug,
            request,
          ],
        ),
        returnValue: _i7.Future<_i5.PullRequest>.value(_FakePullRequest_22(
          this,
          Invocation.method(
            #create,
            [
              slug,
              request,
            ],
          ),
        )),
      ) as _i7.Future<_i5.PullRequest>);
  @override
  _i7.Future<_i5.PullRequest> edit(
    _i5.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: _i7.Future<_i5.PullRequest>.value(_FakePullRequest_22(
          this,
          Invocation.method(
            #edit,
            [
              slug,
              number,
            ],
            {
              #title: title,
              #body: body,
              #state: state,
              #base: base,
            },
          ),
        )),
      ) as _i7.Future<_i5.PullRequest>);
  @override
  _i7.Stream<_i5.RepositoryCommit> listCommits(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommits,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i7.Stream<_i5.RepositoryCommit>.empty(),
      ) as _i7.Stream<_i5.RepositoryCommit>);
  @override
  _i7.Stream<_i5.PullRequestFile> listFiles(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listFiles,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i7.Stream<_i5.PullRequestFile>.empty(),
      ) as _i7.Stream<_i5.PullRequestFile>);
  @override
  _i7.Stream<_i5.PullRequestReview> listReviews(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReviews,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i7.Stream<_i5.PullRequestReview>.empty(),
      ) as _i7.Stream<_i5.PullRequestReview>);
  @override
  _i7.Future<bool> isMerged(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isMerged,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Future<_i5.PullRequestMerge> merge(
    _i5.RepositorySlug? slug,
    int? number, {
    String? message,
    _i5.MergeMethod? mergeMethod = _i5.MergeMethod.merge,
    String? requestSha,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #merge,
          [
            slug,
            number,
          ],
          {
            #message: message,
            #mergeMethod: mergeMethod,
            #requestSha: requestSha,
          },
        ),
        returnValue: _i7.Future<_i5.PullRequestMerge>.value(_FakePullRequestMerge_23(
          this,
          Invocation.method(
            #merge,
            [
              slug,
              number,
            ],
            {
              #message: message,
              #mergeMethod: mergeMethod,
              #requestSha: requestSha,
            },
          ),
        )),
      ) as _i7.Future<_i5.PullRequestMerge>);
  @override
  _i7.Stream<_i5.PullRequestComment> listCommentsByPullRequest(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommentsByPullRequest,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i7.Stream<_i5.PullRequestComment>.empty(),
      ) as _i7.Stream<_i5.PullRequestComment>);
  @override
  _i7.Stream<_i5.PullRequestComment> listComments(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listComments,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.PullRequestComment>.empty(),
      ) as _i7.Stream<_i5.PullRequestComment>);
  @override
  _i7.Future<_i5.PullRequestComment> createComment(
    _i5.RepositorySlug? slug,
    int? number,
    _i5.CreatePullRequestComment? comment,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createComment,
          [
            slug,
            number,
            comment,
          ],
        ),
        returnValue: _i7.Future<_i5.PullRequestComment>.value(_FakePullRequestComment_24(
          this,
          Invocation.method(
            #createComment,
            [
              slug,
              number,
              comment,
            ],
          ),
        )),
      ) as _i7.Future<_i5.PullRequestComment>);
  @override
  _i7.Future<_i5.PullRequestReview> createReview(
    _i5.RepositorySlug? slug,
    _i5.CreatePullRequestReview? review,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createReview,
          [
            slug,
            review,
          ],
        ),
        returnValue: _i7.Future<_i5.PullRequestReview>.value(_FakePullRequestReview_25(
          this,
          Invocation.method(
            #createReview,
            [
              slug,
              review,
            ],
          ),
        )),
      ) as _i7.Future<_i5.PullRequestReview>);
}

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

  @override
  _i5.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_21(
          this,
          Invocation.getter(#github),
        ),
      ) as _i5.GitHub);
  @override
  _i7.Stream<_i5.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: _i7.Stream<_i5.Repository>.empty(),
      ) as _i7.Stream<_i5.Repository>);
  @override
  _i7.Stream<_i5.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: _i7.Stream<_i5.Repository>.empty(),
      ) as _i7.Stream<_i5.Repository>);
  @override
  _i7.Stream<_i5.Repository> listOrganizationRepositories(
    String? org, {
    String? type = r'all',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listOrganizationRepositories,
          [org],
          {#type: type},
        ),
        returnValue: _i7.Stream<_i5.Repository>.empty(),
      ) as _i7.Stream<_i5.Repository>);
  @override
  _i7.Stream<_i5.Repository> listPublicRepositories({
    int? limit = 50,
    DateTime? since,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listPublicRepositories,
          [],
          {
            #limit: limit,
            #since: since,
          },
        ),
        returnValue: _i7.Stream<_i5.Repository>.empty(),
      ) as _i7.Stream<_i5.Repository>);
  @override
  _i7.Future<_i5.Repository> createRepository(
    _i5.CreateRepository? repository, {
    String? org,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createRepository,
          [repository],
          {#org: org},
        ),
        returnValue: _i7.Future<_i5.Repository>.value(_FakeRepository_26(
          this,
          Invocation.method(
            #createRepository,
            [repository],
            {#org: org},
          ),
        )),
      ) as _i7.Future<_i5.Repository>);
  @override
  _i7.Future<_i5.LicenseDetails> getLicense(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLicense,
          [slug],
        ),
        returnValue: _i7.Future<_i5.LicenseDetails>.value(_FakeLicenseDetails_27(
          this,
          Invocation.method(
            #getLicense,
            [slug],
          ),
        )),
      ) as _i7.Future<_i5.LicenseDetails>);
  @override
  _i7.Future<_i5.Repository> getRepository(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getRepository,
          [slug],
        ),
        returnValue: _i7.Future<_i5.Repository>.value(_FakeRepository_26(
          this,
          Invocation.method(
            #getRepository,
            [slug],
          ),
        )),
      ) as _i7.Future<_i5.Repository>);
  @override
  _i7.Stream<_i5.Repository> getRepositories(List<_i5.RepositorySlug>? slugs) => (super.noSuchMethod(
        Invocation.method(
          #getRepositories,
          [slugs],
        ),
        returnValue: _i7.Stream<_i5.Repository>.empty(),
      ) as _i7.Stream<_i5.Repository>);
  @override
  _i7.Future<_i5.Repository> editRepository(
    _i5.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: _i7.Future<_i5.Repository>.value(_FakeRepository_26(
          this,
          Invocation.method(
            #editRepository,
            [slug],
            {
              #name: name,
              #description: description,
              #homepage: homepage,
              #private: private,
              #hasIssues: hasIssues,
              #hasWiki: hasWiki,
              #hasDownloads: hasDownloads,
            },
          ),
        )),
      ) as _i7.Future<_i5.Repository>);
  @override
  _i7.Future<bool> deleteRepository(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #deleteRepository,
          [slug],
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Stream<_i5.Contributor> listContributors(
    _i5.RepositorySlug? slug, {
    bool? anon = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listContributors,
          [slug],
          {#anon: anon},
        ),
        returnValue: _i7.Stream<_i5.Contributor>.empty(),
      ) as _i7.Stream<_i5.Contributor>);
  @override
  _i7.Stream<_i5.Team> listTeams(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listTeams,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.Team>.empty(),
      ) as _i7.Stream<_i5.Team>);
  @override
  _i7.Future<_i5.LanguageBreakdown> listLanguages(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listLanguages,
          [slug],
        ),
        returnValue: _i7.Future<_i5.LanguageBreakdown>.value(_FakeLanguageBreakdown_28(
          this,
          Invocation.method(
            #listLanguages,
            [slug],
          ),
        )),
      ) as _i7.Future<_i5.LanguageBreakdown>);
  @override
  _i7.Stream<_i5.Tag> listTags(
    _i5.RepositorySlug? slug, {
    int? page = 1,
    int? pages,
    int? perPage = 30,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listTags,
          [slug],
          {
            #page: page,
            #pages: pages,
            #perPage: perPage,
          },
        ),
        returnValue: _i7.Stream<_i5.Tag>.empty(),
      ) as _i7.Stream<_i5.Tag>);
  @override
  _i7.Stream<_i5.Branch> listBranches(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listBranches,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.Branch>.empty(),
      ) as _i7.Stream<_i5.Branch>);
  @override
  _i7.Future<_i5.Branch> getBranch(
    _i5.RepositorySlug? slug,
    String? branch,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBranch,
          [
            slug,
            branch,
          ],
        ),
        returnValue: _i7.Future<_i5.Branch>.value(_FakeBranch_29(
          this,
          Invocation.method(
            #getBranch,
            [
              slug,
              branch,
            ],
          ),
        )),
      ) as _i7.Future<_i5.Branch>);
  @override
  _i7.Stream<_i5.Collaborator> listCollaborators(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCollaborators,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.Collaborator>.empty(),
      ) as _i7.Stream<_i5.Collaborator>);
  @override
  _i7.Future<bool> isCollaborator(
    _i5.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Future<bool> addCollaborator(
    _i5.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #addCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Future<bool> removeCollaborator(
    _i5.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Stream<_i5.CommitComment> listSingleCommitComments(
    _i5.RepositorySlug? slug,
    _i5.RepositoryCommit? commit,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listSingleCommitComments,
          [
            slug,
            commit,
          ],
        ),
        returnValue: _i7.Stream<_i5.CommitComment>.empty(),
      ) as _i7.Stream<_i5.CommitComment>);
  @override
  _i7.Stream<_i5.CommitComment> listCommitComments(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommitComments,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.CommitComment>.empty(),
      ) as _i7.Stream<_i5.CommitComment>);
  @override
  _i7.Future<_i5.CommitComment> createCommitComment(
    _i5.RepositorySlug? slug,
    _i5.RepositoryCommit? commit, {
    required String? body,
    String? path,
    int? position,
    int? line,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createCommitComment,
          [
            slug,
            commit,
          ],
          {
            #body: body,
            #path: path,
            #position: position,
            #line: line,
          },
        ),
        returnValue: _i7.Future<_i5.CommitComment>.value(_FakeCommitComment_30(
          this,
          Invocation.method(
            #createCommitComment,
            [
              slug,
              commit,
            ],
            {
              #body: body,
              #path: path,
              #position: position,
              #line: line,
            },
          ),
        )),
      ) as _i7.Future<_i5.CommitComment>);
  @override
  _i7.Future<_i5.CommitComment> getCommitComment(
    _i5.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommitComment,
          [slug],
          {#id: id},
        ),
        returnValue: _i7.Future<_i5.CommitComment>.value(_FakeCommitComment_30(
          this,
          Invocation.method(
            #getCommitComment,
            [slug],
            {#id: id},
          ),
        )),
      ) as _i7.Future<_i5.CommitComment>);
  @override
  _i7.Future<_i5.CommitComment> updateCommitComment(
    _i5.RepositorySlug? slug, {
    required int? id,
    required String? body,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateCommitComment,
          [slug],
          {
            #id: id,
            #body: body,
          },
        ),
        returnValue: _i7.Future<_i5.CommitComment>.value(_FakeCommitComment_30(
          this,
          Invocation.method(
            #updateCommitComment,
            [slug],
            {
              #id: id,
              #body: body,
            },
          ),
        )),
      ) as _i7.Future<_i5.CommitComment>);
  @override
  _i7.Future<bool> deleteCommitComment(
    _i5.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteCommitComment,
          [slug],
          {#id: id},
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Stream<_i5.RepositoryCommit> listCommits(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommits,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.RepositoryCommit>.empty(),
      ) as _i7.Stream<_i5.RepositoryCommit>);
  @override
  _i7.Future<_i5.RepositoryCommit> getCommit(
    _i5.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommit,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i7.Future<_i5.RepositoryCommit>.value(_FakeRepositoryCommit_31(
          this,
          Invocation.method(
            #getCommit,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i7.Future<_i5.RepositoryCommit>);
  @override
  _i7.Future<String> getCommitDiff(
    _i5.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommitDiff,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i7.Future<String>.value(''),
      ) as _i7.Future<String>);
  @override
  _i7.Future<_i5.GitHubComparison> compareCommits(
    _i5.RepositorySlug? slug,
    String? refBase,
    String? refHead,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #compareCommits,
          [
            slug,
            refBase,
            refHead,
          ],
        ),
        returnValue: _i7.Future<_i5.GitHubComparison>.value(_FakeGitHubComparison_32(
          this,
          Invocation.method(
            #compareCommits,
            [
              slug,
              refBase,
              refHead,
            ],
          ),
        )),
      ) as _i7.Future<_i5.GitHubComparison>);
  @override
  _i7.Future<_i5.GitHubFile> getReadme(
    _i5.RepositorySlug? slug, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReadme,
          [slug],
          {#ref: ref},
        ),
        returnValue: _i7.Future<_i5.GitHubFile>.value(_FakeGitHubFile_33(
          this,
          Invocation.method(
            #getReadme,
            [slug],
            {#ref: ref},
          ),
        )),
      ) as _i7.Future<_i5.GitHubFile>);
  @override
  _i7.Future<_i5.RepositoryContents> getContents(
    _i5.RepositorySlug? slug,
    String? path, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getContents,
          [
            slug,
            path,
          ],
          {#ref: ref},
        ),
        returnValue: _i7.Future<_i5.RepositoryContents>.value(_FakeRepositoryContents_34(
          this,
          Invocation.method(
            #getContents,
            [
              slug,
              path,
            ],
            {#ref: ref},
          ),
        )),
      ) as _i7.Future<_i5.RepositoryContents>);
  @override
  _i7.Future<_i5.ContentCreation> createFile(
    _i5.RepositorySlug? slug,
    _i5.CreateFile? file,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createFile,
          [
            slug,
            file,
          ],
        ),
        returnValue: _i7.Future<_i5.ContentCreation>.value(_FakeContentCreation_35(
          this,
          Invocation.method(
            #createFile,
            [
              slug,
              file,
            ],
          ),
        )),
      ) as _i7.Future<_i5.ContentCreation>);
  @override
  _i7.Future<_i5.ContentCreation> updateFile(
    _i5.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: _i7.Future<_i5.ContentCreation>.value(_FakeContentCreation_35(
          this,
          Invocation.method(
            #updateFile,
            [
              slug,
              path,
              message,
              content,
              sha,
            ],
            {#branch: branch},
          ),
        )),
      ) as _i7.Future<_i5.ContentCreation>);
  @override
  _i7.Future<_i5.ContentCreation> deleteFile(
    _i5.RepositorySlug? slug,
    String? path,
    String? message,
    String? sha,
    String? branch,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteFile,
          [
            slug,
            path,
            message,
            sha,
            branch,
          ],
        ),
        returnValue: _i7.Future<_i5.ContentCreation>.value(_FakeContentCreation_35(
          this,
          Invocation.method(
            #deleteFile,
            [
              slug,
              path,
              message,
              sha,
              branch,
            ],
          ),
        )),
      ) as _i7.Future<_i5.ContentCreation>);
  @override
  _i7.Future<String?> getArchiveLink(
    _i5.RepositorySlug? slug,
    String? ref, {
    String? format = r'tarball',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getArchiveLink,
          [
            slug,
            ref,
          ],
          {#format: format},
        ),
        returnValue: _i7.Future<String?>.value(),
      ) as _i7.Future<String?>);
  @override
  _i7.Stream<_i5.Repository> listForks(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listForks,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.Repository>.empty(),
      ) as _i7.Stream<_i5.Repository>);
  @override
  _i7.Future<_i5.Repository> createFork(
    _i5.RepositorySlug? slug, [
    _i5.CreateFork? fork,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #createFork,
          [
            slug,
            fork,
          ],
        ),
        returnValue: _i7.Future<_i5.Repository>.value(_FakeRepository_26(
          this,
          Invocation.method(
            #createFork,
            [
              slug,
              fork,
            ],
          ),
        )),
      ) as _i7.Future<_i5.Repository>);
  @override
  _i7.Stream<_i5.Hook> listHooks(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listHooks,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.Hook>.empty(),
      ) as _i7.Stream<_i5.Hook>);
  @override
  _i7.Future<_i5.Hook> getHook(
    _i5.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i7.Future<_i5.Hook>.value(_FakeHook_36(
          this,
          Invocation.method(
            #getHook,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i7.Future<_i5.Hook>);
  @override
  _i7.Future<_i5.Hook> createHook(
    _i5.RepositorySlug? slug,
    _i5.CreateHook? hook,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createHook,
          [
            slug,
            hook,
          ],
        ),
        returnValue: _i7.Future<_i5.Hook>.value(_FakeHook_36(
          this,
          Invocation.method(
            #createHook,
            [
              slug,
              hook,
            ],
          ),
        )),
      ) as _i7.Future<_i5.Hook>);
  @override
  _i7.Future<_i5.Hook> editHook(
    _i5.RepositorySlug? slug,
    _i5.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: _i7.Future<_i5.Hook>.value(_FakeHook_36(
          this,
          Invocation.method(
            #editHook,
            [
              slug,
              hookToEdit,
            ],
            {
              #configUrl: configUrl,
              #configContentType: configContentType,
              #configSecret: configSecret,
              #configInsecureSsl: configInsecureSsl,
              #events: events,
              #addEvents: addEvents,
              #removeEvents: removeEvents,
              #active: active,
            },
          ),
        )),
      ) as _i7.Future<_i5.Hook>);
  @override
  _i7.Future<bool> testPushHook(
    _i5.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #testPushHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Future<bool> pingHook(
    _i5.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #pingHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Future<bool> deleteHook(
    _i5.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Stream<_i5.PublicKey> listDeployKeys(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listDeployKeys,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.PublicKey>.empty(),
      ) as _i7.Stream<_i5.PublicKey>);
  @override
  _i7.Future<_i5.PublicKey> getDeployKey(
    _i5.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getDeployKey,
          [slug],
          {#id: id},
        ),
        returnValue: _i7.Future<_i5.PublicKey>.value(_FakePublicKey_37(
          this,
          Invocation.method(
            #getDeployKey,
            [slug],
            {#id: id},
          ),
        )),
      ) as _i7.Future<_i5.PublicKey>);
  @override
  _i7.Future<_i5.PublicKey> createDeployKey(
    _i5.RepositorySlug? slug,
    _i5.CreatePublicKey? key,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createDeployKey,
          [
            slug,
            key,
          ],
        ),
        returnValue: _i7.Future<_i5.PublicKey>.value(_FakePublicKey_37(
          this,
          Invocation.method(
            #createDeployKey,
            [
              slug,
              key,
            ],
          ),
        )),
      ) as _i7.Future<_i5.PublicKey>);
  @override
  _i7.Future<bool> deleteDeployKey({
    required _i5.RepositorySlug? slug,
    required _i5.PublicKey? key,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteDeployKey,
          [],
          {
            #slug: slug,
            #key: key,
          },
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Future<_i5.RepositoryCommit> merge(
    _i5.RepositorySlug? slug,
    _i5.CreateMerge? merge,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #merge,
          [
            slug,
            merge,
          ],
        ),
        returnValue: _i7.Future<_i5.RepositoryCommit>.value(_FakeRepositoryCommit_31(
          this,
          Invocation.method(
            #merge,
            [
              slug,
              merge,
            ],
          ),
        )),
      ) as _i7.Future<_i5.RepositoryCommit>);
  @override
  _i7.Future<_i5.RepositoryPages> getPagesInfo(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getPagesInfo,
          [slug],
        ),
        returnValue: _i7.Future<_i5.RepositoryPages>.value(_FakeRepositoryPages_38(
          this,
          Invocation.method(
            #getPagesInfo,
            [slug],
          ),
        )),
      ) as _i7.Future<_i5.RepositoryPages>);
  @override
  _i7.Stream<_i5.PageBuild> listPagesBuilds(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listPagesBuilds,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.PageBuild>.empty(),
      ) as _i7.Stream<_i5.PageBuild>);
  @override
  _i7.Future<_i5.PageBuild> getLatestPagesBuild(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLatestPagesBuild,
          [slug],
        ),
        returnValue: _i7.Future<_i5.PageBuild>.value(_FakePageBuild_39(
          this,
          Invocation.method(
            #getLatestPagesBuild,
            [slug],
          ),
        )),
      ) as _i7.Future<_i5.PageBuild>);
  @override
  _i7.Stream<_i5.Release> listReleases(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listReleases,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.Release>.empty(),
      ) as _i7.Stream<_i5.Release>);
  @override
  _i7.Future<_i5.Release> getLatestRelease(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLatestRelease,
          [slug],
        ),
        returnValue: _i7.Future<_i5.Release>.value(_FakeRelease_40(
          this,
          Invocation.method(
            #getLatestRelease,
            [slug],
          ),
        )),
      ) as _i7.Future<_i5.Release>);
  @override
  _i7.Future<_i5.Release> getReleaseById(
    _i5.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseById,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i7.Future<_i5.Release>.value(_FakeRelease_40(
          this,
          Invocation.method(
            #getReleaseById,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i7.Future<_i5.Release>);
  @override
  _i7.Future<_i5.Release> getReleaseByTagName(
    _i5.RepositorySlug? slug,
    String? tagName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseByTagName,
          [
            slug,
            tagName,
          ],
        ),
        returnValue: _i7.Future<_i5.Release>.value(_FakeRelease_40(
          this,
          Invocation.method(
            #getReleaseByTagName,
            [
              slug,
              tagName,
            ],
          ),
        )),
      ) as _i7.Future<_i5.Release>);
  @override
  _i7.Future<_i5.Release> createRelease(
    _i5.RepositorySlug? slug,
    _i5.CreateRelease? createRelease, {
    bool? getIfExists = true,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createRelease,
          [
            slug,
            createRelease,
          ],
          {#getIfExists: getIfExists},
        ),
        returnValue: _i7.Future<_i5.Release>.value(_FakeRelease_40(
          this,
          Invocation.method(
            #createRelease,
            [
              slug,
              createRelease,
            ],
            {#getIfExists: getIfExists},
          ),
        )),
      ) as _i7.Future<_i5.Release>);
  @override
  _i7.Future<_i5.Release> editRelease(
    _i5.RepositorySlug? slug,
    _i5.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: _i7.Future<_i5.Release>.value(_FakeRelease_40(
          this,
          Invocation.method(
            #editRelease,
            [
              slug,
              releaseToEdit,
            ],
            {
              #tagName: tagName,
              #targetCommitish: targetCommitish,
              #name: name,
              #body: body,
              #draft: draft,
              #preRelease: preRelease,
            },
          ),
        )),
      ) as _i7.Future<_i5.Release>);
  @override
  _i7.Future<bool> deleteRelease(
    _i5.RepositorySlug? slug,
    _i5.Release? release,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteRelease,
          [
            slug,
            release,
          ],
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Stream<_i5.ReleaseAsset> listReleaseAssets(
    _i5.RepositorySlug? slug,
    _i5.Release? release,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReleaseAssets,
          [
            slug,
            release,
          ],
        ),
        returnValue: _i7.Stream<_i5.ReleaseAsset>.empty(),
      ) as _i7.Stream<_i5.ReleaseAsset>);
  @override
  _i7.Future<_i5.ReleaseAsset> getReleaseAsset(
    _i5.RepositorySlug? slug,
    _i5.Release? release, {
    required int? assetId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseAsset,
          [
            slug,
            release,
          ],
          {#assetId: assetId},
        ),
        returnValue: _i7.Future<_i5.ReleaseAsset>.value(_FakeReleaseAsset_41(
          this,
          Invocation.method(
            #getReleaseAsset,
            [
              slug,
              release,
            ],
            {#assetId: assetId},
          ),
        )),
      ) as _i7.Future<_i5.ReleaseAsset>);
  @override
  _i7.Future<_i5.ReleaseAsset> editReleaseAsset(
    _i5.RepositorySlug? slug,
    _i5.ReleaseAsset? assetToEdit, {
    String? name,
    String? label,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #editReleaseAsset,
          [
            slug,
            assetToEdit,
          ],
          {
            #name: name,
            #label: label,
          },
        ),
        returnValue: _i7.Future<_i5.ReleaseAsset>.value(_FakeReleaseAsset_41(
          this,
          Invocation.method(
            #editReleaseAsset,
            [
              slug,
              assetToEdit,
            ],
            {
              #name: name,
              #label: label,
            },
          ),
        )),
      ) as _i7.Future<_i5.ReleaseAsset>);
  @override
  _i7.Future<bool> deleteReleaseAsset(
    _i5.RepositorySlug? slug,
    _i5.ReleaseAsset? asset,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteReleaseAsset,
          [
            slug,
            asset,
          ],
        ),
        returnValue: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Future<List<_i5.ReleaseAsset>> uploadReleaseAssets(
    _i5.Release? release,
    Iterable<_i5.CreateReleaseAsset>? createReleaseAssets,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #uploadReleaseAssets,
          [
            release,
            createReleaseAssets,
          ],
        ),
        returnValue: _i7.Future<List<_i5.ReleaseAsset>>.value(<_i5.ReleaseAsset>[]),
      ) as _i7.Future<List<_i5.ReleaseAsset>>);
  @override
  _i7.Future<List<_i5.ContributorStatistics>> listContributorStats(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listContributorStats,
          [slug],
        ),
        returnValue: _i7.Future<List<_i5.ContributorStatistics>>.value(<_i5.ContributorStatistics>[]),
      ) as _i7.Future<List<_i5.ContributorStatistics>>);
  @override
  _i7.Stream<_i5.YearCommitCountWeek> listCommitActivity(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommitActivity,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.YearCommitCountWeek>.empty(),
      ) as _i7.Stream<_i5.YearCommitCountWeek>);
  @override
  _i7.Stream<_i5.WeeklyChangesCount> listCodeFrequency(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCodeFrequency,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.WeeklyChangesCount>.empty(),
      ) as _i7.Stream<_i5.WeeklyChangesCount>);
  @override
  _i7.Future<_i5.ContributorParticipation> getParticipation(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getParticipation,
          [slug],
        ),
        returnValue: _i7.Future<_i5.ContributorParticipation>.value(_FakeContributorParticipation_42(
          this,
          Invocation.method(
            #getParticipation,
            [slug],
          ),
        )),
      ) as _i7.Future<_i5.ContributorParticipation>);
  @override
  _i7.Stream<_i5.PunchcardEntry> listPunchcard(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listPunchcard,
          [slug],
        ),
        returnValue: _i7.Stream<_i5.PunchcardEntry>.empty(),
      ) as _i7.Stream<_i5.PunchcardEntry>);
  @override
  _i7.Stream<_i5.RepositoryStatus> listStatuses(
    _i5.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listStatuses,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i7.Stream<_i5.RepositoryStatus>.empty(),
      ) as _i7.Stream<_i5.RepositoryStatus>);
  @override
  _i7.Future<_i5.RepositoryStatus> createStatus(
    _i5.RepositorySlug? slug,
    String? ref,
    _i5.CreateStatus? request,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createStatus,
          [
            slug,
            ref,
            request,
          ],
        ),
        returnValue: _i7.Future<_i5.RepositoryStatus>.value(_FakeRepositoryStatus_43(
          this,
          Invocation.method(
            #createStatus,
            [
              slug,
              ref,
              request,
            ],
          ),
        )),
      ) as _i7.Future<_i5.RepositoryStatus>);
  @override
  _i7.Future<_i5.CombinedRepositoryStatus> getCombinedStatus(
    _i5.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCombinedStatus,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i7.Future<_i5.CombinedRepositoryStatus>.value(_FakeCombinedRepositoryStatus_44(
          this,
          Invocation.method(
            #getCombinedStatus,
            [
              slug,
              ref,
            ],
          ),
        )),
      ) as _i7.Future<_i5.CombinedRepositoryStatus>);
  @override
  _i7.Future<_i5.ReleaseNotes> generateReleaseNotes(_i5.CreateReleaseNotes? crn) => (super.noSuchMethod(
        Invocation.method(
          #generateReleaseNotes,
          [crn],
        ),
        returnValue: _i7.Future<_i5.ReleaseNotes>.value(_FakeReleaseNotes_45(
          this,
          Invocation.method(
            #generateReleaseNotes,
            [crn],
          ),
        )),
      ) as _i7.Future<_i5.ReleaseNotes>);
}

/// A class which mocks [GitHubComparison].
///
/// See the documentation for Mockito's code generation for more information.
class MockGitHubComparison extends _i1.Mock implements _i5.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 _i2.Response {
  MockResponse() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i11.Uint8List get bodyBytes => (super.noSuchMethod(
        Invocation.getter(#bodyBytes),
        returnValue: _i11.Uint8List(0),
      ) as _i11.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);
}
