// Mocks generated by Mockito 5.4.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 _i6;
import 'dart:typed_data' as _i11;

import 'package:_discoveryapis_commons/_discoveryapis_commons.dart' as _i8;
import 'package:auto_submit/service/access_client_provider.dart' as _i7;
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;
import 'package:mockito/src/dummies.dart' as _i10;

// 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 _FakeAuthentication_7 extends _i1.SmartFake implements _i5.Authentication {
  _FakeAuthentication_7(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

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

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

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

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

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

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

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

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

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

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

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

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

class _FakeFuture_21<T1> extends _i1.SmartFake implements _i6.Future<T1> {
  _FakeFuture_21(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class _FakeReleaseNotes_47 extends _i1.SmartFake implements _i5.ReleaseNotes {
  _FakeReleaseNotes_47(
    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 _i7.AccessClientProvider {
  MockAccessClientProvider() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i6.Future<_i2.Client> createAccessClient(
          {List<String>? scopes = const [r'https://www.googleapis.com/auth/cloud-platform']}) =>
      (super.noSuchMethod(
        Invocation.method(
          #createAccessClient,
          [],
          {#scopes: scopes},
        ),
        returnValue: _i6.Future<_i2.Client>.value(_FakeClient_0(
          this,
          Invocation.method(
            #createAccessClient,
            [],
            {#scopes: scopes},
          ),
        )),
      ) as _i6.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
  _i6.Future<_i3.JobCancelResponse> cancel(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #cancel,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i6.Future<_i3.JobCancelResponse>.value(_FakeJobCancelResponse_1(
          this,
          Invocation.method(
            #cancel,
            [
              projectId,
              jobId,
            ],
            {
              #location: location,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i6.Future<_i3.JobCancelResponse>);
  @override
  _i6.Future<void> delete(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #delete,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i6.Future<void>.value(),
        returnValueForMissingStub: _i6.Future<void>.value(),
      ) as _i6.Future<void>);
  @override
  _i6.Future<_i3.Job> get(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i6.Future<_i3.Job>.value(_FakeJob_2(
          this,
          Invocation.method(
            #get,
            [
              projectId,
              jobId,
            ],
            {
              #location: location,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i6.Future<_i3.Job>);
  @override
  _i6.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: _i6.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 _i6.Future<_i3.GetQueryResultsResponse>);
  @override
  _i6.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: _i6.Future<_i3.Job>.value(_FakeJob_2(
          this,
          Invocation.method(
            #insert,
            [
              request,
              projectId,
            ],
            {
              #$fields: $fields,
              #uploadOptions: uploadOptions,
              #uploadMedia: uploadMedia,
            },
          ),
        )),
      ) as _i6.Future<_i3.Job>);
  @override
  _i6.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: _i6.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 _i6.Future<_i3.JobList>);
  @override
  _i6.Future<_i3.QueryResponse> query(
    _i3.QueryRequest? request,
    String? projectId, {
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #query,
          [
            request,
            projectId,
          ],
          {#$fields: $fields},
        ),
        returnValue: _i6.Future<_i3.QueryResponse>.value(_FakeQueryResponse_5(
          this,
          Invocation.method(
            #query,
            [
              request,
              projectId,
            ],
            {#$fields: $fields},
          ),
        )),
      ) as _i6.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
  _i6.Future<Set<String>> getAutoApprovalAccounts(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getAutoApprovalAccounts,
          [slug],
        ),
        returnValue: _i6.Future<Set<String>>.value(<String>{}),
      ) as _i6.Future<Set<String>>);
  @override
  _i6.Future<void> autoApproval(_i5.PullRequest? pullRequest) => (super.noSuchMethod(
        Invocation.method(
          #autoApproval,
          [pullRequest],
        ),
        returnValue: _i6.Future<void>.value(),
        returnValueForMissingStub: _i6.Future<void>.value(),
      ) as _i6.Future<void>);
}

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

  @override
  _i5.Authentication get auth => (super.noSuchMethod(
        Invocation.getter(#auth),
        returnValue: _FakeAuthentication_7(
          this,
          Invocation.getter(#auth),
        ),
      ) as _i5.Authentication);
  @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_8(
          this,
          Invocation.getter(#activity),
        ),
      ) as _i5.ActivityService);
  @override
  _i5.AuthorizationsService get authorizations => (super.noSuchMethod(
        Invocation.getter(#authorizations),
        returnValue: _FakeAuthorizationsService_9(
          this,
          Invocation.getter(#authorizations),
        ),
      ) as _i5.AuthorizationsService);
  @override
  _i5.GistsService get gists => (super.noSuchMethod(
        Invocation.getter(#gists),
        returnValue: _FakeGistsService_10(
          this,
          Invocation.getter(#gists),
        ),
      ) as _i5.GistsService);
  @override
  _i5.GitService get git => (super.noSuchMethod(
        Invocation.getter(#git),
        returnValue: _FakeGitService_11(
          this,
          Invocation.getter(#git),
        ),
      ) as _i5.GitService);
  @override
  _i5.IssuesService get issues => (super.noSuchMethod(
        Invocation.getter(#issues),
        returnValue: _FakeIssuesService_12(
          this,
          Invocation.getter(#issues),
        ),
      ) as _i5.IssuesService);
  @override
  _i5.MiscService get misc => (super.noSuchMethod(
        Invocation.getter(#misc),
        returnValue: _FakeMiscService_13(
          this,
          Invocation.getter(#misc),
        ),
      ) as _i5.MiscService);
  @override
  _i5.OrganizationsService get organizations => (super.noSuchMethod(
        Invocation.getter(#organizations),
        returnValue: _FakeOrganizationsService_14(
          this,
          Invocation.getter(#organizations),
        ),
      ) as _i5.OrganizationsService);
  @override
  _i5.PullRequestsService get pullRequests => (super.noSuchMethod(
        Invocation.getter(#pullRequests),
        returnValue: _FakePullRequestsService_15(
          this,
          Invocation.getter(#pullRequests),
        ),
      ) as _i5.PullRequestsService);
  @override
  _i5.RepositoriesService get repositories => (super.noSuchMethod(
        Invocation.getter(#repositories),
        returnValue: _FakeRepositoriesService_16(
          this,
          Invocation.getter(#repositories),
        ),
      ) as _i5.RepositoriesService);
  @override
  _i5.SearchService get search => (super.noSuchMethod(
        Invocation.getter(#search),
        returnValue: _FakeSearchService_17(
          this,
          Invocation.getter(#search),
        ),
      ) as _i5.SearchService);
  @override
  _i5.UrlShortenerService get urlShortener => (super.noSuchMethod(
        Invocation.getter(#urlShortener),
        returnValue: _FakeUrlShortenerService_18(
          this,
          Invocation.getter(#urlShortener),
        ),
      ) as _i5.UrlShortenerService);
  @override
  _i5.UsersService get users => (super.noSuchMethod(
        Invocation.getter(#users),
        returnValue: _FakeUsersService_19(
          this,
          Invocation.getter(#users),
        ),
      ) as _i5.UsersService);
  @override
  _i5.ChecksService get checks => (super.noSuchMethod(
        Invocation.getter(#checks),
        returnValue: _FakeChecksService_20(
          this,
          Invocation.getter(#checks),
        ),
      ) as _i5.ChecksService);
  @override
  _i6.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: _i10.ifNotNull(
              _i10.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #getJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i6.Future<T>.value(v),
            ) ??
            _FakeFuture_21<T>(
              this,
              Invocation.method(
                #getJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #preview: preview,
                },
              ),
            ),
      ) as _i6.Future<T>);
  @override
  _i6.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: _i10.ifNotNull(
              _i10.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #postJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i6.Future<T>.value(v),
            ) ??
            _FakeFuture_21<T>(
              this,
              Invocation.method(
                #postJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
      ) as _i6.Future<T>);
  @override
  _i6.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: _i10.ifNotNull(
              _i10.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #putJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i6.Future<T>.value(v),
            ) ??
            _FakeFuture_21<T>(
              this,
              Invocation.method(
                #putJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
      ) as _i6.Future<T>);
  @override
  _i6.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: _i10.ifNotNull(
              _i10.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #patchJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i6.Future<T>.value(v),
            ) ??
            _FakeFuture_21<T>(
              this,
              Invocation.method(
                #patchJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
      ) as _i6.Future<T>);
  @override
  _i6.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: _i10.ifNotNull(
              _i10.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #requestJson,
                  [
                    method,
                    path,
                  ],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i6.Future<T>.value(v),
            ) ??
            _FakeFuture_21<T>(
              this,
              Invocation.method(
                #requestJson,
                [
                  method,
                  path,
                ],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
      ) as _i6.Future<T>);
  @override
  _i6.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: _i6.Future<_i2.Response>.value(_FakeResponse_22(
          this,
          Invocation.method(
            #request,
            [
              method,
              path,
            ],
            {
              #headers: headers,
              #params: params,
              #body: body,
              #statusCode: statusCode,
              #fail: fail,
              #preview: preview,
            },
          ),
        )),
      ) as _i6.Future<_i2.Response>);
  @override
  Never handleStatusCode(_i2.Response? response) => (super.noSuchMethod(
        Invocation.method(
          #handleStatusCode,
          [response],
        ),
        returnValue: null,
      ) as Never);
  @override
  void dispose() => super.noSuchMethod(
        Invocation.method(
          #dispose,
          [],
        ),
        returnValueForMissingStub: null,
      );
}

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

  @override
  _i5.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_23(
          this,
          Invocation.getter(#github),
        ),
      ) as _i5.GitHub);
  @override
  _i6.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: _i6.Stream<_i5.PullRequest>.empty(),
      ) as _i6.Stream<_i5.PullRequest>);
  @override
  _i6.Future<_i5.PullRequest> get(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i6.Future<_i5.PullRequest>.value(_FakePullRequest_24(
          this,
          Invocation.method(
            #get,
            [
              slug,
              number,
            ],
          ),
        )),
      ) as _i6.Future<_i5.PullRequest>);
  @override
  _i6.Future<_i5.PullRequest> create(
    _i5.RepositorySlug? slug,
    _i5.CreatePullRequest? request,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #create,
          [
            slug,
            request,
          ],
        ),
        returnValue: _i6.Future<_i5.PullRequest>.value(_FakePullRequest_24(
          this,
          Invocation.method(
            #create,
            [
              slug,
              request,
            ],
          ),
        )),
      ) as _i6.Future<_i5.PullRequest>);
  @override
  _i6.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: _i6.Future<_i5.PullRequest>.value(_FakePullRequest_24(
          this,
          Invocation.method(
            #edit,
            [
              slug,
              number,
            ],
            {
              #title: title,
              #body: body,
              #state: state,
              #base: base,
            },
          ),
        )),
      ) as _i6.Future<_i5.PullRequest>);
  @override
  _i6.Stream<_i5.RepositoryCommit> listCommits(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommits,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i6.Stream<_i5.RepositoryCommit>.empty(),
      ) as _i6.Stream<_i5.RepositoryCommit>);
  @override
  _i6.Stream<_i5.PullRequestFile> listFiles(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listFiles,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i6.Stream<_i5.PullRequestFile>.empty(),
      ) as _i6.Stream<_i5.PullRequestFile>);
  @override
  _i6.Stream<_i5.PullRequestReview> listReviews(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReviews,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i6.Stream<_i5.PullRequestReview>.empty(),
      ) as _i6.Stream<_i5.PullRequestReview>);
  @override
  _i6.Future<bool> isMerged(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isMerged,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.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: _i6.Future<_i5.PullRequestMerge>.value(_FakePullRequestMerge_25(
          this,
          Invocation.method(
            #merge,
            [
              slug,
              number,
            ],
            {
              #message: message,
              #mergeMethod: mergeMethod,
              #requestSha: requestSha,
            },
          ),
        )),
      ) as _i6.Future<_i5.PullRequestMerge>);
  @override
  _i6.Stream<_i5.PullRequestComment> listCommentsByPullRequest(
    _i5.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommentsByPullRequest,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i6.Stream<_i5.PullRequestComment>.empty(),
      ) as _i6.Stream<_i5.PullRequestComment>);
  @override
  _i6.Stream<_i5.PullRequestComment> listComments(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listComments,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.PullRequestComment>.empty(),
      ) as _i6.Stream<_i5.PullRequestComment>);
  @override
  _i6.Future<_i5.PullRequestComment> createComment(
    _i5.RepositorySlug? slug,
    int? number,
    _i5.CreatePullRequestComment? comment,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createComment,
          [
            slug,
            number,
            comment,
          ],
        ),
        returnValue: _i6.Future<_i5.PullRequestComment>.value(_FakePullRequestComment_26(
          this,
          Invocation.method(
            #createComment,
            [
              slug,
              number,
              comment,
            ],
          ),
        )),
      ) as _i6.Future<_i5.PullRequestComment>);
  @override
  _i6.Future<_i5.PullRequestReview> createReview(
    _i5.RepositorySlug? slug,
    _i5.CreatePullRequestReview? review,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createReview,
          [
            slug,
            review,
          ],
        ),
        returnValue: _i6.Future<_i5.PullRequestReview>.value(_FakePullRequestReview_27(
          this,
          Invocation.method(
            #createReview,
            [
              slug,
              review,
            ],
          ),
        )),
      ) as _i6.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_23(
          this,
          Invocation.getter(#github),
        ),
      ) as _i5.GitHub);
  @override
  _i6.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: _i6.Stream<_i5.Repository>.empty(),
      ) as _i6.Stream<_i5.Repository>);
  @override
  _i6.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: _i6.Stream<_i5.Repository>.empty(),
      ) as _i6.Stream<_i5.Repository>);
  @override
  _i6.Stream<_i5.Repository> listOrganizationRepositories(
    String? org, {
    String? type = r'all',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listOrganizationRepositories,
          [org],
          {#type: type},
        ),
        returnValue: _i6.Stream<_i5.Repository>.empty(),
      ) as _i6.Stream<_i5.Repository>);
  @override
  _i6.Stream<_i5.Repository> listPublicRepositories({
    int? limit = 50,
    DateTime? since,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listPublicRepositories,
          [],
          {
            #limit: limit,
            #since: since,
          },
        ),
        returnValue: _i6.Stream<_i5.Repository>.empty(),
      ) as _i6.Stream<_i5.Repository>);
  @override
  _i6.Future<_i5.Repository> createRepository(
    _i5.CreateRepository? repository, {
    String? org,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createRepository,
          [repository],
          {#org: org},
        ),
        returnValue: _i6.Future<_i5.Repository>.value(_FakeRepository_28(
          this,
          Invocation.method(
            #createRepository,
            [repository],
            {#org: org},
          ),
        )),
      ) as _i6.Future<_i5.Repository>);
  @override
  _i6.Future<_i5.LicenseDetails> getLicense(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLicense,
          [slug],
        ),
        returnValue: _i6.Future<_i5.LicenseDetails>.value(_FakeLicenseDetails_29(
          this,
          Invocation.method(
            #getLicense,
            [slug],
          ),
        )),
      ) as _i6.Future<_i5.LicenseDetails>);
  @override
  _i6.Future<_i5.Repository> getRepository(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getRepository,
          [slug],
        ),
        returnValue: _i6.Future<_i5.Repository>.value(_FakeRepository_28(
          this,
          Invocation.method(
            #getRepository,
            [slug],
          ),
        )),
      ) as _i6.Future<_i5.Repository>);
  @override
  _i6.Stream<_i5.Repository> getRepositories(List<_i5.RepositorySlug>? slugs) => (super.noSuchMethod(
        Invocation.method(
          #getRepositories,
          [slugs],
        ),
        returnValue: _i6.Stream<_i5.Repository>.empty(),
      ) as _i6.Stream<_i5.Repository>);
  @override
  _i6.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: _i6.Future<_i5.Repository>.value(_FakeRepository_28(
          this,
          Invocation.method(
            #editRepository,
            [slug],
            {
              #name: name,
              #description: description,
              #homepage: homepage,
              #private: private,
              #hasIssues: hasIssues,
              #hasWiki: hasWiki,
              #hasDownloads: hasDownloads,
            },
          ),
        )),
      ) as _i6.Future<_i5.Repository>);
  @override
  _i6.Future<bool> deleteRepository(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #deleteRepository,
          [slug],
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.Stream<_i5.Contributor> listContributors(
    _i5.RepositorySlug? slug, {
    bool? anon = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listContributors,
          [slug],
          {#anon: anon},
        ),
        returnValue: _i6.Stream<_i5.Contributor>.empty(),
      ) as _i6.Stream<_i5.Contributor>);
  @override
  _i6.Stream<_i5.Team> listTeams(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listTeams,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.Team>.empty(),
      ) as _i6.Stream<_i5.Team>);
  @override
  _i6.Future<_i5.LanguageBreakdown> listLanguages(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listLanguages,
          [slug],
        ),
        returnValue: _i6.Future<_i5.LanguageBreakdown>.value(_FakeLanguageBreakdown_30(
          this,
          Invocation.method(
            #listLanguages,
            [slug],
          ),
        )),
      ) as _i6.Future<_i5.LanguageBreakdown>);
  @override
  _i6.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: _i6.Stream<_i5.Tag>.empty(),
      ) as _i6.Stream<_i5.Tag>);
  @override
  _i6.Stream<_i5.Branch> listBranches(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listBranches,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.Branch>.empty(),
      ) as _i6.Stream<_i5.Branch>);
  @override
  _i6.Future<_i5.Branch> getBranch(
    _i5.RepositorySlug? slug,
    String? branch,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBranch,
          [
            slug,
            branch,
          ],
        ),
        returnValue: _i6.Future<_i5.Branch>.value(_FakeBranch_31(
          this,
          Invocation.method(
            #getBranch,
            [
              slug,
              branch,
            ],
          ),
        )),
      ) as _i6.Future<_i5.Branch>);
  @override
  _i6.Stream<_i5.Collaborator> listCollaborators(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCollaborators,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.Collaborator>.empty(),
      ) as _i6.Stream<_i5.Collaborator>);
  @override
  _i6.Future<bool> isCollaborator(
    _i5.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.Future<bool> addCollaborator(
    _i5.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #addCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.Future<bool> removeCollaborator(
    _i5.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.Stream<_i5.CommitComment> listSingleCommitComments(
    _i5.RepositorySlug? slug,
    _i5.RepositoryCommit? commit,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listSingleCommitComments,
          [
            slug,
            commit,
          ],
        ),
        returnValue: _i6.Stream<_i5.CommitComment>.empty(),
      ) as _i6.Stream<_i5.CommitComment>);
  @override
  _i6.Stream<_i5.CommitComment> listCommitComments(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommitComments,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.CommitComment>.empty(),
      ) as _i6.Stream<_i5.CommitComment>);
  @override
  _i6.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: _i6.Future<_i5.CommitComment>.value(_FakeCommitComment_32(
          this,
          Invocation.method(
            #createCommitComment,
            [
              slug,
              commit,
            ],
            {
              #body: body,
              #path: path,
              #position: position,
              #line: line,
            },
          ),
        )),
      ) as _i6.Future<_i5.CommitComment>);
  @override
  _i6.Future<_i5.CommitComment> getCommitComment(
    _i5.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommitComment,
          [slug],
          {#id: id},
        ),
        returnValue: _i6.Future<_i5.CommitComment>.value(_FakeCommitComment_32(
          this,
          Invocation.method(
            #getCommitComment,
            [slug],
            {#id: id},
          ),
        )),
      ) as _i6.Future<_i5.CommitComment>);
  @override
  _i6.Future<_i5.CommitComment> updateCommitComment(
    _i5.RepositorySlug? slug, {
    required int? id,
    required String? body,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateCommitComment,
          [slug],
          {
            #id: id,
            #body: body,
          },
        ),
        returnValue: _i6.Future<_i5.CommitComment>.value(_FakeCommitComment_32(
          this,
          Invocation.method(
            #updateCommitComment,
            [slug],
            {
              #id: id,
              #body: body,
            },
          ),
        )),
      ) as _i6.Future<_i5.CommitComment>);
  @override
  _i6.Future<bool> deleteCommitComment(
    _i5.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteCommitComment,
          [slug],
          {#id: id},
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.Stream<_i5.RepositoryCommit> listCommits(
    _i5.RepositorySlug? slug, {
    String? sha,
    String? path,
    String? author,
    String? committer,
    DateTime? since,
    DateTime? until,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommits,
          [slug],
          {
            #sha: sha,
            #path: path,
            #author: author,
            #committer: committer,
            #since: since,
            #until: until,
          },
        ),
        returnValue: _i6.Stream<_i5.RepositoryCommit>.empty(),
      ) as _i6.Stream<_i5.RepositoryCommit>);
  @override
  _i6.Future<_i5.RepositoryCommit> getCommit(
    _i5.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommit,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i6.Future<_i5.RepositoryCommit>.value(_FakeRepositoryCommit_33(
          this,
          Invocation.method(
            #getCommit,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i6.Future<_i5.RepositoryCommit>);
  @override
  _i6.Future<String> getCommitDiff(
    _i5.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommitDiff,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i6.Future<String>.value(''),
      ) as _i6.Future<String>);
  @override
  _i6.Future<_i5.GitHubComparison> compareCommits(
    _i5.RepositorySlug? slug,
    String? refBase,
    String? refHead,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #compareCommits,
          [
            slug,
            refBase,
            refHead,
          ],
        ),
        returnValue: _i6.Future<_i5.GitHubComparison>.value(_FakeGitHubComparison_34(
          this,
          Invocation.method(
            #compareCommits,
            [
              slug,
              refBase,
              refHead,
            ],
          ),
        )),
      ) as _i6.Future<_i5.GitHubComparison>);
  @override
  _i6.Future<_i5.GitHubFile> getReadme(
    _i5.RepositorySlug? slug, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReadme,
          [slug],
          {#ref: ref},
        ),
        returnValue: _i6.Future<_i5.GitHubFile>.value(_FakeGitHubFile_35(
          this,
          Invocation.method(
            #getReadme,
            [slug],
            {#ref: ref},
          ),
        )),
      ) as _i6.Future<_i5.GitHubFile>);
  @override
  _i6.Future<_i5.RepositoryContents> getContents(
    _i5.RepositorySlug? slug,
    String? path, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getContents,
          [
            slug,
            path,
          ],
          {#ref: ref},
        ),
        returnValue: _i6.Future<_i5.RepositoryContents>.value(_FakeRepositoryContents_36(
          this,
          Invocation.method(
            #getContents,
            [
              slug,
              path,
            ],
            {#ref: ref},
          ),
        )),
      ) as _i6.Future<_i5.RepositoryContents>);
  @override
  _i6.Future<_i5.ContentCreation> createFile(
    _i5.RepositorySlug? slug,
    _i5.CreateFile? file,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createFile,
          [
            slug,
            file,
          ],
        ),
        returnValue: _i6.Future<_i5.ContentCreation>.value(_FakeContentCreation_37(
          this,
          Invocation.method(
            #createFile,
            [
              slug,
              file,
            ],
          ),
        )),
      ) as _i6.Future<_i5.ContentCreation>);
  @override
  _i6.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: _i6.Future<_i5.ContentCreation>.value(_FakeContentCreation_37(
          this,
          Invocation.method(
            #updateFile,
            [
              slug,
              path,
              message,
              content,
              sha,
            ],
            {#branch: branch},
          ),
        )),
      ) as _i6.Future<_i5.ContentCreation>);
  @override
  _i6.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: _i6.Future<_i5.ContentCreation>.value(_FakeContentCreation_37(
          this,
          Invocation.method(
            #deleteFile,
            [
              slug,
              path,
              message,
              sha,
              branch,
            ],
          ),
        )),
      ) as _i6.Future<_i5.ContentCreation>);
  @override
  _i6.Future<String?> getArchiveLink(
    _i5.RepositorySlug? slug,
    String? ref, {
    String? format = r'tarball',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getArchiveLink,
          [
            slug,
            ref,
          ],
          {#format: format},
        ),
        returnValue: _i6.Future<String?>.value(),
      ) as _i6.Future<String?>);
  @override
  _i6.Stream<_i5.Repository> listForks(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listForks,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.Repository>.empty(),
      ) as _i6.Stream<_i5.Repository>);
  @override
  _i6.Future<_i5.Repository> createFork(
    _i5.RepositorySlug? slug, [
    _i5.CreateFork? fork,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #createFork,
          [
            slug,
            fork,
          ],
        ),
        returnValue: _i6.Future<_i5.Repository>.value(_FakeRepository_28(
          this,
          Invocation.method(
            #createFork,
            [
              slug,
              fork,
            ],
          ),
        )),
      ) as _i6.Future<_i5.Repository>);
  @override
  _i6.Stream<_i5.Hook> listHooks(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listHooks,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.Hook>.empty(),
      ) as _i6.Stream<_i5.Hook>);
  @override
  _i6.Future<_i5.Hook> getHook(
    _i5.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i6.Future<_i5.Hook>.value(_FakeHook_38(
          this,
          Invocation.method(
            #getHook,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i6.Future<_i5.Hook>);
  @override
  _i6.Future<_i5.Hook> createHook(
    _i5.RepositorySlug? slug,
    _i5.CreateHook? hook,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createHook,
          [
            slug,
            hook,
          ],
        ),
        returnValue: _i6.Future<_i5.Hook>.value(_FakeHook_38(
          this,
          Invocation.method(
            #createHook,
            [
              slug,
              hook,
            ],
          ),
        )),
      ) as _i6.Future<_i5.Hook>);
  @override
  _i6.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: _i6.Future<_i5.Hook>.value(_FakeHook_38(
          this,
          Invocation.method(
            #editHook,
            [
              slug,
              hookToEdit,
            ],
            {
              #configUrl: configUrl,
              #configContentType: configContentType,
              #configSecret: configSecret,
              #configInsecureSsl: configInsecureSsl,
              #events: events,
              #addEvents: addEvents,
              #removeEvents: removeEvents,
              #active: active,
            },
          ),
        )),
      ) as _i6.Future<_i5.Hook>);
  @override
  _i6.Future<bool> testPushHook(
    _i5.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #testPushHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.Future<bool> pingHook(
    _i5.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #pingHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.Future<bool> deleteHook(
    _i5.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.Stream<_i5.PublicKey> listDeployKeys(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listDeployKeys,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.PublicKey>.empty(),
      ) as _i6.Stream<_i5.PublicKey>);
  @override
  _i6.Future<_i5.PublicKey> getDeployKey(
    _i5.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getDeployKey,
          [slug],
          {#id: id},
        ),
        returnValue: _i6.Future<_i5.PublicKey>.value(_FakePublicKey_39(
          this,
          Invocation.method(
            #getDeployKey,
            [slug],
            {#id: id},
          ),
        )),
      ) as _i6.Future<_i5.PublicKey>);
  @override
  _i6.Future<_i5.PublicKey> createDeployKey(
    _i5.RepositorySlug? slug,
    _i5.CreatePublicKey? key,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createDeployKey,
          [
            slug,
            key,
          ],
        ),
        returnValue: _i6.Future<_i5.PublicKey>.value(_FakePublicKey_39(
          this,
          Invocation.method(
            #createDeployKey,
            [
              slug,
              key,
            ],
          ),
        )),
      ) as _i6.Future<_i5.PublicKey>);
  @override
  _i6.Future<bool> deleteDeployKey({
    required _i5.RepositorySlug? slug,
    required _i5.PublicKey? key,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteDeployKey,
          [],
          {
            #slug: slug,
            #key: key,
          },
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.Future<_i5.RepositoryCommit> merge(
    _i5.RepositorySlug? slug,
    _i5.CreateMerge? merge,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #merge,
          [
            slug,
            merge,
          ],
        ),
        returnValue: _i6.Future<_i5.RepositoryCommit>.value(_FakeRepositoryCommit_33(
          this,
          Invocation.method(
            #merge,
            [
              slug,
              merge,
            ],
          ),
        )),
      ) as _i6.Future<_i5.RepositoryCommit>);
  @override
  _i6.Future<_i5.RepositoryPages> getPagesInfo(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getPagesInfo,
          [slug],
        ),
        returnValue: _i6.Future<_i5.RepositoryPages>.value(_FakeRepositoryPages_40(
          this,
          Invocation.method(
            #getPagesInfo,
            [slug],
          ),
        )),
      ) as _i6.Future<_i5.RepositoryPages>);
  @override
  _i6.Stream<_i5.PageBuild> listPagesBuilds(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listPagesBuilds,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.PageBuild>.empty(),
      ) as _i6.Stream<_i5.PageBuild>);
  @override
  _i6.Future<_i5.PageBuild> getLatestPagesBuild(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLatestPagesBuild,
          [slug],
        ),
        returnValue: _i6.Future<_i5.PageBuild>.value(_FakePageBuild_41(
          this,
          Invocation.method(
            #getLatestPagesBuild,
            [slug],
          ),
        )),
      ) as _i6.Future<_i5.PageBuild>);
  @override
  _i6.Stream<_i5.Release> listReleases(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listReleases,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.Release>.empty(),
      ) as _i6.Stream<_i5.Release>);
  @override
  _i6.Future<_i5.Release> getLatestRelease(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLatestRelease,
          [slug],
        ),
        returnValue: _i6.Future<_i5.Release>.value(_FakeRelease_42(
          this,
          Invocation.method(
            #getLatestRelease,
            [slug],
          ),
        )),
      ) as _i6.Future<_i5.Release>);
  @override
  _i6.Future<_i5.Release> getReleaseById(
    _i5.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseById,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i6.Future<_i5.Release>.value(_FakeRelease_42(
          this,
          Invocation.method(
            #getReleaseById,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i6.Future<_i5.Release>);
  @override
  _i6.Future<_i5.Release> getReleaseByTagName(
    _i5.RepositorySlug? slug,
    String? tagName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseByTagName,
          [
            slug,
            tagName,
          ],
        ),
        returnValue: _i6.Future<_i5.Release>.value(_FakeRelease_42(
          this,
          Invocation.method(
            #getReleaseByTagName,
            [
              slug,
              tagName,
            ],
          ),
        )),
      ) as _i6.Future<_i5.Release>);
  @override
  _i6.Future<_i5.Release> createRelease(
    _i5.RepositorySlug? slug,
    _i5.CreateRelease? createRelease, {
    bool? getIfExists = true,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createRelease,
          [
            slug,
            createRelease,
          ],
          {#getIfExists: getIfExists},
        ),
        returnValue: _i6.Future<_i5.Release>.value(_FakeRelease_42(
          this,
          Invocation.method(
            #createRelease,
            [
              slug,
              createRelease,
            ],
            {#getIfExists: getIfExists},
          ),
        )),
      ) as _i6.Future<_i5.Release>);
  @override
  _i6.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: _i6.Future<_i5.Release>.value(_FakeRelease_42(
          this,
          Invocation.method(
            #editRelease,
            [
              slug,
              releaseToEdit,
            ],
            {
              #tagName: tagName,
              #targetCommitish: targetCommitish,
              #name: name,
              #body: body,
              #draft: draft,
              #preRelease: preRelease,
            },
          ),
        )),
      ) as _i6.Future<_i5.Release>);
  @override
  _i6.Future<bool> deleteRelease(
    _i5.RepositorySlug? slug,
    _i5.Release? release,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteRelease,
          [
            slug,
            release,
          ],
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.Stream<_i5.ReleaseAsset> listReleaseAssets(
    _i5.RepositorySlug? slug,
    _i5.Release? release,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReleaseAssets,
          [
            slug,
            release,
          ],
        ),
        returnValue: _i6.Stream<_i5.ReleaseAsset>.empty(),
      ) as _i6.Stream<_i5.ReleaseAsset>);
  @override
  _i6.Future<_i5.ReleaseAsset> getReleaseAsset(
    _i5.RepositorySlug? slug,
    _i5.Release? release, {
    required int? assetId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseAsset,
          [
            slug,
            release,
          ],
          {#assetId: assetId},
        ),
        returnValue: _i6.Future<_i5.ReleaseAsset>.value(_FakeReleaseAsset_43(
          this,
          Invocation.method(
            #getReleaseAsset,
            [
              slug,
              release,
            ],
            {#assetId: assetId},
          ),
        )),
      ) as _i6.Future<_i5.ReleaseAsset>);
  @override
  _i6.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: _i6.Future<_i5.ReleaseAsset>.value(_FakeReleaseAsset_43(
          this,
          Invocation.method(
            #editReleaseAsset,
            [
              slug,
              assetToEdit,
            ],
            {
              #name: name,
              #label: label,
            },
          ),
        )),
      ) as _i6.Future<_i5.ReleaseAsset>);
  @override
  _i6.Future<bool> deleteReleaseAsset(
    _i5.RepositorySlug? slug,
    _i5.ReleaseAsset? asset,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteReleaseAsset,
          [
            slug,
            asset,
          ],
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.Future<bool>);
  @override
  _i6.Future<List<_i5.ReleaseAsset>> uploadReleaseAssets(
    _i5.Release? release,
    Iterable<_i5.CreateReleaseAsset>? createReleaseAssets,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #uploadReleaseAssets,
          [
            release,
            createReleaseAssets,
          ],
        ),
        returnValue: _i6.Future<List<_i5.ReleaseAsset>>.value(<_i5.ReleaseAsset>[]),
      ) as _i6.Future<List<_i5.ReleaseAsset>>);
  @override
  _i6.Future<List<_i5.ContributorStatistics>> listContributorStats(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listContributorStats,
          [slug],
        ),
        returnValue: _i6.Future<List<_i5.ContributorStatistics>>.value(<_i5.ContributorStatistics>[]),
      ) as _i6.Future<List<_i5.ContributorStatistics>>);
  @override
  _i6.Stream<_i5.YearCommitCountWeek> listCommitActivity(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommitActivity,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.YearCommitCountWeek>.empty(),
      ) as _i6.Stream<_i5.YearCommitCountWeek>);
  @override
  _i6.Stream<_i5.WeeklyChangesCount> listCodeFrequency(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCodeFrequency,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.WeeklyChangesCount>.empty(),
      ) as _i6.Stream<_i5.WeeklyChangesCount>);
  @override
  _i6.Future<_i5.ContributorParticipation> getParticipation(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getParticipation,
          [slug],
        ),
        returnValue: _i6.Future<_i5.ContributorParticipation>.value(_FakeContributorParticipation_44(
          this,
          Invocation.method(
            #getParticipation,
            [slug],
          ),
        )),
      ) as _i6.Future<_i5.ContributorParticipation>);
  @override
  _i6.Stream<_i5.PunchcardEntry> listPunchcard(_i5.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listPunchcard,
          [slug],
        ),
        returnValue: _i6.Stream<_i5.PunchcardEntry>.empty(),
      ) as _i6.Stream<_i5.PunchcardEntry>);
  @override
  _i6.Stream<_i5.RepositoryStatus> listStatuses(
    _i5.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listStatuses,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i6.Stream<_i5.RepositoryStatus>.empty(),
      ) as _i6.Stream<_i5.RepositoryStatus>);
  @override
  _i6.Future<_i5.RepositoryStatus> createStatus(
    _i5.RepositorySlug? slug,
    String? ref,
    _i5.CreateStatus? request,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createStatus,
          [
            slug,
            ref,
            request,
          ],
        ),
        returnValue: _i6.Future<_i5.RepositoryStatus>.value(_FakeRepositoryStatus_45(
          this,
          Invocation.method(
            #createStatus,
            [
              slug,
              ref,
              request,
            ],
          ),
        )),
      ) as _i6.Future<_i5.RepositoryStatus>);
  @override
  _i6.Future<_i5.CombinedRepositoryStatus> getCombinedStatus(
    _i5.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCombinedStatus,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i6.Future<_i5.CombinedRepositoryStatus>.value(_FakeCombinedRepositoryStatus_46(
          this,
          Invocation.method(
            #getCombinedStatus,
            [
              slug,
              ref,
            ],
          ),
        )),
      ) as _i6.Future<_i5.CombinedRepositoryStatus>);
  @override
  _i6.Future<_i5.ReleaseNotes> generateReleaseNotes(_i5.CreateReleaseNotes? crn) => (super.noSuchMethod(
        Invocation.method(
          #generateReleaseNotes,
          [crn],
        ),
        returnValue: _i6.Future<_i5.ReleaseNotes>.value(_FakeReleaseNotes_47(
          this,
          Invocation.method(
            #generateReleaseNotes,
            [crn],
          ),
        )),
      ) as _i6.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
  set url(String? _url) => super.noSuchMethod(
        Invocation.setter(
          #url,
          _url,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set status(String? _status) => super.noSuchMethod(
        Invocation.setter(
          #status,
          _status,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set aheadBy(int? _aheadBy) => super.noSuchMethod(
        Invocation.setter(
          #aheadBy,
          _aheadBy,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set behindBy(int? _behindBy) => super.noSuchMethod(
        Invocation.setter(
          #behindBy,
          _behindBy,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set totalCommits(int? _totalCommits) => super.noSuchMethod(
        Invocation.setter(
          #totalCommits,
          _totalCommits,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set files(List<_i5.CommitFile>? _files) => super.noSuchMethod(
        Invocation.setter(
          #files,
          _files,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set commits(List<_i5.RepositoryCommit>? _commits) => super.noSuchMethod(
        Invocation.setter(
          #commits,
          _commits,
        ),
        returnValueForMissingStub: null,
      );
  @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);
}
