using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Lima;

namespace UnitTesting
{
    public class MessageMockerTests : UnitTestSharp.TestFixture
    {
        Form form;
        Control control;
        System.Drawing.Point controlLoc = new System.Drawing.Point(25, 25);
        
        public override void TestSetup()
        {
            form = new Form();
            form.Width = 100;
            form.Height = 100;
            form.Location = new System.Drawing.Point(0, 0);
            form.ClientSize = new System.Drawing.Size(100, 100);

            control = new Control();

            control.Width = 50;
            control.Height = 50;
            control.Location = controlLoc;

            form.Controls.Add(control);
        }

        public override void TestTeardown()
        {
            form.Dispose();
        }

        public void CanFakeFormMessages()
        {
            Form form = new Form();
            bool fired = false;
            form.MouseWheel += delegate(object sender, MouseEventArgs args)
            {
                fired = true;
            };

            MessageMocker.FireScrollWheel(form, 0, 0);

            Check(fired);
        }

        public void CanFakeMouseEnterEvents_Forms()
        {
            bool fired = false;
            form.MouseEnter += delegate(object sender, EventArgs args)
            {
                fired = true;
            };

            MessageMocker.FireMouseMove(form, 0, 0);

            Check(fired);
        }

        public void CanFakeMouseEnterEvents_Controls()
        {
            bool fired = false;
            control.MouseEnter += delegate(object sender, EventArgs args)
            {
                fired = true;
            };

            MessageMocker.FireMouseMove(control, 0, 0);

            Check(fired);
        }

        public void CanFakeMouseLeaveEvents_Controls()
        {
            bool fired = false;
            control.MouseLeave += delegate(object sender, EventArgs args)
            {
                fired = true;
            };

            MessageMocker.FireMouseMove(control, 0, 0);
            MessageMocker.FireMouseLeave(control);
            
            Check(fired);
        }

        class TestForm : Form, IMessageFilter
        {
            public bool hit = false;

            public TestForm()
            {
                Application.AddMessageFilter(this);
            }

            public bool PreFilterMessage(ref Message m)
            {
                if (m.HWnd != Handle)
                {
                    return false;
                }

                if (m.Msg == MessageMocker.WM_MOUSEWHEEL)
                {
                    return true;
                }

                return false;
            }
        }

        public void ReflectMessageMessageFilter()
        {
            TestForm form = new TestForm();

            form.MouseWheel += delegate(object sender, MouseEventArgs args)
            {
                form.hit = true;
            };

            MessageMocker.FireScrollWheel(form, 0, 0);

            CheckFalse(form.hit);

            Application.RemoveMessageFilter(form);
        }
    }
}