// 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.Windows.Forms;
using Common;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace PreviewHandlerCommonUnitTests
{
    [TestClass]
    public class FormHandlerControlTests
    {
        private class TestFormControl : FormHandlerControl
        {
        }

        [TestMethod]
        public void FormHandlerControlShouldCreateHandleOnInitialization()
        {
            // Arrange and act
            using (var testFormHandlerControl = new TestFormControl())
            {
                // Assert
                Assert.IsTrue(testFormHandlerControl.IsHandleCreated);
            }
        }

        [TestMethod]
        public void FormHandlerControlShouldSetVisibleFalseOnInitialization()
        {
            // Arrange and act
            using (var testFormHandlerControl = new TestFormControl())
            {
                // Assert
                Assert.IsFalse(testFormHandlerControl.Visible);
            }
        }

        [TestMethod]
        public void FormHandlerControlShouldSetFormBorderStyleOnInitialization()
        {
            // Arrange and act
            using (var testFormHandlerControl = new TestFormControl())
            {
                // Assert
                Assert.AreEqual(FormBorderStyle.None, testFormHandlerControl.FormBorderStyle);
            }
        }

        [TestMethod]
        public void FormHandlerControlShouldReturnValidHandleWhenGetHandleCalled()
        {
            // Arrange
            using (var testFormHandlerControl = new TestFormControl())
            {
                // Act
                var handle = testFormHandlerControl.Handle;

                // Assert
                Assert.AreEqual(testFormHandlerControl.Handle, handle);
            }
        }

        [TestMethod]
        public void FormHandlerControlShouldSetBackgroundColorWhenSetBackgroundColorCalled()
        {
            // Arrange
            using (var testFormHandlerControl = new TestFormControl())
            {
                var color = Color.Navy;

                // Act
                testFormHandlerControl.SetBackgroundColor(color);

                // Assert
                Assert.AreEqual(color, testFormHandlerControl.BackColor);
            }
        }

        [TestMethod]
        public void FormHandlerControlShouldSetFontWhenSetFontCalled()
        {
            // Arrange
            using (var testFormHandlerControl = new TestFormControl())
            {
                using (var font = new Font("Arial", 20))
                {
                    // Act
                    testFormHandlerControl.SetFont(font);

                    // Assert
                    Assert.AreEqual(font, testFormHandlerControl.Font);
                }
            }
        }

        [TestMethod]
        public void FormHandlerControlShouldUpdateBoundsWhenSetRectCalled()
        {
            // Arrange
            using (var testFormHandlerControl = new TestFormControl())
            {
                var bounds = new Rectangle(2, 2, 4, 4);

                // Act
                testFormHandlerControl.SetRect(bounds);

                // Assert
                Assert.AreEqual(bounds, testFormHandlerControl.Bounds);
            }
        }

        [TestMethod]
        public void FormHandlerControlShouldSetTextColorWhenSetTextColorCalled()
        {
            // Arrange
            using (var testFormHandlerControl = new TestFormControl())
            {
                var color = Color.Navy;

                // Act
                testFormHandlerControl.SetTextColor(color);

                // Assert
                Assert.AreEqual(color, testFormHandlerControl.ForeColor);
            }
        }

        [TestMethod]
        public void FormHandlerControlShouldClearAllControlsWhenUnloadCalled()
        {
            // Arrange
            using (var testFormHandlerControl = new TestFormControl())
            {
                testFormHandlerControl.Controls.Add(new TextBox());
                testFormHandlerControl.Controls.Add(new RichTextBox());

                // Act
                testFormHandlerControl.Unload();

                // Assert
                Assert.AreEqual(0, testFormHandlerControl.Controls.Count);
            }
        }

        [TestMethod]
        public void FormHandlerControlShouldSetVisibleFalseWhenUnloadCalled()
        {
            // Arrange
            using (var testFormHandlerControl = new TestFormControl())
            {
                // Act
                testFormHandlerControl.Unload();

                // Assert
                Assert.IsFalse(testFormHandlerControl.Visible);
            }
        }

        [TestMethod]
        public void FormHandlerControlShouldSetVisibletrueWhenDoPreviewCalled()
        {
            // Arrange
            using (var testFormHandlerControl = new TestFormControl())
            {
                // Act
                testFormHandlerControl.DoPreview("valid-path");

                // Assert
                Assert.IsTrue(testFormHandlerControl.Visible);
            }
        }

        [TestMethod]
        public void FormHandlerControlShouldSetParentHandleWhenSetWindowCalled()
        {
            // Arrange
            using (var testFormHandlerControl = new TestFormControl())
            {
                using (var parentFormWindow = new UserControl())
                {
                    var parentHwnd = parentFormWindow.Handle;
                    var rect = new Rectangle(2, 2, 4, 4);

                    // Act
                    testFormHandlerControl.SetWindow(parentHwnd, rect);
                    var actualParentHwnd = NativeMethods.GetAncestor(testFormHandlerControl.Handle, 1); // GA_PARENT 1

                    // Assert
                    Assert.AreEqual(parentHwnd, actualParentHwnd);
                }
            }
        }
    }
}
