// Mocks generated by Mockito 5.3.1 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
  _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
  void handleStatusCode(_i2.Response? response) => super.noSuchMethod(
        Invocation.method(
          #handleStatusCode,
          [response],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void dispose() => super.noSuchMethod(
        Invocation.method(
          #dispose,
          [],
        ),
        returnValueForMissingStub: null,
      );
}

/// A class which mocks [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,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #merge,
          [
            slug,
            number,
          ],
          {#message: message},
        ),
        returnValue: _i7.Future<_i5.PullRequestMerge>.value(_FakePullRequestMerge_23(
          this,
          Invocation.method(
            #merge,
            [
              slug,
              number,
            ],
            {#message: message},
          ),
        )),
      ) 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);
}
