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

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i6;
import 'dart:typed_data' as _i7;

import 'package:auto_submit/service/approver_service.dart' as _i5;
import 'package:auto_submit/service/config.dart' as _i2;
import 'package:github/github.dart' as _i4;
import 'package:http/http.dart' as _i3;
import 'package:mockito/mockito.dart' as _i1;

// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class

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

class _FakeClient_1 extends _i1.SmartFake implements _i3.Client {
  _FakeClient_1(Object parent, Invocation parentInvocation) : super(parent, parentInvocation);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  @override
  _i2.Config get config =>
      (super.noSuchMethod(Invocation.getter(#config), returnValue: _FakeConfig_0(this, Invocation.getter(#config)))
          as _i2.Config);
  @override
  _i6.Future<void> approve(_i4.PullRequest? pullRequest) =>
      (super.noSuchMethod(Invocation.method(#approve, [pullRequest]),
          returnValue: _i6.Future<void>.value(),
          returnValueForMissingStub: _i6.Future<void>.value()) as _i6.Future<void>);
}

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

  @override
  set auth(_i4.Authentication? _auth) =>
      super.noSuchMethod(Invocation.setter(#auth, _auth), returnValueForMissingStub: null);
  @override
  String get endpoint => (super.noSuchMethod(Invocation.getter(#endpoint), returnValue: '') as String);
  @override
  _i3.Client get client =>
      (super.noSuchMethod(Invocation.getter(#client), returnValue: _FakeClient_1(this, Invocation.getter(#client)))
          as _i3.Client);
  @override
  _i4.ActivityService get activity => (super.noSuchMethod(Invocation.getter(#activity),
      returnValue: _FakeActivityService_2(this, Invocation.getter(#activity))) as _i4.ActivityService);
  @override
  _i4.AuthorizationsService get authorizations => (super.noSuchMethod(Invocation.getter(#authorizations),
          returnValue: _FakeAuthorizationsService_3(this, Invocation.getter(#authorizations)))
      as _i4.AuthorizationsService);
  @override
  _i4.GistsService get gists =>
      (super.noSuchMethod(Invocation.getter(#gists), returnValue: _FakeGistsService_4(this, Invocation.getter(#gists)))
          as _i4.GistsService);
  @override
  _i4.GitService get git =>
      (super.noSuchMethod(Invocation.getter(#git), returnValue: _FakeGitService_5(this, Invocation.getter(#git)))
          as _i4.GitService);
  @override
  _i4.IssuesService get issues => (super.noSuchMethod(Invocation.getter(#issues),
      returnValue: _FakeIssuesService_6(this, Invocation.getter(#issues))) as _i4.IssuesService);
  @override
  _i4.MiscService get misc =>
      (super.noSuchMethod(Invocation.getter(#misc), returnValue: _FakeMiscService_7(this, Invocation.getter(#misc)))
          as _i4.MiscService);
  @override
  _i4.OrganizationsService get organizations => (super.noSuchMethod(Invocation.getter(#organizations),
      returnValue: _FakeOrganizationsService_8(this, Invocation.getter(#organizations))) as _i4.OrganizationsService);
  @override
  _i4.PullRequestsService get pullRequests => (super.noSuchMethod(Invocation.getter(#pullRequests),
      returnValue: _FakePullRequestsService_9(this, Invocation.getter(#pullRequests))) as _i4.PullRequestsService);
  @override
  _i4.RepositoriesService get repositories => (super.noSuchMethod(Invocation.getter(#repositories),
      returnValue: _FakeRepositoriesService_10(this, Invocation.getter(#repositories))) as _i4.RepositoriesService);
  @override
  _i4.SearchService get search => (super.noSuchMethod(Invocation.getter(#search),
      returnValue: _FakeSearchService_11(this, Invocation.getter(#search))) as _i4.SearchService);
  @override
  _i4.UrlShortenerService get urlShortener => (super.noSuchMethod(Invocation.getter(#urlShortener),
      returnValue: _FakeUrlShortenerService_12(this, Invocation.getter(#urlShortener))) as _i4.UrlShortenerService);
  @override
  _i4.UsersService get users =>
      (super.noSuchMethod(Invocation.getter(#users), returnValue: _FakeUsersService_13(this, Invocation.getter(#users)))
          as _i4.UsersService);
  @override
  _i4.ChecksService get checks => (super.noSuchMethod(Invocation.getter(#checks),
      returnValue: _FakeChecksService_14(this, Invocation.getter(#checks))) as _i4.ChecksService);
  @override
  _i6.Future<T> getJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i3.Response)? fail,
          Map<String, String>? headers,
          Map<String, String>? params,
          _i4.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: _i6.Future<T>.value(null)) as _i6.Future<T>);
  @override
  _i6.Future<T> postJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i3.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i4.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: _i6.Future<T>.value(null)) as _i6.Future<T>);
  @override
  _i6.Future<T> putJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i3.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i4.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: _i6.Future<T>.value(null)) as _i6.Future<T>);
  @override
  _i6.Future<T> patchJSON<S, T>(String? path,
          {int? statusCode,
          void Function(_i3.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i4.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: _i6.Future<T>.value(null)) as _i6.Future<T>);
  @override
  _i6.Future<T> requestJson<S, T>(String? method, String? path,
          {int? statusCode,
          void Function(_i3.Response)? fail,
          Map<String, String>? headers,
          Map<String, dynamic>? params,
          _i4.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: _i6.Future<T>.value(null)) as _i6.Future<T>);
  @override
  _i6.Future<_i3.Response> request(String? method, String? path,
          {Map<String, String>? headers,
          Map<String, dynamic>? params,
          dynamic body,
          int? statusCode,
          void Function(_i3.Response)? fail,
          String? preview}) =>
      (super.noSuchMethod(Invocation.method(#request, [method, path], {#headers: headers, #params: params, #body: body, #statusCode: statusCode, #fail: fail, #preview: preview}),
          returnValue: _i6.Future<_i3.Response>.value(_FakeResponse_15(
              this,
              Invocation.method(#request, [
                method,
                path
              ], {
                #headers: headers,
                #params: params,
                #body: body,
                #statusCode: statusCode,
                #fail: fail,
                #preview: preview
              })))) as _i6.Future<_i3.Response>);
  @override
  void handleStatusCode(_i3.Response? response) =>
      super.noSuchMethod(Invocation.method(#handleStatusCode, [response]), returnValueForMissingStub: null);
  @override
  void dispose() => super.noSuchMethod(Invocation.method(#dispose, []), returnValueForMissingStub: null);
}

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

  @override
  _i4.GitHub get github =>
      (super.noSuchMethod(Invocation.getter(#github), returnValue: _FakeGitHub_16(this, Invocation.getter(#github)))
          as _i4.GitHub);
  @override
  _i6.Stream<_i4.PullRequest> list(_i4.RepositorySlug? slug,
          {int? pages,
          String? base,
          String? direction = r'desc',
          String? head,
          String? sort = r'created',
          String? state = r'open'}) =>
      (super.noSuchMethod(
          Invocation.method(#list, [slug],
              {#pages: pages, #base: base, #direction: direction, #head: head, #sort: sort, #state: state}),
          returnValue: _i6.Stream<_i4.PullRequest>.empty()) as _i6.Stream<_i4.PullRequest>);
  @override
  _i6.Future<_i4.PullRequest> get(_i4.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#get, [slug, number]),
              returnValue:
                  _i6.Future<_i4.PullRequest>.value(_FakePullRequest_17(this, Invocation.method(#get, [slug, number]))))
          as _i6.Future<_i4.PullRequest>);
  @override
  _i6.Future<_i4.PullRequest> create(_i4.RepositorySlug? slug, _i4.CreatePullRequest? request) => (super.noSuchMethod(
          Invocation.method(#create, [slug, request]),
          returnValue:
              _i6.Future<_i4.PullRequest>.value(_FakePullRequest_17(this, Invocation.method(#create, [slug, request]))))
      as _i6.Future<_i4.PullRequest>);
  @override
  _i6.Future<_i4.PullRequest> edit(_i4.RepositorySlug? slug, int? number,
          {String? title, String? body, String? state, String? base}) =>
      (super.noSuchMethod(
              Invocation.method(#edit, [slug, number], {#title: title, #body: body, #state: state, #base: base}),
              returnValue: _i6.Future<_i4.PullRequest>.value(_FakePullRequest_17(this,
                  Invocation.method(#edit, [slug, number], {#title: title, #body: body, #state: state, #base: base}))))
          as _i6.Future<_i4.PullRequest>);
  @override
  _i6.Stream<_i4.RepositoryCommit> listCommits(_i4.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#listCommits, [slug, number]),
          returnValue: _i6.Stream<_i4.RepositoryCommit>.empty()) as _i6.Stream<_i4.RepositoryCommit>);
  @override
  _i6.Stream<_i4.PullRequestFile> listFiles(_i4.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#listFiles, [slug, number]),
          returnValue: _i6.Stream<_i4.PullRequestFile>.empty()) as _i6.Stream<_i4.PullRequestFile>);
  @override
  _i6.Stream<_i4.PullRequestReview> listReviews(_i4.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#listReviews, [slug, number]),
          returnValue: _i6.Stream<_i4.PullRequestReview>.empty()) as _i6.Stream<_i4.PullRequestReview>);
  @override
  _i6.Future<bool> isMerged(_i4.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#isMerged, [slug, number]), returnValue: _i6.Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Future<_i4.PullRequestMerge> merge(_i4.RepositorySlug? slug, int? number, {String? message}) =>
      (super.noSuchMethod(Invocation.method(#merge, [slug, number], {#message: message}),
              returnValue: _i6.Future<_i4.PullRequestMerge>.value(
                  _FakePullRequestMerge_18(this, Invocation.method(#merge, [slug, number], {#message: message}))))
          as _i6.Future<_i4.PullRequestMerge>);
  @override
  _i6.Stream<_i4.PullRequestComment> listCommentsByPullRequest(_i4.RepositorySlug? slug, int? number) =>
      (super.noSuchMethod(Invocation.method(#listCommentsByPullRequest, [slug, number]),
          returnValue: _i6.Stream<_i4.PullRequestComment>.empty()) as _i6.Stream<_i4.PullRequestComment>);
  @override
  _i6.Stream<_i4.PullRequestComment> listComments(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listComments, [slug]),
          returnValue: _i6.Stream<_i4.PullRequestComment>.empty()) as _i6.Stream<_i4.PullRequestComment>);
  @override
  _i6.Future<_i4.PullRequestComment> createComment(
          _i4.RepositorySlug? slug, int? number, _i4.CreatePullRequestComment? comment) =>
      (super.noSuchMethod(Invocation.method(#createComment, [slug, number, comment]),
              returnValue: _i6.Future<_i4.PullRequestComment>.value(
                  _FakePullRequestComment_19(this, Invocation.method(#createComment, [slug, number, comment]))))
          as _i6.Future<_i4.PullRequestComment>);
  @override
  _i6.Future<_i4.PullRequestReview> createReview(_i4.RepositorySlug? slug, _i4.CreatePullRequestReview? review) =>
      (super.noSuchMethod(Invocation.method(#createReview, [slug, review]),
              returnValue: _i6.Future<_i4.PullRequestReview>.value(
                  _FakePullRequestReview_20(this, Invocation.method(#createReview, [slug, review]))))
          as _i6.Future<_i4.PullRequestReview>);
}

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

  @override
  _i4.GitHub get github =>
      (super.noSuchMethod(Invocation.getter(#github), returnValue: _FakeGitHub_16(this, Invocation.getter(#github)))
          as _i4.GitHub);
  @override
  _i6.Stream<_i4.Repository> listRepositories(
          {String? type = r'owner', String? sort = r'full_name', String? direction = r'asc'}) =>
      (super.noSuchMethod(Invocation.method(#listRepositories, [], {#type: type, #sort: sort, #direction: direction}),
          returnValue: _i6.Stream<_i4.Repository>.empty()) as _i6.Stream<_i4.Repository>);
  @override
  _i6.Stream<_i4.Repository> listUserRepositories(String? user,
          {String? type = r'owner', String? sort = r'full_name', String? direction = r'asc'}) =>
      (super.noSuchMethod(
          Invocation.method(#listUserRepositories, [user], {#type: type, #sort: sort, #direction: direction}),
          returnValue: _i6.Stream<_i4.Repository>.empty()) as _i6.Stream<_i4.Repository>);
  @override
  _i6.Stream<_i4.Repository> listOrganizationRepositories(String? org, {String? type = r'all'}) =>
      (super.noSuchMethod(Invocation.method(#listOrganizationRepositories, [org], {#type: type}),
          returnValue: _i6.Stream<_i4.Repository>.empty()) as _i6.Stream<_i4.Repository>);
  @override
  _i6.Stream<_i4.Repository> listPublicRepositories({int? limit = 50, DateTime? since}) =>
      (super.noSuchMethod(Invocation.method(#listPublicRepositories, [], {#limit: limit, #since: since}),
          returnValue: _i6.Stream<_i4.Repository>.empty()) as _i6.Stream<_i4.Repository>);
  @override
  _i6.Future<_i4.Repository> createRepository(_i4.CreateRepository? repository, {String? org}) =>
      (super.noSuchMethod(Invocation.method(#createRepository, [repository], {#org: org}),
              returnValue: _i6.Future<_i4.Repository>.value(
                  _FakeRepository_21(this, Invocation.method(#createRepository, [repository], {#org: org}))))
          as _i6.Future<_i4.Repository>);
  @override
  _i6.Future<_i4.LicenseDetails> getLicense(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#getLicense, [slug]),
          returnValue: _i6.Future<_i4.LicenseDetails>.value(
              _FakeLicenseDetails_22(this, Invocation.method(#getLicense, [slug])))) as _i6.Future<_i4.LicenseDetails>);
  @override
  _i6.Future<_i4.Repository> getRepository(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#getRepository, [slug]),
              returnValue:
                  _i6.Future<_i4.Repository>.value(_FakeRepository_21(this, Invocation.method(#getRepository, [slug]))))
          as _i6.Future<_i4.Repository>);
  @override
  _i6.Stream<_i4.Repository> getRepositories(List<_i4.RepositorySlug>? slugs) =>
      (super.noSuchMethod(Invocation.method(#getRepositories, [slugs]), returnValue: _i6.Stream<_i4.Repository>.empty())
          as _i6.Stream<_i4.Repository>);
  @override
  _i6.Future<_i4.Repository> editRepository(_i4.RepositorySlug? slug,
          {String? name,
          String? description,
          String? homepage,
          bool? private,
          bool? hasIssues,
          bool? hasWiki,
          bool? hasDownloads}) =>
      (super.noSuchMethod(
          Invocation.method(#editRepository, [
            slug
          ], {
            #name: name,
            #description: description,
            #homepage: homepage,
            #private: private,
            #hasIssues: hasIssues,
            #hasWiki: hasWiki,
            #hasDownloads: hasDownloads
          }),
          returnValue: _i6.Future<_i4.Repository>.value(_FakeRepository_21(
              this,
              Invocation.method(#editRepository, [
                slug
              ], {
                #name: name,
                #description: description,
                #homepage: homepage,
                #private: private,
                #hasIssues: hasIssues,
                #hasWiki: hasWiki,
                #hasDownloads: hasDownloads
              })))) as _i6.Future<_i4.Repository>);
  @override
  _i6.Future<bool> deleteRepository(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#deleteRepository, [slug]), returnValue: _i6.Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Stream<_i4.Contributor> listContributors(_i4.RepositorySlug? slug, {bool? anon = false}) =>
      (super.noSuchMethod(Invocation.method(#listContributors, [slug], {#anon: anon}),
          returnValue: _i6.Stream<_i4.Contributor>.empty()) as _i6.Stream<_i4.Contributor>);
  @override
  _i6.Stream<_i4.Team> listTeams(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listTeams, [slug]), returnValue: _i6.Stream<_i4.Team>.empty())
          as _i6.Stream<_i4.Team>);
  @override
  _i6.Future<_i4.LanguageBreakdown> listLanguages(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listLanguages, [slug]),
              returnValue: _i6.Future<_i4.LanguageBreakdown>.value(
                  _FakeLanguageBreakdown_23(this, Invocation.method(#listLanguages, [slug]))))
          as _i6.Future<_i4.LanguageBreakdown>);
  @override
  _i6.Stream<_i4.Tag> listTags(_i4.RepositorySlug? slug, {int? page = 1, int? pages, int? perPage = 30}) =>
      (super.noSuchMethod(Invocation.method(#listTags, [slug], {#page: page, #pages: pages, #perPage: perPage}),
          returnValue: _i6.Stream<_i4.Tag>.empty()) as _i6.Stream<_i4.Tag>);
  @override
  _i6.Stream<_i4.Branch> listBranches(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listBranches, [slug]), returnValue: _i6.Stream<_i4.Branch>.empty())
          as _i6.Stream<_i4.Branch>);
  @override
  _i6.Future<_i4.Branch> getBranch(_i4.RepositorySlug? slug, String? branch) =>
      (super.noSuchMethod(Invocation.method(#getBranch, [slug, branch]),
              returnValue:
                  _i6.Future<_i4.Branch>.value(_FakeBranch_24(this, Invocation.method(#getBranch, [slug, branch]))))
          as _i6.Future<_i4.Branch>);
  @override
  _i6.Stream<_i4.Collaborator> listCollaborators(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listCollaborators, [slug]),
          returnValue: _i6.Stream<_i4.Collaborator>.empty()) as _i6.Stream<_i4.Collaborator>);
  @override
  _i6.Future<bool> isCollaborator(_i4.RepositorySlug? slug, String? user) =>
      (super.noSuchMethod(Invocation.method(#isCollaborator, [slug, user]), returnValue: _i6.Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Future<bool> addCollaborator(_i4.RepositorySlug? slug, String? user) =>
      (super.noSuchMethod(Invocation.method(#addCollaborator, [slug, user]), returnValue: _i6.Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Future<bool> removeCollaborator(_i4.RepositorySlug? slug, String? user) =>
      (super.noSuchMethod(Invocation.method(#removeCollaborator, [slug, user]),
          returnValue: _i6.Future<bool>.value(false)) as _i6.Future<bool>);
  @override
  _i6.Stream<_i4.CommitComment> listSingleCommitComments(_i4.RepositorySlug? slug, _i4.RepositoryCommit? commit) =>
      (super.noSuchMethod(Invocation.method(#listSingleCommitComments, [slug, commit]),
          returnValue: _i6.Stream<_i4.CommitComment>.empty()) as _i6.Stream<_i4.CommitComment>);
  @override
  _i6.Stream<_i4.CommitComment> listCommitComments(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listCommitComments, [slug]),
          returnValue: _i6.Stream<_i4.CommitComment>.empty()) as _i6.Stream<_i4.CommitComment>);
  @override
  _i6.Future<_i4.CommitComment> createCommitComment(_i4.RepositorySlug? slug, _i4.RepositoryCommit? commit,
          {String? body, String? path, int? position, int? line}) =>
      (super
          .noSuchMethod(Invocation.method(#createCommitComment, [slug, commit], {#body: body, #path: path, #position: position, #line: line}),
              returnValue: _i6.Future<_i4.CommitComment>.value(_FakeCommitComment_25(
                  this,
                  Invocation.method(#createCommitComment, [slug, commit],
                      {#body: body, #path: path, #position: position, #line: line})))) as _i6.Future<_i4.CommitComment>);
  @override
  _i6.Future<_i4.CommitComment> getCommitComment(_i4.RepositorySlug? slug, {int? id}) =>
      (super.noSuchMethod(Invocation.method(#getCommitComment, [slug], {#id: id}),
              returnValue: _i6.Future<_i4.CommitComment>.value(
                  _FakeCommitComment_25(this, Invocation.method(#getCommitComment, [slug], {#id: id}))))
          as _i6.Future<_i4.CommitComment>);
  @override
  _i6.Future<_i4.CommitComment> updateCommitComment(_i4.RepositorySlug? slug, {int? id, String? body}) =>
      (super.noSuchMethod(Invocation.method(#updateCommitComment, [slug], {#id: id, #body: body}),
              returnValue: _i6.Future<_i4.CommitComment>.value(
                  _FakeCommitComment_25(this, Invocation.method(#updateCommitComment, [slug], {#id: id, #body: body}))))
          as _i6.Future<_i4.CommitComment>);
  @override
  _i6.Future<bool> deleteCommitComment(_i4.RepositorySlug? slug, {int? id}) =>
      (super.noSuchMethod(Invocation.method(#deleteCommitComment, [slug], {#id: id}),
          returnValue: _i6.Future<bool>.value(false)) as _i6.Future<bool>);
  @override
  _i6.Stream<_i4.RepositoryCommit> listCommits(_i4.RepositorySlug? slug) => (super
          .noSuchMethod(Invocation.method(#listCommits, [slug]), returnValue: _i6.Stream<_i4.RepositoryCommit>.empty())
      as _i6.Stream<_i4.RepositoryCommit>);
  @override
  _i6.Future<_i4.RepositoryCommit> getCommit(_i4.RepositorySlug? slug, String? sha) =>
      (super.noSuchMethod(Invocation.method(#getCommit, [slug, sha]),
              returnValue: _i6.Future<_i4.RepositoryCommit>.value(
                  _FakeRepositoryCommit_26(this, Invocation.method(#getCommit, [slug, sha]))))
          as _i6.Future<_i4.RepositoryCommit>);
  @override
  _i6.Future<String> getCommitDiff(_i4.RepositorySlug? slug, String? sha) =>
      (super.noSuchMethod(Invocation.method(#getCommitDiff, [slug, sha]), returnValue: _i6.Future<String>.value(''))
          as _i6.Future<String>);
  @override
  _i6.Future<_i4.GitHubComparison> compareCommits(_i4.RepositorySlug? slug, String? refBase, String? refHead) =>
      (super.noSuchMethod(Invocation.method(#compareCommits, [slug, refBase, refHead]),
              returnValue: _i6.Future<_i4.GitHubComparison>.value(
                  _FakeGitHubComparison_27(this, Invocation.method(#compareCommits, [slug, refBase, refHead]))))
          as _i6.Future<_i4.GitHubComparison>);
  @override
  _i6.Future<_i4.GitHubFile> getReadme(_i4.RepositorySlug? slug, {String? ref}) => (super.noSuchMethod(
      Invocation.method(#getReadme, [slug], {#ref: ref}),
      returnValue: _i6.Future<_i4.GitHubFile>.value(
          _FakeGitHubFile_28(this, Invocation.method(#getReadme, [slug], {#ref: ref})))) as _i6.Future<_i4.GitHubFile>);
  @override
  _i6.Future<_i4.RepositoryContents> getContents(_i4.RepositorySlug? slug, String? path, {String? ref}) =>
      (super.noSuchMethod(Invocation.method(#getContents, [slug, path], {#ref: ref}),
              returnValue: _i6.Future<_i4.RepositoryContents>.value(
                  _FakeRepositoryContents_29(this, Invocation.method(#getContents, [slug, path], {#ref: ref}))))
          as _i6.Future<_i4.RepositoryContents>);
  @override
  _i6.Future<_i4.ContentCreation> createFile(_i4.RepositorySlug? slug, _i4.CreateFile? file) =>
      (super.noSuchMethod(Invocation.method(#createFile, [slug, file]),
              returnValue: _i6.Future<_i4.ContentCreation>.value(
                  _FakeContentCreation_30(this, Invocation.method(#createFile, [slug, file]))))
          as _i6.Future<_i4.ContentCreation>);
  @override
  _i6.Future<_i4.ContentCreation> updateFile(
          _i4.RepositorySlug? slug, String? path, String? message, String? content, String? sha, {String? branch}) =>
      (super.noSuchMethod(Invocation.method(#updateFile, [slug, path, message, content, sha], {#branch: branch}),
              returnValue: _i6.Future<_i4.ContentCreation>.value(_FakeContentCreation_30(
                  this, Invocation.method(#updateFile, [slug, path, message, content, sha], {#branch: branch}))))
          as _i6.Future<_i4.ContentCreation>);
  @override
  _i6.Future<_i4.ContentCreation> deleteFile(
          _i4.RepositorySlug? slug, String? path, String? message, String? sha, String? branch) =>
      (super.noSuchMethod(Invocation.method(#deleteFile, [slug, path, message, sha, branch]),
              returnValue: _i6.Future<_i4.ContentCreation>.value(
                  _FakeContentCreation_30(this, Invocation.method(#deleteFile, [slug, path, message, sha, branch]))))
          as _i6.Future<_i4.ContentCreation>);
  @override
  _i6.Future<String?> getArchiveLink(_i4.RepositorySlug? slug, String? ref, {String? format = r'tarball'}) =>
      (super.noSuchMethod(Invocation.method(#getArchiveLink, [slug, ref], {#format: format}),
          returnValue: _i6.Future<String?>.value()) as _i6.Future<String?>);
  @override
  _i6.Stream<_i4.Repository> listForks(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listForks, [slug]), returnValue: _i6.Stream<_i4.Repository>.empty())
          as _i6.Stream<_i4.Repository>);
  @override
  _i6.Future<_i4.Repository> createFork(_i4.RepositorySlug? slug, [_i4.CreateFork? fork]) => (super.noSuchMethod(
          Invocation.method(#createFork, [slug, fork]),
          returnValue:
              _i6.Future<_i4.Repository>.value(_FakeRepository_21(this, Invocation.method(#createFork, [slug, fork]))))
      as _i6.Future<_i4.Repository>);
  @override
  _i6.Stream<_i4.Hook> listHooks(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listHooks, [slug]), returnValue: _i6.Stream<_i4.Hook>.empty())
          as _i6.Stream<_i4.Hook>);
  @override
  _i6.Future<_i4.Hook> getHook(_i4.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#getHook, [slug, id]),
              returnValue: _i6.Future<_i4.Hook>.value(_FakeHook_31(this, Invocation.method(#getHook, [slug, id]))))
          as _i6.Future<_i4.Hook>);
  @override
  _i6.Future<_i4.Hook> createHook(_i4.RepositorySlug? slug, _i4.CreateHook? hook) =>
      (super.noSuchMethod(Invocation.method(#createHook, [slug, hook]),
              returnValue: _i6.Future<_i4.Hook>.value(_FakeHook_31(this, Invocation.method(#createHook, [slug, hook]))))
          as _i6.Future<_i4.Hook>);
  @override
  _i6.Future<_i4.Hook> editHook(_i4.RepositorySlug? slug, _i4.Hook? hookToEdit,
          {String? configUrl,
          String? configContentType,
          String? configSecret,
          bool? configInsecureSsl,
          List<String>? events,
          List<String>? addEvents,
          List<String>? removeEvents,
          bool? active}) =>
      (super.noSuchMethod(
          Invocation.method(#editHook, [
            slug,
            hookToEdit
          ], {
            #configUrl: configUrl,
            #configContentType: configContentType,
            #configSecret: configSecret,
            #configInsecureSsl: configInsecureSsl,
            #events: events,
            #addEvents: addEvents,
            #removeEvents: removeEvents,
            #active: active
          }),
          returnValue: _i6.Future<_i4.Hook>.value(_FakeHook_31(
              this,
              Invocation.method(#editHook, [
                slug,
                hookToEdit
              ], {
                #configUrl: configUrl,
                #configContentType: configContentType,
                #configSecret: configSecret,
                #configInsecureSsl: configInsecureSsl,
                #events: events,
                #addEvents: addEvents,
                #removeEvents: removeEvents,
                #active: active
              })))) as _i6.Future<_i4.Hook>);
  @override
  _i6.Future<bool> testPushHook(_i4.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#testPushHook, [slug, id]), returnValue: _i6.Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Future<bool> pingHook(_i4.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#pingHook, [slug, id]), returnValue: _i6.Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Future<bool> deleteHook(_i4.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#deleteHook, [slug, id]), returnValue: _i6.Future<bool>.value(false))
          as _i6.Future<bool>);
  @override
  _i6.Stream<_i4.PublicKey> listDeployKeys(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listDeployKeys, [slug]), returnValue: _i6.Stream<_i4.PublicKey>.empty())
          as _i6.Stream<_i4.PublicKey>);
  @override
  _i6.Future<_i4.PublicKey> getDeployKey(_i4.RepositorySlug? slug, {int? id}) => (super.noSuchMethod(
      Invocation.method(#getDeployKey, [slug], {#id: id}),
      returnValue: _i6.Future<_i4.PublicKey>.value(
          _FakePublicKey_32(this, Invocation.method(#getDeployKey, [slug], {#id: id})))) as _i6.Future<_i4.PublicKey>);
  @override
  _i6.Future<_i4.PublicKey> createDeployKey(_i4.RepositorySlug? slug, _i4.CreatePublicKey? key) =>
      (super.noSuchMethod(Invocation.method(#createDeployKey, [slug, key]),
          returnValue: _i6.Future<_i4.PublicKey>.value(
              _FakePublicKey_32(this, Invocation.method(#createDeployKey, [slug, key])))) as _i6.Future<_i4.PublicKey>);
  @override
  _i6.Future<bool> deleteDeployKey({_i4.RepositorySlug? slug, _i4.PublicKey? key}) =>
      (super.noSuchMethod(Invocation.method(#deleteDeployKey, [], {#slug: slug, #key: key}),
          returnValue: _i6.Future<bool>.value(false)) as _i6.Future<bool>);
  @override
  _i6.Future<_i4.RepositoryCommit> merge(_i4.RepositorySlug? slug, _i4.CreateMerge? merge) =>
      (super.noSuchMethod(Invocation.method(#merge, [slug, merge]),
              returnValue: _i6.Future<_i4.RepositoryCommit>.value(
                  _FakeRepositoryCommit_26(this, Invocation.method(#merge, [slug, merge]))))
          as _i6.Future<_i4.RepositoryCommit>);
  @override
  _i6.Future<_i4.RepositoryPages> getPagesInfo(_i4.RepositorySlug? slug) => (super.noSuchMethod(
      Invocation.method(#getPagesInfo, [slug]),
      returnValue: _i6.Future<_i4.RepositoryPages>.value(
          _FakeRepositoryPages_33(this, Invocation.method(#getPagesInfo, [slug])))) as _i6.Future<_i4.RepositoryPages>);
  @override
  _i6.Stream<_i4.PageBuild> listPagesBuilds(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listPagesBuilds, [slug]), returnValue: _i6.Stream<_i4.PageBuild>.empty())
          as _i6.Stream<_i4.PageBuild>);
  @override
  _i6.Future<_i4.PageBuild> getLatestPagesBuild(_i4.RepositorySlug? slug) => (super.noSuchMethod(
          Invocation.method(#getLatestPagesBuild, [slug]),
          returnValue:
              _i6.Future<_i4.PageBuild>.value(_FakePageBuild_34(this, Invocation.method(#getLatestPagesBuild, [slug]))))
      as _i6.Future<_i4.PageBuild>);
  @override
  _i6.Stream<_i4.Release> listReleases(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listReleases, [slug]), returnValue: _i6.Stream<_i4.Release>.empty())
          as _i6.Stream<_i4.Release>);
  @override
  _i6.Future<_i4.Release> getLatestRelease(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#getLatestRelease, [slug]),
              returnValue:
                  _i6.Future<_i4.Release>.value(_FakeRelease_35(this, Invocation.method(#getLatestRelease, [slug]))))
          as _i6.Future<_i4.Release>);
  @override
  _i6.Future<_i4.Release> getReleaseById(_i4.RepositorySlug? slug, int? id) =>
      (super.noSuchMethod(Invocation.method(#getReleaseById, [slug, id]),
              returnValue:
                  _i6.Future<_i4.Release>.value(_FakeRelease_35(this, Invocation.method(#getReleaseById, [slug, id]))))
          as _i6.Future<_i4.Release>);
  @override
  _i6.Future<_i4.Release> getReleaseByTagName(_i4.RepositorySlug? slug, String? tagName) => (super.noSuchMethod(
      Invocation.method(#getReleaseByTagName, [slug, tagName]),
      returnValue: _i6.Future<_i4.Release>.value(
          _FakeRelease_35(this, Invocation.method(#getReleaseByTagName, [slug, tagName])))) as _i6.Future<_i4.Release>);
  @override
  _i6.Future<_i4.Release> createRelease(_i4.RepositorySlug? slug, _i4.CreateRelease? createRelease,
          {bool? getIfExists = true}) =>
      (super.noSuchMethod(Invocation.method(#createRelease, [slug, createRelease], {#getIfExists: getIfExists}),
              returnValue: _i6.Future<_i4.Release>.value(_FakeRelease_35(
                  this, Invocation.method(#createRelease, [slug, createRelease], {#getIfExists: getIfExists}))))
          as _i6.Future<_i4.Release>);
  @override
  _i6.Future<_i4.Release> editRelease(_i4.RepositorySlug? slug, _i4.Release? releaseToEdit,
          {String? tagName, String? targetCommitish, String? name, String? body, bool? draft, bool? preRelease}) =>
      (super.noSuchMethod(Invocation.method(#editRelease, [slug, releaseToEdit], {#tagName: tagName, #targetCommitish: targetCommitish, #name: name, #body: body, #draft: draft, #preRelease: preRelease}),
          returnValue: _i6.Future<_i4.Release>.value(_FakeRelease_35(
              this,
              Invocation.method(#editRelease, [
                slug,
                releaseToEdit
              ], {
                #tagName: tagName,
                #targetCommitish: targetCommitish,
                #name: name,
                #body: body,
                #draft: draft,
                #preRelease: preRelease
              })))) as _i6.Future<_i4.Release>);
  @override
  _i6.Future<bool> deleteRelease(_i4.RepositorySlug? slug, _i4.Release? release) => (super
          .noSuchMethod(Invocation.method(#deleteRelease, [slug, release]), returnValue: _i6.Future<bool>.value(false))
      as _i6.Future<bool>);
  @override
  _i6.Stream<_i4.ReleaseAsset> listReleaseAssets(_i4.RepositorySlug? slug, _i4.Release? release) =>
      (super.noSuchMethod(Invocation.method(#listReleaseAssets, [slug, release]),
          returnValue: _i6.Stream<_i4.ReleaseAsset>.empty()) as _i6.Stream<_i4.ReleaseAsset>);
  @override
  _i6.Future<_i4.ReleaseAsset> getReleaseAsset(_i4.RepositorySlug? slug, _i4.Release? release, {int? assetId}) =>
      (super.noSuchMethod(Invocation.method(#getReleaseAsset, [slug, release], {#assetId: assetId}),
              returnValue: _i6.Future<_i4.ReleaseAsset>.value(_FakeReleaseAsset_36(
                  this, Invocation.method(#getReleaseAsset, [slug, release], {#assetId: assetId}))))
          as _i6.Future<_i4.ReleaseAsset>);
  @override
  _i6.Future<_i4.ReleaseAsset> editReleaseAsset(_i4.RepositorySlug? slug, _i4.ReleaseAsset? assetToEdit,
          {String? name, String? label}) =>
      (super.noSuchMethod(Invocation.method(#editReleaseAsset, [slug, assetToEdit], {#name: name, #label: label}),
              returnValue: _i6.Future<_i4.ReleaseAsset>.value(_FakeReleaseAsset_36(
                  this, Invocation.method(#editReleaseAsset, [slug, assetToEdit], {#name: name, #label: label}))))
          as _i6.Future<_i4.ReleaseAsset>);
  @override
  _i6.Future<bool> deleteReleaseAsset(_i4.RepositorySlug? slug, _i4.ReleaseAsset? asset) =>
      (super.noSuchMethod(Invocation.method(#deleteReleaseAsset, [slug, asset]),
          returnValue: _i6.Future<bool>.value(false)) as _i6.Future<bool>);
  @override
  _i6.Future<List<_i4.ReleaseAsset>> uploadReleaseAssets(
          _i4.Release? release, Iterable<_i4.CreateReleaseAsset>? createReleaseAssets) =>
      (super.noSuchMethod(Invocation.method(#uploadReleaseAssets, [release, createReleaseAssets]),
              returnValue: _i6.Future<List<_i4.ReleaseAsset>>.value(<_i4.ReleaseAsset>[]))
          as _i6.Future<List<_i4.ReleaseAsset>>);
  @override
  _i6.Future<List<_i4.ContributorStatistics>> listContributorStats(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listContributorStats, [slug]),
              returnValue: _i6.Future<List<_i4.ContributorStatistics>>.value(<_i4.ContributorStatistics>[]))
          as _i6.Future<List<_i4.ContributorStatistics>>);
  @override
  _i6.Stream<_i4.YearCommitCountWeek> listCommitActivity(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listCommitActivity, [slug]),
          returnValue: _i6.Stream<_i4.YearCommitCountWeek>.empty()) as _i6.Stream<_i4.YearCommitCountWeek>);
  @override
  _i6.Stream<_i4.WeeklyChangesCount> listCodeFrequency(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#listCodeFrequency, [slug]),
          returnValue: _i6.Stream<_i4.WeeklyChangesCount>.empty()) as _i6.Stream<_i4.WeeklyChangesCount>);
  @override
  _i6.Future<_i4.ContributorParticipation> getParticipation(_i4.RepositorySlug? slug) =>
      (super.noSuchMethod(Invocation.method(#getParticipation, [slug]),
              returnValue: _i6.Future<_i4.ContributorParticipation>.value(
                  _FakeContributorParticipation_37(this, Invocation.method(#getParticipation, [slug]))))
          as _i6.Future<_i4.ContributorParticipation>);
  @override
  _i6.Stream<_i4.PunchcardEntry> listPunchcard(_i4.RepositorySlug? slug) => (super
          .noSuchMethod(Invocation.method(#listPunchcard, [slug]), returnValue: _i6.Stream<_i4.PunchcardEntry>.empty())
      as _i6.Stream<_i4.PunchcardEntry>);
  @override
  _i6.Stream<_i4.RepositoryStatus> listStatuses(_i4.RepositorySlug? slug, String? ref) =>
      (super.noSuchMethod(Invocation.method(#listStatuses, [slug, ref]),
          returnValue: _i6.Stream<_i4.RepositoryStatus>.empty()) as _i6.Stream<_i4.RepositoryStatus>);
  @override
  _i6.Future<_i4.RepositoryStatus> createStatus(_i4.RepositorySlug? slug, String? ref, _i4.CreateStatus? request) =>
      (super.noSuchMethod(Invocation.method(#createStatus, [slug, ref, request]),
              returnValue: _i6.Future<_i4.RepositoryStatus>.value(
                  _FakeRepositoryStatus_38(this, Invocation.method(#createStatus, [slug, ref, request]))))
          as _i6.Future<_i4.RepositoryStatus>);
  @override
  _i6.Future<_i4.CombinedRepositoryStatus> getCombinedStatus(_i4.RepositorySlug? slug, String? ref) =>
      (super.noSuchMethod(Invocation.method(#getCombinedStatus, [slug, ref]),
              returnValue: _i6.Future<_i4.CombinedRepositoryStatus>.value(
                  _FakeCombinedRepositoryStatus_39(this, Invocation.method(#getCombinedStatus, [slug, ref]))))
          as _i6.Future<_i4.CombinedRepositoryStatus>);
  @override
  _i6.Future<_i4.ReleaseNotes> generateReleaseNotes(_i4.CreateReleaseNotes? crn) =>
      (super.noSuchMethod(Invocation.method(#generateReleaseNotes, [crn]),
              returnValue: _i6.Future<_i4.ReleaseNotes>.value(
                  _FakeReleaseNotes_40(this, Invocation.method(#generateReleaseNotes, [crn]))))
          as _i6.Future<_i4.ReleaseNotes>);
}

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

  @override
  Map<String, dynamic> toJson() =>
      (super.noSuchMethod(Invocation.method(#toJson, []), returnValue: <String, dynamic>{}) as Map<String, dynamic>);
}

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

  @override
  _i7.Uint8List get bodyBytes =>
      (super.noSuchMethod(Invocation.getter(#bodyBytes), returnValue: _i7.Uint8List(0)) as _i7.Uint8List);
  @override
  String get body => (super.noSuchMethod(Invocation.getter(#body), returnValue: '') as String);
  @override
  int get statusCode => (super.noSuchMethod(Invocation.getter(#statusCode), returnValue: 0) as int);
  @override
  Map<String, String> get headers =>
      (super.noSuchMethod(Invocation.getter(#headers), returnValue: <String, String>{}) as Map<String, String>);
  @override
  bool get isRedirect => (super.noSuchMethod(Invocation.getter(#isRedirect), returnValue: false) as bool);
  @override
  bool get persistentConnection =>
      (super.noSuchMethod(Invocation.getter(#persistentConnection), returnValue: false) as bool);
}
