// Mocks generated by Mockito 5.3.2 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 _i27;

import 'package:cocoon_service/src/foundation/github_checks_util.dart' as _i11;
import 'package:cocoon_service/src/foundation/utils.dart' as _i35;
import 'package:cocoon_service/src/model/appengine/commit.dart' as _i34;
import 'package:cocoon_service/src/model/appengine/task.dart' as _i36;
import 'package:cocoon_service/src/model/ci_yaml/target.dart' as _i32;
import 'package:cocoon_service/src/model/github/checks.dart' as _i33;
import 'package:cocoon_service/src/model/luci/buildbucket.dart' as _i9;
import 'package:cocoon_service/src/model/luci/push_message.dart' as _i30;
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 _i21;
import 'package:cocoon_service/src/service/bigquery.dart' as _i22;
import 'package:cocoon_service/src/service/branch_service.dart' as _i23;
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 _i37;
import 'package:cocoon_service/src/service/gerrit_service.dart' as _i7;
import 'package:cocoon_service/src/service/github_checks_service.dart' as _i28;
import 'package:cocoon_service/src/service/github_service.dart' as _i25;
import 'package:cocoon_service/src/service/luci_build_service.dart' as _i31;
import 'package:cocoon_service/src/service/scheduler.dart' as _i29;
import 'package:github/github.dart' as _i10;
import 'package:github/hooks.dart' as _i24;
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 _i20;
import 'package:process/src/interface/process_manager.dart' as _i38;
import 'package:retry/retry.dart' as _i8;

import '../../service/cache_service_test.dart' as _i26;
import 'mocks.dart' as _i39;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class _FakeResponse_95 extends _i1.SmartFake implements _i2.Response {
  _FakeResponse_95(
    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 _i21.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 _i22.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<_i22.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<_i22.BuilderStatistic>>.value(<_i22.BuilderStatistic>[]),
      ) as _i17.Future<List<_i22.BuilderStatistic>>);
  @override
  _i17.Future<List<_i22.BuilderRecord>> listRecentBuildRecordsForBuilder(
    String? projectId, {
    String? builder,
    int? limit,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listRecentBuildRecordsForBuilder,
          [projectId],
          {
            #builder: builder,
            #limit: limit,
          },
        ),
        returnValue: _i17.Future<List<_i22.BuilderRecord>>.value(<_i22.BuilderRecord>[]),
      ) as _i17.Future<List<_i22.BuilderRecord>>);
}

