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