PowerToys/src/modules/previewpane/UnitTests-PreviewHandlerCommon/PreviewHandlerBaseTests.cs

392 lines
14 KiB
C#
Raw Normal View History

[0.16]: Merge Preview Handlers in Master (#1516) * Added project template for common library * Added reference to stylecop.json * Fixed xml documetation file path for common project * Added reference to stylecop.json * Added COM interface interpolations to C# * Changed namespace to Common * Added xml doc to com interfaces * Removed AnyCPU configuration from solution file * Added Preview Hander and form User Control Implementation * Fix stylecop warnings * Added test control and handler * Added Xaml description for preview handler * Added Xml documenatation * Updated the control to form * Added registration and unregistration logic for the handler * Moved the files in separate folder and fix PR comments * updated the name of previewhandler class to base class * Added the DoPreview to PreviewHandlerControl Interface * Modified the Dopreview and Unload as virtual method * Uncommented the DocumentText to help bug repro * HTML Parsing Extension for preview pane markdown renderer (#1108) * Added Extension for html post processing * Added unit test poroject for preview pane * Added pipline test and base test function * Added Tests for extension * Added tests for url slashes * Added tests for url and figure caption * Markdown preview pane (#1128) * Added Extension for html post processing * Added unit test poroject for preview pane * Added pipline test and base test function * Added Tests for extension * Added handler and control for markdown * Tests added * Locally working version for markdown * Working image relative url's in markdown * Added CSS to preview display * Updates CSS for code block * Removed html file write comment in markdown control * Updated assembly version and web browser control test * Add Svg preview handler (#1129) * Added a new project for Svg preview handler * Added initial implementation of Svg Preview Handler * Fixed output path * Added Unit Test Project * Added StreamWrapper and Update Svg Control * Updated Svg Handler Guid * Removed migration backup folder * Removed Fluent Assertions NuGet * Added Comments for StreamWrapper * Removed the manual GC collect * Added unit tests for Svg preview Handler * Updated the xml doc for stream wrapper * User/lamotile/add_powerpreviewsettings (#1075) * Added powersettings to PowerToys Settings UI * added settings library * updated settings-web * updated project oncfiguration * updated project onfiguration * updated project .sln file * removed .etl file and added it to git-ignore * separated the PowerPreviewModule into split classes .cpp and .h * moved PowerPreviewModule implemnetations to .cpp file * fixed StringTable formatter * fixed spacing in resource.h * added m_ to member varibales * initiliaze m_isPreviewEnabled in the base class * removed duplication of objects by using pass by refference and std::move * made the getters const * updated naming convention * Split test calsses * Add const string * Replaced move with const string * Made attributes private * Made attributes private * removed unused constructor * Update resource.h formatted resource.h * Adding unit tests for preview handler common (#1156) * Changed the name of the Common library to PreviewHandlerCommon * Added unit tests project for PreviewHandlerCommon * Updated ComInterop accessor type * Added unit tests for PreviewHandlerbase * Added tests for file and stream based handler * Added unit tests for StreamWrapper * Added form handler unit tests * Added Unit tests for FormHandlerControl * Added file header * Add Powerpreview project * Add spacing in sln file * swapped string refferences (#1199) * added registry methods and enable/disable preview handlers (#1230) * added registry methods and enable/disable preview handlers * formatted .rc file. * formatted resource file * formatted .rc file. * formatted settings.cpp * formatted settings.h * formatted SVGPreviewSettingsClassTest.cpp * Formatted MarkDownPreviewSettingsClassTest.cpp * using wide strings * formatted settings.h * FileExplorerPreviewSettingsTest.cpp formatting * fixed typo and formatting * closing Registry and fixing typos * formmarted code using ctrl+k+d * fixed naming * fixed typo * changed if/else reverse order * Markdown preview pane (#1220) * Added rich text bar for information display * Added infobar * Added tests for extension and markdown control * Added xml docstring for markdown preview handler control * Updated assembly file for markdown preview pane * Updated removal of script tag without modifying CSS * Added info bar text string to resource file. * Removed error with infobar display on first rendering * Updated assembly version * Remove script and image element from Svg (#1231) * Added implementation to remove script and image tag * Added Unit tests for SvgPreviewHandlerHelper * Updated Unit tests for SvgPreviewControl * Moved the hardcoded string to resource file * Changed the LocalMachine to CurrentUser for preview handler registration * Added unit tests for multiple blocked elements tags * User/lamotile/update settings objects (#1263) * added registry methods and enable/disable preview handlers * formatted .rc file. * formatted resource file * formatted .rc file. * formatted settings.cpp * formatted settings.h * formatted SVGPreviewSettingsClassTest.cpp * Formatted MarkDownPreviewSettingsClassTest.cpp * using wide strings * formatted settings.h * FileExplorerPreviewSettingsTest.cpp formatting * fixed typo and formatting * closing Registry and fixing typos * formmarted code using ctrl+k+d * fixed naming * fixed typo * changed if/else reverse order * updated setiings_objects.cpp * removed changes on files that are not part of this PR * removed const ref on primative types * updated pass by ref semantic and removed pas by reff on primative types * fixed spaces in the commas * fixed spaces in brackets * Preview pane telemetry (#1299) * Added telemetry base class and markdown telemetry class * Updated docstring for telemetry event. * Added telemetry to markdown for error * Added try catch for markdown preview handler and display error bar * Updated markdown telemetry to make event names global variable * Updated parameter name to camel casing and telemetry event name naming. * Corrected assembbly version for svg renderer * Markdown Image files display (#1303) * Added telemetry base class and markdown telemetry class * Updated docstring for telemetry event. * Added telemetry to markdown for error * Added try catch for markdown preview handler and display error bar * Updated markdown telemetry to make event names global variable * Updated Markdown preview to display without vertical scrollbar and removed xml doc to html agility pack. * Updated parameter name to camel casing and telemetry event name naming. * Corrected assembbly version for svg renderer * Removed duplicate function * Add telemetry for Svg preview handler (#1314) * Added telemetry events for Svg Preview Handler * Added unit test in case preview handler throws * Updated the Error event name * Remove the not required return statement * User/lamotile/add read me (#1332) * add readme * moved images * re-added images' * Fixed gramma * Update figure number refference * improve preview handler intergration (#1319) * improve preview handler intergration * Fixed typo * updated typo * updated enable() function * updated is enabled() * re-updated is enabled() * added this-> key word * (0.16) - Install preview handler with msix (#1339) * Removed the registration logic from preview handlers * Updated the output path * Added logic to shim the activation of .net assembly * Updated manifest file * Fix the allowedsilenttakeover filed in manifest * Updated the appxmanifest file * Added AllowSilentDefaultTakeOver in manifest * Fix returned error code by DllGetClassObject * Moved the CLSID to a common header file * Added info about where CLSID needs to be updated * Added a .reg file for the Keys added in registry.dat * Added comments for DllGetClassObject * Svg Preview Handler block external component (#1368) * Removed the registration logic from preview handlers * Updated the output path * Added logic to shim the activation of .net assembly * Updated manifest file * Fix the allowedsilenttakeover filed in manifest * Updated the appxmanifest file * Added AllowSilentDefaultTakeOver in manifest * Fix returned error code by DllGetClassObject * Moved the CLSID to a common header file * Added info about where CLSID needs to be updated * Added a .reg file for the Keys added in registry.dat * Added comments for DllGetClassObject * Extended WebBrowserSite for setting flags in DISPID_AMBIENT_DLCONTROL * Added XML Documenatation * Removed the logic for deleting image and script element from Svg * Updated Unit Tests * Updated typecast of uint * Forwarded calls to Type.InvokeMember * Resolve PR Comments * Adding MSI Installation for Preview Handler (#1436) * Updated wxs for including dll and registry keys for preview handlers * Changed the casing for registry key * Resolve PR Comments * Added comments for File element * Call GC on preview unloading (#1456) * Call GC collect on preview unloading * Added github issue link * Update Web browser control for Markdown Previewer (#1464) * Updated Webbrowser control * Updated Unit tests * Disabled Navigation for Svg Previewer * Fix power preview unit tests (#1508) * Decoupled registry interaction logic * Updated File explorer settings * Updated unit tests for PowerPreview Settings * Added Asserrtion for Scope of registry key * Updated the registry value to match with installation registry value * Sync master settings.cpp * Merge settings changes from PreviewHandlers * Remove newline changes added into in example_powertoy\trace.cpp * Chaned .net framework to 4.7.2 * Updated Csproj files to auto generate Assembly.info files * Updated msi installer to use version variable for preview handlers assembly * Removed the signing of Assembly and updated wxs to not include PublicKeyToken * Updated the Path in Packaginglayout.xml to modules from Gac and the registry hive binary * Regenerated updated JS and html file * Resolve PR Comments * Readded the wprp file Co-authored-by: Divyansh <divyan@microsoft.com> Co-authored-by: Divyansh <somm14divi@gmail.com> Co-authored-by: Lavius Motileng <58791731+laviusmotileng-ms@users.noreply.github.com>
2020-03-12 06:53:49 +08:00
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using Common;
using Common.ComInterlop;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
namespace UnitTests_PreviewHandlerCommon
{
[TestClass]
public class PreviewHandlerBaseTests
{
private static IPreviewHandlerControl previewHandlerControl;
public class TestPreviewHandler : PreviewHandlerBase
{
public override void DoPreview()
{
throw new NotImplementedException();
}
protected override IPreviewHandlerControl CreatePreviewHandlerControl()
{
return GetMockPreviewHandlerControl();
}
}
[TestMethod]
public void PreviewHandlerBase_ShouldCallPreviewControlSetWindow_WhenSetWindowCalled()
{
// Arrange
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
var handle = new IntPtr(5);
var bounds = GetRectangle(2, 2, 4, 4);
var actualHandle = IntPtr.Zero;
var actualBounds = Rectangle.Empty;
mockPreviewControl
.Setup(_ => _.SetWindow(It.IsAny<IntPtr>(), It.IsAny<Rectangle>()))
.Callback<IntPtr, Rectangle>((hwnd, rect) =>
{
actualHandle = hwnd;
actualBounds = rect;
});
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
// Act
testPreviewHandler.SetWindow(handle, ref bounds);
// Assert
Assert.AreEqual(actualHandle, handle);
Assert.AreEqual(actualBounds, bounds.ToRectangle());
mockPreviewControl.Verify(_ => _.SetWindow(It.IsAny<IntPtr>(), It.IsAny<Rectangle>()), Times.Once);
}
[TestMethod]
public void PreviewHandlerBase_ShouldCallPreviewControlSetrect_WhenSetRectCalled()
{
// Arrange
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
var bounds = GetRectangle(2, 2, 4, 4);
var actualBounds = Rectangle.Empty;
mockPreviewControl
.Setup(_ => _.SetRect(It.IsAny<Rectangle>()))
.Callback<Rectangle>((rect) =>
{
actualBounds = rect;
});
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
// Act
testPreviewHandler.SetRect(ref bounds);
// Assert
Assert.AreEqual(actualBounds, bounds.ToRectangle());
mockPreviewControl.Verify(_ => _.SetRect(It.IsAny<Rectangle>()), Times.Once);
}
[TestMethod]
public void PreviewHandlerBase_ShouldCallPreviewControlUnload_WhenUnloadCalled()
{
// Arrange
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
// Act
testPreviewHandler.Unload();
// Assert
mockPreviewControl.Verify(_ => _.Unload(), Times.Once);
}
[TestMethod]
public void PreviewHandlerBase_ShouldCallPreviewControlSetBackgroundColor_WhenSetBackgroundColorCalled()
{
// Arrange
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
var color = new COLORREF();
// Act
testPreviewHandler.SetBackgroundColor(color);
// Assert
mockPreviewControl.Verify(_ => _.SetBackgroundColor(It.Is<Color>(c => (c == color.Color))), Times.Once);
}
[TestMethod]
public void PreviewHandlerBase_ShouldCallPreviewControlSetTextColor_WhenSetTextColorCalled()
{
// Arrange
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
var color = new COLORREF();
// Act
testPreviewHandler.SetTextColor(color);
// Assert
mockPreviewControl.Verify(_ => _.SetTextColor(It.Is<Color>(c => (c == color.Color))), Times.Once);
}
[TestMethod]
public void PreviewHandlerBase_ShouldCallPreviewControlSetFont_WhenSetFontCalled()
{
// Arrange
Font actualFont = null;
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
mockPreviewControl
.Setup(x => x.SetFont(It.IsAny<Font>()))
.Callback<Font>((font) =>
{
actualFont = font;
});
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
var logFont = GetLogFont();
// Act
testPreviewHandler.SetFont(ref logFont);
// Assert
mockPreviewControl.Verify(_ => _.SetFont(It.IsAny<Font>()), Times.Once);
Assert.AreEqual(Font.FromLogFont(logFont), actualFont);
}
[TestMethod]
public void PreviewHandlerBase_ShouldCallPreviewControlSetFocus_WhenSetFocusCalled()
{
// Arrange
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
// Act
testPreviewHandler.SetFocus();
// Assert
mockPreviewControl.Verify(_ => _.SetFocus(), Times.Once);
}
[TestMethod]
public void PreviewHandlerBase_ShouldSetHandleOnQueryFocus_WhenPreviewControlsReturnValidHandle()
{
// Arrange
var hwnd = new IntPtr(5);
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
mockPreviewControl.Setup(x => x.QueryFocus(out hwnd));
var actualHwnd = IntPtr.Zero;
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
// Act
testPreviewHandler.QueryFocus(out actualHwnd);
// Assert
Assert.AreEqual(actualHwnd, hwnd);
mockPreviewControl.Verify(_ => _.QueryFocus(out hwnd), Times.Once);
}
[TestMethod]
public void PreviewHandlerBase_ShouldThrowOnQueryFocus_WhenPreviewControlsReturnNotValidHandle()
{
// Arrange
var hwnd = IntPtr.Zero;
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
mockPreviewControl.Setup(x => x.QueryFocus(out hwnd));
var actualHwnd = IntPtr.Zero;
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
Win32Exception exception = null;
// Act
try
{
testPreviewHandler.QueryFocus(out actualHwnd);
}
catch (Win32Exception ex)
{
exception = ex;
}
// Assert
Assert.IsNotNull(exception);
mockPreviewControl.Verify(_ => _.QueryFocus(out hwnd), Times.Once);
}
[TestMethod]
public void PreviewHandlerBase_ShouldDirectKeyStrokesToIPreviewHandlerFrame_IfIPreviewHandlerFrameIsSet()
{
// Arrange
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
var mockPreviewHandlerFrame = new Mock<IPreviewHandlerFrame>();
var msg = new MSG();
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
testPreviewHandler.SetSite(mockPreviewHandlerFrame.Object);
// Act
testPreviewHandler.TranslateAccelerator(ref msg);
// Assert
mockPreviewHandlerFrame.Verify(_ => _.TranslateAccelerator(ref msg), Times.Once);
}
[DataTestMethod]
[DataRow((uint)0)]
[DataRow((uint)1)]
public void PreviewHandlerBase_ShouldReturnIPreviewHandlerFrameResponse_IfIPreviewHandlerFrameIsSet(uint resultCode)
{
// Arrange
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
var mockPreviewHandlerFrame = new Mock<IPreviewHandlerFrame>();
var msg = new MSG();
mockPreviewHandlerFrame
.Setup(x => x.TranslateAccelerator(ref msg))
.Returns(resultCode);
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
testPreviewHandler.SetSite(mockPreviewHandlerFrame.Object);
// Act
var actualResultCode = testPreviewHandler.TranslateAccelerator(ref msg);
// Assert
Assert.AreEqual(resultCode, actualResultCode);
}
[TestMethod]
public void PreviewHandlerBase_ShouldReturnS_FALSE_IfIPreviewHandlerFrameIsNotSet()
{
// Arrange
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
var msg = new MSG();
uint S_FALSE = 1;
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
// Act
var result = testPreviewHandler.TranslateAccelerator(ref msg);
// Assert
Assert.AreEqual(result, S_FALSE);
}
[TestMethod]
public void PreviewHandlerBase_ShouldReturnPreviewControlHandle_IfGetWindowCalled()
{
// Arrange
var previewControlHandle = new IntPtr(5);
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
mockPreviewControl.Setup(x => x.GetHandle())
.Returns(previewControlHandle);
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
var hwndReceived = IntPtr.Zero;
// Act
testPreviewHandler.GetWindow(out hwndReceived);
// Assert
Assert.AreEqual(hwndReceived, previewControlHandle);
}
[DataTestMethod]
[DataRow(true)]
[DataRow(false)]
public void PreviewHandlerBase_ShouldThrowNotImplementedException_IfContextSensitiveHelpCalled(bool fEnterMode)
{
// Arrange
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
NotImplementedException exception = null;
// Act
try
{
testPreviewHandler.ContextSensitiveHelp(fEnterMode);
}
catch (NotImplementedException ex)
{
exception = ex;
}
// Assert
Assert.IsNotNull(exception);
}
[TestMethod]
public void PreviewHandlerBase_ShouldReturnSite_WhenGetSiteCalled()
{
// Arrange
var mockPreviewControl = new Mock<IPreviewHandlerControl>();
previewHandlerControl = mockPreviewControl.Object;
var testPreviewHandler = new TestPreviewHandler();
var site = new Mock<IPreviewHandlerFrame>().Object;
testPreviewHandler.SetSite(site);
object actualSite = null;
var riid = Guid.Empty;
// Act
testPreviewHandler.GetSite(ref riid, out actualSite);
// Assert
Assert.AreEqual(actualSite, site);
}
private LOGFONT GetLogFont()
{
var logFont = new LOGFONT();
logFont.LfHeight = 12;
logFont.LfWidth = 0;
logFont.LfEscapement = 0;
logFont.LfWeight = 400; // FW_NORMAL
logFont.LfItalic = Convert.ToByte(false);
logFont.LfUnderline = Convert.ToByte(false);
logFont.LfStrikeOut = Convert.ToByte(0);
logFont.LfCharSet = Convert.ToByte(0); // ANSI_CHARSET
logFont.LfOutPrecision = Convert.ToByte(0); // OUT_DEFAULT_PRECIS
logFont.LfClipPrecision = Convert.ToByte(0);
logFont.LfQuality = Convert.ToByte(0);
logFont.LfPitchAndFamily = Convert.ToByte(0);
logFont.LfFaceName = "valid-font";
return logFont;
}
private RECT GetRectangle(int left, int top, int right, int bottom)
{
var rect = new RECT();
rect.Left = left;
rect.Top = top;
rect.Right = right;
rect.Bottom = bottom;
return rect;
}
private static IPreviewHandlerControl GetMockPreviewHandlerControl()
{
return previewHandlerControl;
}
}
}