// Mocks generated by Mockito 5.3.0 from annotations
// in cocoon_service/test/src/utilities/mocks.dart.
// Do not manually edit this file.

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i17;
import 'dart:convert' as _i16;
import 'dart:io' as _i15;
import 'dart:typed_data' as _i28;

import 'package:appengine/appengine.dart' as _i20;
import 'package:cocoon_service/src/foundation/github_checks_util.dart' as _i11;
import 'package:cocoon_service/src/foundation/utils.dart' as _i36;
import 'package:cocoon_service/src/model/appengine/commit.dart' as _i35;
import 'package:cocoon_service/src/model/appengine/task.dart' as _i37;
import 'package:cocoon_service/src/model/ci_yaml/target.dart' as _i33;
import 'package:cocoon_service/src/model/github/checks.dart' as _i34;
import 'package:cocoon_service/src/model/luci/buildbucket.dart' as _i9;
import 'package:cocoon_service/src/model/luci/push_message.dart' as _i31;
import 'package:cocoon_service/src/request_handling/pubsub.dart' as _i19;
import 'package:cocoon_service/src/service/access_client_provider.dart' as _i5;
import 'package:cocoon_service/src/service/access_token_provider.dart' as _i22;
import 'package:cocoon_service/src/service/bigquery.dart' as _i23;
import 'package:cocoon_service/src/service/branch_service.dart' as _i24;
import 'package:cocoon_service/src/service/buildbucket.dart' as _i18;
import 'package:cocoon_service/src/service/config.dart' as _i3;
import 'package:cocoon_service/src/service/datastore.dart' as _i38;
import 'package:cocoon_service/src/service/gerrit_service.dart' as _i7;
import 'package:cocoon_service/src/service/github_checks_service.dart' as _i29;
import 'package:cocoon_service/src/service/github_service.dart' as _i26;
import 'package:cocoon_service/src/service/luci.dart' as _i39;
import 'package:cocoon_service/src/service/luci_build_service.dart' as _i32;
import 'package:cocoon_service/src/service/scheduler.dart' as _i30;
import 'package:github/github.dart' as _i10;
import 'package:github/hooks.dart' as _i25;
import 'package:googleapis/bigquery/v2.dart' as _i6;
import 'package:googleapis_auth/auth_io.dart' as _i4;
import 'package:graphql/src/cache/cache.dart' as _i13;
import 'package:graphql/src/core/core.dart' as _i12;
import 'package:graphql/src/graphql_client.dart' as _i14;
import 'package:http/http.dart' as _i2;
import 'package:mockito/mockito.dart' as _i1;
import 'package:neat_cache/neat_cache.dart' as _i21;
import 'package:process/src/interface/process_manager.dart' as _i40;
import 'package:retry/retry.dart' as _i8;

import '../../service/cache_service_test.dart' as _i27;
import 'mocks.dart' as _i41;

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

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

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

