Example #1
0
FDE_CSSSYNTAXSTATUS CFDE_CSSSyntaxParser::DoSyntaxParse() {
  while (m_eStatus >= FDE_CSSSYNTAXSTATUS_None) {
    if (m_TextPlane.IsEOF()) {
      if (m_pStream == NULL) {
        if (m_eMode == FDE_CSSSYNTAXMODE_PropertyValue &&
            m_TextData.GetLength() > 0) {
          SaveTextData();
          return m_eStatus = FDE_CSSSYNTAXSTATUS_PropertyValue;
        }
        return m_eStatus = FDE_CSSSYNTAXSTATUS_EOS;
      }
      FX_BOOL bEOS;
      int32_t iLen = m_TextPlane.LoadFromStream(m_pStream, m_iStreamPos,
                                                m_iPlaneSize, bEOS);
      m_iStreamPos = m_pStream->GetPosition();
      if (iLen < 1) {
        if (m_eMode == FDE_CSSSYNTAXMODE_PropertyValue &&
            m_TextData.GetLength() > 0) {
          SaveTextData();
          return m_eStatus = FDE_CSSSYNTAXSTATUS_PropertyValue;
        }
        return m_eStatus = FDE_CSSSYNTAXSTATUS_EOS;
      }
    }
    FX_WCHAR wch;
    while (!m_TextPlane.IsEOF()) {
      wch = m_TextPlane.GetChar();
      switch (m_eMode) {
        case FDE_CSSSYNTAXMODE_RuleSet:
          switch (wch) {
            case '@':
              m_TextPlane.MoveNext();
              SwitchMode(FDE_CSSSYNTAXMODE_AtRule);
              break;
            case '}':
              m_TextPlane.MoveNext();
              if (RestoreMode()) {
                return FDE_CSSSYNTAXSTATUS_DeclClose;
              } else {
                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
              }
              break;
            case '/':
              if (m_TextPlane.GetNextChar() == '*') {
                m_ModeStack.Push(m_eMode);
                SwitchMode(FDE_CSSSYNTAXMODE_Comment);
                break;
              }
            default:
              if (wch <= ' ') {
                m_TextPlane.MoveNext();
              } else if (FDE_IsSelectorStart(wch)) {
                SwitchMode(FDE_CSSSYNTAXMODE_Selector);
                return FDE_CSSSYNTAXSTATUS_StyleRule;
              } else {
                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
              }
              break;
          }
          break;
        case FDE_CSSSYNTAXMODE_Selector:
          switch (wch) {
            case ',':
              m_TextPlane.MoveNext();
              SwitchMode(FDE_CSSSYNTAXMODE_Selector);
              if (m_iTextDatLen > 0) {
                return FDE_CSSSYNTAXSTATUS_Selector;
              }
              break;
            case '{':
              if (m_TextData.GetLength() > 0) {
                SaveTextData();
                return FDE_CSSSYNTAXSTATUS_Selector;
              } else {
                m_TextPlane.MoveNext();
                m_ModeStack.Push(FDE_CSSSYNTAXMODE_RuleSet);
                SwitchMode(FDE_CSSSYNTAXMODE_PropertyName);
                return FDE_CSSSYNTAXSTATUS_DeclOpen;
              }
              break;
            case '/':
              if (m_TextPlane.GetNextChar() == '*') {
                if (SwitchToComment() > 0) {
                  return FDE_CSSSYNTAXSTATUS_Selector;
                }
                break;
              }
            default:
              AppendChar(wch);
              break;
          }
          break;
        case FDE_CSSSYNTAXMODE_PropertyName:
          switch (wch) {
            case ':':
              m_TextPlane.MoveNext();
              SwitchMode(FDE_CSSSYNTAXMODE_PropertyValue);
              return FDE_CSSSYNTAXSTATUS_PropertyName;
            case '}':
              m_TextPlane.MoveNext();
              if (RestoreMode()) {
                return FDE_CSSSYNTAXSTATUS_DeclClose;
              } else {
                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
              }
              break;
            case '/':
              if (m_TextPlane.GetNextChar() == '*') {
                if (SwitchToComment() > 0) {
                  return FDE_CSSSYNTAXSTATUS_PropertyName;
                }
                break;
              }
            default:
              AppendChar(wch);
              break;
          }
          break;
        case FDE_CSSSYNTAXMODE_PropertyValue:
          switch (wch) {
            case ';':
              m_TextPlane.MoveNext();
            case '}':
              SwitchMode(FDE_CSSSYNTAXMODE_PropertyName);
              return FDE_CSSSYNTAXSTATUS_PropertyValue;
            case '/':
              if (m_TextPlane.GetNextChar() == '*') {
                if (SwitchToComment() > 0) {
                  return FDE_CSSSYNTAXSTATUS_PropertyValue;
                }
                break;
              }
            default:
              AppendChar(wch);
              break;
          }
          break;
        case FDE_CSSSYNTAXMODE_Comment:
          if (wch == '/' && m_TextData.GetLength() > 0 &&
              m_TextData.GetAt(m_TextData.GetLength() - 1) == '*') {
            RestoreMode();
          } else {
            m_TextData.AppendChar(wch);
          }
          m_TextPlane.MoveNext();
          break;
        case FDE_CSSSYNTAXMODE_MediaType:
          switch (wch) {
            case ',':
              m_TextPlane.MoveNext();
              SwitchMode(FDE_CSSSYNTAXMODE_MediaType);
              if (m_iTextDatLen > 0) {
                return FDE_CSSSYNTAXSTATUS_MediaType;
              }
              break;
            case '{': {
              FDE_CSSSYNTAXMODE* pMode = m_ModeStack.GetTopElement();
              if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_MediaRule) {
                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
              }
              if (m_TextData.GetLength() > 0) {
                SaveTextData();
                return FDE_CSSSYNTAXSTATUS_MediaType;
              } else {
                m_TextPlane.MoveNext();
                *pMode = FDE_CSSSYNTAXMODE_RuleSet;
                SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
                return FDE_CSSSYNTAXSTATUS_DeclOpen;
              }
            } break;
            case ';': {
              FDE_CSSSYNTAXMODE* pMode = m_ModeStack.GetTopElement();
              if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_Import) {
                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
              }
              if (m_TextData.GetLength() > 0) {
                SaveTextData();
                if (IsImportEnabled()) {
                  return FDE_CSSSYNTAXSTATUS_MediaType;
                }
              } else {
                FX_BOOL bEnabled = IsImportEnabled();
                m_TextPlane.MoveNext();
                m_ModeStack.Pop();
                SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
                if (bEnabled) {
                  DisableImport();
                  return FDE_CSSSYNTAXSTATUS_ImportClose;
                }
              }
            } break;
            case '/':
              if (m_TextPlane.GetNextChar() == '*') {
                if (SwitchToComment() > 0) {
                  return FDE_CSSSYNTAXSTATUS_MediaType;
                }
                break;
              }
            default:
              AppendChar(wch);
              break;
          }
          break;
        case FDE_CSSSYNTAXMODE_URI: {
          FDE_CSSSYNTAXMODE* pMode = m_ModeStack.GetTopElement();
          if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_Import) {
            return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
          }
          if (wch <= ' ' || wch == ';') {
            int32_t iURIStart, iURILength = m_TextData.GetLength();
            if (iURILength > 0 &&
                FDE_ParseCSSURI(m_TextData.GetBuffer(), iURILength, iURIStart,
                                iURILength)) {
              m_TextData.Subtract(iURIStart, iURILength);
              SwitchMode(FDE_CSSSYNTAXMODE_MediaType);
              if (IsImportEnabled()) {
                return FDE_CSSSYNTAXSTATUS_URI;
              } else {
                break;
              }
            }
          }
          AppendChar(wch);
        } break;
        case FDE_CSSSYNTAXMODE_AtRule:
          if (wch > ' ') {
            AppendChar(wch);
          } else {
            int32_t iLen = m_TextData.GetLength();
            const FX_WCHAR* psz = m_TextData.GetBuffer();
            if (FXSYS_wcsncmp(L"charset", psz, iLen) == 0) {
              SwitchMode(FDE_CSSSYNTAXMODE_Charset);
            } else if (FXSYS_wcsncmp(L"import", psz, iLen) == 0) {
              m_ModeStack.Push(FDE_CSSSYNTAXMODE_Import);
              SwitchMode(FDE_CSSSYNTAXMODE_URI);
              if (IsImportEnabled()) {
                return FDE_CSSSYNTAXSTATUS_ImportRule;
              } else {
                break;
              }
            } else if (FXSYS_wcsncmp(L"media", psz, iLen) == 0) {
              m_ModeStack.Push(FDE_CSSSYNTAXMODE_MediaRule);
              SwitchMode(FDE_CSSSYNTAXMODE_MediaType);
              return FDE_CSSSYNTAXSTATUS_MediaRule;
            } else if (FXSYS_wcsncmp(L"font-face", psz, iLen) == 0) {
              SwitchMode(FDE_CSSSYNTAXMODE_Selector);
              return FDE_CSSSYNTAXSTATUS_FontFaceRule;
            } else if (FXSYS_wcsncmp(L"page", psz, iLen) == 0) {
              SwitchMode(FDE_CSSSYNTAXMODE_Selector);
              return FDE_CSSSYNTAXSTATUS_PageRule;
            } else {
              SwitchMode(FDE_CSSSYNTAXMODE_UnknownRule);
            }
          }
          break;
        case FDE_CSSSYNTAXMODE_Charset:
          if (wch == ';') {
            m_TextPlane.MoveNext();
            SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
            if (IsCharsetEnabled()) {
              DisableCharset();
              if (m_iTextDatLen > 0) {
                if (m_pStream != NULL) {
                  FX_WORD wCodePage = FX_GetCodePageFormStringW(
                      m_TextData.GetBuffer(), m_iTextDatLen);
                  if (wCodePage < 0xFFFF &&
                      m_pStream->GetCodePage() != wCodePage) {
                    m_pStream->SetCodePage(wCodePage);
                  }
                }
                return FDE_CSSSYNTAXSTATUS_Charset;
              }
            }
          } else {
            AppendChar(wch);
          }
          break;
        case FDE_CSSSYNTAXMODE_UnknownRule:
          if (wch == ';') {
            SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
          }
          m_TextPlane.MoveNext();
          break;
        default:
          FXSYS_assert(FALSE);
          break;
      }
    }
  }
  return m_eStatus;
}
//
// TDS 4.2.6
//
EFI_STATUS
BBTestSetCursorPositionConformanceAutoTest (
    IN EFI_BB_TEST_PROTOCOL       *This,
    IN VOID                       *ClientInterface,
    IN EFI_TEST_LEVEL             TestLevel,
    IN EFI_HANDLE                 SupportHandle
  )
{
  EFI_STANDARD_TEST_LIBRARY_PROTOCOL   *StandardLib;
  EFI_STATUS                           Status;
  EFI_SIMPLE_TEXT_OUT_PROTOCOL         *SimpleOut;
  EFI_TEST_ASSERTION                   AssertionType;

  EFI_SIMPLE_TEXT_OUTPUT_MODE          ModeOrg, ModeExpected;
  INT32                                Mode;
  UINTN                                ColumnTest[10], RowTest[10];
  UINTN                                Column, Row;

  UINTN                                Index;

  EFI_GRAPHICS_OUTPUT_PROTOCOL                *GraphicsOutput;
  EFI_DEVICE_PATH_PROTOCOL             *DevicePath;
  CHAR16                               *DevicePathStr;

  //
  // Get the Standard Library Interface
  //
  Status = gtBS->HandleProtocol (
                   SupportHandle,
                   &gEfiStandardTestLibraryGuid,
                   &StandardLib
                   );

  if (EFI_ERROR(Status)) {
    StandardLib->RecordAssertion (
                   StandardLib,
                   EFI_TEST_ASSERTION_FAILED,
                   gTestGenericFailureGuid,
                   L"BS.HandleProtocol - Handle standard test library",
                   L"%a:%d:Status - %r",
                   __FILE__,
                   (UINTN)__LINE__,
                   Status
                   );
    return Status;
  }

  SimpleOut = (EFI_SIMPLE_TEXT_OUT_PROTOCOL *)ClientInterface;

  //
  // Get Device Path of current Simple_Text_Output_Protocol
  // And out put device path or device name
  //
  Status = LocateDevicePathFromSimpleTextOut (SimpleOut, &DevicePath, StandardLib);
  if (Status == EFI_SUCCESS) {
    DevicePathStr = DevicePathToStr (DevicePath);
    if (DevicePathStr != NULL) {
      StandardLib->RecordMessage (
                     StandardLib,
                     EFI_VERBOSE_LEVEL_DEFAULT,
                     L"\r\nCurrent Device: %s",
                     DevicePathStr
                     );
      Status = gtBS->FreePool (DevicePathStr);
      if (EFI_ERROR(Status)) {
        StandardLib->RecordAssertion (
                       StandardLib,
                       EFI_TEST_ASSERTION_FAILED,
                       gTestGenericFailureGuid,
                       L"BS.FreePool - Free pool",
                       L"%a:%d:Status - %r",
                       __FILE__,
                       (UINTN)__LINE__,
                       Status
                       );
        return Status;
      }
      DevicePathStr = NULL;
    }
  } else {
    Status = LocateGopFromSimpleTextOut (SimpleOut, &GraphicsOutput, StandardLib);
    if (EFI_ERROR(Status)) {
      //
      // Console Splitter/StdErr
      //
      StandardLib->RecordMessage (
                     StandardLib,
                     EFI_VERBOSE_LEVEL_DEFAULT,
                     L"\r\nCurrent Device: ConsoleSplitter/StdErr"
                     );
    } else {
      //
      // Console Splitter/ConOut
      //
      StandardLib->RecordMessage (
                     StandardLib,
                     EFI_VERBOSE_LEVEL_DEFAULT,
                     L"\r\nCurrent Device: ConsoleSplitter/ConOut"
                     );
    }
  }

  //
  // Backup Mode
  //
  BackupMode (SimpleOut, &ModeOrg);

  //
  // For each mode supported!
  //
  for (Mode = 0; Mode < SimpleOut->Mode->MaxMode; Mode++) {
    //
    // Change mode
    //
    Status = SimpleOut->SetMode (SimpleOut, Mode);
    if (EFI_ERROR(Status)) {
      AssertionType = EFI_TEST_ASSERTION_FAILED;
      StandardLib->RecordAssertion (
                     StandardLib,
                     AssertionType,
                     gTestGenericFailureGuid,
                     L"EFI_SIMPLE_TEXT_OUT_PROTOCOL.SetMode - SetMode() with valid mode",
                     L"%a:%d: Status = %r, Mode = %d",
                     __FILE__,
                     (UINTN)__LINE__,
                     Status,
                     Mode
                     );
      continue;
    }

    //
    // Get Mode's screen boundary
    //
    Status = SimpleOut->QueryMode (SimpleOut, Mode, &Column, &Row);
    if (EFI_ERROR(Status)) {
      AssertionType = EFI_TEST_ASSERTION_FAILED;
      StandardLib->RecordAssertion (
                     StandardLib,
                     AssertionType,
                     gTestGenericFailureGuid,
                     L"EFI_SIMPLE_TEXT_OUT_PROTOCOL.QueryMode - QueryMode() with valid mode",
                     L"%a:%d: Status = %r, Mode = %d",
                     __FILE__,
                     (UINTN)__LINE__,
                     Status,
                     Mode
                     );
      continue;
    }

    //
    // Prepare test data
    //
    ColumnTest[0] = Column;
    RowTest[0]    = Row - 1;
    ColumnTest[1] = Column;
    RowTest[1]    = 0;
    ColumnTest[2] = Column + 1;
    RowTest[2]    = Row - 1;
    ColumnTest[3] = Column + 1;
    RowTest[3]    = 0;
    ColumnTest[4] = 0;
    RowTest[4]    = Row;
    ColumnTest[5] = Column - 1;
    RowTest[5]    = Row;
    ColumnTest[6] = Column - 1;
    RowTest[6]    = Row + 1;
    ColumnTest[7] = 0;
    RowTest[7]    = Row + 1;

    for (Index = 0; Index < 8; Index++) {
      //
      // Prepare expected Mode after call Reset.
      //
      BackupMode (SimpleOut, &ModeExpected);

      //
      // Call SetAttribute with invalid Attribute
      //
      Status = SimpleOut->SetCursorPosition (SimpleOut, ColumnTest[Index], RowTest[Index]);

      //
      // Mode itegrity test
      //
      if (CheckModeIntegrity (&ModeExpected, SimpleOut->Mode) == FALSE) {
        AssertionType = EFI_TEST_ASSERTION_FAILED;
      } else {
        AssertionType = EFI_TEST_ASSERTION_PASSED;
      }
      StandardLib->RecordAssertion (
                     StandardLib,
                     AssertionType,
                     gSimpleTextOutputConformanceTestAssertionGuid009,
                     L"EFI_SIMPLE_TEXT_OUT_PROTOCOL.SetCursorPosition - SetCursorPosition() with invalid position, mode position integrity",
                     L"%a:%d: Mode=%d, Positoin=(%d x %d) Current: Cursor Position(%d x %d), Mode=%d, MaxMode=%d, Attribute=%d, CursorVisible=%d. "\
                     L" Expected:Cursor Position(%d x %d), Mode=%d, MaxMode=%d, Attribute=%d, CursorVisible=%d.",
                     __FILE__,
                     (UINTN)__LINE__,
                     Mode,
                     ColumnTest[Index],
                     RowTest[Index],
                     SimpleOut->Mode->CursorColumn,
                     SimpleOut->Mode->CursorRow,
                     SimpleOut->Mode->Mode,
                     SimpleOut->Mode->MaxMode,
                     SimpleOut->Mode->Attribute,
                     SimpleOut->Mode->CursorVisible,
                     ModeExpected.CursorColumn,
                     ModeExpected.CursorRow,
                     ModeExpected.Mode,
                     ModeExpected.MaxMode,
                     ModeExpected.Attribute,
                     ModeExpected.CursorVisible
                     );

      //
      // Status check
      //
      if (Status!=EFI_UNSUPPORTED) {
        AssertionType = EFI_TEST_ASSERTION_FAILED;
      } else {
        AssertionType = EFI_TEST_ASSERTION_PASSED;
      }
      StandardLib->RecordAssertion (
                     StandardLib,
                     AssertionType,
                     gSimpleTextOutputConformanceTestAssertionGuid010,
                     L"EFI_SIMPLE_TEXT_OUT_PROTOCOL.SetCursorPosition - SetCursorPositoin() with invalid Position",
                     L"%a:%d: Status = %r, Mode = %d, Position = (%d x %d)",
                     __FILE__,
                     (UINTN)__LINE__,
                     Status,
                     Mode,
                     ColumnTest[Index],
                     RowTest[Index]
                     );
    }
  }
  return RestoreMode (SimpleOut, &ModeOrg, StandardLib);
}
Example #3
0
/****************************************************************************
REMARKS:
Displays the menu of DDC tests and allows the DDC functionality to be
tested.
****************************************************************************/
void DDCCITests(
    GC_devCtx *gc)
{
    int         choice,err = ddcOk;
    GA_SCIFuncs sci;

    /* For NonVGA controllers we need to run this test in graphics modes
     * to ensure that we are running on the proper controller hardware
     * that we support DPMS on (ie: the Windows driver hardware).
     */
    SetGraphicsMode(gc);

    /* Allow a 1.5 second delay before trying to do DDC/CI communications */
    _OS_delay(1500000);

    /* Initialise DDC/CI communications */
    sci.dwSize = sizeof(sci);
    if (!GA_queryFunctions(dc,GA_GET_SCIFUNCS,&sci) || (err = MCS_begin(dc)) != ddcOk) {
        RestoreMode(gc);
        GC_clrscr(gc);
        if (err == ddcNotAvailable)
            GC_printf(gc,"DDC/CI not supported by monitor!\n\n");
        else
            GC_printf(gc,"DDC monitor not connected!\n\n");
        GC_printf(gc,"Press any key to continue");
        EVT_getch();
        return;
        }

    /* Display menu information on screen */
    for (;;) {
        ClearPage(0);
        gmoveto(40,40);
        gprintf("DDC/CI support active:");
        gnewline();
        gprintf("Enter function to test:");
        gprintf("  [0] - Is Control Supported");
        gprintf("  [1] - Enable Control");
        gprintf("  [2] - Get Control Value");
        gprintf("  [3] - Set Control Value");
        gprintf("  [4] - Reset Control");
        gprintf("  [5] - Get Timing Report");
        gprintf("  [6] - Save Current Settings");
        gprintf("  [7] - Get Self Test Report");
        gprintf("  [8] - Get Capabilities String");
        gprintf("  [Esc] - Quit");
        gprintf("Which: ");

        /* Loop around trying the different DPMS states */
        choice = EVT_getch();
        if (choice == 0x1B || tolower(choice) == 'q')
            break;
        gnewline();
        switch (choice) {
            case '0': testMCS_isControlSupported(gc);       break;
            case '1': testMCS_enableControl(gc);            break;
            case '2': testMCS_getControlValue(gc);          break;
            case '3': testMCS_setControlValue(gc);          break;
            case '4': testMCS_resetControl(gc);             break;
            case '5': testMCS_getTimingReport();            break;
            case '6': testMCS_saveCurrentSettings();        break;
            case '7': testMCS_getSelfTestReport();          break;
            case '8': testMCS_getCapabilitiesString();      break;
            }
        }

    /* Close the DDC/CI communications channel */
    MCS_end();

    /* Restore text mode for NonVGA controllers */
    RestoreMode(gc);
}
//
// TDS 4.2.5
//
EFI_STATUS
BBTestSetAttributeConformanceAutoTest (
    IN EFI_BB_TEST_PROTOCOL       *This,
    IN VOID                       *ClientInterface,
    IN EFI_TEST_LEVEL             TestLevel,
    IN EFI_HANDLE                 SupportHandle
  )
{
  //
  // This test case should be obsolete according to Spec changed.
  //

  EFI_STANDARD_TEST_LIBRARY_PROTOCOL   *StandardLib;
  EFI_STATUS                           Status;
  EFI_SIMPLE_TEXT_OUT_PROTOCOL         *SimpleOut;
  EFI_TEST_ASSERTION                   AssertionType;

  EFI_SIMPLE_TEXT_OUTPUT_MODE          ModeOrg, ModeExpected;
  UINTN                                Attribute[10];

  UINTN                                Index;

  EFI_GRAPHICS_OUTPUT_PROTOCOL                *GraphicsOutput;
  EFI_DEVICE_PATH_PROTOCOL             *DevicePath;
  CHAR16                               *DevicePathStr;



  //
  // Get the Standard Library Interface
  //
  Status = gtBS->HandleProtocol (
                   SupportHandle,
                   &gEfiStandardTestLibraryGuid,
                   &StandardLib
                   );

  if (EFI_ERROR(Status)) {
    StandardLib->RecordAssertion (
                   StandardLib,
                   EFI_TEST_ASSERTION_FAILED,
                   gTestGenericFailureGuid,
                   L"BS.HandleProtocol - Handle standard test library",
                   L"%a:%d:Status - %r",
                   __FILE__,
                   (UINTN)__LINE__,
                   Status
                   );
    return Status;
  }

  SimpleOut = (EFI_SIMPLE_TEXT_OUT_PROTOCOL *)ClientInterface;

  //
  // Get Device Path of current Simple_Text_Output_Protocol
  // And out put device path or device name
  //
  Status = LocateDevicePathFromSimpleTextOut (SimpleOut, &DevicePath, StandardLib);
  if (Status == EFI_SUCCESS) {
    DevicePathStr = DevicePathToStr (DevicePath);
    if (DevicePathStr != NULL) {
      StandardLib->RecordMessage (
                     StandardLib,
                     EFI_VERBOSE_LEVEL_DEFAULT,
                     L"\r\nCurrent Device: %s",
                     DevicePathStr
                     );
      Status = gtBS->FreePool (DevicePathStr);
      if (EFI_ERROR(Status)) {
        StandardLib->RecordAssertion (
                       StandardLib,
                       EFI_TEST_ASSERTION_FAILED,
                       gTestGenericFailureGuid,
                       L"BS.FreePool - Free pool",
                       L"%a:%d:Status - %r",
                       __FILE__,
                       (UINTN)__LINE__,
                       Status
                       );
        return Status;
      }
      DevicePathStr = NULL;
    }
  } else {
    Status = LocateGopFromSimpleTextOut (SimpleOut, &GraphicsOutput, StandardLib);
    if (EFI_ERROR(Status)) {
      //
      // Console Splitter/StdErr
      //
      StandardLib->RecordMessage (
                     StandardLib,
                     EFI_VERBOSE_LEVEL_DEFAULT,
                     L"\r\nCurrent Device: ConsoleSplitter/StdErr"
                     );
    } else {
      //
      // Console Splitter/ConOut
      //
      StandardLib->RecordMessage (
                     StandardLib,
                     EFI_VERBOSE_LEVEL_DEFAULT,
                     L"\r\nCurrent Device: ConsoleSplitter/ConOut"
                     );
    }
  }

  //
  // Prepare test data
  //

  Attribute[0] = 0xB3;
  Attribute[1] = 0x80;
  Attribute[2] = 0x91;
  Attribute[3] = 0xA2;
  Attribute[4] = 65538;

  //
  // Backup Mode
  //
  BackupMode (SimpleOut, &ModeOrg);

  for (Index = 0; Index < 5; Index++) {
    //
    // Prepare expected Mode after call Reset.
    //
    BackupMode (SimpleOut, &ModeExpected);

    //
    // Call SetAttribute with invalid Attribute
    //
    Status = SimpleOut->SetAttribute (SimpleOut, Attribute[Index]);

    //
    // Mode itegrity test
    //
    ModeExpected.CursorColumn = SimpleOut->Mode->CursorColumn;
    ModeExpected.CursorRow = SimpleOut->Mode->CursorRow;
    if (CheckModeIntegrity (&ModeExpected, SimpleOut->Mode) == FALSE) {
      AssertionType = EFI_TEST_ASSERTION_FAILED;
    } else {
      AssertionType = EFI_TEST_ASSERTION_PASSED;
    }
    StandardLib->RecordAssertion (
                   StandardLib,
                   AssertionType,
                   gSimpleTextOutputConformanceTestAssertionGuid005,
                   L"EFI_SIMPLE_TEXT_OUT_PROTOCOL.SetAttribute - SetAttribute() with invalid Attribute, mode position integrity",
                   L"%a:%d: Attribute=%x Current: Cursor Position(%d x %d), Mode=%d, MaxMode=%d, Attribute=%d, CursorVisible=%d. "\
                   L" Expected:Cursor Position(%d x %d), Mode=%d, MaxMode=%d, Attribute=%d, CursorVisible=%d.",
                   __FILE__,
                   (UINTN)__LINE__,
                   Attribute[Index],
                   SimpleOut->Mode->CursorColumn,
                   SimpleOut->Mode->CursorRow,
                   SimpleOut->Mode->Mode,
                   SimpleOut->Mode->MaxMode,
                   SimpleOut->Mode->Attribute,
                   SimpleOut->Mode->CursorVisible,
                   ModeExpected.CursorColumn,
                   ModeExpected.CursorRow,
                   ModeExpected.Mode,
                   ModeExpected.MaxMode,
                   ModeExpected.Attribute,
                   ModeExpected.CursorVisible
                   );

    //
    // Status check
    //
    if (Status!=EFI_UNSUPPORTED) {
      AssertionType = EFI_TEST_ASSERTION_FAILED;
    } else {
      AssertionType = EFI_TEST_ASSERTION_PASSED;
    }
    StandardLib->RecordAssertion (
                   StandardLib,
                   AssertionType,
                   gSimpleTextOutputConformanceTestAssertionGuid006,
                   L"EFI_SIMPLE_TEXT_OUT_PROTOCOL.SetAttribute - SetAttribute() with invalid Attribute",
                   L"%a:%d: Status = %r, Attribute = %x",
                   __FILE__,
                   (UINTN)__LINE__,
                   Status,
                   Attribute[Index]
                   );
  }

  return RestoreMode (SimpleOut, &ModeOrg, StandardLib);
}