/// A class which mocks [BranchService].
///
/// See the documentation for Mockito's code generation for more information.
class MockBranchService extends _i1.Mock implements _i23.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(_i24.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({
    required _i25.GithubService? githubService,
    required _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 _i26.FakeEntry {
  MockFakeEntry() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i27.Uint8List get value => (super.noSuchMethod(
        Invocation.getter(#value),
        returnValue: _i27.Uint8List(0),
      ) as _i27.Uint8List);
  @override
  set value(_i27.Uint8List? _value) => super.noSuchMethod(
        Invocation.setter(
          #value,
          _value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i17.Future<_i27.Uint8List> get([
    _i17.Future<_i27.Uint8List?> Function()? create,
    Duration? ttl,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            create,
            ttl,
          ],
        ),
        returnValue: _i17.Future<_i27.Uint8List>.value(_i27.Uint8List(0)),
      ) as _i17.Future<_i27.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<_i27.Uint8List?> set(
    _i27.Uint8List? value, [
    Duration? ttl,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #set,
          [
            value,
            ttl,
          ],
        ),
        returnValue: _i17.Future<_i27.Uint8List?>.value(),
      ) as _i17.Future<_i27.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 _i28.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,
    _i24.CheckSuiteEvent? checkSuiteEvent,
    _i29.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(
    _i30.BuildPushMessage? buildPushMessage,
    _i31.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(_i30.Result? result) => (super.noSuchMethod(
        Invocation.method(
          #conclusionForResult,
          [result],
        ),
        returnValue: _FakeCheckRunConclusion_18(
          this,
          Invocation.method(
            #conclusionForResult,
            [result],
          ),
        ),
      ) as _i10.CheckRunConclusion);
  @override
  _i10.CheckRunStatus statusForResult(_i30.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,
    _i24.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 _i25.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, {
    required String? title,
    String? body,
    String? commitMessage,
    required _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, {
    required int? issueNumber,
  }) =>
      (super.noSuchMethod(Invocation.method(
        #getIssue,
        [slug],
        {#issueNumber: issueNumber},
      )) as _i17.Future<_i10.Issue>?);
  @override
  _i17.Future<void> assignIssue(
    _i10.RepositorySlug? slug, {
    required int? issueNumber,
    required 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, {
    required int? issueNumber,
    required 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, {
    required int? issueNumber,
    required 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, {
    required _i12.QueryOptions<TParsed>? originalOptions,
    required _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, {
    required 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,
    required 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 _i31.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<_i32.Target>> scheduleTryBuilds({
    required List<_i32.Target>? targets,
    required _i10.PullRequest? pullRequest,
    _i24.CheckSuiteEvent? checkSuiteEvent,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #scheduleTryBuilds,
          [],
          {
            #targets: targets,
            #pullRequest: pullRequest,
            #checkSuiteEvent: checkSuiteEvent,
          },
        ),
        returnValue: _i17.Future<List<_i32.Target>>.value(<_i32.Target>[]),
      ) as _i17.Future<List<_i32.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<_i32.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({
    required String? commitSha,
    required String? builderName,
    required _i30.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(_i33.CheckRunEvent? checkRunEvent) => (super.noSuchMethod(
        Invocation.method(
          #rescheduleUsingCheckRunEvent,
          [checkRunEvent],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<_i9.Build> getBuildById(
    String? id, {
    String? fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBuildById,
          [id],
          {#fields: fields},
        ),
        returnValue: _i17.Future<_i9.Build>.value(_FakeBuild_8(
          this,
          Invocation.method(
            #getBuildById,
            [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({
    required _i34.Commit? commit,
    required List<_i35.Tuple<_i32.Target, _i36.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<void> createPostsubmitCheckRun(
    _i34.Commit? commit,
    _i32.Target? target,
    Map<String, dynamic>? rawUserData,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createPostsubmitCheckRun,
          [
            commit,
            target,
            rawUserData,
          ],
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<bool> checkRerunBuilder({
    required _i34.Commit? commit,
    required _i32.Target? target,
    required _i36.Task? task,
    required _i37.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 [ProcessManager].
///
/// See the documentation for Mockito's code generation for more information.
class MockProcessManager extends _i1.Mock implements _i38.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_51(
          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_52(
          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_52(
          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_53(
          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_54(
          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_55(
          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_56(
          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_57(
          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_56(
          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_56(
          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_58(
          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_59(
          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, {
    required String? body,
    String? path,
    int? position,
    int? line,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createCommitComment,
          [
            slug,
            commit,
          ],
          {
            #body: body,
            #path: path,
            #position: position,
            #line: line,
          },
        ),
        returnValue: _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
          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, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommitComment,
          [slug],
          {#id: id},
        ),
        returnValue: _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
          this,
          Invocation.method(
            #getCommitComment,
            [slug],
            {#id: id},
          ),
        )),
      ) as _i17.Future<_i10.CommitComment>);
  @override
  _i17.Future<_i10.CommitComment> updateCommitComment(
    _i10.RepositorySlug? slug, {
    required int? id,
    required String? body,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateCommitComment,
          [slug],
          {
            #id: id,
            #body: body,
          },
        ),
        returnValue: _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
          this,
          Invocation.method(
            #updateCommitComment,
            [slug],
            {
              #id: id,
              #body: body,
            },
          ),
        )),
      ) as _i17.Future<_i10.CommitComment>);
  @override
  _i17.Future<bool> deleteCommitComment(
    _i10.RepositorySlug? slug, {
    required 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_61(
          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_62(
          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_63(
          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_64(
          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_65(
          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_65(
          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_65(
          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_56(
          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_66(
          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_66(
          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_66(
          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, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getDeployKey,
          [slug],
          {#id: id},
        ),
        returnValue: _i17.Future<_i10.PublicKey>.value(_FakePublicKey_67(
          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_67(
          this,
          Invocation.method(
            #createDeployKey,
            [
              slug,
              key,
            ],
          ),
        )),
      ) as _i17.Future<_i10.PublicKey>);
  @override
  _i17.Future<bool> deleteDeployKey({
    required _i10.RepositorySlug? slug,
    required _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_61(
          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_68(
          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_69(
          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_70(
          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_70(
          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_70(
          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_70(
          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_70(
          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, {
    required int? assetId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseAsset,
          [
            slug,
            release,
          ],
          {#assetId: assetId},
        ),
        returnValue: _i17.Future<_i10.ReleaseAsset>.value(_FakeReleaseAsset_71(
          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_71(
          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_72(
          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_73(
          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_74(
          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_75(
          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_76(
          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_77(
          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_78(
          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_79(
          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_79(
          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_67(
          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 _i20.Cache<_i27.Uint8List> {
  MockCache() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i20.Entry<_i27.Uint8List> operator [](String? key) => (super.noSuchMethod(
        Invocation.method(
          #[],
          [key],
        ),
        returnValue: _FakeEntry_80<_i27.Uint8List>(
          this,
          Invocation.method(
            #[],
            [key],
          ),
        ),
      ) as _i20.Entry<_i27.Uint8List>);
  @override
  _i20.Cache<_i27.Uint8List> withPrefix(String? prefix) => (super.noSuchMethod(
        Invocation.method(
          #withPrefix,
          [prefix],
        ),
        returnValue: _FakeCache_81<_i27.Uint8List>(
          this,
          Invocation.method(
            #withPrefix,
            [prefix],
          ),
        ),
      ) as _i20.Cache<_i27.Uint8List>);
  @override
  _i20.Cache<S> withCodec<S>(_i16.Codec<S, _i27.Uint8List>? codec) => (super.noSuchMethod(
        Invocation.method(
          #withCodec,
          [codec],
        ),
        returnValue: _FakeCache_81<S>(
          this,
          Invocation.method(
            #withCodec,
            [codec],
          ),
        ),
      ) as _i20.Cache<S>);
  @override
  _i20.Cache<_i27.Uint8List> withTTL(Duration? ttl) => (super.noSuchMethod(
        Invocation.method(
          #withTTL,
          [ttl],
        ),
        returnValue: _FakeCache_81<_i27.Uint8List>(
          this,
          Invocation.method(
            #withTTL,
            [ttl],
          ),
        ),
      ) as _i20.Cache<_i27.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_82(
          this,
          Invocation.getter(#activity),
        ),
      ) as _i10.ActivityService);
  @override
  _i10.AuthorizationsService get authorizations => (super.noSuchMethod(
        Invocation.getter(#authorizations),
        returnValue: _FakeAuthorizationsService_83(
          this,
          Invocation.getter(#authorizations),
        ),
      ) as _i10.AuthorizationsService);
  @override
  _i10.GistsService get gists => (super.noSuchMethod(
        Invocation.getter(#gists),
        returnValue: _FakeGistsService_84(
          this,
          Invocation.getter(#gists),
        ),
      ) as _i10.GistsService);
  @override
  _i10.GitService get git => (super.noSuchMethod(
        Invocation.getter(#git),
        returnValue: _FakeGitService_85(
          this,
          Invocation.getter(#git),
        ),
      ) as _i10.GitService);
  @override
  _i10.IssuesService get issues => (super.noSuchMethod(
        Invocation.getter(#issues),
        returnValue: _FakeIssuesService_86(
          this,
          Invocation.getter(#issues),
        ),
      ) as _i10.IssuesService);
  @override
  _i10.MiscService get misc => (super.noSuchMethod(
        Invocation.getter(#misc),
        returnValue: _FakeMiscService_87(
          this,
          Invocation.getter(#misc),
        ),
      ) as _i10.MiscService);
  @override
  _i10.OrganizationsService get organizations => (super.noSuchMethod(
        Invocation.getter(#organizations),
        returnValue: _FakeOrganizationsService_88(
          this,
          Invocation.getter(#organizations),
        ),
      ) as _i10.OrganizationsService);
  @override
  _i10.PullRequestsService get pullRequests => (super.noSuchMethod(
        Invocation.getter(#pullRequests),
        returnValue: _FakePullRequestsService_89(
          this,
          Invocation.getter(#pullRequests),
        ),
      ) as _i10.PullRequestsService);
  @override
  _i10.RepositoriesService get repositories => (super.noSuchMethod(
        Invocation.getter(#repositories),
        returnValue: _FakeRepositoriesService_90(
          this,
          Invocation.getter(#repositories),
        ),
      ) as _i10.RepositoriesService);
  @override
  _i10.SearchService get search => (super.noSuchMethod(
        Invocation.getter(#search),
        returnValue: _FakeSearchService_91(
          this,
          Invocation.getter(#search),
        ),
      ) as _i10.SearchService);
  @override
  _i10.UrlShortenerService get urlShortener => (super.noSuchMethod(
        Invocation.getter(#urlShortener),
        returnValue: _FakeUrlShortenerService_92(
          this,
          Invocation.getter(#urlShortener),
        ),
      ) as _i10.UrlShortenerService);
  @override
  _i10.UsersService get users => (super.noSuchMethod(
        Invocation.getter(#users),
        returnValue: _FakeUsersService_93(
          this,
          Invocation.getter(#users),
        ),
      ) as _i10.UsersService);
  @override
  _i10.ChecksService get checks => (super.noSuchMethod(
        Invocation.getter(#checks),
        returnValue: _FakeChecksService_94(
          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: _i39.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_95(
          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,
      );
}
