// 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
  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,
    _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);
}
