// Mocks generated by Mockito 5.4.4 from annotations
// in symbolizer/test/symbolizer_test.dart.
// Do not manually edit this file.

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i5;

import 'package:github/src/common.dart' as _i3;
import 'package:http/http.dart' as _i4;
import 'package:mockito/mockito.dart' as _i1;
import 'package:mockito/src/dummies.dart' as _i8;
import 'package:symbolizer/model.dart' as _i2;
import 'package:symbolizer/ndk.dart' as _i6;
import 'package:symbolizer/symbols.dart' as _i7;

// 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: deprecated_member_use
// ignore_for_file: deprecated_member_use_from_same_package
// 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 _FakeEngineBuild_0 extends _i1.SmartFake implements _i2.EngineBuild {
  _FakeEngineBuild_0(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/// A class which mocks [SymbolsCache].
///
/// See the documentation for Mockito's code generation for more information.
class MockSymbolsCache extends _i1.Mock implements _i7.SymbolsCache {
  @override
  _i5.Future<String> get(_i2.EngineBuild? build) => (super.noSuchMethod(
        Invocation.method(
          #get,
          [build],
        ),
        returnValue: _i5.Future<String>.value(_i8.dummyValue<String>(
          this,
          Invocation.method(
            #get,
            [build],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<String>.value(_i8.dummyValue<String>(
          this,
          Invocation.method(
            #get,
            [build],
          ),
        )),
      ) as _i5.Future<String>);

  @override
  _i5.Future<String> getEngineBinary(_i2.EngineBuild? build) =>
      (super.noSuchMethod(
        Invocation.method(
          #getEngineBinary,
          [build],
        ),
        returnValue: _i5.Future<String>.value(_i8.dummyValue<String>(
          this,
          Invocation.method(
            #getEngineBinary,
            [build],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<String>.value(_i8.dummyValue<String>(
          this,
          Invocation.method(
            #getEngineBinary,
            [build],
          ),
        )),
      ) as _i5.Future<String>);

  @override
  _i5.Future<_i2.EngineBuild> findVariantByBuildId({
    required String? engineHash,
    required _i2.EngineVariant? variant,
    required String? buildId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #findVariantByBuildId,
          [],
          {
            #engineHash: engineHash,
            #variant: variant,
            #buildId: buildId,
          },
        ),
        returnValue: _i5.Future<_i2.EngineBuild>.value(_FakeEngineBuild_0(
          this,
          Invocation.method(
            #findVariantByBuildId,
            [],
            {
              #engineHash: engineHash,
              #variant: variant,
              #buildId: buildId,
            },
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i2.EngineBuild>.value(_FakeEngineBuild_0(
          this,
          Invocation.method(
            #findVariantByBuildId,
            [],
            {
              #engineHash: engineHash,
              #variant: variant,
              #buildId: buildId,
            },
          ),
        )),
      ) as _i5.Future<_i2.EngineBuild>);
}

/// A class which mocks [GitHub].
///
/// See the documentation for Mockito's code generation for more information.
class MockGitHub extends _i1.Mock implements _i3.GitHub {
  @override
  _i3.Authentication get auth => (super.noSuchMethod(
        Invocation.getter(#auth),
        returnValue: _FakeAuthentication_1(
          this,
          Invocation.getter(#auth),
        ),
        returnValueForMissingStub: _FakeAuthentication_1(
          this,
          Invocation.getter(#auth),
        ),
      ) as _i3.Authentication);

  @override
  set auth(_i3.Authentication? _auth) => super.noSuchMethod(
        Invocation.setter(
          #auth,
          _auth,
        ),
        returnValueForMissingStub: null,
      );

  @override
  String get endpoint => (super.noSuchMethod(
        Invocation.getter(#endpoint),
        returnValue: _i8.dummyValue<String>(
          this,
          Invocation.getter(#endpoint),
        ),
        returnValueForMissingStub: _i8.dummyValue<String>(
          this,
          Invocation.getter(#endpoint),
        ),
      ) as String);

  @override
  String get version => (super.noSuchMethod(
        Invocation.getter(#version),
        returnValue: _i8.dummyValue<String>(
          this,
          Invocation.getter(#version),
        ),
        returnValueForMissingStub: _i8.dummyValue<String>(
          this,
          Invocation.getter(#version),
        ),
      ) as String);

  @override
  _i4.Client get client => (super.noSuchMethod(
        Invocation.getter(#client),
        returnValue: _FakeClient_2(
          this,
          Invocation.getter(#client),
        ),
        returnValueForMissingStub: _FakeClient_2(
          this,
          Invocation.getter(#client),
        ),
      ) as _i4.Client);

  @override
  _i3.ActivityService get activity => (super.noSuchMethod(
        Invocation.getter(#activity),
        returnValue: _FakeActivityService_3(
          this,
          Invocation.getter(#activity),
        ),
        returnValueForMissingStub: _FakeActivityService_3(
          this,
          Invocation.getter(#activity),
        ),
      ) as _i3.ActivityService);

  @override
  _i3.AuthorizationsService get authorizations => (super.noSuchMethod(
        Invocation.getter(#authorizations),
        returnValue: _FakeAuthorizationsService_4(
          this,
          Invocation.getter(#authorizations),
        ),
        returnValueForMissingStub: _FakeAuthorizationsService_4(
          this,
          Invocation.getter(#authorizations),
        ),
      ) as _i3.AuthorizationsService);

  @override
  _i3.GistsService get gists => (super.noSuchMethod(
        Invocation.getter(#gists),
        returnValue: _FakeGistsService_5(
          this,
          Invocation.getter(#gists),
        ),
        returnValueForMissingStub: _FakeGistsService_5(
          this,
          Invocation.getter(#gists),
        ),
      ) as _i3.GistsService);

  @override
  _i3.GitService get git => (super.noSuchMethod(
        Invocation.getter(#git),
        returnValue: _FakeGitService_6(
          this,
          Invocation.getter(#git),
        ),
        returnValueForMissingStub: _FakeGitService_6(
          this,
          Invocation.getter(#git),
        ),
      ) as _i3.GitService);

  @override
  _i3.IssuesService get issues => (super.noSuchMethod(
        Invocation.getter(#issues),
        returnValue: _FakeIssuesService_7(
          this,
          Invocation.getter(#issues),
        ),
        returnValueForMissingStub: _FakeIssuesService_7(
          this,
          Invocation.getter(#issues),
        ),
      ) as _i3.IssuesService);

  @override
  _i3.MiscService get misc => (super.noSuchMethod(
        Invocation.getter(#misc),
        returnValue: _FakeMiscService_8(
          this,
          Invocation.getter(#misc),
        ),
        returnValueForMissingStub: _FakeMiscService_8(
          this,
          Invocation.getter(#misc),
        ),
      ) as _i3.MiscService);

  @override
  _i3.OrganizationsService get organizations => (super.noSuchMethod(
        Invocation.getter(#organizations),
        returnValue: _FakeOrganizationsService_9(
          this,
          Invocation.getter(#organizations),
        ),
        returnValueForMissingStub: _FakeOrganizationsService_9(
          this,
          Invocation.getter(#organizations),
        ),
      ) as _i3.OrganizationsService);

  @override
  _i3.PullRequestsService get pullRequests => (super.noSuchMethod(
        Invocation.getter(#pullRequests),
        returnValue: _FakePullRequestsService_10(
          this,
          Invocation.getter(#pullRequests),
        ),
        returnValueForMissingStub: _FakePullRequestsService_10(
          this,
          Invocation.getter(#pullRequests),
        ),
      ) as _i3.PullRequestsService);

  @override
  _i3.RepositoriesService get repositories => (super.noSuchMethod(
        Invocation.getter(#repositories),
        returnValue: _FakeRepositoriesService_11(
          this,
          Invocation.getter(#repositories),
        ),
        returnValueForMissingStub: _FakeRepositoriesService_11(
          this,
          Invocation.getter(#repositories),
        ),
      ) as _i3.RepositoriesService);

  @override
  _i3.SearchService get search => (super.noSuchMethod(
        Invocation.getter(#search),
        returnValue: _FakeSearchService_12(
          this,
          Invocation.getter(#search),
        ),
        returnValueForMissingStub: _FakeSearchService_12(
          this,
          Invocation.getter(#search),
        ),
      ) as _i3.SearchService);

  @override
  _i3.UrlShortenerService get urlShortener => (super.noSuchMethod(
        Invocation.getter(#urlShortener),
        returnValue: _FakeUrlShortenerService_13(
          this,
          Invocation.getter(#urlShortener),
        ),
        returnValueForMissingStub: _FakeUrlShortenerService_13(
          this,
          Invocation.getter(#urlShortener),
        ),
      ) as _i3.UrlShortenerService);

  @override
  _i3.UsersService get users => (super.noSuchMethod(
        Invocation.getter(#users),
        returnValue: _FakeUsersService_14(
          this,
          Invocation.getter(#users),
        ),
        returnValueForMissingStub: _FakeUsersService_14(
          this,
          Invocation.getter(#users),
        ),
      ) as _i3.UsersService);

  @override
  _i3.ChecksService get checks => (super.noSuchMethod(
        Invocation.getter(#checks),
        returnValue: _FakeChecksService_15(
          this,
          Invocation.getter(#checks),
        ),
        returnValueForMissingStub: _FakeChecksService_15(
          this,
          Invocation.getter(#checks),
        ),
      ) as _i3.ChecksService);

  @override
  _i5.Future<T> getJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i4.Response)? fail,
    Map<String, String>? headers,
    Map<String, String>? params,
    _i3.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: _i8.ifNotNull(
              _i8.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #getJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i5.Future<T>.value(v),
            ) ??
            _FakeFuture_16<T>(
              this,
              Invocation.method(
                #getJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #preview: preview,
                },
              ),
            ),
        returnValueForMissingStub: _i8.ifNotNull(
              _i8.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #getJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i5.Future<T>.value(v),
            ) ??
            _FakeFuture_16<T>(
              this,
              Invocation.method(
                #getJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #preview: preview,
                },
              ),
            ),
      ) as _i5.Future<T>);

  @override
  _i5.Future<T> postJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i4.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i3.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: _i8.ifNotNull(
              _i8.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #postJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i5.Future<T>.value(v),
            ) ??
            _FakeFuture_16<T>(
              this,
              Invocation.method(
                #postJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
        returnValueForMissingStub: _i8.ifNotNull(
              _i8.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #postJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i5.Future<T>.value(v),
            ) ??
            _FakeFuture_16<T>(
              this,
              Invocation.method(
                #postJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
      ) as _i5.Future<T>);

  @override
  _i5.Future<T> putJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i4.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i3.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: _i8.ifNotNull(
              _i8.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #putJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i5.Future<T>.value(v),
            ) ??
            _FakeFuture_16<T>(
              this,
              Invocation.method(
                #putJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
        returnValueForMissingStub: _i8.ifNotNull(
              _i8.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #putJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i5.Future<T>.value(v),
            ) ??
            _FakeFuture_16<T>(
              this,
              Invocation.method(
                #putJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
      ) as _i5.Future<T>);

  @override
  _i5.Future<T> patchJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i4.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i3.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: _i8.ifNotNull(
              _i8.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #patchJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i5.Future<T>.value(v),
            ) ??
            _FakeFuture_16<T>(
              this,
              Invocation.method(
                #patchJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
        returnValueForMissingStub: _i8.ifNotNull(
              _i8.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #patchJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i5.Future<T>.value(v),
            ) ??
            _FakeFuture_16<T>(
              this,
              Invocation.method(
                #patchJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
      ) as _i5.Future<T>);

  @override
  _i5.Future<T> requestJson<S, T>(
    String? method,
    String? path, {
    int? statusCode,
    void Function(_i4.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i3.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: _i8.ifNotNull(
              _i8.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #requestJson,
                  [
                    method,
                    path,
                  ],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i5.Future<T>.value(v),
            ) ??
            _FakeFuture_16<T>(
              this,
              Invocation.method(
                #requestJson,
                [
                  method,
                  path,
                ],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
        returnValueForMissingStub: _i8.ifNotNull(
              _i8.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #requestJson,
                  [
                    method,
                    path,
                  ],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i5.Future<T>.value(v),
            ) ??
            _FakeFuture_16<T>(
              this,
              Invocation.method(
                #requestJson,
                [
                  method,
                  path,
                ],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
      ) as _i5.Future<T>);

  @override
  _i5.Future<_i4.Response> request(
    String? method,
    String? path, {
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    dynamic body,
    int? statusCode,
    void Function(_i4.Response)? fail,
    String? preview,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #request,
          [
            method,
            path,
          ],
          {
            #headers: headers,
            #params: params,
            #body: body,
            #statusCode: statusCode,
            #fail: fail,
            #preview: preview,
          },
        ),
        returnValue: _i5.Future<_i4.Response>.value(_FakeResponse_17(
          this,
          Invocation.method(
            #request,
            [
              method,
              path,
            ],
            {
              #headers: headers,
              #params: params,
              #body: body,
              #statusCode: statusCode,
              #fail: fail,
              #preview: preview,
            },
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i4.Response>.value(_FakeResponse_17(
          this,
          Invocation.method(
            #request,
            [
              method,
              path,
            ],
            {
              #headers: headers,
              #params: params,
              #body: body,
              #statusCode: statusCode,
              #fail: fail,
              #preview: preview,
            },
          ),
        )),
      ) as _i5.Future<_i4.Response>);

  @override
  Never handleStatusCode(_i4.Response? response) => (super.noSuchMethod(
        Invocation.method(
          #handleStatusCode,
          [response],
        ),
        returnValue: null,
        returnValueForMissingStub: null,
      ) as Never);

  @override
  void dispose() => super.noSuchMethod(
        Invocation.method(
          #dispose,
          [],
        ),
        returnValueForMissingStub: null,
      );
}

/// A class which mocks [Ndk].
///
/// See the documentation for Mockito's code generation for more information.
class MockNdk extends _i1.Mock implements _i6.Ndk {
  @override
  _i6.LlvmTools get llvmTools => (super.noSuchMethod(
        Invocation.getter(#llvmTools),
        returnValue: _FakeLlvmTools_18(
          this,
          Invocation.getter(#llvmTools),
        ),
        returnValueForMissingStub: _FakeLlvmTools_18(
          this,
          Invocation.getter(#llvmTools),
        ),
      ) as _i6.LlvmTools);

  @override
  _i5.Future<_i6.SectionInfo> getTextSectionInfo(String? object) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTextSectionInfo,
          [object],
        ),
        returnValue: _i5.Future<_i6.SectionInfo>.value(_FakeSectionInfo_19(
          this,
          Invocation.method(
            #getTextSectionInfo,
            [object],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i6.SectionInfo>.value(_FakeSectionInfo_19(
          this,
          Invocation.method(
            #getTextSectionInfo,
            [object],
          ),
        )),
      ) as _i5.Future<_i6.SectionInfo>);

  @override
  _i5.Future<String> getBuildId(String? object) => (super.noSuchMethod(
        Invocation.method(
          #getBuildId,
          [object],
        ),
        returnValue: _i5.Future<String>.value(_i8.dummyValue<String>(
          this,
          Invocation.method(
            #getBuildId,
            [object],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<String>.value(_i8.dummyValue<String>(
          this,
          Invocation.method(
            #getBuildId,
            [object],
          ),
        )),
      ) as _i5.Future<String>);

  @override
  _i5.Future<List<String>> symbolize({
    required String? object,
    required List<String>? addresses,
    String? arch,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #symbolize,
          [],
          {
            #object: object,
            #addresses: addresses,
            #arch: arch,
          },
        ),
        returnValue: _i5.Future<List<String>>.value(<String>[]),
        returnValueForMissingStub: _i5.Future<List<String>>.value(<String>[]),
      ) as _i5.Future<List<String>>);

  @override
  _i5.Stream<String> objdump({
    required String? object,
    required String? arch,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #objdump,
          [],
          {
            #object: object,
            #arch: arch,
          },
        ),
        returnValue: _i5.Stream<String>.empty(),
        returnValueForMissingStub: _i5.Stream<String>.empty(),
      ) as _i5.Stream<String>);
}

/// A class which mocks [RepositoriesService].
///
/// See the documentation for Mockito's code generation for more information.
class MockRepositoriesService extends _i1.Mock
    implements _i3.RepositoriesService {
  @override
  _i3.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_20(
          this,
          Invocation.getter(#github),
        ),
        returnValueForMissingStub: _FakeGitHub_20(
          this,
          Invocation.getter(#github),
        ),
      ) as _i3.GitHub);

  @override
  _i5.Stream<_i3.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: _i5.Stream<_i3.Repository>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
      ) as _i5.Stream<_i3.Repository>);

  @override
  _i5.Stream<_i3.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: _i5.Stream<_i3.Repository>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
      ) as _i5.Stream<_i3.Repository>);

  @override
  _i5.Stream<_i3.Repository> listOrganizationRepositories(
    String? org, {
    String? type = r'all',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listOrganizationRepositories,
          [org],
          {#type: type},
        ),
        returnValue: _i5.Stream<_i3.Repository>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
      ) as _i5.Stream<_i3.Repository>);

  @override
  _i5.Stream<_i3.Repository> listPublicRepositories({
    int? limit = 50,
    DateTime? since,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listPublicRepositories,
          [],
          {
            #limit: limit,
            #since: since,
          },
        ),
        returnValue: _i5.Stream<_i3.Repository>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
      ) as _i5.Stream<_i3.Repository>);

  @override
  _i5.Future<_i3.Repository> createRepository(
    _i3.CreateRepository? repository, {
    String? org,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createRepository,
          [repository],
          {#org: org},
        ),
        returnValue: _i5.Future<_i3.Repository>.value(_FakeRepository_21(
          this,
          Invocation.method(
            #createRepository,
            [repository],
            {#org: org},
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.Repository>.value(_FakeRepository_21(
          this,
          Invocation.method(
            #createRepository,
            [repository],
            {#org: org},
          ),
        )),
      ) as _i5.Future<_i3.Repository>);

  @override
  _i5.Future<_i3.LicenseDetails> getLicense(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #getLicense,
          [slug],
        ),
        returnValue:
            _i5.Future<_i3.LicenseDetails>.value(_FakeLicenseDetails_22(
          this,
          Invocation.method(
            #getLicense,
            [slug],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.LicenseDetails>.value(_FakeLicenseDetails_22(
          this,
          Invocation.method(
            #getLicense,
            [slug],
          ),
        )),
      ) as _i5.Future<_i3.LicenseDetails>);

  @override
  _i5.Future<_i3.Repository> getRepository(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #getRepository,
          [slug],
        ),
        returnValue: _i5.Future<_i3.Repository>.value(_FakeRepository_21(
          this,
          Invocation.method(
            #getRepository,
            [slug],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.Repository>.value(_FakeRepository_21(
          this,
          Invocation.method(
            #getRepository,
            [slug],
          ),
        )),
      ) as _i5.Future<_i3.Repository>);

  @override
  _i5.Stream<_i3.Repository> getRepositories(List<_i3.RepositorySlug>? slugs) =>
      (super.noSuchMethod(
        Invocation.method(
          #getRepositories,
          [slugs],
        ),
        returnValue: _i5.Stream<_i3.Repository>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
      ) as _i5.Stream<_i3.Repository>);

  @override
  _i5.Future<_i3.Repository> editRepository(
    _i3.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: _i5.Future<_i3.Repository>.value(_FakeRepository_21(
          this,
          Invocation.method(
            #editRepository,
            [slug],
            {
              #name: name,
              #description: description,
              #homepage: homepage,
              #private: private,
              #hasIssues: hasIssues,
              #hasWiki: hasWiki,
              #hasDownloads: hasDownloads,
            },
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.Repository>.value(_FakeRepository_21(
          this,
          Invocation.method(
            #editRepository,
            [slug],
            {
              #name: name,
              #description: description,
              #homepage: homepage,
              #private: private,
              #hasIssues: hasIssues,
              #hasWiki: hasWiki,
              #hasDownloads: hasDownloads,
            },
          ),
        )),
      ) as _i5.Future<_i3.Repository>);

  @override
  _i5.Future<bool> deleteRepository(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteRepository,
          [slug],
        ),
        returnValue: _i5.Future<bool>.value(false),
        returnValueForMissingStub: _i5.Future<bool>.value(false),
      ) as _i5.Future<bool>);

  @override
  _i5.Stream<_i3.Contributor> listContributors(
    _i3.RepositorySlug? slug, {
    bool? anon = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listContributors,
          [slug],
          {#anon: anon},
        ),
        returnValue: _i5.Stream<_i3.Contributor>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Contributor>.empty(),
      ) as _i5.Stream<_i3.Contributor>);

  @override
  _i5.Stream<_i3.Team> listTeams(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listTeams,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.Team>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Team>.empty(),
      ) as _i5.Stream<_i3.Team>);

  @override
  _i5.Future<_i3.LanguageBreakdown> listLanguages(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listLanguages,
          [slug],
        ),
        returnValue:
            _i5.Future<_i3.LanguageBreakdown>.value(_FakeLanguageBreakdown_23(
          this,
          Invocation.method(
            #listLanguages,
            [slug],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.LanguageBreakdown>.value(_FakeLanguageBreakdown_23(
          this,
          Invocation.method(
            #listLanguages,
            [slug],
          ),
        )),
      ) as _i5.Future<_i3.LanguageBreakdown>);

  @override
  _i5.Stream<_i3.Tag> listTags(
    _i3.RepositorySlug? slug, {
    int? page = 1,
    int? pages,
    int? perPage = 30,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listTags,
          [slug],
          {
            #page: page,
            #pages: pages,
            #perPage: perPage,
          },
        ),
        returnValue: _i5.Stream<_i3.Tag>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Tag>.empty(),
      ) as _i5.Stream<_i3.Tag>);

  @override
  _i5.Stream<_i3.Branch> listBranches(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listBranches,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.Branch>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Branch>.empty(),
      ) as _i5.Stream<_i3.Branch>);

  @override
  _i5.Future<_i3.Branch> getBranch(
    _i3.RepositorySlug? slug,
    String? branch,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBranch,
          [
            slug,
            branch,
          ],
        ),
        returnValue: _i5.Future<_i3.Branch>.value(_FakeBranch_24(
          this,
          Invocation.method(
            #getBranch,
            [
              slug,
              branch,
            ],
          ),
        )),
        returnValueForMissingStub: _i5.Future<_i3.Branch>.value(_FakeBranch_24(
          this,
          Invocation.method(
            #getBranch,
            [
              slug,
              branch,
            ],
          ),
        )),
      ) as _i5.Future<_i3.Branch>);

  @override
  _i5.Stream<_i3.Collaborator> listCollaborators(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCollaborators,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.Collaborator>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Collaborator>.empty(),
      ) as _i5.Stream<_i3.Collaborator>);

  @override
  _i5.Future<bool> isCollaborator(
    _i3.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i5.Future<bool>.value(false),
        returnValueForMissingStub: _i5.Future<bool>.value(false),
      ) as _i5.Future<bool>);

  @override
  _i5.Future<bool> addCollaborator(
    _i3.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #addCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i5.Future<bool>.value(false),
        returnValueForMissingStub: _i5.Future<bool>.value(false),
      ) as _i5.Future<bool>);

  @override
  _i5.Future<bool> removeCollaborator(
    _i3.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i5.Future<bool>.value(false),
        returnValueForMissingStub: _i5.Future<bool>.value(false),
      ) as _i5.Future<bool>);

  @override
  _i5.Stream<_i3.CommitComment> listSingleCommitComments(
    _i3.RepositorySlug? slug,
    _i3.RepositoryCommit? commit,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listSingleCommitComments,
          [
            slug,
            commit,
          ],
        ),
        returnValue: _i5.Stream<_i3.CommitComment>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.CommitComment>.empty(),
      ) as _i5.Stream<_i3.CommitComment>);

  @override
  _i5.Stream<_i3.CommitComment> listCommitComments(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommitComments,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.CommitComment>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.CommitComment>.empty(),
      ) as _i5.Stream<_i3.CommitComment>);

  @override
  _i5.Future<_i3.CommitComment> createCommitComment(
    _i3.RepositorySlug? slug,
    _i3.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: _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
          this,
          Invocation.method(
            #createCommitComment,
            [
              slug,
              commit,
            ],
            {
              #body: body,
              #path: path,
              #position: position,
              #line: line,
            },
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
          this,
          Invocation.method(
            #createCommitComment,
            [
              slug,
              commit,
            ],
            {
              #body: body,
              #path: path,
              #position: position,
              #line: line,
            },
          ),
        )),
      ) as _i5.Future<_i3.CommitComment>);

  @override
  _i5.Future<_i3.CommitComment> getCommitComment(
    _i3.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommitComment,
          [slug],
          {#id: id},
        ),
        returnValue: _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
          this,
          Invocation.method(
            #getCommitComment,
            [slug],
            {#id: id},
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
          this,
          Invocation.method(
            #getCommitComment,
            [slug],
            {#id: id},
          ),
        )),
      ) as _i5.Future<_i3.CommitComment>);

  @override
  _i5.Future<_i3.CommitComment> updateCommitComment(
    _i3.RepositorySlug? slug, {
    required int? id,
    required String? body,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateCommitComment,
          [slug],
          {
            #id: id,
            #body: body,
          },
        ),
        returnValue: _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
          this,
          Invocation.method(
            #updateCommitComment,
            [slug],
            {
              #id: id,
              #body: body,
            },
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
          this,
          Invocation.method(
            #updateCommitComment,
            [slug],
            {
              #id: id,
              #body: body,
            },
          ),
        )),
      ) as _i5.Future<_i3.CommitComment>);

  @override
  _i5.Future<bool> deleteCommitComment(
    _i3.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteCommitComment,
          [slug],
          {#id: id},
        ),
        returnValue: _i5.Future<bool>.value(false),
        returnValueForMissingStub: _i5.Future<bool>.value(false),
      ) as _i5.Future<bool>);

  @override
  _i5.Stream<_i3.RepositoryCommit> listCommits(
    _i3.RepositorySlug? slug, {
    String? sha,
    String? path,
    String? author,
    String? committer,
    DateTime? since,
    DateTime? until,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommits,
          [slug],
          {
            #sha: sha,
            #path: path,
            #author: author,
            #committer: committer,
            #since: since,
            #until: until,
          },
        ),
        returnValue: _i5.Stream<_i3.RepositoryCommit>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.RepositoryCommit>.empty(),
      ) as _i5.Stream<_i3.RepositoryCommit>);

  @override
  _i5.Future<_i3.RepositoryCommit> getCommit(
    _i3.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommit,
          [
            slug,
            sha,
          ],
        ),
        returnValue:
            _i5.Future<_i3.RepositoryCommit>.value(_FakeRepositoryCommit_26(
          this,
          Invocation.method(
            #getCommit,
            [
              slug,
              sha,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.RepositoryCommit>.value(_FakeRepositoryCommit_26(
          this,
          Invocation.method(
            #getCommit,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i5.Future<_i3.RepositoryCommit>);

  @override
  _i5.Future<String> getCommitDiff(
    _i3.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommitDiff,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i5.Future<String>.value(_i8.dummyValue<String>(
          this,
          Invocation.method(
            #getCommitDiff,
            [
              slug,
              sha,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<String>.value(_i8.dummyValue<String>(
          this,
          Invocation.method(
            #getCommitDiff,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i5.Future<String>);

  @override
  _i5.Future<_i3.GitHubComparison> compareCommits(
    _i3.RepositorySlug? slug,
    String? refBase,
    String? refHead,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #compareCommits,
          [
            slug,
            refBase,
            refHead,
          ],
        ),
        returnValue:
            _i5.Future<_i3.GitHubComparison>.value(_FakeGitHubComparison_27(
          this,
          Invocation.method(
            #compareCommits,
            [
              slug,
              refBase,
              refHead,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.GitHubComparison>.value(_FakeGitHubComparison_27(
          this,
          Invocation.method(
            #compareCommits,
            [
              slug,
              refBase,
              refHead,
            ],
          ),
        )),
      ) as _i5.Future<_i3.GitHubComparison>);

  @override
  _i5.Future<_i3.GitHubFile> getReadme(
    _i3.RepositorySlug? slug, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReadme,
          [slug],
          {#ref: ref},
        ),
        returnValue: _i5.Future<_i3.GitHubFile>.value(_FakeGitHubFile_28(
          this,
          Invocation.method(
            #getReadme,
            [slug],
            {#ref: ref},
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.GitHubFile>.value(_FakeGitHubFile_28(
          this,
          Invocation.method(
            #getReadme,
            [slug],
            {#ref: ref},
          ),
        )),
      ) as _i5.Future<_i3.GitHubFile>);

  @override
  _i5.Future<_i3.RepositoryContents> getContents(
    _i3.RepositorySlug? slug,
    String? path, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getContents,
          [
            slug,
            path,
          ],
          {#ref: ref},
        ),
        returnValue:
            _i5.Future<_i3.RepositoryContents>.value(_FakeRepositoryContents_29(
          this,
          Invocation.method(
            #getContents,
            [
              slug,
              path,
            ],
            {#ref: ref},
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.RepositoryContents>.value(_FakeRepositoryContents_29(
          this,
          Invocation.method(
            #getContents,
            [
              slug,
              path,
            ],
            {#ref: ref},
          ),
        )),
      ) as _i5.Future<_i3.RepositoryContents>);

  @override
  _i5.Future<_i3.ContentCreation> createFile(
    _i3.RepositorySlug? slug,
    _i3.CreateFile? file,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createFile,
          [
            slug,
            file,
          ],
        ),
        returnValue:
            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
          this,
          Invocation.method(
            #createFile,
            [
              slug,
              file,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
          this,
          Invocation.method(
            #createFile,
            [
              slug,
              file,
            ],
          ),
        )),
      ) as _i5.Future<_i3.ContentCreation>);

  @override
  _i5.Future<_i3.ContentCreation> updateFile(
    _i3.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:
            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
          this,
          Invocation.method(
            #updateFile,
            [
              slug,
              path,
              message,
              content,
              sha,
            ],
            {#branch: branch},
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
          this,
          Invocation.method(
            #updateFile,
            [
              slug,
              path,
              message,
              content,
              sha,
            ],
            {#branch: branch},
          ),
        )),
      ) as _i5.Future<_i3.ContentCreation>);

  @override
  _i5.Future<_i3.ContentCreation> deleteFile(
    _i3.RepositorySlug? slug,
    String? path,
    String? message,
    String? sha,
    String? branch,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteFile,
          [
            slug,
            path,
            message,
            sha,
            branch,
          ],
        ),
        returnValue:
            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
          this,
          Invocation.method(
            #deleteFile,
            [
              slug,
              path,
              message,
              sha,
              branch,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
          this,
          Invocation.method(
            #deleteFile,
            [
              slug,
              path,
              message,
              sha,
              branch,
            ],
          ),
        )),
      ) as _i5.Future<_i3.ContentCreation>);

  @override
  _i5.Future<String?> getArchiveLink(
    _i3.RepositorySlug? slug,
    String? ref, {
    String? format = r'tarball',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getArchiveLink,
          [
            slug,
            ref,
          ],
          {#format: format},
        ),
        returnValue: _i5.Future<String?>.value(),
        returnValueForMissingStub: _i5.Future<String?>.value(),
      ) as _i5.Future<String?>);

  @override
  _i5.Stream<_i3.Repository> listForks(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listForks,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.Repository>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
      ) as _i5.Stream<_i3.Repository>);

  @override
  _i5.Future<_i3.Repository> createFork(
    _i3.RepositorySlug? slug, [
    _i3.CreateFork? fork,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #createFork,
          [
            slug,
            fork,
          ],
        ),
        returnValue: _i5.Future<_i3.Repository>.value(_FakeRepository_21(
          this,
          Invocation.method(
            #createFork,
            [
              slug,
              fork,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.Repository>.value(_FakeRepository_21(
          this,
          Invocation.method(
            #createFork,
            [
              slug,
              fork,
            ],
          ),
        )),
      ) as _i5.Future<_i3.Repository>);

  @override
  _i5.Stream<_i3.Hook> listHooks(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listHooks,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.Hook>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Hook>.empty(),
      ) as _i5.Stream<_i3.Hook>);

  @override
  _i5.Future<_i3.Hook> getHook(
    _i3.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i5.Future<_i3.Hook>.value(_FakeHook_31(
          this,
          Invocation.method(
            #getHook,
            [
              slug,
              id,
            ],
          ),
        )),
        returnValueForMissingStub: _i5.Future<_i3.Hook>.value(_FakeHook_31(
          this,
          Invocation.method(
            #getHook,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i5.Future<_i3.Hook>);

  @override
  _i5.Future<_i3.Hook> createHook(
    _i3.RepositorySlug? slug,
    _i3.CreateHook? hook,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createHook,
          [
            slug,
            hook,
          ],
        ),
        returnValue: _i5.Future<_i3.Hook>.value(_FakeHook_31(
          this,
          Invocation.method(
            #createHook,
            [
              slug,
              hook,
            ],
          ),
        )),
        returnValueForMissingStub: _i5.Future<_i3.Hook>.value(_FakeHook_31(
          this,
          Invocation.method(
            #createHook,
            [
              slug,
              hook,
            ],
          ),
        )),
      ) as _i5.Future<_i3.Hook>);

  @override
  _i5.Future<_i3.Hook> editHook(
    _i3.RepositorySlug? slug,
    _i3.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: _i5.Future<_i3.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,
            },
          ),
        )),
        returnValueForMissingStub: _i5.Future<_i3.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 _i5.Future<_i3.Hook>);

  @override
  _i5.Future<bool> testPushHook(
    _i3.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #testPushHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i5.Future<bool>.value(false),
        returnValueForMissingStub: _i5.Future<bool>.value(false),
      ) as _i5.Future<bool>);

  @override
  _i5.Future<bool> pingHook(
    _i3.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #pingHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i5.Future<bool>.value(false),
        returnValueForMissingStub: _i5.Future<bool>.value(false),
      ) as _i5.Future<bool>);

  @override
  _i5.Future<bool> deleteHook(
    _i3.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i5.Future<bool>.value(false),
        returnValueForMissingStub: _i5.Future<bool>.value(false),
      ) as _i5.Future<bool>);

  @override
  _i5.Stream<_i3.PublicKey> listDeployKeys(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listDeployKeys,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.PublicKey>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.PublicKey>.empty(),
      ) as _i5.Stream<_i3.PublicKey>);

  @override
  _i5.Future<_i3.PublicKey> getDeployKey(
    _i3.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getDeployKey,
          [slug],
          {#id: id},
        ),
        returnValue: _i5.Future<_i3.PublicKey>.value(_FakePublicKey_32(
          this,
          Invocation.method(
            #getDeployKey,
            [slug],
            {#id: id},
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.PublicKey>.value(_FakePublicKey_32(
          this,
          Invocation.method(
            #getDeployKey,
            [slug],
            {#id: id},
          ),
        )),
      ) as _i5.Future<_i3.PublicKey>);

  @override
  _i5.Future<_i3.PublicKey> createDeployKey(
    _i3.RepositorySlug? slug,
    _i3.CreatePublicKey? key,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createDeployKey,
          [
            slug,
            key,
          ],
        ),
        returnValue: _i5.Future<_i3.PublicKey>.value(_FakePublicKey_32(
          this,
          Invocation.method(
            #createDeployKey,
            [
              slug,
              key,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.PublicKey>.value(_FakePublicKey_32(
          this,
          Invocation.method(
            #createDeployKey,
            [
              slug,
              key,
            ],
          ),
        )),
      ) as _i5.Future<_i3.PublicKey>);

  @override
  _i5.Future<bool> deleteDeployKey({
    required _i3.RepositorySlug? slug,
    required _i3.PublicKey? key,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteDeployKey,
          [],
          {
            #slug: slug,
            #key: key,
          },
        ),
        returnValue: _i5.Future<bool>.value(false),
        returnValueForMissingStub: _i5.Future<bool>.value(false),
      ) as _i5.Future<bool>);

  @override
  _i5.Future<_i3.RepositoryCommit> merge(
    _i3.RepositorySlug? slug,
    _i3.CreateMerge? merge,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #merge,
          [
            slug,
            merge,
          ],
        ),
        returnValue:
            _i5.Future<_i3.RepositoryCommit>.value(_FakeRepositoryCommit_26(
          this,
          Invocation.method(
            #merge,
            [
              slug,
              merge,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.RepositoryCommit>.value(_FakeRepositoryCommit_26(
          this,
          Invocation.method(
            #merge,
            [
              slug,
              merge,
            ],
          ),
        )),
      ) as _i5.Future<_i3.RepositoryCommit>);

  @override
  _i5.Future<_i3.RepositoryPages> getPagesInfo(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #getPagesInfo,
          [slug],
        ),
        returnValue:
            _i5.Future<_i3.RepositoryPages>.value(_FakeRepositoryPages_33(
          this,
          Invocation.method(
            #getPagesInfo,
            [slug],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.RepositoryPages>.value(_FakeRepositoryPages_33(
          this,
          Invocation.method(
            #getPagesInfo,
            [slug],
          ),
        )),
      ) as _i5.Future<_i3.RepositoryPages>);

  @override
  _i5.Stream<_i3.PageBuild> listPagesBuilds(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listPagesBuilds,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.PageBuild>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.PageBuild>.empty(),
      ) as _i5.Stream<_i3.PageBuild>);

  @override
  _i5.Future<_i3.PageBuild> getLatestPagesBuild(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #getLatestPagesBuild,
          [slug],
        ),
        returnValue: _i5.Future<_i3.PageBuild>.value(_FakePageBuild_34(
          this,
          Invocation.method(
            #getLatestPagesBuild,
            [slug],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.PageBuild>.value(_FakePageBuild_34(
          this,
          Invocation.method(
            #getLatestPagesBuild,
            [slug],
          ),
        )),
      ) as _i5.Future<_i3.PageBuild>);

  @override
  _i5.Stream<_i3.Release> listReleases(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReleases,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.Release>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.Release>.empty(),
      ) as _i5.Stream<_i3.Release>);

  @override
  _i5.Future<_i3.Release> getLatestRelease(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #getLatestRelease,
          [slug],
        ),
        returnValue: _i5.Future<_i3.Release>.value(_FakeRelease_35(
          this,
          Invocation.method(
            #getLatestRelease,
            [slug],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.Release>.value(_FakeRelease_35(
          this,
          Invocation.method(
            #getLatestRelease,
            [slug],
          ),
        )),
      ) as _i5.Future<_i3.Release>);

  @override
  _i5.Future<_i3.Release> getReleaseById(
    _i3.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseById,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i5.Future<_i3.Release>.value(_FakeRelease_35(
          this,
          Invocation.method(
            #getReleaseById,
            [
              slug,
              id,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.Release>.value(_FakeRelease_35(
          this,
          Invocation.method(
            #getReleaseById,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i5.Future<_i3.Release>);

  @override
  _i5.Future<_i3.Release> getReleaseByTagName(
    _i3.RepositorySlug? slug,
    String? tagName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseByTagName,
          [
            slug,
            tagName,
          ],
        ),
        returnValue: _i5.Future<_i3.Release>.value(_FakeRelease_35(
          this,
          Invocation.method(
            #getReleaseByTagName,
            [
              slug,
              tagName,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.Release>.value(_FakeRelease_35(
          this,
          Invocation.method(
            #getReleaseByTagName,
            [
              slug,
              tagName,
            ],
          ),
        )),
      ) as _i5.Future<_i3.Release>);

  @override
  _i5.Future<_i3.Release> createRelease(
    _i3.RepositorySlug? slug,
    _i3.CreateRelease? createRelease, {
    bool? getIfExists = true,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createRelease,
          [
            slug,
            createRelease,
          ],
          {#getIfExists: getIfExists},
        ),
        returnValue: _i5.Future<_i3.Release>.value(_FakeRelease_35(
          this,
          Invocation.method(
            #createRelease,
            [
              slug,
              createRelease,
            ],
            {#getIfExists: getIfExists},
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.Release>.value(_FakeRelease_35(
          this,
          Invocation.method(
            #createRelease,
            [
              slug,
              createRelease,
            ],
            {#getIfExists: getIfExists},
          ),
        )),
      ) as _i5.Future<_i3.Release>);

  @override
  _i5.Future<_i3.Release> editRelease(
    _i3.RepositorySlug? slug,
    _i3.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: _i5.Future<_i3.Release>.value(_FakeRelease_35(
          this,
          Invocation.method(
            #editRelease,
            [
              slug,
              releaseToEdit,
            ],
            {
              #tagName: tagName,
              #targetCommitish: targetCommitish,
              #name: name,
              #body: body,
              #draft: draft,
              #preRelease: preRelease,
            },
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.Release>.value(_FakeRelease_35(
          this,
          Invocation.method(
            #editRelease,
            [
              slug,
              releaseToEdit,
            ],
            {
              #tagName: tagName,
              #targetCommitish: targetCommitish,
              #name: name,
              #body: body,
              #draft: draft,
              #preRelease: preRelease,
            },
          ),
        )),
      ) as _i5.Future<_i3.Release>);

  @override
  _i5.Future<bool> deleteRelease(
    _i3.RepositorySlug? slug,
    _i3.Release? release,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteRelease,
          [
            slug,
            release,
          ],
        ),
        returnValue: _i5.Future<bool>.value(false),
        returnValueForMissingStub: _i5.Future<bool>.value(false),
      ) as _i5.Future<bool>);

  @override
  _i5.Stream<_i3.ReleaseAsset> listReleaseAssets(
    _i3.RepositorySlug? slug,
    _i3.Release? release,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReleaseAssets,
          [
            slug,
            release,
          ],
        ),
        returnValue: _i5.Stream<_i3.ReleaseAsset>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.ReleaseAsset>.empty(),
      ) as _i5.Stream<_i3.ReleaseAsset>);

  @override
  _i5.Future<_i3.ReleaseAsset> getReleaseAsset(
    _i3.RepositorySlug? slug,
    _i3.Release? release, {
    required int? assetId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseAsset,
          [
            slug,
            release,
          ],
          {#assetId: assetId},
        ),
        returnValue: _i5.Future<_i3.ReleaseAsset>.value(_FakeReleaseAsset_36(
          this,
          Invocation.method(
            #getReleaseAsset,
            [
              slug,
              release,
            ],
            {#assetId: assetId},
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.ReleaseAsset>.value(_FakeReleaseAsset_36(
          this,
          Invocation.method(
            #getReleaseAsset,
            [
              slug,
              release,
            ],
            {#assetId: assetId},
          ),
        )),
      ) as _i5.Future<_i3.ReleaseAsset>);

  @override
  _i5.Future<_i3.ReleaseAsset> editReleaseAsset(
    _i3.RepositorySlug? slug,
    _i3.ReleaseAsset? assetToEdit, {
    String? name,
    String? label,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #editReleaseAsset,
          [
            slug,
            assetToEdit,
          ],
          {
            #name: name,
            #label: label,
          },
        ),
        returnValue: _i5.Future<_i3.ReleaseAsset>.value(_FakeReleaseAsset_36(
          this,
          Invocation.method(
            #editReleaseAsset,
            [
              slug,
              assetToEdit,
            ],
            {
              #name: name,
              #label: label,
            },
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.ReleaseAsset>.value(_FakeReleaseAsset_36(
          this,
          Invocation.method(
            #editReleaseAsset,
            [
              slug,
              assetToEdit,
            ],
            {
              #name: name,
              #label: label,
            },
          ),
        )),
      ) as _i5.Future<_i3.ReleaseAsset>);

  @override
  _i5.Future<bool> deleteReleaseAsset(
    _i3.RepositorySlug? slug,
    _i3.ReleaseAsset? asset,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteReleaseAsset,
          [
            slug,
            asset,
          ],
        ),
        returnValue: _i5.Future<bool>.value(false),
        returnValueForMissingStub: _i5.Future<bool>.value(false),
      ) as _i5.Future<bool>);

  @override
  _i5.Future<List<_i3.ReleaseAsset>> uploadReleaseAssets(
    _i3.Release? release,
    Iterable<_i3.CreateReleaseAsset>? createReleaseAssets,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #uploadReleaseAssets,
          [
            release,
            createReleaseAssets,
          ],
        ),
        returnValue:
            _i5.Future<List<_i3.ReleaseAsset>>.value(<_i3.ReleaseAsset>[]),
        returnValueForMissingStub:
            _i5.Future<List<_i3.ReleaseAsset>>.value(<_i3.ReleaseAsset>[]),
      ) as _i5.Future<List<_i3.ReleaseAsset>>);

  @override
  _i5.Future<List<_i3.ContributorStatistics>> listContributorStats(
          _i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listContributorStats,
          [slug],
        ),
        returnValue: _i5.Future<List<_i3.ContributorStatistics>>.value(
            <_i3.ContributorStatistics>[]),
        returnValueForMissingStub:
            _i5.Future<List<_i3.ContributorStatistics>>.value(
                <_i3.ContributorStatistics>[]),
      ) as _i5.Future<List<_i3.ContributorStatistics>>);

  @override
  _i5.Stream<_i3.YearCommitCountWeek> listCommitActivity(
          _i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommitActivity,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.YearCommitCountWeek>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.YearCommitCountWeek>.empty(),
      ) as _i5.Stream<_i3.YearCommitCountWeek>);

  @override
  _i5.Stream<_i3.WeeklyChangesCount> listCodeFrequency(
          _i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCodeFrequency,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.WeeklyChangesCount>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.WeeklyChangesCount>.empty(),
      ) as _i5.Stream<_i3.WeeklyChangesCount>);

  @override
  _i5.Future<_i3.ContributorParticipation> getParticipation(
          _i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #getParticipation,
          [slug],
        ),
        returnValue: _i5.Future<_i3.ContributorParticipation>.value(
            _FakeContributorParticipation_37(
          this,
          Invocation.method(
            #getParticipation,
            [slug],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.ContributorParticipation>.value(
                _FakeContributorParticipation_37(
          this,
          Invocation.method(
            #getParticipation,
            [slug],
          ),
        )),
      ) as _i5.Future<_i3.ContributorParticipation>);

  @override
  _i5.Stream<_i3.PunchcardEntry> listPunchcard(_i3.RepositorySlug? slug) =>
      (super.noSuchMethod(
        Invocation.method(
          #listPunchcard,
          [slug],
        ),
        returnValue: _i5.Stream<_i3.PunchcardEntry>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.PunchcardEntry>.empty(),
      ) as _i5.Stream<_i3.PunchcardEntry>);

  @override
  _i5.Stream<_i3.RepositoryStatus> listStatuses(
    _i3.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listStatuses,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i5.Stream<_i3.RepositoryStatus>.empty(),
        returnValueForMissingStub: _i5.Stream<_i3.RepositoryStatus>.empty(),
      ) as _i5.Stream<_i3.RepositoryStatus>);

  @override
  _i5.Future<_i3.RepositoryStatus> createStatus(
    _i3.RepositorySlug? slug,
    String? ref,
    _i3.CreateStatus? request,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createStatus,
          [
            slug,
            ref,
            request,
          ],
        ),
        returnValue:
            _i5.Future<_i3.RepositoryStatus>.value(_FakeRepositoryStatus_38(
          this,
          Invocation.method(
            #createStatus,
            [
              slug,
              ref,
              request,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.RepositoryStatus>.value(_FakeRepositoryStatus_38(
          this,
          Invocation.method(
            #createStatus,
            [
              slug,
              ref,
              request,
            ],
          ),
        )),
      ) as _i5.Future<_i3.RepositoryStatus>);

  @override
  _i5.Future<_i3.CombinedRepositoryStatus> getCombinedStatus(
    _i3.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCombinedStatus,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i5.Future<_i3.CombinedRepositoryStatus>.value(
            _FakeCombinedRepositoryStatus_39(
          this,
          Invocation.method(
            #getCombinedStatus,
            [
              slug,
              ref,
            ],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.CombinedRepositoryStatus>.value(
                _FakeCombinedRepositoryStatus_39(
          this,
          Invocation.method(
            #getCombinedStatus,
            [
              slug,
              ref,
            ],
          ),
        )),
      ) as _i5.Future<_i3.CombinedRepositoryStatus>);

  @override
  _i5.Future<_i3.ReleaseNotes> generateReleaseNotes(
          _i3.CreateReleaseNotes? crn) =>
      (super.noSuchMethod(
        Invocation.method(
          #generateReleaseNotes,
          [crn],
        ),
        returnValue: _i5.Future<_i3.ReleaseNotes>.value(_FakeReleaseNotes_40(
          this,
          Invocation.method(
            #generateReleaseNotes,
            [crn],
          ),
        )),
        returnValueForMissingStub:
            _i5.Future<_i3.ReleaseNotes>.value(_FakeReleaseNotes_40(
          this,
          Invocation.method(
            #generateReleaseNotes,
            [crn],
          ),
        )),
      ) as _i5.Future<_i3.ReleaseNotes>);
}

/// A class which mocks [RepositoryCommit].
///
/// See the documentation for Mockito's code generation for more information.
class MockRepositoryCommit extends _i1.Mock implements _i3.RepositoryCommit {
  @override
  set url(String? _url) => super.noSuchMethod(
        Invocation.setter(
          #url,
          _url,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set sha(String? _sha) => super.noSuchMethod(
        Invocation.setter(
          #sha,
          _sha,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set htmlUrl(String? _htmlUrl) => super.noSuchMethod(
        Invocation.setter(
          #htmlUrl,
          _htmlUrl,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set commentsUrl(String? _commentsUrl) => super.noSuchMethod(
        Invocation.setter(
          #commentsUrl,
          _commentsUrl,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set commit(_i3.GitCommit? _commit) => super.noSuchMethod(
        Invocation.setter(
          #commit,
          _commit,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set author(_i3.User? _author) => super.noSuchMethod(
        Invocation.setter(
          #author,
          _author,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set committer(_i3.User? _committer) => super.noSuchMethod(
        Invocation.setter(
          #committer,
          _committer,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set parents(List<_i3.GitCommit>? _parents) => super.noSuchMethod(
        Invocation.setter(
          #parents,
          _parents,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set stats(_i3.CommitStats? _stats) => super.noSuchMethod(
        Invocation.setter(
          #stats,
          _stats,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set files(List<_i3.CommitFile>? _files) => super.noSuchMethod(
        Invocation.setter(
          #files,
          _files,
        ),
        returnValueForMissingStub: null,
      );

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