class _FakeTabledataResource_4 extends _i1.SmartFake implements _i6.TabledataResource {
  _FakeTabledataResource_4(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeJobsResource_5 extends _i1.SmartFake implements _i6.JobsResource {
  _FakeJobsResource_5(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeGerritService_6 extends _i1.SmartFake implements _i7.GerritService {
  _FakeGerritService_6(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeRetryOptions_7 extends _i1.SmartFake implements _i8.RetryOptions {
  _FakeRetryOptions_7(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeBuild_8 extends _i1.SmartFake implements _i9.Build {
  _FakeBuild_8(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeSearchBuildsResponse_9 extends _i1.SmartFake implements _i9.SearchBuildsResponse {
  _FakeSearchBuildsResponse_9(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeBatchResponse_10 extends _i1.SmartFake implements _i9.BatchResponse {
  _FakeBatchResponse_10(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeListBuildersResponse_11 extends _i1.SmartFake implements _i9.ListBuildersResponse {
  _FakeListBuildersResponse_11(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

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

class _FakeIssue_13 extends _i1.SmartFake implements _i10.Issue {
  _FakeIssue_13(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeIssueComment_14 extends _i1.SmartFake implements _i10.IssueComment {
  _FakeIssueComment_14(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeIssueLabel_15 extends _i1.SmartFake implements _i10.IssueLabel {
  _FakeIssueLabel_15(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeMilestone_16 extends _i1.SmartFake implements _i10.Milestone {
  _FakeMilestone_16(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeGithubChecksUtil_17 extends _i1.SmartFake implements _i11.GithubChecksUtil {
  _FakeGithubChecksUtil_17(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeCheckRunConclusion_18 extends _i1.SmartFake implements _i10.CheckRunConclusion {
  _FakeCheckRunConclusion_18(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeCheckRunStatus_19 extends _i1.SmartFake implements _i10.CheckRunStatus {
  _FakeCheckRunStatus_19(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeCheckSuite_20 extends _i1.SmartFake implements _i10.CheckSuite {
  _FakeCheckSuite_20(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeCheckRun_21 extends _i1.SmartFake implements _i10.CheckRun {
  _FakeCheckRun_21(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

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

class _FakeGitReference_23 extends _i1.SmartFake implements _i10.GitReference {
  _FakeGitReference_23(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeRateLimit_24 extends _i1.SmartFake implements _i10.RateLimit {
  _FakeRateLimit_24(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeGitBlob_25 extends _i1.SmartFake implements _i10.GitBlob {
  _FakeGitBlob_25(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeGitCommit_26 extends _i1.SmartFake implements _i10.GitCommit {
  _FakeGitCommit_26(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeGitTag_27 extends _i1.SmartFake implements _i10.GitTag {
  _FakeGitTag_27(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeGitTree_28 extends _i1.SmartFake implements _i10.GitTree {
  _FakeGitTree_28(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeDefaultPolicies_29 extends _i1.SmartFake implements _i12.DefaultPolicies {
  _FakeDefaultPolicies_29(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeLink_30 extends _i1.SmartFake implements _i12.Link {
  _FakeLink_30(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeGraphQLCache_31 extends _i1.SmartFake implements _i13.GraphQLCache {
  _FakeGraphQLCache_31(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeQueryManager_32 extends _i1.SmartFake implements _i12.QueryManager {
  _FakeQueryManager_32(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeGraphQLClient_33 extends _i1.SmartFake implements _i14.GraphQLClient {
  _FakeGraphQLClient_33(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeObservableQuery_34<TParsed> extends _i1.SmartFake implements _i12.ObservableQuery<TParsed> {
  _FakeObservableQuery_34(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeQueryResult_35<TParsed extends Object?> extends _i1.SmartFake implements _i12.QueryResult<TParsed> {
  _FakeQueryResult_35(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeDuration_36 extends _i1.SmartFake implements Duration {
  _FakeDuration_36(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeHttpClientRequest_37 extends _i1.SmartFake implements _i15.HttpClientRequest {
  _FakeHttpClientRequest_37(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeUri_38 extends _i1.SmartFake implements Uri {
  _FakeUri_38(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeHttpHeaders_39 extends _i1.SmartFake implements _i15.HttpHeaders {
  _FakeHttpHeaders_39(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeHttpClientResponse_40 extends _i1.SmartFake implements _i15.HttpClientResponse {
  _FakeHttpClientResponse_40(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeEncoding_41 extends _i1.SmartFake implements _i16.Encoding {
  _FakeEncoding_41(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeSocket_42 extends _i1.SmartFake implements _i15.Socket {
  _FakeSocket_42(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeStreamSubscription_43<T> extends _i1.SmartFake implements _i17.StreamSubscription<T> {
  _FakeStreamSubscription_43(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeJobCancelResponse_44 extends _i1.SmartFake implements _i6.JobCancelResponse {
  _FakeJobCancelResponse_44(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

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

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

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

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

class _FakeBuildBucketClient_49 extends _i1.SmartFake implements _i18.BuildBucketClient {
  _FakeBuildBucketClient_49(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakePubSub_50 extends _i1.SmartFake implements _i19.PubSub {
  _FakePubSub_50(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeClientContext_51 extends _i1.SmartFake implements _i20.ClientContext {
  _FakeClientContext_51(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeProcess_52 extends _i1.SmartFake implements _i15.Process {
  _FakeProcess_52(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeProcessResult_53 extends _i1.SmartFake implements _i15.ProcessResult {
  _FakeProcessResult_53(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class _FakeTableDataInsertAllResponse_77 extends _i1.SmartFake implements _i6.TableDataInsertAllResponse {
  _FakeTableDataInsertAllResponse_77(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeTableDataList_78 extends _i1.SmartFake implements _i6.TableDataList {
  _FakeTableDataList_78(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeUser_79 extends _i1.SmartFake implements _i10.User {
  _FakeUser_79(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeCurrentUser_80 extends _i1.SmartFake implements _i10.CurrentUser {
  _FakeCurrentUser_80(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeEntry_81<T> extends _i1.SmartFake implements _i21.Entry<T> {
  _FakeEntry_81(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

class _FakeCache_82<T> extends _i1.SmartFake implements _i21.Cache<T> {
  _FakeCache_82(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  @override
  _i3.Config get config =>
      (super.noSuchMethod(Invocation.getter(#config), returnValue: _FakeConfig_1(this, Invocation.getter(#config)))
          as _i3.Config);
  @override
  _i17.Future<_i4.AccessToken> createAccessToken() => (super.noSuchMethod(Invocation.method(#createAccessToken, []),
          returnValue:
              _i17.Future<_i4.AccessToken>.value(_FakeAccessToken_2(this, Invocation.method(#createAccessToken, []))))
      as _i17.Future<_i4.AccessToken>);
}

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

  @override
  _i5.AccessClientProvider get accessClientProvider => (super.noSuchMethod(Invocation.getter(#accessClientProvider),
          returnValue: _FakeAccessClientProvider_3(this, Invocation.getter(#accessClientProvider)))
      as _i5.AccessClientProvider);
  @override
  _i17.Future<_i6.TabledataResource> defaultTabledata() => (super.noSuchMethod(Invocation.method(#defaultTabledata, []),
          returnValue: _i17.Future<_i6.TabledataResource>.value(
              _FakeTabledataResource_4(this, Invocation.method(#defaultTabledata, []))))
      as _i17.Future<_i6.TabledataResource>);
  @override
  _i17.Future<_i6.JobsResource> defaultJobs() => (super.noSuchMethod(Invocation.method(#defaultJobs, []),
          returnValue:
              _i17.Future<_i6.JobsResource>.value(_FakeJobsResource_5(this, Invocation.method(#defaultJobs, []))))
      as _i17.Future<_i6.JobsResource>);
  @override
  _i17.Future<List<_i23.BuilderStatistic>> listBuilderStatistic(String? projectId,
          {int? limit = 100, String? bucket = r'prod'}) =>
      (super.noSuchMethod(Invocation.method(#listBuilderStatistic, [projectId], {#limit: limit, #bucket: bucket}),
              returnValue: _i17.Future<List<_i23.BuilderStatistic>>.value(<_i23.BuilderStatistic>[]))
          as _i17.Future<List<_i23.BuilderStatistic>>);
  @override
  _i17.Future<List<_i23.BuilderRecord>> listRecentBuildRecordsForBuilder(String? projectId,
          {String? builder, int? limit}) =>
      (super.noSuchMethod(
              Invocation.method(#listRecentBuildRecordsForBuilder, [projectId], {#builder: builder, #limit: limit}),
              returnValue: _i17.Future<List<_i23.BuilderRecord>>.value(<_i23.BuilderRecord>[]))
          as _i17.Future<List<_i23.BuilderRecord>>);
}

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

  @override
  _i3.Config get config =>
      (super.noSuchMethod(Invocation.getter(#config), returnValue: _FakeConfig_1(this, Invocation.getter(#config)))
          as _i3.Config);
  @override
  _i7.GerritService get gerritService => (super.noSuchMethod(Invocation.getter(#gerritService),
      returnValue: _FakeGerritService_6(this, Invocation.getter(#gerritService))) as _i7.GerritService);
  @override
  _i8.RetryOptions get retryOptions => (super.noSuchMethod(Invocation.getter(#retryOptions),
      returnValue: _FakeRetryOptions_7(this, Invocation.getter(#retryOptions))) as _i8.RetryOptions);
  @override
  _i17.Future<void> handleCreateRequest(_i25.CreateEvent? createEvent) =>
      (super.noSuchMethod(Invocation.method(#handleCreateRequest, [createEvent]),
          returnValue: _i17.Future<void>.value(),
          returnValueForMissingStub: _i17.Future<void>.value()) as _i17.Future<void>);
  @override
  _i17.Future<void> branchFlutterRecipes(String? branch) =>
      (super.noSuchMethod(Invocation.method(#branchFlutterRecipes, [branch]),
          returnValue: _i17.Future<void>.value(),
          returnValueForMissingStub: _i17.Future<void>.value()) as _i17.Future<void>);
  @override
  _i17.Future<List<Map<String, String>>> getReleaseBranches(
          {_i26.GithubService? githubService, _i10.RepositorySlug? slug}) =>
      (super.noSuchMethod(Invocation.method(#getReleaseBranches, [], {#githubService: githubService, #slug: slug}),
              returnValue: _i17.Future<List<Map<String, String>>>.value(<Map<String, String>>[]))
          as _i17.Future<List<Map<String, String>>>);
}

/// A class which mocks [BuildBucketClient].
///
/// See the documentation for Mockito's code generation for more information.
// ignore: must_be_immutable
class MockBuildBucketClient extends _i1.Mock implements _i18.BuildBucketClient {
  MockBuildBucketClient() {
    _i1.throwOnMissingStub(this);
  }

  @override
  String get buildBucketBuildUri =>
      (super.noSuchMethod(Invocation.getter(#buildBucketBuildUri), returnValue: '') as String);
  @override
  String get buildBucketBuilderUri =>
      (super.noSuchMethod(Invocation.getter(#buildBucketBuilderUri), returnValue: '') as String);
  @override
  _i2.Client get httpClient => (super.noSuchMethod(Invocation.getter(#httpClient),
      returnValue: _FakeClient_0(this, Invocation.getter(#httpClient))) as _i2.Client);
  @override
  _i17.Future<_i9.Build> scheduleBuild(_i9.ScheduleBuildRequest? request,
          {String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds'}) =>
      (super.noSuchMethod(Invocation.method(#scheduleBuild, [request], {#buildBucketUri: buildBucketUri}),
              returnValue: _i17.Future<_i9.Build>.value(
                  _FakeBuild_8(this, Invocation.method(#scheduleBuild, [request], {#buildBucketUri: buildBucketUri}))))
          as _i17.Future<_i9.Build>);
  @override
  _i17.Future<_i9.SearchBuildsResponse> searchBuilds(_i9.SearchBuildsRequest? request,
          {String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds'}) =>
      (super.noSuchMethod(Invocation.method(#searchBuilds, [request], {#buildBucketUri: buildBucketUri}),
              returnValue: _i17.Future<_i9.SearchBuildsResponse>.value(_FakeSearchBuildsResponse_9(
                  this, Invocation.method(#searchBuilds, [request], {#buildBucketUri: buildBucketUri}))))
          as _i17.Future<_i9.SearchBuildsResponse>);
  @override
  _i17.Future<_i9.BatchResponse> batch(_i9.BatchRequest? request,
          {String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds'}) =>
      (super.noSuchMethod(Invocation.method(#batch, [request], {#buildBucketUri: buildBucketUri}),
              returnValue: _i17.Future<_i9.BatchResponse>.value(
                  _FakeBatchResponse_10(this, Invocation.method(#batch, [request], {#buildBucketUri: buildBucketUri}))))
          as _i17.Future<_i9.BatchResponse>);
  @override
  _i17.Future<_i9.Build> cancelBuild(_i9.CancelBuildRequest? request,
          {String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds'}) =>
      (super.noSuchMethod(Invocation.method(#cancelBuild, [request], {#buildBucketUri: buildBucketUri}),
              returnValue: _i17.Future<_i9.Build>.value(
                  _FakeBuild_8(this, Invocation.method(#cancelBuild, [request], {#buildBucketUri: buildBucketUri}))))
          as _i17.Future<_i9.Build>);
  @override
  _i17.Future<_i9.Build> getBuild(_i9.GetBuildRequest? request,
          {String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds'}) =>
      (super.noSuchMethod(Invocation.method(#getBuild, [request], {#buildBucketUri: buildBucketUri}),
              returnValue: _i17.Future<_i9.Build>.value(
                  _FakeBuild_8(this, Invocation.method(#getBuild, [request], {#buildBucketUri: buildBucketUri}))))
          as _i17.Future<_i9.Build>);
  @override
  _i17.Future<_i9.ListBuildersResponse> listBuilders(_i9.ListBuildersRequest? request,
          {String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builders'}) =>
      (super.noSuchMethod(Invocation.method(#listBuilders, [request], {#buildBucketUri: buildBucketUri}),
              returnValue: _i17.Future<_i9.ListBuildersResponse>.value(_FakeListBuildersResponse_11(
                  this, Invocation.method(#listBuilders, [request], {#buildBucketUri: buildBucketUri}))))
          as _i17.Future<_i9.ListBuildersResponse>);
  @override
  void close() => super.noSuchMethod(Invocation.method(#close, []), returnValueForMissingStub: null);
}

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

  @override
  _i28.Uint8List get value =>
      (super.noSuchMethod(Invocation.getter(#value), returnValue: _i28.Uint8List(0)) as _i28.Uint8List);
  @override
  set value(_i28.Uint8List? _value) =>
      super.noSuchMethod(Invocation.setter(#value, _value), returnValueForMissingStub: null);
  @override
  _i17.Future<_i28.Uint8List> get([_i17.Future<_i28.Uint8List?> Function()? create, Duration? ttl]) =>
      (super.noSuchMethod(Invocation.method(#get, [create, ttl]),
          returnValue: _i17.Future<_i28.Uint8List>.value(_i28.Uint8List(0))) as _i17.Future<_i28.Uint8List>);
  @override
  _i17.Future<void> purge({int? retries = 0}) => (super.noSuchMethod(Invocation.method(#purge, [], {#retries: retries}),
      returnValue: _i17.Future<void>.value(),
      returnValueForMissingStub: _i17.Future<void>.value()) as _i17.Future<void>);
  @override
  _i17.Future<_i28.Uint8List?> set(_i28.Uint8List? value, [Duration? ttl]) =>
      (super.noSuchMethod(Invocation.method(#set, [value, ttl]), returnValue: _i17.Future<_i28.Uint8List?>.value())
          as _i17.Future<_i28.Uint8List?>);
}

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

  @override
  _i10.GitHub get github =>
      (super.noSuchMethod(Invocation.getter(#github), returnValue: _FakeGitHub_12(this, Invocation.getter(#github)))
          as _i10.GitHub);
  @override
  _i17.Stream<_i10.Issue> listAll(
          {int? milestoneNumber,
          String? state,
          String? direction,
          String? sort,
          DateTime? since,
          int? perPage,
          List<String>? labels}) =>
      (super.noSuchMethod(
          Invocation.method(#listAll, [], {
            #milestoneNumber: milestoneNumber,
            #state: state,
            #direction: direction,
            #sort: sort,
            #since: since,
            #perPage: perPage,
            #labels: labels
          }),
          returnValue: _i17.Stream<_i10.Issue>.empty()) as _i17.Stream<_i10.Issue>);
  @override
  _i17.Stream<_i10.Issue> listByUser(
          {int? milestoneNumber,
          String? state,
          String? direction,
          String? sort,
          DateTime? since,
          int? perPage,
          List<String>? labels}) =>
      (super.noSuchMethod(
          Invocation.method(#listByUser, [], {
            #milestoneNumber: milestoneNumber,
            #state: state,
            #direction: direction,
            #sort: sort,
            #since: since,
            #perPage: perPage,
            #labels: labels
          }),
          returnValue: _i17.Stream<_i10.Issue>.empty()) as _i17.Stream<_i10.Issue>);
  @override
  _i17.Stream<_i10.Issue> listByOrg(String? org,
          {int? milestoneNumber,
          String? state,
          String? direction,
          String? sort,
          DateTime? since,
          int? perPage,
          List<String>? labels}) =>
      (super.noSuchMethod(
          Invocation.method(#listByOrg, [
            org
          ], {
            #milestoneNumber: milestoneNumber,
            #state: state,
            #direction: direction,
            #sort: sort,
            #since: since,
            #perPage: perPage,
            #labels: labels
          }),
          returnValue: _i17.Stream<_i10.Issue>.empty()) as _i17.Stream<_i10.Issue>);
  @override
  _i17.Stream<_i10.Issue> listByRepo(_i10.RepositorySlug? slug,
          {int? milestoneNumber,
          String? state,
          String? direction,
          String? sort,
          DateTime? since,
          int? perPage,
          List<String>? labels}) =>
      (super.noSuchMethod(
          Invocation.method(#listByRepo, [
            slug
          ], {
            #milestoneNumber: milestoneNumber,
            #state: state,
            #direction: direction,
            #sort: sort,
            #since: since,
            #perPage: perPage,
            #labels: labels
          }),
          returnValue: _i17.Stream<_i10.Issue>.empty()) as _i17.Stream<_i10.Issue>);
  @override
  _i17.Stream<_i10.Reaction> listReactions(_i10.RepositorySlug? slug, int? issueNumber, {_i10.ReactionType? content}) =>
      (super.noSuchMethod(Invocation.method(#listReactions, [slug, issueNumber], {#content: content}),
          returnValue: _i17.Stream<_i10.Reaction>.empty()) as _i17.Stream<_i10.Reaction>);
  @override
  _i17.Future<_i10.Issue> edit(_i10.RepositorySlug? slug, int? issueNumber, _i10.IssueRequest? issue) =>
      (super.noSuchMethod(Invocation.method(#edit, [slug, issueNumber, issue]),
          returnValue: _i17.Future<_i10.Issue>.value(
              _FakeIssue_13(this, Invocation.method(#edit, [slug, issueNumber, issue])))) as _i17.Future<_i10.Issue>);
  @override
  _i17.Future<_i10.Issue> get(_i10.RepositorySlug? slug, int? issueNumber) => (super.noSuchMethod(
          Invocation.method(#get, [slug, issueNumber]),
          returnValue: _i17.Future<_i10.Issue>.value(_FakeIssue_13(this, Invocation.method(#get, [slug, issueNumber]))))
      as _i17.Future<_i10.Issue>);
  @override
  _i17.Future<_i10.Issue> create(_i10.RepositorySlug? slug, _i10.IssueRequest? issue) => (super.noSuchMethod(
          Invocation.method(#create, [slug, issue]),
          returnValue: _i17.Future<_i10.Issue>.value(_FakeIssue_13(this, Invocation.method(#create, [slug, issue]))))
      as _i17.Future<_i10.Issue>);
  @override
  _i17.Stream<_i10.User> listAssignees(_i10.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listAssignees, [slug]), returnValue: _i17.Stream<_i10.User>.empty())
          as _i17.Stream<_i10.User>);
  @override
  _i17.Future<bool> isAssignee(_i10.RepositorySlug? slug, String? repoName) =>
      (super.noSuchMethod(Invocation.method(#isAssignee, [slug, repoName]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.IssueComment> listCommentsByIssue(_i10.RepositorySlug? slug, int? issueNumber) =>
      (super.noSuchMethod(Invocation.method(#listCommentsByIssue, [slug, issueNumber]),
          returnValue: _i17.Stream<_i10.IssueComment>.empty()) as _i17.Stream<_i10.IssueComment>);
  @override
  _i17.Stream<_i10.IssueComment> listCommentsByRepo(_i10.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listCommentsByRepo, [slug]),
          returnValue: _i17.Stream<_i10.IssueComment>.empty()) as _i17.Stream<_i10.IssueComment>);
  @override
  _i17.Future<_i10.IssueComment> getComment(_i10.RepositorySlug? slug, int? id) => (super.noSuchMethod(
      Invocation.method(#getComment, [slug, id]),
      returnValue: _i17.Future<_i10.IssueComment>.value(
          _FakeIssueComment_14(this, Invocation.method(#getComment, [slug, id])))) as _i17.Future<_i10.IssueComment>);
  @override
  _i17.Future<_i10.IssueComment> createComment(_i10.RepositorySlug? slug, int? issueNumber, String? body) =>
      (super.noSuchMethod(Invocation.method(#createComment, [slug, issueNumber, body]),
              returnValue: _i17.Future<_i10.IssueComment>.value(
                  _FakeIssueComment_14(this, Invocation.method(#createComment, [slug, issueNumber, body]))))
          as _i17.Future<_i10.IssueComment>);
  @override
  _i17.Future<_i10.IssueComment> updateComment(_i10.RepositorySlug? slug, int? id, String? body) =>
      (super.noSuchMethod(Invocation.method(#updateComment, [slug, id, body]),
              returnValue: _i17.Future<_i10.IssueComment>.value(
                  _FakeIssueComment_14(this, Invocation.method(#updateComment, [slug, id, body]))))
          as _i17.Future<_i10.IssueComment>);
  @override
  _i17.Future<bool> deleteComment(_i10.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#deleteComment, [slug, id]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.IssueLabel> listLabels(_i10.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listLabels, [slug]), returnValue: _i17.Stream<_i10.IssueLabel>.empty())
          as _i17.Stream<_i10.IssueLabel>);
  @override
  _i17.Future<_i10.IssueLabel> getLabel(_i10.RepositorySlug? slug, String? name) => (super.noSuchMethod(
          Invocation.method(#getLabel, [slug, name]),
          returnValue:
              _i17.Future<_i10.IssueLabel>.value(_FakeIssueLabel_15(this, Invocation.method(#getLabel, [slug, name]))))
      as _i17.Future<_i10.IssueLabel>);
  @override
  _i17.Future<_i10.IssueLabel> createLabel(_i10.RepositorySlug? slug, String? name, String? color) =>
      (super.noSuchMethod(Invocation.method(#createLabel, [slug, name, color]),
              returnValue: _i17.Future<_i10.IssueLabel>.value(
                  _FakeIssueLabel_15(this, Invocation.method(#createLabel, [slug, name, color]))))
          as _i17.Future<_i10.IssueLabel>);
  @override
  _i17.Future<_i10.IssueLabel> editLabel(_i10.RepositorySlug? slug, String? name, String? color) =>
      (super.noSuchMethod(Invocation.method(#editLabel, [slug, name, color]),
              returnValue: _i17.Future<_i10.IssueLabel>.value(
                  _FakeIssueLabel_15(this, Invocation.method(#editLabel, [slug, name, color]))))
          as _i17.Future<_i10.IssueLabel>);
  @override
  _i17.Future<bool> deleteLabel(_i10.RepositorySlug? slug, String? name) =>
      (super.noSuchMethod(Invocation.method(#deleteLabel, [slug, name]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.IssueLabel> listLabelsByIssue(_i10.RepositorySlug? slug, int? issueNumber) =>
      (super.noSuchMethod(Invocation.method(#listLabelsByIssue, [slug, issueNumber]),
          returnValue: _i17.Stream<_i10.IssueLabel>.empty()) as _i17.Stream<_i10.IssueLabel>);
  @override
  _i17.Future<List<_i10.IssueLabel>> addLabelsToIssue(
          _i10.RepositorySlug? slug, int? issueNumber, List<String>? labels) =>
      (super.noSuchMethod(Invocation.method(#addLabelsToIssue, [slug, issueNumber, labels]),
              returnValue: _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]))
          as _i17.Future<List<_i10.IssueLabel>>);
  @override
  _i17.Future<List<_i10.IssueLabel>> replaceLabelsForIssue(
          _i10.RepositorySlug? slug, int? issueNumber, List<String>? labels) =>
      (super.noSuchMethod(Invocation.method(#replaceLabelsForIssue, [slug, issueNumber, labels]),
              returnValue: _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]))
          as _i17.Future<List<_i10.IssueLabel>>);
  @override
  _i17.Future<bool> removeLabelForIssue(_i10.RepositorySlug? slug, int? issueNumber, String? label) =>
      (super.noSuchMethod(Invocation.method(#removeLabelForIssue, [slug, issueNumber, label]),
          returnValue: _i17.Future<bool>.value(false)) as _i17.Future<bool>);
  @override
  _i17.Future<bool> removeAllLabelsForIssue(_i10.RepositorySlug? slug, int? issueNumber) =>
      (super.noSuchMethod(Invocation.method(#removeAllLabelsForIssue, [slug, issueNumber]),
          returnValue: _i17.Future<bool>.value(false)) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.Milestone> listMilestones(_i10.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listMilestones, [slug]), returnValue: _i17.Stream<_i10.Milestone>.empty())
          as _i17.Stream<_i10.Milestone>);
  @override
  _i17.Future<_i10.Milestone> createMilestone(_i10.RepositorySlug? slug, _i10.CreateMilestone? request) =>
      (super.noSuchMethod(Invocation.method(#createMilestone, [slug, request]),
              returnValue: _i17.Future<_i10.Milestone>.value(
                  _FakeMilestone_16(this, Invocation.method(#createMilestone, [slug, request]))))
          as _i17.Future<_i10.Milestone>);
  @override
  _i17.Future<bool> deleteMilestone(_i10.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#deleteMilestone, [slug, number]),
          returnValue: _i17.Future<bool>.value(false)) as _i17.Future<bool>);
}

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

  @override
  _i3.Config get config =>
      (super.noSuchMethod(Invocation.getter(#config), returnValue: _FakeConfig_1(this, Invocation.getter(#config)))
          as _i3.Config);
  @override
  set config(_i3.Config? _config) =>
      super.noSuchMethod(Invocation.setter(#config, _config), returnValueForMissingStub: null);
  @override
  _i11.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(Invocation.getter(#githubChecksUtil),
      returnValue: _FakeGithubChecksUtil_17(this, Invocation.getter(#githubChecksUtil))) as _i11.GithubChecksUtil);
  @override
  set githubChecksUtil(_i11.GithubChecksUtil? _githubChecksUtil) =>
      super.noSuchMethod(Invocation.setter(#githubChecksUtil, _githubChecksUtil), returnValueForMissingStub: null);
  @override
  _i17.Future<void> handleCheckSuite(
          _i10.PullRequest? pullRequest, _i25.CheckSuiteEvent? checkSuiteEvent, _i30.Scheduler? scheduler) =>
      (super.noSuchMethod(Invocation.method(#handleCheckSuite, [pullRequest, checkSuiteEvent, scheduler]),
          returnValue: _i17.Future<void>.value(),
          returnValueForMissingStub: _i17.Future<void>.value()) as _i17.Future<void>);
  @override
  _i17.Future<bool> updateCheckStatus(_i31.BuildPushMessage? buildPushMessage, _i32.LuciBuildService? luciBuildService,
          _i10.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#updateCheckStatus, [buildPushMessage, luciBuildService, slug]),
          returnValue: _i17.Future<bool>.value(false)) as _i17.Future<bool>);
  @override
  String getGithubSummary(String? summary) =>
      (super.noSuchMethod(Invocation.method(#getGithubSummary, [summary]), returnValue: '') as String);
  @override
  _i10.CheckRunConclusion conclusionForResult(_i31.Result? result) =>
      (super.noSuchMethod(Invocation.method(#conclusionForResult, [result]),
              returnValue: _FakeCheckRunConclusion_18(this, Invocation.method(#conclusionForResult, [result])))
          as _i10.CheckRunConclusion);
  @override
  _i10.CheckRunStatus statusForResult(_i31.Status? status) => (super.noSuchMethod(
      Invocation.method(#statusForResult, [status]),
      returnValue: _FakeCheckRunStatus_19(this, Invocation.method(#statusForResult, [status]))) as _i10.CheckRunStatus);
}

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

  @override
  _i17.Future<Map<String, _i10.CheckRun>> allCheckRuns(
          _i10.GitHub? gitHubClient, _i25.CheckSuiteEvent? checkSuiteEvent) =>
      (super.noSuchMethod(Invocation.method(#allCheckRuns, [gitHubClient, checkSuiteEvent]),
              returnValue: _i17.Future<Map<String, _i10.CheckRun>>.value(<String, _i10.CheckRun>{}))
          as _i17.Future<Map<String, _i10.CheckRun>>);
  @override
  _i17.Future<_i10.CheckSuite> getCheckSuite(_i10.GitHub? gitHubClient, _i10.RepositorySlug? slug, int? checkSuiteId) =>
      (super.noSuchMethod(Invocation.method(#getCheckSuite, [gitHubClient, slug, checkSuiteId]),
              returnValue: _i17.Future<_i10.CheckSuite>.value(
                  _FakeCheckSuite_20(this, Invocation.method(#getCheckSuite, [gitHubClient, slug, checkSuiteId]))))
          as _i17.Future<_i10.CheckSuite>);
  @override
  _i17.Future<void> updateCheckRun(_i3.Config? cocoonConfig, _i10.RepositorySlug? slug, _i10.CheckRun? checkRun,
          {_i10.CheckRunStatus? status = _i10.CheckRunStatus.queued,
          _i10.CheckRunConclusion? conclusion,
          String? detailsUrl,
          _i10.CheckRunOutput? output}) =>
      (super.noSuchMethod(
          Invocation.method(#updateCheckRun, [cocoonConfig, slug, checkRun],
              {#status: status, #conclusion: conclusion, #detailsUrl: detailsUrl, #output: output}),
          returnValue: _i17.Future<void>.value(),
          returnValueForMissingStub: _i17.Future<void>.value()) as _i17.Future<void>);
  @override
  _i17.Future<_i10.CheckRun> getCheckRun(_i3.Config? cocoonConfig, _i10.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#getCheckRun, [cocoonConfig, slug, id]),
              returnValue: _i17.Future<_i10.CheckRun>.value(
                  _FakeCheckRun_21(this, Invocation.method(#getCheckRun, [cocoonConfig, slug, id]))))
          as _i17.Future<_i10.CheckRun>);
  @override
  _i17.Future<_i10.CheckRun> createCheckRun(
          _i3.Config? cocoonConfig, _i10.RepositorySlug? slug, String? sha, String? name,
          {_i10.CheckRunOutput? output}) =>
      (super.noSuchMethod(Invocation.method(#createCheckRun, [cocoonConfig, slug, sha, name], {#output: output}),
              returnValue: _i17.Future<_i10.CheckRun>.value(_FakeCheckRun_21(
                  this, Invocation.method(#createCheckRun, [cocoonConfig, slug, sha, name], {#output: output}))))
          as _i17.Future<_i10.CheckRun>);
}

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

  @override
  _i10.GitHub get github =>
      (super.noSuchMethod(Invocation.getter(#github), returnValue: _FakeGitHub_12(this, Invocation.getter(#github)))
          as _i10.GitHub);
  @override
  _i17.Future<List<_i10.RepositoryCommit>> listCommits(
          _i10.RepositorySlug? slug, String? branch, int? lastCommitTimestampMills) =>
      (super.noSuchMethod(Invocation.method(#listCommits, [slug, branch, lastCommitTimestampMills]),
              returnValue: _i17.Future<List<_i10.RepositoryCommit>>.value(<_i10.RepositoryCommit>[]))
          as _i17.Future<List<_i10.RepositoryCommit>>);
  @override
  _i17.Future<List<_i10.PullRequest>> listPullRequests(_i10.RepositorySlug? slug, String? branch) =>
      (super.noSuchMethod(Invocation.method(#listPullRequests, [slug, branch]),
              returnValue: _i17.Future<List<_i10.PullRequest>>.value(<_i10.PullRequest>[]))
          as _i17.Future<List<_i10.PullRequest>>);
  @override
  _i17.Future<_i10.PullRequest> createPullRequest(_i10.RepositorySlug? slug,
          {String? title,
          String? body,
          String? commitMessage,
          _i10.GitReference? baseRef,
          List<_i10.CreateGitTreeEntry>? entries}) =>
      (super.noSuchMethod(Invocation.method(#createPullRequest, [slug], {#title: title, #body: body, #commitMessage: commitMessage, #baseRef: baseRef, #entries: entries}),
          returnValue: _i17.Future<_i10.PullRequest>.value(_FakePullRequest_22(
              this,
              Invocation.method(#createPullRequest, [
                slug
              ], {
                #title: title,
                #body: body,
                #commitMessage: commitMessage,
                #baseRef: baseRef,
                #entries: entries
              })))) as _i17.Future<_i10.PullRequest>);
  @override
  _i17.Future<void> assignReviewer(_i10.RepositorySlug? slug, {int? pullRequestNumber, String? reviewer}) =>
      (super.noSuchMethod(
          Invocation.method(#assignReviewer, [slug], {#pullRequestNumber: pullRequestNumber, #reviewer: reviewer}),
          returnValue: _i17.Future<void>.value(),
          returnValueForMissingStub: _i17.Future<void>.value()) as _i17.Future<void>);
  @override
  _i17.Future<List<_i10.Issue>> listIssues(_i10.RepositorySlug? slug,
          {List<String>? labels, String? state = r'open'}) =>
      (super.noSuchMethod(Invocation.method(#listIssues, [slug], {#labels: labels, #state: state}),
          returnValue: _i17.Future<List<_i10.Issue>>.value(<_i10.Issue>[])) as _i17.Future<List<_i10.Issue>>);
  @override
  _i17.Future<_i10.Issue>? getIssue(_i10.RepositorySlug? slug, {int? issueNumber}) =>
      (super.noSuchMethod(Invocation.method(#getIssue, [slug], {#issueNumber: issueNumber}))
          as _i17.Future<_i10.Issue>?);
  @override
  _i17.Future<void> assignIssue(_i10.RepositorySlug? slug, {int? issueNumber, String? assignee}) =>
      (super.noSuchMethod(Invocation.method(#assignIssue, [slug], {#issueNumber: issueNumber, #assignee: assignee}),
          returnValue: _i17.Future<void>.value(),
          returnValueForMissingStub: _i17.Future<void>.value()) as _i17.Future<void>);
  @override
  _i17.Future<_i10.Issue> createIssue(_i10.RepositorySlug? slug,
          {String? title, String? body, List<String>? labels, String? assignee}) =>
      (super.noSuchMethod(
          Invocation.method(#createIssue, [slug], {#title: title, #body: body, #labels: labels, #assignee: assignee}),
          returnValue: _i17.Future<_i10.Issue>.value(_FakeIssue_13(
              this,
              Invocation.method(
                  #createIssue, [slug], {#title: title, #body: body, #labels: labels, #assignee: assignee})))) as _i17
          .Future<_i10.Issue>);
  @override
  _i17.Future<_i10.IssueComment?> createComment(_i10.RepositorySlug? slug, {int? issueNumber, String? body}) =>
      (super.noSuchMethod(Invocation.method(#createComment, [slug], {#issueNumber: issueNumber, #body: body}),
          returnValue: _i17.Future<_i10.IssueComment?>.value()) as _i17.Future<_i10.IssueComment?>);
  @override
  _i17.Future<List<_i10.IssueLabel>> replaceLabelsForIssue(_i10.RepositorySlug? slug,
          {int? issueNumber, List<String>? labels}) =>
      (super.noSuchMethod(
              Invocation.method(#replaceLabelsForIssue, [slug], {#issueNumber: issueNumber, #labels: labels}),
              returnValue: _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]))
          as _i17.Future<List<_i10.IssueLabel>>);
  @override
  _i17.Future<List<String>> listFiles(_i10.PullRequest? pullRequest) =>
      (super.noSuchMethod(Invocation.method(#listFiles, [pullRequest]),
          returnValue: _i17.Future<List<String>>.value(<String>[])) as _i17.Future<List<String>>);
  @override
  _i17.Future<String> getFileContent(_i10.RepositorySlug? slug, String? path, {String? ref}) =>
      (super.noSuchMethod(Invocation.method(#getFileContent, [slug, path], {#ref: ref}),
          returnValue: _i17.Future<String>.value('')) as _i17.Future<String>);
  @override
  _i17.Future<_i10.GitReference> getReference(_i10.RepositorySlug? slug, String? ref) =>
      (super.noSuchMethod(Invocation.method(#getReference, [slug, ref]),
              returnValue: _i17.Future<_i10.GitReference>.value(
                  _FakeGitReference_23(this, Invocation.method(#getReference, [slug, ref]))))
          as _i17.Future<_i10.GitReference>);
  @override
  _i17.Future<_i10.RateLimit> getRateLimit() => (super.noSuchMethod(Invocation.method(#getRateLimit, []),
          returnValue: _i17.Future<_i10.RateLimit>.value(_FakeRateLimit_24(this, Invocation.method(#getRateLimit, []))))
      as _i17.Future<_i10.RateLimit>);
}

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

  @override
  _i10.GitHub get github =>
      (super.noSuchMethod(Invocation.getter(#github), returnValue: _FakeGitHub_12(this, Invocation.getter(#github)))
          as _i10.GitHub);
  @override
  _i17.Future<_i10.GitBlob> getBlob(_i10.RepositorySlug? slug, String? sha) => (super.noSuchMethod(
          Invocation.method(#getBlob, [slug, sha]),
          returnValue: _i17.Future<_i10.GitBlob>.value(_FakeGitBlob_25(this, Invocation.method(#getBlob, [slug, sha]))))
      as _i17.Future<_i10.GitBlob>);
  @override
  _i17.Future<_i10.GitBlob> createBlob(_i10.RepositorySlug? slug, _i10.CreateGitBlob? blob) =>
      (super.noSuchMethod(Invocation.method(#createBlob, [slug, blob]),
              returnValue:
                  _i17.Future<_i10.GitBlob>.value(_FakeGitBlob_25(this, Invocation.method(#createBlob, [slug, blob]))))
          as _i17.Future<_i10.GitBlob>);
  @override
  _i17.Future<_i10.GitCommit> getCommit(_i10.RepositorySlug? slug, String? sha) => (super.noSuchMethod(
          Invocation.method(#getCommit, [slug, sha]),
          returnValue:
              _i17.Future<_i10.GitCommit>.value(_FakeGitCommit_26(this, Invocation.method(#getCommit, [slug, sha]))))
      as _i17.Future<_i10.GitCommit>);
  @override
  _i17.Future<_i10.GitCommit> createCommit(_i10.RepositorySlug? slug, _i10.CreateGitCommit? commit) =>
      (super.noSuchMethod(Invocation.method(#createCommit, [slug, commit]),
              returnValue: _i17.Future<_i10.GitCommit>.value(
                  _FakeGitCommit_26(this, Invocation.method(#createCommit, [slug, commit]))))
          as _i17.Future<_i10.GitCommit>);
  @override
  _i17.Future<_i10.GitReference> getReference(_i10.RepositorySlug? slug, String? ref) =>
      (super.noSuchMethod(Invocation.method(#getReference, [slug, ref]),
              returnValue: _i17.Future<_i10.GitReference>.value(
                  _FakeGitReference_23(this, Invocation.method(#getReference, [slug, ref]))))
          as _i17.Future<_i10.GitReference>);
  @override
  _i17.Stream<_i10.GitReference> listReferences(_i10.RepositorySlug? slug, {String? type}) =>
      (super.noSuchMethod(Invocation.method(#listReferences, [slug], {#type: type}),
          returnValue: _i17.Stream<_i10.GitReference>.empty()) as _i17.Stream<_i10.GitReference>);
  @override
  _i17.Future<_i10.GitReference> createReference(_i10.RepositorySlug? slug, String? ref, String? sha) =>
      (super.noSuchMethod(Invocation.method(#createReference, [slug, ref, sha]),
              returnValue: _i17.Future<_i10.GitReference>.value(
                  _FakeGitReference_23(this, Invocation.method(#createReference, [slug, ref, sha]))))
          as _i17.Future<_i10.GitReference>);
  @override
  _i17.Future<_i10.GitReference> editReference(_i10.RepositorySlug? slug, String? ref, String? sha,
          {bool? force = false}) =>
      (super.noSuchMethod(Invocation.method(#editReference, [slug, ref, sha], {#force: force}),
              returnValue: _i17.Future<_i10.GitReference>.value(
                  _FakeGitReference_23(this, Invocation.method(#editReference, [slug, ref, sha], {#force: force}))))
          as _i17.Future<_i10.GitReference>);
  @override
  _i17.Future<bool> deleteReference(_i10.RepositorySlug? slug, String? ref) =>
      (super.noSuchMethod(Invocation.method(#deleteReference, [slug, ref]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Future<_i10.GitTag> getTag(_i10.RepositorySlug? slug, String? sha) => (super.noSuchMethod(
          Invocation.method(#getTag, [slug, sha]),
          returnValue: _i17.Future<_i10.GitTag>.value(_FakeGitTag_27(this, Invocation.method(#getTag, [slug, sha]))))
      as _i17.Future<_i10.GitTag>);
  @override
  _i17.Future<_i10.GitTag> createTag(_i10.RepositorySlug? slug, _i10.CreateGitTag? tag) => (super.noSuchMethod(
          Invocation.method(#createTag, [slug, tag]),
          returnValue: _i17.Future<_i10.GitTag>.value(_FakeGitTag_27(this, Invocation.method(#createTag, [slug, tag]))))
      as _i17.Future<_i10.GitTag>);
  @override
  _i17.Future<_i10.GitTree> getTree(_i10.RepositorySlug? slug, String? sha, {bool? recursive = false}) =>
      (super.noSuchMethod(Invocation.method(#getTree, [slug, sha], {#recursive: recursive}),
              returnValue: _i17.Future<_i10.GitTree>.value(
                  _FakeGitTree_28(this, Invocation.method(#getTree, [slug, sha], {#recursive: recursive}))))
          as _i17.Future<_i10.GitTree>);
  @override
  _i17.Future<_i10.GitTree> createTree(_i10.RepositorySlug? slug, _i10.CreateGitTree? tree) =>
      (super.noSuchMethod(Invocation.method(#createTree, [slug, tree]),
              returnValue:
                  _i17.Future<_i10.GitTree>.value(_FakeGitTree_28(this, Invocation.method(#createTree, [slug, tree]))))
          as _i17.Future<_i10.GitTree>);
}

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

  @override
  _i12.DefaultPolicies get defaultPolicies => (super.noSuchMethod(Invocation.getter(#defaultPolicies),
      returnValue: _FakeDefaultPolicies_29(this, Invocation.getter(#defaultPolicies))) as _i12.DefaultPolicies);
  @override
  set defaultPolicies(_i12.DefaultPolicies? _defaultPolicies) =>
      super.noSuchMethod(Invocation.setter(#defaultPolicies, _defaultPolicies), returnValueForMissingStub: null);
  @override
  _i12.Link get link =>
      (super.noSuchMethod(Invocation.getter(#link), returnValue: _FakeLink_30(this, Invocation.getter(#link)))
          as _i12.Link);
  @override
  _i13.GraphQLCache get cache =>
      (super.noSuchMethod(Invocation.getter(#cache), returnValue: _FakeGraphQLCache_31(this, Invocation.getter(#cache)))
          as _i13.GraphQLCache);
  @override
  _i12.QueryManager get queryManager => (super.noSuchMethod(Invocation.getter(#queryManager),
      returnValue: _FakeQueryManager_32(this, Invocation.getter(#queryManager))) as _i12.QueryManager);
  @override
  set queryManager(_i12.QueryManager? _queryManager) =>
      super.noSuchMethod(Invocation.setter(#queryManager, _queryManager), returnValueForMissingStub: null);
  @override
  _i14.GraphQLClient copyWith(
          {_i12.Link? link,
          _i13.GraphQLCache? cache,
          _i12.DefaultPolicies? defaultPolicies,
          bool? alwaysRebroadcast}) =>
      (super.noSuchMethod(
          Invocation.method(#copyWith, [],
              {#link: link, #cache: cache, #defaultPolicies: defaultPolicies, #alwaysRebroadcast: alwaysRebroadcast}),
          returnValue: _FakeGraphQLClient_33(
              this,
              Invocation.method(#copyWith, [], {
                #link: link,
                #cache: cache,
                #defaultPolicies: defaultPolicies,
                #alwaysRebroadcast: alwaysRebroadcast
              }))) as _i14.GraphQLClient);
  @override
  _i12.ObservableQuery<TParsed> watchQuery<TParsed>(_i12.WatchQueryOptions<TParsed>? options) =>
      (super.noSuchMethod(Invocation.method(#watchQuery, [options]),
              returnValue: _FakeObservableQuery_34<TParsed>(this, Invocation.method(#watchQuery, [options])))
          as _i12.ObservableQuery<TParsed>);
  @override
  _i12.ObservableQuery<TParsed> watchMutation<TParsed>(_i12.WatchQueryOptions<TParsed>? options) =>
      (super.noSuchMethod(Invocation.method(#watchMutation, [options]),
              returnValue: _FakeObservableQuery_34<TParsed>(this, Invocation.method(#watchMutation, [options])))
          as _i12.ObservableQuery<TParsed>);
  @override
  _i17.Future<_i12.QueryResult<TParsed>> query<TParsed>(_i12.QueryOptions<TParsed>? options) =>
      (super.noSuchMethod(Invocation.method(#query, [options]),
              returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(
                  _FakeQueryResult_35<TParsed>(this, Invocation.method(#query, [options]))))
          as _i17.Future<_i12.QueryResult<TParsed>>);
  @override
  _i17.Future<_i12.QueryResult<TParsed>> mutate<TParsed>(_i12.MutationOptions<TParsed>? options) =>
      (super.noSuchMethod(Invocation.method(#mutate, [options]),
              returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(
                  _FakeQueryResult_35<TParsed>(this, Invocation.method(#mutate, [options]))))
          as _i17.Future<_i12.QueryResult<TParsed>>);
  @override
  _i17.Stream<_i12.QueryResult<TParsed>> subscribe<TParsed>(_i12.SubscriptionOptions<TParsed>? options) =>
      (super.noSuchMethod(Invocation.method(#subscribe, [options]),
          returnValue: _i17.Stream<_i12.QueryResult<TParsed>>.empty()) as _i17.Stream<_i12.QueryResult<TParsed>>);
  @override
  _i17.Future<_i12.QueryResult<TParsed>> fetchMore<TParsed>(_i12.FetchMoreOptions? fetchMoreOptions,
          {_i12.QueryOptions<TParsed>? originalOptions, _i12.QueryResult<TParsed>? previousResult}) =>
      (super.noSuchMethod(
              Invocation.method(
                  #fetchMore, [fetchMoreOptions], {#originalOptions: originalOptions, #previousResult: previousResult}),
              returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(_FakeQueryResult_35<TParsed>(
                  this, Invocation.method(#fetchMore, [fetchMoreOptions], {#originalOptions: originalOptions, #previousResult: previousResult}))))
          as _i17.Future<_i12.QueryResult<TParsed>>);
  @override
  Map<String, dynamic>? readQuery(_i12.Request? request, {bool? optimistic = true}) =>
      (super.noSuchMethod(Invocation.method(#readQuery, [request], {#optimistic: optimistic}))
          as Map<String, dynamic>?);
  @override
  Map<String, dynamic>? readFragment(_i13.FragmentRequest? fragmentRequest, {bool? optimistic = true}) =>
      (super.noSuchMethod(Invocation.method(#readFragment, [fragmentRequest], {#optimistic: optimistic}))
          as Map<String, dynamic>?);
  @override
  void writeQuery(_i12.Request? request, {Map<String, dynamic>? data, bool? broadcast = true}) =>
      super.noSuchMethod(Invocation.method(#writeQuery, [request], {#data: data, #broadcast: broadcast}),
          returnValueForMissingStub: null);
  @override
  void writeFragment(_i13.FragmentRequest? fragmentRequest, {bool? broadcast = true, Map<String, dynamic>? data}) =>
      super.noSuchMethod(Invocation.method(#writeFragment, [fragmentRequest], {#broadcast: broadcast, #data: data}),
          returnValueForMissingStub: null);
  @override
  _i17.Future<List<_i12.QueryResult<Object?>?>>? resetStore({bool? refetchQueries = true}) =>
      (super.noSuchMethod(Invocation.method(#resetStore, [], {#refetchQueries: refetchQueries}))
          as _i17.Future<List<_i12.QueryResult<Object?>?>>?);
}

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

  @override
  Duration get idleTimeout => (super.noSuchMethod(Invocation.getter(#idleTimeout),
      returnValue: _FakeDuration_36(this, Invocation.getter(#idleTimeout))) as Duration);
  @override
  set idleTimeout(Duration? _idleTimeout) =>
      super.noSuchMethod(Invocation.setter(#idleTimeout, _idleTimeout), returnValueForMissingStub: null);
  @override
  set connectionTimeout(Duration? _connectionTimeout) =>
      super.noSuchMethod(Invocation.setter(#connectionTimeout, _connectionTimeout), returnValueForMissingStub: null);
  @override
  set maxConnectionsPerHost(int? _maxConnectionsPerHost) => super
      .noSuchMethod(Invocation.setter(#maxConnectionsPerHost, _maxConnectionsPerHost), returnValueForMissingStub: null);
  @override
  bool get autoUncompress => (super.noSuchMethod(Invocation.getter(#autoUncompress), returnValue: false) as bool);
  @override
  set autoUncompress(bool? _autoUncompress) =>
      super.noSuchMethod(Invocation.setter(#autoUncompress, _autoUncompress), returnValueForMissingStub: null);
  @override
  set userAgent(String? _userAgent) =>
      super.noSuchMethod(Invocation.setter(#userAgent, _userAgent), returnValueForMissingStub: null);
  @override
  set authenticate(_i17.Future<bool> Function(Uri, String, String?)? f) =>
      super.noSuchMethod(Invocation.setter(#authenticate, f), returnValueForMissingStub: null);
  @override
  set connectionFactory(_i17.Future<_i15.ConnectionTask<_i15.Socket>> Function(Uri, String?, int?)? f) =>
      super.noSuchMethod(Invocation.setter(#connectionFactory, f), returnValueForMissingStub: null);
  @override
  set findProxy(String Function(Uri)? f) =>
      super.noSuchMethod(Invocation.setter(#findProxy, f), returnValueForMissingStub: null);
  @override
  set authenticateProxy(_i17.Future<bool> Function(String, int, String, String?)? f) =>
      super.noSuchMethod(Invocation.setter(#authenticateProxy, f), returnValueForMissingStub: null);
  @override
  set badCertificateCallback(bool Function(_i15.X509Certificate, String, int)? callback) =>
      super.noSuchMethod(Invocation.setter(#badCertificateCallback, callback), returnValueForMissingStub: null);
  @override
  set keyLog(dynamic Function(String)? callback) =>
      super.noSuchMethod(Invocation.setter(#keyLog, callback), returnValueForMissingStub: null);
  @override
  _i17.Future<_i15.HttpClientRequest> open(String? method, String? host, int? port, String? path) =>
      (super.noSuchMethod(Invocation.method(#open, [method, host, port, path]),
              returnValue: _i17.Future<_i15.HttpClientRequest>.value(
                  _FakeHttpClientRequest_37(this, Invocation.method(#open, [method, host, port, path]))))
          as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> openUrl(String? method, Uri? url) =>
      (super.noSuchMethod(Invocation.method(#openUrl, [method, url]),
              returnValue: _i17.Future<_i15.HttpClientRequest>.value(
                  _FakeHttpClientRequest_37(this, Invocation.method(#openUrl, [method, url]))))
          as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> get(String? host, int? port, String? path) =>
      (super.noSuchMethod(Invocation.method(#get, [host, port, path]),
              returnValue: _i17.Future<_i15.HttpClientRequest>.value(
                  _FakeHttpClientRequest_37(this, Invocation.method(#get, [host, port, path]))))
          as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> getUrl(Uri? url) => (super.noSuchMethod(Invocation.method(#getUrl, [url]),
      returnValue: _i17.Future<_i15.HttpClientRequest>.value(
          _FakeHttpClientRequest_37(this, Invocation.method(#getUrl, [url])))) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> post(String? host, int? port, String? path) =>
      (super.noSuchMethod(Invocation.method(#post, [host, port, path]),
              returnValue: _i17.Future<_i15.HttpClientRequest>.value(
                  _FakeHttpClientRequest_37(this, Invocation.method(#post, [host, port, path]))))
          as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> postUrl(Uri? url) => (super.noSuchMethod(Invocation.method(#postUrl, [url]),
      returnValue: _i17.Future<_i15.HttpClientRequest>.value(
          _FakeHttpClientRequest_37(this, Invocation.method(#postUrl, [url])))) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> put(String? host, int? port, String? path) =>
      (super.noSuchMethod(Invocation.method(#put, [host, port, path]),
              returnValue: _i17.Future<_i15.HttpClientRequest>.value(
                  _FakeHttpClientRequest_37(this, Invocation.method(#put, [host, port, path]))))
          as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> putUrl(Uri? url) => (super.noSuchMethod(Invocation.method(#putUrl, [url]),
      returnValue: _i17.Future<_i15.HttpClientRequest>.value(
          _FakeHttpClientRequest_37(this, Invocation.method(#putUrl, [url])))) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> delete(String? host, int? port, String? path) =>
      (super.noSuchMethod(Invocation.method(#delete, [host, port, path]),
              returnValue: _i17.Future<_i15.HttpClientRequest>.value(
                  _FakeHttpClientRequest_37(this, Invocation.method(#delete, [host, port, path]))))
          as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> deleteUrl(Uri? url) => (super.noSuchMethod(Invocation.method(#deleteUrl, [url]),
          returnValue: _i17.Future<_i15.HttpClientRequest>.value(
              _FakeHttpClientRequest_37(this, Invocation.method(#deleteUrl, [url]))))
      as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> patch(String? host, int? port, String? path) =>
      (super.noSuchMethod(Invocation.method(#patch, [host, port, path]),
              returnValue: _i17.Future<_i15.HttpClientRequest>.value(
                  _FakeHttpClientRequest_37(this, Invocation.method(#patch, [host, port, path]))))
          as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> patchUrl(Uri? url) => (super.noSuchMethod(Invocation.method(#patchUrl, [url]),
          returnValue: _i17.Future<_i15.HttpClientRequest>.value(
              _FakeHttpClientRequest_37(this, Invocation.method(#patchUrl, [url]))))
      as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> head(String? host, int? port, String? path) =>
      (super.noSuchMethod(Invocation.method(#head, [host, port, path]),
              returnValue: _i17.Future<_i15.HttpClientRequest>.value(
                  _FakeHttpClientRequest_37(this, Invocation.method(#head, [host, port, path]))))
          as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> headUrl(Uri? url) => (super.noSuchMethod(Invocation.method(#headUrl, [url]),
      returnValue: _i17.Future<_i15.HttpClientRequest>.value(
          _FakeHttpClientRequest_37(this, Invocation.method(#headUrl, [url])))) as _i17.Future<_i15.HttpClientRequest>);
  @override
  void addCredentials(Uri? url, String? realm, _i15.HttpClientCredentials? credentials) => super
      .noSuchMethod(Invocation.method(#addCredentials, [url, realm, credentials]), returnValueForMissingStub: null);
  @override
  void addProxyCredentials(String? host, int? port, String? realm, _i15.HttpClientCredentials? credentials) =>
      super.noSuchMethod(Invocation.method(#addProxyCredentials, [host, port, realm, credentials]),
          returnValueForMissingStub: null);
  @override
  void close({bool? force = false}) =>
      super.noSuchMethod(Invocation.method(#close, [], {#force: force}), returnValueForMissingStub: null);
}

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

  @override
  bool get persistentConnection =>
      (super.noSuchMethod(Invocation.getter(#persistentConnection), returnValue: false) as bool);
  @override
  set persistentConnection(bool? _persistentConnection) => super
      .noSuchMethod(Invocation.setter(#persistentConnection, _persistentConnection), returnValueForMissingStub: null);
  @override
  bool get followRedirects => (super.noSuchMethod(Invocation.getter(#followRedirects), returnValue: false) as bool);
  @override
  set followRedirects(bool? _followRedirects) =>
      super.noSuchMethod(Invocation.setter(#followRedirects, _followRedirects), returnValueForMissingStub: null);
  @override
  int get maxRedirects => (super.noSuchMethod(Invocation.getter(#maxRedirects), returnValue: 0) as int);
  @override
  set maxRedirects(int? _maxRedirects) =>
      super.noSuchMethod(Invocation.setter(#maxRedirects, _maxRedirects), returnValueForMissingStub: null);
  @override
  int get contentLength => (super.noSuchMethod(Invocation.getter(#contentLength), returnValue: 0) as int);
  @override
  set contentLength(int? _contentLength) =>
      super.noSuchMethod(Invocation.setter(#contentLength, _contentLength), returnValueForMissingStub: null);
  @override
  bool get bufferOutput => (super.noSuchMethod(Invocation.getter(#bufferOutput), returnValue: false) as bool);
  @override
  set bufferOutput(bool? _bufferOutput) =>
      super.noSuchMethod(Invocation.setter(#bufferOutput, _bufferOutput), returnValueForMissingStub: null);
  @override
  String get method => (super.noSuchMethod(Invocation.getter(#method), returnValue: '') as String);
  @override
  Uri get uri =>
      (super.noSuchMethod(Invocation.getter(#uri), returnValue: _FakeUri_38(this, Invocation.getter(#uri))) as Uri);
  @override
  _i15.HttpHeaders get headers => (super.noSuchMethod(Invocation.getter(#headers),
      returnValue: _FakeHttpHeaders_39(this, Invocation.getter(#headers))) as _i15.HttpHeaders);
  @override
  List<_i15.Cookie> get cookies =>
      (super.noSuchMethod(Invocation.getter(#cookies), returnValue: <_i15.Cookie>[]) as List<_i15.Cookie>);
  @override
  _i17.Future<_i15.HttpClientResponse> get done => (super.noSuchMethod(Invocation.getter(#done),
          returnValue:
              _i17.Future<_i15.HttpClientResponse>.value(_FakeHttpClientResponse_40(this, Invocation.getter(#done))))
      as _i17.Future<_i15.HttpClientResponse>);
  @override
  _i16.Encoding get encoding => (super.noSuchMethod(Invocation.getter(#encoding),
      returnValue: _FakeEncoding_41(this, Invocation.getter(#encoding))) as _i16.Encoding);
  @override
  set encoding(_i16.Encoding? _encoding) =>
      super.noSuchMethod(Invocation.setter(#encoding, _encoding), returnValueForMissingStub: null);
  @override
  _i17.Future<_i15.HttpClientResponse> close() => (super.noSuchMethod(Invocation.method(#close, []),
      returnValue: _i17.Future<_i15.HttpClientResponse>.value(
          _FakeHttpClientResponse_40(this, Invocation.method(#close, [])))) as _i17.Future<_i15.HttpClientResponse>);
  @override
  void abort([Object? exception, StackTrace? stackTrace]) =>
      super.noSuchMethod(Invocation.method(#abort, [exception, stackTrace]), returnValueForMissingStub: null);
  @override
  void add(List<int>? data) => super.noSuchMethod(Invocation.method(#add, [data]), returnValueForMissingStub: null);
  @override
  void write(Object? object) =>
      super.noSuchMethod(Invocation.method(#write, [object]), returnValueForMissingStub: null);
  @override
  void writeAll(Iterable<dynamic>? objects, [String? separator = r'']) =>
      super.noSuchMethod(Invocation.method(#writeAll, [objects, separator]), returnValueForMissingStub: null);
  @override
  void writeln([Object? object = r'']) =>
      super.noSuchMethod(Invocation.method(#writeln, [object]), returnValueForMissingStub: null);
  @override
  void writeCharCode(int? charCode) =>
      super.noSuchMethod(Invocation.method(#writeCharCode, [charCode]), returnValueForMissingStub: null);
  @override
  void addError(Object? error, [StackTrace? stackTrace]) =>
      super.noSuchMethod(Invocation.method(#addError, [error, stackTrace]), returnValueForMissingStub: null);
  @override
  _i17.Future<dynamic> addStream(_i17.Stream<List<int>>? stream) =>
      (super.noSuchMethod(Invocation.method(#addStream, [stream]), returnValue: _i17.Future<dynamic>.value())
          as _i17.Future<dynamic>);
  @override
  _i17.Future<dynamic> flush() =>
      (super.noSuchMethod(Invocation.method(#flush, []), returnValue: _i17.Future<dynamic>.value())
          as _i17.Future<dynamic>);
}

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

  @override
  int get statusCode => (super.noSuchMethod(Invocation.getter(#statusCode), returnValue: 0) as int);
  @override
  String get reasonPhrase => (super.noSuchMethod(Invocation.getter(#reasonPhrase), returnValue: '') as String);
  @override
  int get contentLength => (super.noSuchMethod(Invocation.getter(#contentLength), returnValue: 0) as int);
  @override
  _i15.HttpClientResponseCompressionState get compressionState => (super.noSuchMethod(
      Invocation.getter(#compressionState),
      returnValue: _i15.HttpClientResponseCompressionState.notCompressed) as _i15.HttpClientResponseCompressionState);
  @override
  bool get persistentConnection =>
      (super.noSuchMethod(Invocation.getter(#persistentConnection), returnValue: false) as bool);
  @override
  bool get isRedirect => (super.noSuchMethod(Invocation.getter(#isRedirect), returnValue: false) as bool);
  @override
  List<_i15.RedirectInfo> get redirects =>
      (super.noSuchMethod(Invocation.getter(#redirects), returnValue: <_i15.RedirectInfo>[])
          as List<_i15.RedirectInfo>);
  @override
  _i15.HttpHeaders get headers => (super.noSuchMethod(Invocation.getter(#headers),
      returnValue: _FakeHttpHeaders_39(this, Invocation.getter(#headers))) as _i15.HttpHeaders);
  @override
  List<_i15.Cookie> get cookies =>
      (super.noSuchMethod(Invocation.getter(#cookies), returnValue: <_i15.Cookie>[]) as List<_i15.Cookie>);
  @override
  bool get isBroadcast => (super.noSuchMethod(Invocation.getter(#isBroadcast), returnValue: false) as bool);
  @override
  _i17.Future<int> get length =>
      (super.noSuchMethod(Invocation.getter(#length), returnValue: _i17.Future<int>.value(0)) as _i17.Future<int>);
  @override
  _i17.Future<bool> get isEmpty =>
      (super.noSuchMethod(Invocation.getter(#isEmpty), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Future<List<int>> get first =>
      (super.noSuchMethod(Invocation.getter(#first), returnValue: _i17.Future<List<int>>.value(<int>[]))
          as _i17.Future<List<int>>);
  @override
  _i17.Future<List<int>> get last =>
      (super.noSuchMethod(Invocation.getter(#last), returnValue: _i17.Future<List<int>>.value(<int>[]))
          as _i17.Future<List<int>>);
  @override
  _i17.Future<List<int>> get single =>
      (super.noSuchMethod(Invocation.getter(#single), returnValue: _i17.Future<List<int>>.value(<int>[]))
          as _i17.Future<List<int>>);
  @override
  _i17.Future<_i15.HttpClientResponse> redirect([String? method, Uri? url, bool? followLoops]) =>
      (super.noSuchMethod(Invocation.method(#redirect, [method, url, followLoops]),
              returnValue: _i17.Future<_i15.HttpClientResponse>.value(
                  _FakeHttpClientResponse_40(this, Invocation.method(#redirect, [method, url, followLoops]))))
          as _i17.Future<_i15.HttpClientResponse>);
  @override
  _i17.Future<_i15.Socket> detachSocket() => (super.noSuchMethod(Invocation.method(#detachSocket, []),
          returnValue: _i17.Future<_i15.Socket>.value(_FakeSocket_42(this, Invocation.method(#detachSocket, []))))
      as _i17.Future<_i15.Socket>);
  @override
  _i17.Stream<List<int>> asBroadcastStream(
          {void Function(_i17.StreamSubscription<List<int>>)? onListen,
          void Function(_i17.StreamSubscription<List<int>>)? onCancel}) =>
      (super.noSuchMethod(Invocation.method(#asBroadcastStream, [], {#onListen: onListen, #onCancel: onCancel}),
          returnValue: _i17.Stream<List<int>>.empty()) as _i17.Stream<List<int>>);
  @override
  _i17.StreamSubscription<List<int>> listen(void Function(List<int>)? onData,
          {Function? onError, void Function()? onDone, bool? cancelOnError}) =>
      (super.noSuchMethod(
              Invocation.method(#listen, [onData], {#onError: onError, #onDone: onDone, #cancelOnError: cancelOnError}),
              returnValue: _FakeStreamSubscription_43<List<int>>(
                  this,
                  Invocation.method(
                      #listen, [onData], {#onError: onError, #onDone: onDone, #cancelOnError: cancelOnError})))
          as _i17.StreamSubscription<List<int>>);
  @override
  _i17.Stream<List<int>> where(bool Function(List<int>)? test) =>
      (super.noSuchMethod(Invocation.method(#where, [test]), returnValue: _i17.Stream<List<int>>.empty())
          as _i17.Stream<List<int>>);
  @override
  _i17.Stream<S> map<S>(S Function(List<int>)? convert) =>
      (super.noSuchMethod(Invocation.method(#map, [convert]), returnValue: _i17.Stream<S>.empty()) as _i17.Stream<S>);
  @override
  _i17.Stream<E> asyncMap<E>(_i17.FutureOr<E> Function(List<int>)? convert) =>
      (super.noSuchMethod(Invocation.method(#asyncMap, [convert]), returnValue: _i17.Stream<E>.empty())
          as _i17.Stream<E>);
  @override
  _i17.Stream<E> asyncExpand<E>(_i17.Stream<E>? Function(List<int>)? convert) =>
      (super.noSuchMethod(Invocation.method(#asyncExpand, [convert]), returnValue: _i17.Stream<E>.empty())
          as _i17.Stream<E>);
  @override
  _i17.Stream<List<int>> handleError(Function? onError, {bool Function(dynamic)? test}) =>
      (super.noSuchMethod(Invocation.method(#handleError, [onError], {#test: test}),
          returnValue: _i17.Stream<List<int>>.empty()) as _i17.Stream<List<int>>);
  @override
  _i17.Stream<S> expand<S>(Iterable<S> Function(List<int>)? convert) =>
      (super.noSuchMethod(Invocation.method(#expand, [convert]), returnValue: _i17.Stream<S>.empty())
          as _i17.Stream<S>);
  @override
  _i17.Future<dynamic> pipe(_i17.StreamConsumer<List<int>>? streamConsumer) =>
      (super.noSuchMethod(Invocation.method(#pipe, [streamConsumer]), returnValue: _i17.Future<dynamic>.value())
          as _i17.Future<dynamic>);
  @override
  _i17.Stream<S> transform<S>(_i17.StreamTransformer<List<int>, S>? streamTransformer) =>
      (super.noSuchMethod(Invocation.method(#transform, [streamTransformer]), returnValue: _i17.Stream<S>.empty())
          as _i17.Stream<S>);
  @override
  _i17.Future<List<int>> reduce(List<int> Function(List<int>, List<int>)? combine) =>
      (super.noSuchMethod(Invocation.method(#reduce, [combine]), returnValue: _i17.Future<List<int>>.value(<int>[]))
          as _i17.Future<List<int>>);
  @override
  _i17.Future<S> fold<S>(S? initialValue, S Function(S, List<int>)? combine) =>
      (super.noSuchMethod(Invocation.method(#fold, [initialValue, combine]), returnValue: _i17.Future<S>.value(null))
          as _i17.Future<S>);
  @override
  _i17.Future<String> join([String? separator = r'']) =>
      (super.noSuchMethod(Invocation.method(#join, [separator]), returnValue: _i17.Future<String>.value(''))
          as _i17.Future<String>);
  @override
  _i17.Future<bool> contains(Object? needle) =>
      (super.noSuchMethod(Invocation.method(#contains, [needle]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Future<dynamic> forEach(void Function(List<int>)? action) =>
      (super.noSuchMethod(Invocation.method(#forEach, [action]), returnValue: _i17.Future<dynamic>.value())
          as _i17.Future<dynamic>);
  @override
  _i17.Future<bool> every(bool Function(List<int>)? test) =>
      (super.noSuchMethod(Invocation.method(#every, [test]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Future<bool> any(bool Function(List<int>)? test) =>
      (super.noSuchMethod(Invocation.method(#any, [test]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Stream<R> cast<R>() =>
      (super.noSuchMethod(Invocation.method(#cast, []), returnValue: _i17.Stream<R>.empty()) as _i17.Stream<R>);
  @override
  _i17.Future<List<List<int>>> toList() => (super.noSuchMethod(Invocation.method(#toList, []),
      returnValue: _i17.Future<List<List<int>>>.value(<List<int>>[])) as _i17.Future<List<List<int>>>);
  @override
  _i17.Future<Set<List<int>>> toSet() =>
      (super.noSuchMethod(Invocation.method(#toSet, []), returnValue: _i17.Future<Set<List<int>>>.value(<List<int>>{}))
          as _i17.Future<Set<List<int>>>);
  @override
  _i17.Future<E> drain<E>([E? futureValue]) =>
      (super.noSuchMethod(Invocation.method(#drain, [futureValue]), returnValue: _i17.Future<E>.value(null))
          as _i17.Future<E>);
  @override
  _i17.Stream<List<int>> take(int? count) =>
      (super.noSuchMethod(Invocation.method(#take, [count]), returnValue: _i17.Stream<List<int>>.empty())
          as _i17.Stream<List<int>>);
  @override
  _i17.Stream<List<int>> takeWhile(bool Function(List<int>)? test) =>
      (super.noSuchMethod(Invocation.method(#takeWhile, [test]), returnValue: _i17.Stream<List<int>>.empty())
          as _i17.Stream<List<int>>);
  @override
  _i17.Stream<List<int>> skip(int? count) =>
      (super.noSuchMethod(Invocation.method(#skip, [count]), returnValue: _i17.Stream<List<int>>.empty())
          as _i17.Stream<List<int>>);
  @override
  _i17.Stream<List<int>> skipWhile(bool Function(List<int>)? test) =>
      (super.noSuchMethod(Invocation.method(#skipWhile, [test]), returnValue: _i17.Stream<List<int>>.empty())
          as _i17.Stream<List<int>>);
  @override
  _i17.Stream<List<int>> distinct([bool Function(List<int>, List<int>)? equals]) =>
      (super.noSuchMethod(Invocation.method(#distinct, [equals]), returnValue: _i17.Stream<List<int>>.empty())
          as _i17.Stream<List<int>>);
  @override
  _i17.Future<List<int>> firstWhere(bool Function(List<int>)? test, {List<int> Function()? orElse}) =>
      (super.noSuchMethod(Invocation.method(#firstWhere, [test], {#orElse: orElse}),
          returnValue: _i17.Future<List<int>>.value(<int>[])) as _i17.Future<List<int>>);
  @override
  _i17.Future<List<int>> lastWhere(bool Function(List<int>)? test, {List<int> Function()? orElse}) =>
      (super.noSuchMethod(Invocation.method(#lastWhere, [test], {#orElse: orElse}),
          returnValue: _i17.Future<List<int>>.value(<int>[])) as _i17.Future<List<int>>);
  @override
  _i17.Future<List<int>> singleWhere(bool Function(List<int>)? test, {List<int> Function()? orElse}) =>
      (super.noSuchMethod(Invocation.method(#singleWhere, [test], {#orElse: orElse}),
          returnValue: _i17.Future<List<int>>.value(<int>[])) as _i17.Future<List<int>>);
  @override
  _i17.Future<List<int>> elementAt(int? index) =>
      (super.noSuchMethod(Invocation.method(#elementAt, [index]), returnValue: _i17.Future<List<int>>.value(<int>[]))
          as _i17.Future<List<int>>);
  @override
  _i17.Stream<List<int>> timeout(Duration? timeLimit, {void Function(_i17.EventSink<List<int>>)? onTimeout}) =>
      (super.noSuchMethod(Invocation.method(#timeout, [timeLimit], {#onTimeout: onTimeout}),
          returnValue: _i17.Stream<List<int>>.empty()) as _i17.Stream<List<int>>);
}

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

  @override
  _i17.Future<_i6.JobCancelResponse> cancel(String? projectId, String? jobId, {String? location, String? $fields}) =>
      (super.noSuchMethod(Invocation.method(#cancel, [projectId, jobId], {#location: location, #$fields: $fields}),
              returnValue: _i17.Future<_i6.JobCancelResponse>.value(_FakeJobCancelResponse_44(
                  this, Invocation.method(#cancel, [projectId, jobId], {#location: location, #$fields: $fields}))))
          as _i17.Future<_i6.JobCancelResponse>);
  @override
  _i17.Future<void> delete(String? projectId, String? jobId, {String? location, String? $fields}) =>
      (super.noSuchMethod(Invocation.method(#delete, [projectId, jobId], {#location: location, #$fields: $fields}),
          returnValue: _i17.Future<void>.value(),
          returnValueForMissingStub: _i17.Future<void>.value()) as _i17.Future<void>);
  @override
  _i17.Future<_i6.Job> get(String? projectId, String? jobId, {String? location, String? $fields}) =>
      (super.noSuchMethod(Invocation.method(#get, [projectId, jobId], {#location: location, #$fields: $fields}),
              returnValue: _i17.Future<_i6.Job>.value(_FakeJob_45(
                  this, Invocation.method(#get, [projectId, jobId], {#location: location, #$fields: $fields}))))
          as _i17.Future<_i6.Job>);
  @override
  _i17.Future<_i6.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: _i17.Future<_i6.GetQueryResultsResponse>.value(_FakeGetQueryResultsResponse_46(
              this,
              Invocation.method(#getQueryResults, [
                projectId,
                jobId
              ], {
                #location: location,
                #maxResults: maxResults,
                #pageToken: pageToken,
                #startIndex: startIndex,
                #timeoutMs: timeoutMs,
                #$fields: $fields
              })))) as _i17.Future<_i6.GetQueryResultsResponse>);
  @override
  _i17.Future<_i6.Job> insert(_i6.Job? request, String? projectId,
          {String? $fields,
          _i6.UploadOptions? uploadOptions = _i6.UploadOptions.defaultOptions,
          _i6.Media? uploadMedia}) =>
      (super.noSuchMethod(Invocation.method(#insert, [request, projectId], {#$fields: $fields, #uploadOptions: uploadOptions, #uploadMedia: uploadMedia}),
          returnValue: _i17.Future<_i6.Job>.value(_FakeJob_45(
              this,
              Invocation.method(#insert, [
                request,
                projectId
              ], {
                #$fields: $fields,
                #uploadOptions: uploadOptions,
                #uploadMedia: uploadMedia
              })))) as _i17.Future<_i6.Job>);
  @override
  _i17.Future<_i6.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: _i17.Future<_i6.JobList>.value(_FakeJobList_47(
              this,
              Invocation.method(#list, [
                projectId
              ], {
                #allUsers: allUsers,
                #maxCreationTime: maxCreationTime,
                #maxResults: maxResults,
                #minCreationTime: minCreationTime,
                #pageToken: pageToken,
                #parentJobId: parentJobId,
                #projection: projection,
                #stateFilter: stateFilter,
                #$fields: $fields
              })))) as _i17.Future<_i6.JobList>);
  @override
  _i17.Future<_i6.QueryResponse> query(_i6.QueryRequest? request, String? projectId, {String? $fields}) =>
      (super.noSuchMethod(Invocation.method(#query, [request, projectId], {#$fields: $fields}),
              returnValue: _i17.Future<_i6.QueryResponse>.value(
                  _FakeQueryResponse_48(this, Invocation.method(#query, [request, projectId], {#$fields: $fields}))))
          as _i17.Future<_i6.QueryResponse>);
}

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

  @override
  _i18.BuildBucketClient get buildBucketClient => (super.noSuchMethod(Invocation.getter(#buildBucketClient),
      returnValue: _FakeBuildBucketClient_49(this, Invocation.getter(#buildBucketClient))) as _i18.BuildBucketClient);
  @override
  set buildBucketClient(_i18.BuildBucketClient? _buildBucketClient) =>
      super.noSuchMethod(Invocation.setter(#buildBucketClient, _buildBucketClient), returnValueForMissingStub: null);
  @override
  _i3.Config get config =>
      (super.noSuchMethod(Invocation.getter(#config), returnValue: _FakeConfig_1(this, Invocation.getter(#config)))
          as _i3.Config);
  @override
  set config(_i3.Config? _config) =>
      super.noSuchMethod(Invocation.setter(#config, _config), returnValueForMissingStub: null);
  @override
  _i11.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(Invocation.getter(#githubChecksUtil),
      returnValue: _FakeGithubChecksUtil_17(this, Invocation.getter(#githubChecksUtil))) as _i11.GithubChecksUtil);
  @override
  set githubChecksUtil(_i11.GithubChecksUtil? _githubChecksUtil) =>
      super.noSuchMethod(Invocation.setter(#githubChecksUtil, _githubChecksUtil), returnValueForMissingStub: null);
  @override
  _i7.GerritService get gerritService => (super.noSuchMethod(Invocation.getter(#gerritService),
      returnValue: _FakeGerritService_6(this, Invocation.getter(#gerritService))) as _i7.GerritService);
  @override
  set gerritService(_i7.GerritService? _gerritService) =>
      super.noSuchMethod(Invocation.setter(#gerritService, _gerritService), returnValueForMissingStub: null);
  @override
  _i19.PubSub get pubsub =>
      (super.noSuchMethod(Invocation.getter(#pubsub), returnValue: _FakePubSub_50(this, Invocation.getter(#pubsub)))
          as _i19.PubSub);
  @override
  _i17.Future<List<List<_i9.Request>>> shard(List<_i9.Request>? requests, int? max) =>
      (super.noSuchMethod(Invocation.method(#shard, [requests, max]),
              returnValue: _i17.Future<List<List<_i9.Request>>>.value(<List<_i9.Request>>[]))
          as _i17.Future<List<List<_i9.Request>>>);
  @override
  _i17.Future<Iterable<_i9.Build>> getTryBuilds(_i10.RepositorySlug? slug, String? sha, String? builderName) =>
      (super.noSuchMethod(Invocation.method(#getTryBuilds, [slug, sha, builderName]),
          returnValue: _i17.Future<Iterable<_i9.Build>>.value(<_i9.Build>[])) as _i17.Future<Iterable<_i9.Build>>);
  @override
  _i17.Future<Iterable<_i9.Build>> getProdBuilds(_i10.RepositorySlug? slug, String? commitSha, String? builderName) =>
      (super.noSuchMethod(Invocation.method(#getProdBuilds, [slug, commitSha, builderName]),
          returnValue: _i17.Future<Iterable<_i9.Build>>.value(<_i9.Build>[])) as _i17.Future<Iterable<_i9.Build>>);
  @override
  _i17.Future<Iterable<_i9.Build>> getBuilds(_i10.RepositorySlug? slug, String? commitSha, String? builderName,
          String? bucket, Map<String, List<String>>? tags) =>
      (super.noSuchMethod(Invocation.method(#getBuilds, [slug, commitSha, builderName, bucket, tags]),
          returnValue: _i17.Future<Iterable<_i9.Build>>.value(<_i9.Build>[])) as _i17.Future<Iterable<_i9.Build>>);
  @override
  _i17.Future<Map<String?, _i9.Build?>> tryBuildsForPullRequest(_i10.PullRequest? pullRequest) =>
      (super.noSuchMethod(Invocation.method(#tryBuildsForPullRequest, [pullRequest]),
              returnValue: _i17.Future<Map<String?, _i9.Build?>>.value(<String?, _i9.Build?>{}))
          as _i17.Future<Map<String?, _i9.Build?>>);
  @override
  _i17.Future<List<_i33.Target>> scheduleTryBuilds(
          {List<_i33.Target>? targets, _i10.PullRequest? pullRequest, _i25.CheckSuiteEvent? checkSuiteEvent}) =>
      (super.noSuchMethod(
          Invocation.method(#scheduleTryBuilds, [],
              {#targets: targets, #pullRequest: pullRequest, #checkSuiteEvent: checkSuiteEvent}),
          returnValue: _i17.Future<List<_i33.Target>>.value(<_i33.Target>[])) as _i17.Future<List<_i33.Target>>);
  @override
  _i17.Future<void> cancelBuilds(_i10.PullRequest? pullRequest, String? reason) =>
      (super.noSuchMethod(Invocation.method(#cancelBuilds, [pullRequest, reason]),
          returnValue: _i17.Future<void>.value(),
          returnValueForMissingStub: _i17.Future<void>.value()) as _i17.Future<void>);
  @override
  _i17.Future<List<_i9.Build?>> failedBuilds(_i10.PullRequest? pullRequest, List<_i33.Target>? targets) =>
      (super.noSuchMethod(Invocation.method(#failedBuilds, [pullRequest, targets]),
          returnValue: _i17.Future<List<_i9.Build?>>.value(<_i9.Build?>[])) as _i17.Future<List<_i9.Build?>>);
  @override
  _i17.Future<bool> rescheduleBuild(
          {String? commitSha, String? builderName, _i31.BuildPushMessage? buildPushMessage}) =>
      (super.noSuchMethod(
          Invocation.method(#rescheduleBuild, [],
              {#commitSha: commitSha, #builderName: builderName, #buildPushMessage: buildPushMessage}),
          returnValue: _i17.Future<bool>.value(false)) as _i17.Future<bool>);
  @override
  _i17.Future<bool> rescheduleUsingCheckRunEvent(_i34.CheckRunEvent? checkRunEvent) =>
      (super.noSuchMethod(Invocation.method(#rescheduleUsingCheckRunEvent, [checkRunEvent]),
          returnValue: _i17.Future<bool>.value(false)) as _i17.Future<bool>);
  @override
  _i17.Future<_i9.Build> getTryBuildById(String? id, {String? fields}) => (super.noSuchMethod(
      Invocation.method(#getTryBuildById, [id], {#fields: fields}),
      returnValue: _i17.Future<_i9.Build>.value(
          _FakeBuild_8(this, Invocation.method(#getTryBuildById, [id], {#fields: fields})))) as _i17.Future<_i9.Build>);
  @override
  _i17.Future<Set<String>> getAvailableBuilderSet({String? project = r'flutter', String? bucket = r'prod'}) =>
      (super.noSuchMethod(Invocation.method(#getAvailableBuilderSet, [], {#project: project, #bucket: bucket}),
          returnValue: _i17.Future<Set<String>>.value(<String>{})) as _i17.Future<Set<String>>);
  @override
  _i17.Future<void> schedulePostsubmitBuilds(
          {_i35.Commit? commit, List<_i36.Tuple<_i33.Target, _i37.Task, int>>? toBeScheduled}) =>
      (super.noSuchMethod(
          Invocation.method(#schedulePostsubmitBuilds, [], {#commit: commit, #toBeScheduled: toBeScheduled}),
          returnValue: _i17.Future<void>.value(),
          returnValueForMissingStub: _i17.Future<void>.value()) as _i17.Future<void>);
  @override
  _i17.Future<bool> checkRerunBuilder(
          {_i35.Commit? commit,
          _i33.Target? target,
          _i37.Task? task,
          _i38.DatastoreService? datastore,
          Map<String, List<String>>? tags,
          bool? ignoreChecks = false}) =>
      (super.noSuchMethod(
          Invocation.method(#checkRerunBuilder, [], {
            #commit: commit,
            #target: target,
            #task: task,
            #datastore: datastore,
            #tags: tags,
            #ignoreChecks: ignoreChecks
          }),
          returnValue: _i17.Future<bool>.value(false)) as _i17.Future<bool>);
}

/// A class which mocks [LuciService].
///
/// See the documentation for Mockito's code generation for more information.
// ignore: must_be_immutable
class MockLuciService extends _i1.Mock implements _i39.LuciService {
  MockLuciService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i18.BuildBucketClient get buildBucketClient => (super.noSuchMethod(Invocation.getter(#buildBucketClient),
      returnValue: _FakeBuildBucketClient_49(this, Invocation.getter(#buildBucketClient))) as _i18.BuildBucketClient);
  @override
  _i3.Config get config =>
      (super.noSuchMethod(Invocation.getter(#config), returnValue: _FakeConfig_1(this, Invocation.getter(#config)))
          as _i3.Config);
  @override
  _i20.ClientContext get clientContext => (super.noSuchMethod(Invocation.getter(#clientContext),
      returnValue: _FakeClientContext_51(this, Invocation.getter(#clientContext))) as _i20.ClientContext);
  @override
  _i17.Future<Map<_i39.BranchLuciBuilder, Map<String, List<_i39.LuciTask>>>> getBranchRecentTasks(
          {List<_i39.LuciBuilder>? builders, bool? requireTaskName = false}) =>
      (super.noSuchMethod(
              Invocation.method(#getBranchRecentTasks, [], {#builders: builders, #requireTaskName: requireTaskName}),
              returnValue: _i17.Future<Map<_i39.BranchLuciBuilder, Map<String, List<_i39.LuciTask>>>>.value(
                  <_i39.BranchLuciBuilder, Map<String, List<_i39.LuciTask>>>{}))
          as _i17.Future<Map<_i39.BranchLuciBuilder, Map<String, List<_i39.LuciTask>>>>);
  @override
  List<List<_i39.LuciBuilder>> getPartialBuildersList(List<_i39.LuciBuilder>? builders, int? builderBatchSize) =>
      (super.noSuchMethod(Invocation.method(#getPartialBuildersList, [builders, builderBatchSize]),
          returnValue: <List<_i39.LuciBuilder>>[]) as List<List<_i39.LuciBuilder>>);
  @override
  _i17.Future<List<_i9.Build>> getBuildsForBuilderList(List<_i39.LuciBuilder>? builders,
          {bool? requireTaskName = false}) =>
      (super.noSuchMethod(Invocation.method(#getBuildsForBuilderList, [builders], {#requireTaskName: requireTaskName}),
          returnValue: _i17.Future<List<_i9.Build>>.value(<_i9.Build>[])) as _i17.Future<List<_i9.Build>>);
  @override
  _i17.Future<Map<_i39.LuciBuilder, List<_i39.LuciTask>>> getRecentTasks(
          {List<_i39.LuciBuilder>? builders, bool? requireTaskName = false}) =>
      (super.noSuchMethod(
          Invocation.method(#getRecentTasks, [], {#builders: builders, #requireTaskName: requireTaskName}),
          returnValue: _i17.Future<Map<_i39.LuciBuilder, List<_i39.LuciTask>>>.value(
              <_i39.LuciBuilder, List<_i39.LuciTask>>{})) as _i17.Future<Map<_i39.LuciBuilder, List<_i39.LuciTask>>>);
  @override
  _i17.Future<Iterable<_i9.Build>> getBuilds(bool? requireTaskName, List<_i39.LuciBuilder>? builders) =>
      (super.noSuchMethod(Invocation.method(#getBuilds, [requireTaskName, builders]),
          returnValue: _i17.Future<Iterable<_i9.Build>>.value(<_i9.Build>[])) as _i17.Future<Iterable<_i9.Build>>);
}

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

  @override
  _i17.Future<_i15.Process> start(List<Object>? command,
          {String? workingDirectory,
          Map<String, String>? environment,
          bool? includeParentEnvironment = true,
          bool? runInShell = false,
          _i15.ProcessStartMode? mode = _i15.ProcessStartMode.normal}) =>
      (super.noSuchMethod(
          Invocation.method(#start, [
            command
          ], {
            #workingDirectory: workingDirectory,
            #environment: environment,
            #includeParentEnvironment: includeParentEnvironment,
            #runInShell: runInShell,
            #mode: mode
          }),
          returnValue: _i17.Future<_i15.Process>.value(_FakeProcess_52(
              this,
              Invocation.method(#start, [
                command
              ], {
                #workingDirectory: workingDirectory,
                #environment: environment,
                #includeParentEnvironment: includeParentEnvironment,
                #runInShell: runInShell,
                #mode: mode
              })))) as _i17.Future<_i15.Process>);
  @override
  _i17.Future<_i15.ProcessResult> run(List<Object>? command,
          {String? workingDirectory,
          Map<String, String>? environment,
          bool? includeParentEnvironment = true,
          bool? runInShell = false,
          _i16.Encoding? stdoutEncoding = const _i15.SystemEncoding(),
          _i16.Encoding? stderrEncoding = const _i15.SystemEncoding()}) =>
      (super.noSuchMethod(
          Invocation.method(#run, [
            command
          ], {
            #workingDirectory: workingDirectory,
            #environment: environment,
            #includeParentEnvironment: includeParentEnvironment,
            #runInShell: runInShell,
            #stdoutEncoding: stdoutEncoding,
            #stderrEncoding: stderrEncoding
          }),
          returnValue: _i17.Future<_i15.ProcessResult>.value(_FakeProcessResult_53(
              this,
              Invocation.method(#run, [
                command
              ], {
                #workingDirectory: workingDirectory,
                #environment: environment,
                #includeParentEnvironment: includeParentEnvironment,
                #runInShell: runInShell,
                #stdoutEncoding: stdoutEncoding,
                #stderrEncoding: stderrEncoding
              })))) as _i17.Future<_i15.ProcessResult>);
  @override
  _i15.ProcessResult runSync(List<Object>? command,
          {String? workingDirectory,
          Map<String, String>? environment,
          bool? includeParentEnvironment = true,
          bool? runInShell = false,
          _i16.Encoding? stdoutEncoding = const _i15.SystemEncoding(),
          _i16.Encoding? stderrEncoding = const _i15.SystemEncoding()}) =>
      (super.noSuchMethod(
          Invocation.method(#runSync, [
            command
          ], {
            #workingDirectory: workingDirectory,
            #environment: environment,
            #includeParentEnvironment: includeParentEnvironment,
            #runInShell: runInShell,
            #stdoutEncoding: stdoutEncoding,
            #stderrEncoding: stderrEncoding
          }),
          returnValue: _FakeProcessResult_53(
              this,
              Invocation.method(#runSync, [
                command
              ], {
                #workingDirectory: workingDirectory,
                #environment: environment,
                #includeParentEnvironment: includeParentEnvironment,
                #runInShell: runInShell,
                #stdoutEncoding: stdoutEncoding,
                #stderrEncoding: stderrEncoding
              }))) as _i15.ProcessResult);
  @override
  bool canRun(dynamic executable, {String? workingDirectory}) =>
      (super.noSuchMethod(Invocation.method(#canRun, [executable], {#workingDirectory: workingDirectory}),
          returnValue: false) as bool);
  @override
  bool killPid(int? pid, [_i15.ProcessSignal? signal = _i15.ProcessSignal.sigterm]) =>
      (super.noSuchMethod(Invocation.method(#killPid, [pid, signal]), returnValue: false) as bool);
}

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

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

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

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

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

  @override
  _i17.Future<_i6.TableDataInsertAllResponse> insertAll(
          _i6.TableDataInsertAllRequest? request, String? projectId, String? datasetId, String? tableId,
          {String? $fields}) =>
      (super.noSuchMethod(Invocation.method(#insertAll, [request, projectId, datasetId, tableId], {#$fields: $fields}),
              returnValue: _i17.Future<_i6.TableDataInsertAllResponse>.value(_FakeTableDataInsertAllResponse_77(
                  this, Invocation.method(#insertAll, [request, projectId, datasetId, tableId], {#$fields: $fields}))))
          as _i17.Future<_i6.TableDataInsertAllResponse>);
  @override
  _i17.Future<_i6.TableDataList> list(String? projectId, String? datasetId, String? tableId,
          {int? maxResults, String? pageToken, String? selectedFields, String? startIndex, String? $fields}) =>
      (super.noSuchMethod(
          Invocation.method(#list, [
            projectId,
            datasetId,
            tableId
          ], {
            #maxResults: maxResults,
            #pageToken: pageToken,
            #selectedFields: selectedFields,
            #startIndex: startIndex,
            #$fields: $fields
          }),
          returnValue: _i17.Future<_i6.TableDataList>.value(_FakeTableDataList_78(
              this,
              Invocation.method(#list, [
                projectId,
                datasetId,
                tableId
              ], {
                #maxResults: maxResults,
                #pageToken: pageToken,
                #selectedFields: selectedFields,
                #startIndex: startIndex,
                #$fields: $fields
              })))) as _i17.Future<_i6.TableDataList>);
}

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

  @override
  _i10.GitHub get github =>
      (super.noSuchMethod(Invocation.getter(#github), returnValue: _FakeGitHub_12(this, Invocation.getter(#github)))
          as _i10.GitHub);
  @override
  _i17.Future<_i10.User> getUser(String? name) => (super.noSuchMethod(Invocation.method(#getUser, [name]),
          returnValue: _i17.Future<_i10.User>.value(_FakeUser_79(this, Invocation.method(#getUser, [name]))))
      as _i17.Future<_i10.User>);
  @override
  _i17.Future<_i10.CurrentUser> editCurrentUser(
          {String? name,
          String? email,
          String? blog,
          String? company,
          String? location,
          bool? hireable,
          String? bio}) =>
      (super
          .noSuchMethod(Invocation.method(#editCurrentUser, [], {#name: name, #email: email, #blog: blog, #company: company, #location: location, #hireable: hireable, #bio: bio}),
              returnValue: _i17.Future<_i10.CurrentUser>.value(_FakeCurrentUser_80(
                  this,
                  Invocation.method(#editCurrentUser, [], {
                    #name: name,
                    #email: email,
                    #blog: blog,
                    #company: company,
                    #location: location,
                    #hireable: hireable,
                    #bio: bio
                  })))) as _i17.Future<_i10.CurrentUser>);
  @override
  _i17.Stream<_i10.User> getUsers(List<String>? names, {int? pages}) =>
      (super.noSuchMethod(Invocation.method(#getUsers, [names], {#pages: pages}),
          returnValue: _i17.Stream<_i10.User>.empty()) as _i17.Stream<_i10.User>);
  @override
  _i17.Future<_i10.CurrentUser> getCurrentUser() => (super.noSuchMethod(Invocation.method(#getCurrentUser, []),
          returnValue:
              _i17.Future<_i10.CurrentUser>.value(_FakeCurrentUser_80(this, Invocation.method(#getCurrentUser, []))))
      as _i17.Future<_i10.CurrentUser>);
  @override
  _i17.Future<bool> isUser(String? name) =>
      (super.noSuchMethod(Invocation.method(#isUser, [name]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.User> listUsers({int? pages, int? since}) =>
      (super.noSuchMethod(Invocation.method(#listUsers, [], {#pages: pages, #since: since}),
          returnValue: _i17.Stream<_i10.User>.empty()) as _i17.Stream<_i10.User>);
  @override
  _i17.Stream<_i10.UserEmail> listEmails() =>
      (super.noSuchMethod(Invocation.method(#listEmails, []), returnValue: _i17.Stream<_i10.UserEmail>.empty())
          as _i17.Stream<_i10.UserEmail>);
  @override
  _i17.Stream<_i10.UserEmail> addEmails(List<String>? emails) =>
      (super.noSuchMethod(Invocation.method(#addEmails, [emails]), returnValue: _i17.Stream<_i10.UserEmail>.empty())
          as _i17.Stream<_i10.UserEmail>);
  @override
  _i17.Future<bool> deleteEmails(List<String>? emails) =>
      (super.noSuchMethod(Invocation.method(#deleteEmails, [emails]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.User> listUserFollowers(String? user) =>
      (super.noSuchMethod(Invocation.method(#listUserFollowers, [user]), returnValue: _i17.Stream<_i10.User>.empty())
          as _i17.Stream<_i10.User>);
  @override
  _i17.Future<bool> isFollowingUser(String? user) =>
      (super.noSuchMethod(Invocation.method(#isFollowingUser, [user]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Future<bool> isUserFollowing(String? user, String? target) =>
      (super.noSuchMethod(Invocation.method(#isUserFollowing, [user, target]),
          returnValue: _i17.Future<bool>.value(false)) as _i17.Future<bool>);
  @override
  _i17.Future<bool> followUser(String? user) =>
      (super.noSuchMethod(Invocation.method(#followUser, [user]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Future<bool> unfollowUser(String? user) =>
      (super.noSuchMethod(Invocation.method(#unfollowUser, [user]), returnValue: _i17.Future<bool>.value(false))
          as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.User> listCurrentUserFollowers() =>
      (super.noSuchMethod(Invocation.method(#listCurrentUserFollowers, []), returnValue: _i17.Stream<_i10.User>.empty())
          as _i17.Stream<_i10.User>);
  @override
  _i17.Stream<_i10.User> listCurrentUserFollowing() =>
      (super.noSuchMethod(Invocation.method(#listCurrentUserFollowing, []), returnValue: _i17.Stream<_i10.User>.empty())
          as _i17.Stream<_i10.User>);
  @override
  _i17.Stream<_i10.PublicKey> listPublicKeys([String? userLogin]) =>
      (super.noSuchMethod(Invocation.method(#listPublicKeys, [userLogin]),
          returnValue: _i17.Stream<_i10.PublicKey>.empty()) as _i17.Stream<_i10.PublicKey>);
  @override
  _i17.Future<_i10.PublicKey> createPublicKey(_i10.CreatePublicKey? key) => (super.noSuchMethod(
          Invocation.method(#createPublicKey, [key]),
          returnValue:
              _i17.Future<_i10.PublicKey>.value(_FakePublicKey_68(this, Invocation.method(#createPublicKey, [key]))))
      as _i17.Future<_i10.PublicKey>);
}

/// A class which mocks [Cache].
///
/// See the documentation for Mockito's code generation for more information.
class MockCache extends _i1.Mock implements _i21.Cache<_i28.Uint8List> {
  MockCache() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i21.Entry<_i28.Uint8List> operator [](String? key) => (super.noSuchMethod(Invocation.method(#[], [key]),
      returnValue: _FakeEntry_81<_i28.Uint8List>(this, Invocation.method(#[], [key]))) as _i21.Entry<_i28.Uint8List>);
  @override
  _i21.Cache<_i28.Uint8List> withPrefix(String? prefix) => (super.noSuchMethod(Invocation.method(#withPrefix, [prefix]),
          returnValue: _FakeCache_82<_i28.Uint8List>(this, Invocation.method(#withPrefix, [prefix])))
      as _i21.Cache<_i28.Uint8List>);
  @override
  _i21.Cache<S> withCodec<S>(_i16.Codec<S, _i28.Uint8List>? codec) =>
      (super.noSuchMethod(Invocation.method(#withCodec, [codec]),
          returnValue: _FakeCache_82<S>(this, Invocation.method(#withCodec, [codec]))) as _i21.Cache<S>);
  @override
  _i21.Cache<_i28.Uint8List> withTTL(Duration? ttl) => (super.noSuchMethod(Invocation.method(#withTTL, [ttl]),
          returnValue: _FakeCache_82<_i28.Uint8List>(this, Invocation.method(#withTTL, [ttl])))
      as _i21.Cache<_i28.Uint8List>);
}

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

  @override
  set auth(_i10.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
  _i10.ActivityService get activity => (super.noSuchMethod(Invocation.getter(#activity),
      returnValue: _FakeActivityService_83(this, Invocation.getter(#activity))) as _i10.ActivityService);
  @override
  _i10.AuthorizationsService get authorizations => (super.noSuchMethod(Invocation.getter(#authorizations),
          returnValue: _FakeAuthorizationsService_84(this, Invocation.getter(#authorizations)))
      as _i10.AuthorizationsService);
  @override
  _i10.GistsService get gists =>
      (super.noSuchMethod(Invocation.getter(#gists), returnValue: _FakeGistsService_85(this, Invocation.getter(#gists)))
          as _i10.GistsService);
  @override
  _i10.GitService get git =>
      (super.noSuchMethod(Invocation.getter(#git), returnValue: _FakeGitService_86(this, Invocation.getter(#git)))
          as _i10.GitService);
  @override
  _i10.IssuesService get issues => (super.noSuchMethod(Invocation.getter(#issues),
      returnValue: _FakeIssuesService_87(this, Invocation.getter(#issues))) as _i10.IssuesService);
  @override
  _i10.MiscService get misc =>
      (super.noSuchMethod(Invocation.getter(#misc), returnValue: _FakeMiscService_88(this, Invocation.getter(#misc)))
          as _i10.MiscService);
  @override
  _i10.OrganizationsService get organizations => (super.noSuchMethod(Invocation.getter(#organizations),
      returnValue: _FakeOrganizationsService_89(this, Invocation.getter(#organizations))) as _i10.OrganizationsService);
  @override
  _i10.PullRequestsService get pullRequests => (super.noSuchMethod(Invocation.getter(#pullRequests),
      returnValue: _FakePullRequestsService_90(this, Invocation.getter(#pullRequests))) as _i10.PullRequestsService);
  @override
  _i10.RepositoriesService get repositories => (super.noSuchMethod(Invocation.getter(#repositories),
      returnValue: _FakeRepositoriesService_91(this, Invocation.getter(#repositories))) as _i10.RepositoriesService);
  @override
  _i10.SearchService get search => (super.noSuchMethod(Invocation.getter(#search),
      returnValue: _FakeSearchService_92(this, Invocation.getter(#search))) as _i10.SearchService);
  @override
  _i10.UrlShortenerService get urlShortener => (super.noSuchMethod(Invocation.getter(#urlShortener),
      returnValue: _FakeUrlShortenerService_93(this, Invocation.getter(#urlShortener))) as _i10.UrlShortenerService);
  @override
  _i10.UsersService get users =>
      (super.noSuchMethod(Invocation.getter(#users), returnValue: _FakeUsersService_94(this, Invocation.getter(#users)))
          as _i10.UsersService);
  @override
  _i10.ChecksService get checks => (super.noSuchMethod(Invocation.getter(#checks),
      returnValue: _FakeChecksService_95(this, Invocation.getter(#checks))) as _i10.ChecksService);
  @override
  _i17.Future<T> getJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i2.Response)? fail,
          Map<String, String>? headers,
          Map<String, String>? params,
          _i10.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: _i17.Future<T>.value(null)) as _i17.Future<T>);
  @override
  _i17.Future<T> postJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i2.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i10.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: _i41.postJsonShim<S, T>(path,
              statusCode: statusCode,
              fail: fail,
              headers: headers,
              params: params,
              convert: convert,
              body: body,
              preview: preview)) as _i17.Future<T>);
  @override
  _i17.Future<T> putJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i2.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i10.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: _i17.Future<T>.value(null)) as _i17.Future<T>);
  @override
  _i17.Future<T> patchJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i2.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i10.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: _i17.Future<T>.value(null)) as _i17.Future<T>);
  @override
  _i17.Future<T> requestJson<S, T>(String? method, String? path,
          {int? statusCode,
          void Function(_i2.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i10.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: _i17.Future<T>.value(null)) as _i17.Future<T>);
  @override
  _i17.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: _i17.Future<_i2.Response>.value(_FakeResponse_96(
              this,
              Invocation.method(#request, [
                method,
                path
              ], {
                #headers: headers,
                #params: params,
                #body: body,
                #statusCode: statusCode,
                #fail: fail,
                #preview: preview
              })))) as _i17.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);
}
