/** @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)
    );
};
