// 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.Drawing; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; using System.Text; using System.Windows.Forms; using Microsoft.PowerToys.PreviewHandler.Svg; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using PreviewHandlerCommon; namespace SvgPreviewHandlerUnitTests { [TestClass] public class SvgPreviewControlTests { [TestMethod] public void SvgPreviewControlShouldAddExtendedBrowserControlWhenDoPreviewCalled() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { // Act svgPreviewControl.DoPreview(GetMockStream("")); // Assert Assert.AreEqual(svgPreviewControl.Controls.Count, 1); Assert.IsInstanceOfType(svgPreviewControl.Controls[0], typeof(WebBrowserExt)); } } [TestMethod] public void SvgPreviewControlShouldSetDocumentStreamWhenDoPreviewCalled() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { // Act svgPreviewControl.DoPreview(GetMockStream("")); // Assert Assert.IsNotNull(((WebBrowser)svgPreviewControl.Controls[0]).DocumentStream); } } [TestMethod] public void SvgPreviewControlShouldDisableWebBrowserContextMenuWhenDoPreviewCalled() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { // Act svgPreviewControl.DoPreview(GetMockStream("")); // Assert Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).IsWebBrowserContextMenuEnabled, false); } } [TestMethod] public void SvgPreviewControlShouldFillDockForWebBrowserWhenDoPreviewCalled() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { // Act svgPreviewControl.DoPreview(GetMockStream("")); // Assert Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).Dock, DockStyle.Fill); } } [TestMethod] public void SvgPreviewControlShouldSetScriptErrorsSuppressedPropertyWhenDoPreviewCalled() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { // Act svgPreviewControl.DoPreview(GetMockStream("")); // Assert Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).ScriptErrorsSuppressed, true); } } [TestMethod] public void SvgPreviewControlShouldSetScrollBarsEnabledPropertyWhenDoPreviewCalled() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { // Act svgPreviewControl.DoPreview(GetMockStream("")); // Assert Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).ScrollBarsEnabled, true); } } [TestMethod] public void SvgPreviewControlShouldDisableAllowNavigationWhenDoPreviewCalled() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { // Act svgPreviewControl.DoPreview(GetMockStream("")); // Assert Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).AllowNavigation, false); } } [TestMethod] public void SvgPreviewControlShouldAddValidInfoBarIfSvgPreviewThrows() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { var mockStream = new Mock(); mockStream .Setup(x => x.Read(It.IsAny(), It.IsAny(), It.IsAny())) .Throws(new Exception()); // Act svgPreviewControl.DoPreview(mockStream.Object); var textBox = svgPreviewControl.Controls[0] as RichTextBox; // Assert Assert.IsFalse(string.IsNullOrWhiteSpace(textBox.Text)); Assert.AreEqual(svgPreviewControl.Controls.Count, 1); Assert.AreEqual(textBox.Dock, DockStyle.Top); Assert.AreEqual(textBox.BackColor, Color.LightYellow); Assert.IsTrue(textBox.Multiline); Assert.IsTrue(textBox.ReadOnly); Assert.AreEqual(textBox.ScrollBars, RichTextBoxScrollBars.None); Assert.AreEqual(textBox.BorderStyle, BorderStyle.None); } } [TestMethod] public void SvgPreviewControlInfoBarWidthShouldAdjustWithParentControlWidthChangesIfSvgPreviewThrows() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { var mockStream = new Mock(); mockStream .Setup(x => x.Read(It.IsAny(), It.IsAny(), It.IsAny())) .Throws(new Exception()); svgPreviewControl.DoPreview(mockStream.Object); var textBox = svgPreviewControl.Controls[0] as RichTextBox; var incrementParentControlWidth = 5; var initialParentWidth = svgPreviewControl.Width; var initialTextBoxWidth = textBox.Width; var finalParentWidth = initialParentWidth + incrementParentControlWidth; // Act svgPreviewControl.Width += incrementParentControlWidth; // Assert Assert.AreEqual(initialParentWidth, initialTextBoxWidth); Assert.AreEqual(finalParentWidth, textBox.Width); } } [TestMethod] public void SvgPreviewControlShouldAddTextBoxIfBlockedElementsArePresent() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { var svgBuilder = new StringBuilder(); svgBuilder.AppendLine(""); svgBuilder.AppendLine("\t"); svgBuilder.AppendLine(""); // Act svgPreviewControl.DoPreview(GetMockStream(svgBuilder.ToString())); // Assert Assert.IsInstanceOfType(svgPreviewControl.Controls[0], typeof(RichTextBox)); Assert.IsInstanceOfType(svgPreviewControl.Controls[1], typeof(WebBrowserExt)); Assert.AreEqual(svgPreviewControl.Controls.Count, 2); } } [TestMethod] public void SvgPreviewControlShouldNotAddTextBoxIfNoBlockedElementsArePresent() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { var svgBuilder = new StringBuilder(); svgBuilder.AppendLine(""); svgBuilder.AppendLine("\t"); svgBuilder.AppendLine("\t"); svgBuilder.AppendLine(""); // Act svgPreviewControl.DoPreview(GetMockStream(svgBuilder.ToString())); // Assert Assert.IsInstanceOfType(svgPreviewControl.Controls[0], typeof(WebBrowserExt)); Assert.AreEqual(svgPreviewControl.Controls.Count, 1); } } [TestMethod] public void SvgPreviewControlInfoBarWidthShouldAdjustWithParentControlWidthChangesIfBlockedElementsArePresent() { // Arrange using (var svgPreviewControl = new SvgPreviewControl()) { var svgBuilder = new StringBuilder(); svgBuilder.AppendLine(""); svgBuilder.AppendLine("\t"); svgBuilder.AppendLine(""); svgPreviewControl.DoPreview(GetMockStream(svgBuilder.ToString())); var textBox = svgPreviewControl.Controls[0] as RichTextBox; var incrementParentControlWidth = 5; var initialParentWidth = svgPreviewControl.Width; var initialTextBoxWidth = textBox.Width; var finalParentWidth = initialParentWidth + incrementParentControlWidth; // Act svgPreviewControl.Width += incrementParentControlWidth; // Assert Assert.AreEqual(initialParentWidth, initialTextBoxWidth); Assert.AreEqual(finalParentWidth, textBox.Width); } } private static IStream GetMockStream(string streamData) { var mockStream = new Mock(); var streamBytes = Encoding.UTF8.GetBytes(streamData); var streamMock = new Mock(); var firstCall = true; streamMock .Setup(x => x.Read(It.IsAny(), It.IsAny(), It.IsAny())) .Callback((buffer, countToRead, bytesReadPtr) => { if (firstCall) { Array.Copy(streamBytes, 0, buffer, 0, streamBytes.Length); Marshal.WriteInt32(bytesReadPtr, streamBytes.Length); firstCall = false; } else { Marshal.WriteInt32(bytesReadPtr, 0); } }); return streamMock.Object; } } }