/** @file MockShellLib.h
  Google Test mocks for ShellLib

  Copyright (c) Microsoft Corporation.
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#pragma once

#include <Library/GoogleTestLib.h>
#include <Library/FunctionMockLib.h>
extern "C" {
  #include <Uefi.h>
  #include <Library/ShellLib.h>
}

struct MockShellLib {
  MOCK_INTERFACE_DECLARATION (MockShellLib);

  MOCK_FUNCTION_DECLARATION (
    CHAR16 *,
    FullyQualifyPath,
    (IN CONST CHAR16  *Path)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_FILE_INFO *,
    ShellGetFileInfo,
    (IN SHELL_FILE_HANDLE  FileHandle)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellSetFileInfo,
    (IN SHELL_FILE_HANDLE  FileHandle,
     IN EFI_FILE_INFO      *FileInfo)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellOpenFileByDevicePath,
    (IN OUT EFI_DEVICE_PATH_PROTOCOL  **FilePath,
     OUT    SHELL_FILE_HANDLE         *FileHandle,
     IN     UINT64                    OpenMode,
     IN     UINT64                    Attributes)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellOpenFileByName,
    (IN CONST CHAR16             *FileName,
     OUT      SHELL_FILE_HANDLE  *FileHandle,
     IN       UINT64             OpenMode,
     IN       UINT64             Attributes)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellCreateDirectory,
    (IN CONST CHAR16             *DirectoryName,
     OUT      SHELL_FILE_HANDLE  *FileHandle)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellReadFile,
    (IN     SHELL_FILE_HANDLE  FileHandle,
     IN OUT UINTN              *ReadSize,
     OUT    VOID               *Buffer)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellWriteFile,
    (IN     SHELL_FILE_HANDLE  FileHandle,
     IN OUT UINTN              *BufferSize,
     IN     VOID               *Buffer)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellCloseFile,
    (IN SHELL_FILE_HANDLE  *FileHandle)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellDeleteFile,
    (IN SHELL_FILE_HANDLE  *FileHandle)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellSetFilePosition,
    (IN SHELL_FILE_HANDLE  FileHandle,
     IN UINT64             Position)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellGetFilePosition,
    (IN  SHELL_FILE_HANDLE  FileHandle,
     OUT UINT64             *Position)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellFlushFile,
    (IN SHELL_FILE_HANDLE  FileHandle)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellFindFirstFile,
    (IN  SHELL_FILE_HANDLE  DirHandle,
     OUT EFI_FILE_INFO      **Buffer)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellFindNextFile,
    (IN     SHELL_FILE_HANDLE  DirHandle,
     IN OUT EFI_FILE_INFO      *Buffer,
     IN OUT BOOLEAN            *NoFile)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellGetFileSize,
    (IN  SHELL_FILE_HANDLE  FileHandle,
     OUT UINT64             *Size)
    );

  MOCK_FUNCTION_DECLARATION (
    BOOLEAN,
    ShellGetExecutionBreakFlag,
    ()
    );

  MOCK_FUNCTION_DECLARATION (
    CONST CHAR16 *,
    ShellGetEnvironmentVariable,
    (IN CONST CHAR16  *EnvKey)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellSetEnvironmentVariable,
    (IN CONST CHAR16   *EnvKey,
     IN CONST CHAR16   *EnvVal,
     IN       BOOLEAN  Volatile)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellExecute,
    (IN  EFI_HANDLE  *ParentHandle,
     IN  CHAR16      *CommandLine,
     IN  BOOLEAN     Output,
     IN  CHAR16      **EnvironmentVariables,
     OUT EFI_STATUS  *Status)
    );

  MOCK_FUNCTION_DECLARATION (
    CONST CHAR16 *,
    ShellGetCurrentDir,
    (IN CHAR16  *CONST DeviceName OPTIONAL)
    );

  MOCK_FUNCTION_DECLARATION (
    VOID,
    ShellSetPageBreakMode,
    (IN BOOLEAN  CurrentState)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellOpenFileMetaArg,
    (IN     CHAR16               *Arg,
     IN     UINT64               OpenMode,
     IN OUT EFI_SHELL_FILE_INFO  **ListHead)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellCloseFileMetaArg,
    (IN OUT EFI_SHELL_FILE_INFO  **ListHead)
    );

  MOCK_FUNCTION_DECLARATION (
    CHAR16 *,
    ShellFindFilePath,
    (IN CONST CHAR16  *FileName)
    );

  MOCK_FUNCTION_DECLARATION (
    CHAR16 *,
    ShellFindFilePathEx,
    (IN CONST CHAR16  *FileName,
     IN CONST CHAR16  *FileExtension)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellCommandLineParseEx,
    (IN CONST SHELL_PARAM_ITEM  *CheckList,
     OUT      LIST_ENTRY        **CheckPackage,
     OUT      CHAR16            **ProblemParam OPTIONAL,
     IN       BOOLEAN           AutoPageBreak,
     IN       BOOLEAN           AlwaysAllowNumbers)
    );

  MOCK_FUNCTION_DECLARATION (
    VOID,
    ShellCommandLineFreeVarList,
    (IN LIST_ENTRY  *CheckPackage)
    );

  MOCK_FUNCTION_DECLARATION (
    BOOLEAN,
    ShellCommandLineGetFlag,
    (IN CONST LIST_ENTRY  *CONST CheckPackage,
     IN CONST CHAR16      *CONST KeyString)
    );

  MOCK_FUNCTION_DECLARATION (
    CONST CHAR16 *,
    ShellCommandLineGetValue,
    (IN CONST LIST_ENTRY  *CheckPackage,
     IN       CHAR16      *KeyString)
    );

  MOCK_FUNCTION_DECLARATION (
    CONST CHAR16 *,
    ShellCommandLineGetRawValue,
    (IN CONST LIST_ENTRY  *CONST CheckPackage,
     IN       UINTN       Position)
    );

  MOCK_FUNCTION_DECLARATION (
    UINTN,
    ShellCommandLineGetCount,
    (IN CONST LIST_ENTRY  *CheckPackage)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellCommandLineCheckDuplicate,
    (IN CONST LIST_ENTRY  *CheckPackage,
     OUT      CHAR16      **Param)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellInitialize,
    ()
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellIsDirectory,
    (IN CONST CHAR16  *DirName)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellIsFile,
    (IN CONST CHAR16  *Name)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellIsFileInPath,
    (IN CONST CHAR16  *Name)
    );

  MOCK_FUNCTION_DECLARATION (
    UINTN,
    ShellStrToUintn,
    (IN CONST CHAR16  *String)
    );

  MOCK_FUNCTION_DECLARATION (
    UINTN,
    ShellHexStrToUintn,
    (IN CONST CHAR16  *String)
    );

  MOCK_FUNCTION_DECLARATION (
    CHAR16 *,
    StrnCatGrow,
    (IN OUT   CHAR16  **Destination,
     IN OUT   UINTN   *CurrentSize,
     IN CONST CHAR16  *Source,
     IN       UINTN   Count)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellCopySearchAndReplace,
    (IN CONST CHAR16   *SourceString,
     IN OUT   CHAR16   *NewString,
     IN       UINTN    NewSize,
     IN CONST CHAR16   *FindTarget,
     IN CONST CHAR16   *ReplaceWith,
     IN CONST BOOLEAN  SkipPreCarrot,
     IN CONST BOOLEAN  ParameterReplacing)
    );

  MOCK_FUNCTION_DECLARATION (
    BOOLEAN,
    ShellIsHexaDecimalDigitCharacter,
    (IN CHAR16  Char)
    );

  MOCK_FUNCTION_DECLARATION (
    BOOLEAN,
    ShellIsDecimalDigitCharacter,
    (IN CHAR16  Char)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellPromptForResponse,
    (IN     SHELL_PROMPT_REQUEST_TYPE  Type,
     IN     CHAR16                     *Prompt OPTIONAL,
     IN OUT VOID                       **Response OPTIONAL)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellPromptForResponseHii,
    (IN       SHELL_PROMPT_REQUEST_TYPE  Type,
     IN CONST EFI_STRING_ID              HiiFormatStringId,
     IN CONST EFI_HII_HANDLE             HiiFormatHandle,
     IN OUT   VOID                       **Response)
    );

  MOCK_FUNCTION_DECLARATION (
    BOOLEAN,
    ShellIsHexOrDecimalNumber,
    (IN CONST CHAR16   *String,
     IN CONST BOOLEAN  ForceHex,
     IN CONST BOOLEAN  StopAtSpace)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellConvertStringToUint64,
    (IN CONST CHAR16   *String,
     OUT      UINT64   *Value,
     IN CONST BOOLEAN  ForceHex,
     IN CONST BOOLEAN  StopAtSpace)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellFileExists,
    (IN CONST CHAR16  *Name)
    );

  MOCK_FUNCTION_DECLARATION (
    CHAR16 *,
    ShellFileHandleReturnLine,
    (IN     SHELL_FILE_HANDLE  Handle,
     IN OUT BOOLEAN            *Ascii)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellFileHandleReadLine,
    (IN     SHELL_FILE_HANDLE  Handle,
     IN OUT CHAR16             *Buffer,
     IN OUT UINTN              *Size,
     IN     BOOLEAN            Truncate,
     IN OUT BOOLEAN            *Ascii)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellDeleteFileByName,
    (IN CONST CHAR16  *FileName)
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    ShellPrintHelp,
    (IN CONST CHAR16   *CommandToGetHelpOn,
     IN CONST CHAR16   *SectionToGetHelpOn,
     IN       BOOLEAN  PrintCommandText)
    );
};
