From 75a4bf3c2eed468d72a79e5dd780827ec41bc291 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Mon, 17 Aug 2015 18:19:15 -0700 Subject: [PATCH 1/2] New our testing moves the mouse and clicks it. --- MatterControlApplication.cs | 8 +- Submodules/agg-sharp | 2 +- TestRunner/NativeMethods.cs | 145 +++++++++++++++++++++++ TestRunner/TestFramework.cs | 212 +++++++++++++++++++++++++++++++++ TestRunner/TestRunner.cs | 222 ----------------------------------- TestRunner/TestRunner.csproj | 4 +- TestRunner/packages.config | 4 + 7 files changed, 370 insertions(+), 227 deletions(-) create mode 100644 TestRunner/NativeMethods.cs create mode 100644 TestRunner/TestFramework.cs delete mode 100644 TestRunner/TestRunner.cs create mode 100644 TestRunner/packages.config diff --git a/MatterControlApplication.cs b/MatterControlApplication.cs index 4170d221c..7f1a5d5b5 100644 --- a/MatterControlApplication.cs +++ b/MatterControlApplication.cs @@ -559,12 +559,14 @@ namespace MatterHackers.MatterControl private void ButtonClickTest() { TestFramework test = new TestFramework("C:/TestImages"); - ImageIO.SaveImageData("test.png", test.GetCurrentScreen()); test.Wait(2); test.ClickByName("SettingsAndControls"); test.Wait(2); - test.ClickImage("BackButton.png"); - } + test.ClickImage("BackButton.png"); + + + //ImageIO.SaveImageData("test.png", test.GetCurrentScreen()); + } public override void OnMouseMove(MouseEventArgs mouseEvent) { diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 4c2a2d037..fd3e1f925 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 4c2a2d0370a40ea4524d8df0ff32e8ff182ff1e5 +Subproject commit fd3e1f9259b528ab1f0d220c6007f53deb81c417 diff --git a/TestRunner/NativeMethods.cs b/TestRunner/NativeMethods.cs new file mode 100644 index 000000000..22fbff66a --- /dev/null +++ b/TestRunner/NativeMethods.cs @@ -0,0 +1,145 @@ +/* +Copyright (c) 2014, Lars Brubaker +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using MatterHackers.Agg; +using MatterHackers.Agg.Image; +using MatterHackers.Agg.PlatformAbstract; +using MatterHackers.Agg.UI; +using MatterHackers.VectorMath; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.Globalization; +using System.IO; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; + +namespace MatterHackers.TestRunner +{ + public static class NativeMethods + { + // P/Invoke declarations + [DllImport("gdi32.dll")] + static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop); + [DllImport("user32.dll")] + static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc); + [DllImport("gdi32.dll")] + static extern IntPtr DeleteDC(IntPtr hDc); + [DllImport("gdi32.dll")] + static extern IntPtr DeleteObject(IntPtr hDc); + [DllImport("gdi32.dll")] + static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight); + [DllImport("gdi32.dll")] + static extern IntPtr CreateCompatibleDC(IntPtr hdc); + [DllImport("gdi32.dll")] + static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp); + [DllImport("user32.dll")] + public static extern IntPtr GetDesktopWindow(); + [DllImport("user32.dll")] + public static extern IntPtr GetWindowDC(IntPtr ptr); + + [DllImport("User32.Dll")] + public static extern long SetCursorPos(int x, int y); + + [DllImport("user32.dll")] + public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); + + public const int MOUSEEVENTF_LEFTDOWN = 0x02; + public const int MOUSEEVENTF_LEFTUP = 0x04; + + public static int GetCurrentScreenHeight() + { + Size sz = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size; + return sz.Height; + } + + public static ImageBuffer GetCurrentScreen() + { + ImageBuffer screenCapture = new ImageBuffer(); + + Size sz = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size; + IntPtr hDesk = GetDesktopWindow(); + IntPtr hSrce = GetWindowDC(hDesk); + IntPtr hDest = CreateCompatibleDC(hSrce); + IntPtr hBmp = CreateCompatibleBitmap(hSrce, sz.Width, sz.Height); + IntPtr hOldBmp = SelectObject(hDest, hBmp); + bool b = BitBlt(hDest, 0, 0, sz.Width, sz.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt); + Bitmap bmpScreenCapture = Bitmap.FromHbitmap(hBmp); + SelectObject(hDest, hOldBmp); + DeleteObject(hBmp); + DeleteDC(hDest); + ReleaseDC(hDesk, hSrce); + + //bmpScreenCapture.Save("bitmapsave.png"); + + screenCapture = new ImageBuffer(bmpScreenCapture.Width, bmpScreenCapture.Height, 32, new BlenderBGRA()); + BitmapData bitmapData = bmpScreenCapture.LockBits(new Rectangle(0, 0, bmpScreenCapture.Width, bmpScreenCapture.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bmpScreenCapture.PixelFormat); + + int offset; + byte[] buffer = screenCapture.GetBuffer(out offset); + int bitmapDataStride = bitmapData.Stride; + int backBufferStrideInBytes = screenCapture.StrideInBytes(); + int backBufferHeight = screenCapture.Height; + int backBufferHeightMinusOne = backBufferHeight - 1; + + unsafe + { + byte* bitmapDataScan0 = (byte*)bitmapData.Scan0; + fixed (byte* pSourceFixed = &buffer[offset]) + { + byte* pSource = bitmapDataScan0 + bitmapDataStride * backBufferHeightMinusOne; + byte* pDestBuffer = pSourceFixed; + for (int y = 0; y < screenCapture.Height; y++) + { + int* pSourceInt = (int*)pSource; + pSourceInt -= (bitmapDataStride * y / 4); + + int* pDestBufferInt = (int*)pDestBuffer; + pDestBufferInt += (backBufferStrideInBytes * y / 4); + + for (int x = 0; x < screenCapture.Width; x++) + { + pDestBufferInt[x] = pSourceInt[x]; + } + } + } + } + + bmpScreenCapture.UnlockBits(bitmapData); + + bmpScreenCapture.Dispose(); + + return screenCapture; + } + } +} \ No newline at end of file diff --git a/TestRunner/TestFramework.cs b/TestRunner/TestFramework.cs new file mode 100644 index 000000000..e3b1de73b --- /dev/null +++ b/TestRunner/TestFramework.cs @@ -0,0 +1,212 @@ +/* +Copyright (c) 2014, Lars Brubaker +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using MatterHackers.Agg; +using MatterHackers.Agg.Image; +using MatterHackers.Agg.PlatformAbstract; +using MatterHackers.Agg.UI; +using MatterHackers.VectorMath; +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Threading; + +namespace MatterHackers.TestRunner +{ + public class TestFramework + { + private string imageDirectory; + + public TestFramework(string imageDirectory) + { + this.imageDirectory = imageDirectory; + } + + public enum ClickOrigin { LowerLeft, Center }; + + public bool ClickByName(string widgetName, int xOffset = 0, int yOffset = 0, double upDelaySeconds = .2, ClickOrigin origin = ClickOrigin.Center) + { + foreach (SystemWindow window in SystemWindow.OpenWindows) + { + GuiWidget widgetToClick = window.FindNamedChildRecursive(widgetName); + if (widgetToClick != null) + { + RectangleDouble childBounds = widgetToClick.TransformToParentSpace(window, widgetToClick.LocalBounds); + + if (origin == ClickOrigin.Center) + { + xOffset += (int)childBounds.Width / 2; + yOffset += (int)childBounds.Height / 2; + } + + Point2D screenPosition = new Point2D((int)childBounds.Left + xOffset, (int)window.Height - (int)(childBounds.Bottom + yOffset)); + + screenPosition.x += WidgetForWindowsFormsAbstract.MainWindowsFormsWindow.Location.X; + screenPosition.y += WidgetForWindowsFormsAbstract.MainWindowsFormsWindow.Location.Y + WidgetForWindowsFormsAbstract.MainWindowsFormsWindow.TitleBarHeight; + + SetCursorPos(screenPosition.x, screenPosition.y); + NativeMethods.mouse_event(NativeMethods.MOUSEEVENTF_LEFTDOWN, screenPosition.x, screenPosition.y, 0, 0); + + Wait(upDelaySeconds); + + NativeMethods.mouse_event(NativeMethods.MOUSEEVENTF_LEFTUP, screenPosition.x, screenPosition.y, 0, 0); + + return true; + } + } + return false; + } + + public Point2D CurrentMousPosition() + { + Point2D mousePos = new Point2D(System.Windows.Forms.Control.MousePosition.X, System.Windows.Forms.Control.MousePosition.Y); + return mousePos; + } + + public enum InterpolationType { LINEAR, EASE_IN, EASE_OUT, EASE_IN_OUT }; + + public double GetInterpolatedValue(double compleatedRatio0To1, InterpolationType interpolationType) + { + switch (interpolationType) + { + case InterpolationType.LINEAR: + return compleatedRatio0To1; + + case InterpolationType.EASE_IN: + return Math.Pow(compleatedRatio0To1, 3); + + case InterpolationType.EASE_OUT: + return (Math.Pow(compleatedRatio0To1 - 1, 3) + 1); + + case InterpolationType.EASE_IN_OUT: + if (compleatedRatio0To1 < .5) + { + return Math.Pow(compleatedRatio0To1 * 2, 3) / 2; + } + else + { + return (Math.Pow(compleatedRatio0To1 * 2 - 2, 3) + 2) / 2; + } + + default: + throw new NotImplementedException(); + } + } + + public void SetCursorPos(int x, int y) + { + Vector2 start = new Vector2(CurrentMousPosition().x, CurrentMousPosition().y); + Vector2 end = new Vector2(x, y); + Vector2 delta = end - start; + int steps = 50; + for (int i = 0; i < steps; i++) + { + double ratio = i / (double)steps; + ratio = GetInterpolatedValue(ratio, InterpolationType.EASE_IN_OUT); + Vector2 current = start + delta * ratio; + NativeMethods.SetCursorPos((int)current.x, (int)current.y); + Thread.Sleep(20); + } + + NativeMethods.SetCursorPos((int)end.x, (int)end.y); + } + + public bool ClickImage(string imageName, int xOffset = 0, int yOffset = 0, double upDelaySeconds = .2, ClickOrigin origin = ClickOrigin.Center) + { + string pathToImage = Path.Combine(imageDirectory, imageName); + + if (File.Exists(pathToImage)) + { + ImageBuffer imageToLookFor = new ImageBuffer(); + + if (ImageIO.LoadImageData(pathToImage, imageToLookFor)) + { + if (origin == ClickOrigin.Center) + { + xOffset += imageToLookFor.Width / 2; + yOffset += imageToLookFor.Height / 2; + } + + ImageBuffer currentScreen = NativeMethods.GetCurrentScreen(); + + Vector2 matchPosition; + double bestMatch; + if (currentScreen.FindLeastSquaresMatch(imageToLookFor, out matchPosition, out bestMatch, 50)) + { + // TODO: figure out which window the position is in + Point2D screenPosition = new Point2D((int)matchPosition.x + xOffset, currentScreen.Height - (int)(matchPosition.y + yOffset)); + SetCursorPos(screenPosition.x, screenPosition.y); + NativeMethods.mouse_event(NativeMethods.MOUSEEVENTF_LEFTDOWN, screenPosition.x, screenPosition.y, 0, 0); + Wait(upDelaySeconds); + NativeMethods.mouse_event(NativeMethods.MOUSEEVENTF_LEFTUP, screenPosition.x, screenPosition.y, 0, 0); + + return true; + } + } + } + + return false; + } + + public ImageBuffer GetCurrentScreen() + { + return NativeMethods.GetCurrentScreen(); + } + + public bool ImageExists(ImageBuffer image) + { + return false; + } + + public bool ImageExists(string imageFileName) + { + return false; + } + + public bool NameExists(string widgetName) + { + foreach (SystemWindow window in SystemWindow.OpenWindows) + { + GuiWidget widgetToClick = window.FindNamedChildRecursive(widgetName); + if (widgetToClick != null) + { + return true; + } + } + + return false; + } + + public void Wait(double timeInSeconds) + { + Thread.Sleep((int)(timeInSeconds * 1000)); + } + } +} \ No newline at end of file diff --git a/TestRunner/TestRunner.cs b/TestRunner/TestRunner.cs deleted file mode 100644 index 1e214cb4a..000000000 --- a/TestRunner/TestRunner.cs +++ /dev/null @@ -1,222 +0,0 @@ -/* -Copyright (c) 2014, Lars Brubaker -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those -of the authors and should not be interpreted as representing official policies, -either expressed or implied, of the FreeBSD Project. -*/ - -using MatterHackers.Agg; -using MatterHackers.Agg.Image; -using MatterHackers.Agg.PlatformAbstract; -using MatterHackers.Agg.UI; -using MatterHackers.VectorMath; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; - -namespace MatterHackers.TestRunner -{ - public class TestFramework - { - // P/Invoke declarations - [DllImport("gdi32.dll")] - static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int - wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop); - [DllImport("user32.dll")] - static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc); - [DllImport("gdi32.dll")] - static extern IntPtr DeleteDC(IntPtr hDc); - [DllImport("gdi32.dll")] - static extern IntPtr DeleteObject(IntPtr hDc); - [DllImport("gdi32.dll")] - static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight); - [DllImport("gdi32.dll")] - static extern IntPtr CreateCompatibleDC(IntPtr hdc); - [DllImport("gdi32.dll")] - static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp); - [DllImport("user32.dll")] - public static extern IntPtr GetDesktopWindow(); - [DllImport("user32.dll")] - public static extern IntPtr GetWindowDC(IntPtr ptr); - - string imageDirectory; - - public TestFramework(string imageDirectory) - { - this.imageDirectory = imageDirectory; - } - - public bool ClickByName(string widgetName, int xOffset = 0, int yOffset = 0, double upDelaySeconds = .2) - { - foreach (SystemWindow window in SystemWindow.OpenWindows) - { - GuiWidget widgetToClick = window.FindNamedChildRecursive(widgetName); - if (widgetToClick != null) - { - RectangleDouble childBounds = widgetToClick.TransformToParentSpace(window, widgetToClick.LocalBounds); - UiThread.RunOnIdle(() => - window.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, - childBounds.Left + xOffset, childBounds.Bottom + yOffset, - 0))); - Wait(upDelaySeconds); - UiThread.RunOnIdle(() => - window.OnMouseUp(new MouseEventArgs(MouseButtons.Left, 0, - childBounds.Left + xOffset, childBounds.Bottom + yOffset, - 0))); - return true; - } - } - return false; - } - - public bool ClickImage(string imageName, int xOffset = 0, int yOffset = 0, double upDelaySeconds = .2) - { - string pathToImage = Path.Combine(imageDirectory, imageName); - - ImageBuffer imageToLookFor = new ImageBuffer(); - if (ImageIO.LoadImageData(pathToImage, imageToLookFor)) - { - ImageBuffer currentScreen = GetCurrentScreen(); - - Vector2 matchPosition; - double bestMatch; - if (currentScreen.FindLeastSquaresMatch(imageToLookFor, out matchPosition, out bestMatch)) - { - // TODO: figure out which window the position is in - SystemWindow window = SystemWindow.OpenWindows[0]; - - UiThread.RunOnIdle(() => - window.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, - matchPosition.x + xOffset, matchPosition.y + yOffset, - 0))); - Wait(upDelaySeconds); - UiThread.RunOnIdle(() => - window.OnMouseUp(new MouseEventArgs(MouseButtons.Left, 0, - matchPosition.x + xOffset, matchPosition.y + yOffset, - 0))); - return true; - } - } - - return false; - } - - public bool NameExists(string widgetName) - { - foreach (SystemWindow window in SystemWindow.OpenWindows) - { - GuiWidget widgetToClick = window.FindNamedChildRecursive(widgetName); - if (widgetToClick != null) - { - return true; - } - } - - return false; - } - - public ImageBuffer GetCurrentScreen() - { - ImageBuffer screenCapture = new ImageBuffer(); - - Size sz = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size; - IntPtr hDesk = GetDesktopWindow(); - IntPtr hSrce = GetWindowDC(hDesk); - IntPtr hDest = CreateCompatibleDC(hSrce); - IntPtr hBmp = CreateCompatibleBitmap(hSrce, sz.Width, sz.Height); - IntPtr hOldBmp = SelectObject(hDest, hBmp); - bool b = BitBlt(hDest, 0, 0, sz.Width, sz.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt); - Bitmap bmpScreenCapture = Bitmap.FromHbitmap(hBmp); - SelectObject(hDest, hOldBmp); - DeleteObject(hBmp); - DeleteDC(hDest); - ReleaseDC(hDesk, hSrce); - - //bmpScreenCapture.Save("bitmapsave.png"); - - screenCapture = new ImageBuffer(bmpScreenCapture.Width, bmpScreenCapture.Height, 32, new BlenderBGRA()); - BitmapData bitmapData = bmpScreenCapture.LockBits(new Rectangle(0, 0, bmpScreenCapture.Width, bmpScreenCapture.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bmpScreenCapture.PixelFormat); - - int offset; - byte[] buffer = screenCapture.GetBuffer(out offset); - int bitmapDataStride = bitmapData.Stride; - int backBufferStrideInBytes = screenCapture.StrideInBytes(); - int backBufferHeight = screenCapture.Height; - int backBufferHeightMinusOne = backBufferHeight - 1; - - unsafe - { - byte* bitmapDataScan0 = (byte*)bitmapData.Scan0; - fixed (byte* pSourceFixed = &buffer[offset]) - { - byte* pSource = bitmapDataScan0 + bitmapDataStride * backBufferHeightMinusOne; - byte* pDestBuffer = pSourceFixed; - for (int y = 0; y < screenCapture.Height; y++) - { - int* pSourceInt = (int*)pSource; - pSourceInt -= (bitmapDataStride * y / 4); - - int* pDestBufferInt = (int*)pDestBuffer; - pDestBufferInt += (backBufferStrideInBytes * y / 4); - - for (int x = 0; x < screenCapture.Width; x++) - { - pDestBufferInt[x] = pSourceInt[x]; - } - } - } - } - - bmpScreenCapture.UnlockBits(bitmapData); - - bmpScreenCapture.Dispose(); - - return screenCapture; - } - - public bool ImageExists(ImageBuffer image) - { - return false; - } - - public bool ImageExists(string imageFileName) - { - return false; - } - - public void Wait(double timeInSeconds) - { - Thread.Sleep((int)(timeInSeconds * 1000)); - } - } -} \ No newline at end of file diff --git a/TestRunner/TestRunner.csproj b/TestRunner/TestRunner.csproj index 14dca95e8..205d287ac 100644 --- a/TestRunner/TestRunner.csproj +++ b/TestRunner/TestRunner.csproj @@ -132,7 +132,8 @@ - + + @@ -162,6 +163,7 @@ + diff --git a/TestRunner/packages.config b/TestRunner/packages.config new file mode 100644 index 000000000..e226b8b70 --- /dev/null +++ b/TestRunner/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From fc62137d3ea88da3d7791130f9614392e2bc33a9 Mon Sep 17 00:00:00 2001 From: larsbrubaker Date: Tue, 18 Aug 2015 10:31:10 -0700 Subject: [PATCH 2/2] Moved GuiAutomation into agg. --- MatterControl.csproj | 8 +- MatterControl.sln | 67 +++++------ MatterControlApplication.cs | 8 +- Submodules/agg-sharp | 2 +- TestRunner/NativeMethods.cs | 145 ------------------------ TestRunner/TestFramework.cs | 212 ----------------------------------- TestRunner/TestRunner.csproj | 173 ---------------------------- TestRunner/app.config | 11 -- TestRunner/packages.config | 4 - 9 files changed, 43 insertions(+), 587 deletions(-) delete mode 100644 TestRunner/NativeMethods.cs delete mode 100644 TestRunner/TestFramework.cs delete mode 100644 TestRunner/TestRunner.csproj delete mode 100644 TestRunner/app.config delete mode 100644 TestRunner/packages.config diff --git a/MatterControl.csproj b/MatterControl.csproj index 9d7bb140b..1aa4c6033 100644 --- a/MatterControl.csproj +++ b/MatterControl.csproj @@ -431,6 +431,10 @@ {04667764-dc7b-4b95-aef6-b4e6c87a54e9} DataConverters3D + + {e9102310-0029-4d8f-b1e9-88fba6147d45} + GuiAutomation + {74F6BB6C-9D02-4512-A59A-21940E35C532} Gui @@ -519,9 +523,5 @@ {990A9AD3-B6A4-407B-9DFC-9C722AF7C9B9} InfInstaller - - {9d193b5c-bef4-44b2-ad6d-597b7a2c52c5} - TestRunner - \ No newline at end of file diff --git a/MatterControl.sln b/MatterControl.sln index aaf3b8232..c55e5f2a5 100644 --- a/MatterControl.sln +++ b/MatterControl.sln @@ -120,7 +120,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "X3GDriver", "..\X3GDriver\X EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Nat", "..\CloudServicesPlugin\Mono.Nat\Mono.Nat.csproj", "{F5D74163-145F-47BF-83DC-D0E07249C6CA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestRunner", "TestRunner\TestRunner.csproj", "{9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GuiAutomation", "SubModules\agg-sharp\GuiAutomation\GuiAutomation.csproj", "{E9102310-0029-4D8F-B1E9-88FBA6147D45}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -1075,38 +1075,38 @@ Global {F5D74163-145F-47BF-83DC-D0E07249C6CA}.Release64|x64.ActiveCfg = Release|x64 {F5D74163-145F-47BF-83DC-D0E07249C6CA}.Release64|x64.Build.0 = Release|x64 {F5D74163-145F-47BF-83DC-D0E07249C6CA}.Release64|x86.ActiveCfg = Release|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug|x64.ActiveCfg = Debug|x64 - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug|x64.Build.0 = Debug|x64 - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug|x86.ActiveCfg = Debug|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug|x86.Build.0 = Debug|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug64|Any CPU.ActiveCfg = Debug64|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug64|Any CPU.Build.0 = Debug64|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug64|Mixed Platforms.ActiveCfg = Debug64|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug64|Mixed Platforms.Build.0 = Debug64|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug64|x64.ActiveCfg = Debug64|x64 - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug64|x64.Build.0 = Debug64|x64 - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug64|x86.ActiveCfg = Debug64|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Debug64|x86.Build.0 = Debug64|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release|Any CPU.Build.0 = Release|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release|x64.ActiveCfg = Release|x64 - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release|x64.Build.0 = Release|x64 - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release|x86.ActiveCfg = Release|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release|x86.Build.0 = Release|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release64|Any CPU.ActiveCfg = Release64|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release64|Any CPU.Build.0 = Release64|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release64|Mixed Platforms.ActiveCfg = Release64|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release64|Mixed Platforms.Build.0 = Release64|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release64|x64.ActiveCfg = Release64|x64 - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release64|x64.Build.0 = Release64|x64 - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release64|x86.ActiveCfg = Release64|Any CPU - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5}.Release64|x86.Build.0 = Release64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|x64.ActiveCfg = Debug|x64 + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|x64.Build.0 = Debug|x64 + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|x86.ActiveCfg = Debug|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug|x86.Build.0 = Debug|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug64|Any CPU.ActiveCfg = Debug64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug64|Any CPU.Build.0 = Debug64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug64|Mixed Platforms.ActiveCfg = Debug64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug64|Mixed Platforms.Build.0 = Debug64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug64|x64.ActiveCfg = Debug64|x64 + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug64|x64.Build.0 = Debug64|x64 + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug64|x86.ActiveCfg = Debug64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Debug64|x86.Build.0 = Debug64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|Any CPU.Build.0 = Release|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|x64.ActiveCfg = Release|x64 + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|x64.Build.0 = Release|x64 + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|x86.ActiveCfg = Release|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release|x86.Build.0 = Release|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release64|Any CPU.ActiveCfg = Release64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release64|Any CPU.Build.0 = Release64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release64|Mixed Platforms.ActiveCfg = Release64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release64|Mixed Platforms.Build.0 = Release64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release64|x64.ActiveCfg = Release64|x64 + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release64|x64.Build.0 = Release64|x64 + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release64|x86.ActiveCfg = Release64|Any CPU + {E9102310-0029-4D8F-B1E9-88FBA6147D45}.Release64|x86.Build.0 = Release64|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1142,6 +1142,7 @@ Global {8CD15B23-D30F-470E-99BA-9276FB7CABD4} = {FBE6DF29-85A9-4A8B-B739-35BE4CA0A9B7} {26164CC3-29AD-4384-861C-181440934B00} = {4E79BE4E-275E-4901-9173-E9096B7318F0} {F5D74163-145F-47BF-83DC-D0E07249C6CA} = {4E79BE4E-275E-4901-9173-E9096B7318F0} + {E9102310-0029-4D8F-B1E9-88FBA6147D45} = {2AB9B589-5C98-4C05-BBEA-F97DAE168EAB} EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution StartupItem = MatterControl.csproj diff --git a/MatterControlApplication.cs b/MatterControlApplication.cs index 7f1a5d5b5..a5fcaa11d 100644 --- a/MatterControlApplication.cs +++ b/MatterControlApplication.cs @@ -39,7 +39,7 @@ using MatterHackers.MatterControl.SettingsManagement; using MatterHackers.MatterControl.SlicerConfiguration; using MatterHackers.PolygonMesh.Processors; using MatterHackers.RenderOpenGl.OpenGl; -using MatterHackers.TestRunner; +using MatterHackers.GuiAutomation; using MatterHackers.VectorMath; using Mindscape.Raygun4Net; using System; @@ -533,7 +533,7 @@ namespace MatterHackers.MatterControl if (firstDraw) { - //Task.Run((Action)ButtonClickTest); + //Task.Run((Action)AutomationTest); UiThread.RunOnIdle(DoAutoConnectIfRequired); firstDraw = false; @@ -556,9 +556,9 @@ namespace MatterHackers.MatterControl //msGraph.Draw(MatterHackers.Agg.Transform.Affine.NewIdentity(), graphics2D); } - private void ButtonClickTest() + private void AutomationTest() { - TestFramework test = new TestFramework("C:/TestImages"); + AutomationRunner test = new AutomationRunner("C:/TestImages"); test.Wait(2); test.ClickByName("SettingsAndControls"); test.Wait(2); diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index fd3e1f925..7f766b566 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit fd3e1f9259b528ab1f0d220c6007f53deb81c417 +Subproject commit 7f766b566fb0d98124b53e5a37bc84741c767567 diff --git a/TestRunner/NativeMethods.cs b/TestRunner/NativeMethods.cs deleted file mode 100644 index 22fbff66a..000000000 --- a/TestRunner/NativeMethods.cs +++ /dev/null @@ -1,145 +0,0 @@ -/* -Copyright (c) 2014, Lars Brubaker -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those -of the authors and should not be interpreted as representing official policies, -either expressed or implied, of the FreeBSD Project. -*/ - -using MatterHackers.Agg; -using MatterHackers.Agg.Image; -using MatterHackers.Agg.PlatformAbstract; -using MatterHackers.Agg.UI; -using MatterHackers.VectorMath; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; - -namespace MatterHackers.TestRunner -{ - public static class NativeMethods - { - // P/Invoke declarations - [DllImport("gdi32.dll")] - static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop); - [DllImport("user32.dll")] - static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc); - [DllImport("gdi32.dll")] - static extern IntPtr DeleteDC(IntPtr hDc); - [DllImport("gdi32.dll")] - static extern IntPtr DeleteObject(IntPtr hDc); - [DllImport("gdi32.dll")] - static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight); - [DllImport("gdi32.dll")] - static extern IntPtr CreateCompatibleDC(IntPtr hdc); - [DllImport("gdi32.dll")] - static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp); - [DllImport("user32.dll")] - public static extern IntPtr GetDesktopWindow(); - [DllImport("user32.dll")] - public static extern IntPtr GetWindowDC(IntPtr ptr); - - [DllImport("User32.Dll")] - public static extern long SetCursorPos(int x, int y); - - [DllImport("user32.dll")] - public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); - - public const int MOUSEEVENTF_LEFTDOWN = 0x02; - public const int MOUSEEVENTF_LEFTUP = 0x04; - - public static int GetCurrentScreenHeight() - { - Size sz = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size; - return sz.Height; - } - - public static ImageBuffer GetCurrentScreen() - { - ImageBuffer screenCapture = new ImageBuffer(); - - Size sz = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size; - IntPtr hDesk = GetDesktopWindow(); - IntPtr hSrce = GetWindowDC(hDesk); - IntPtr hDest = CreateCompatibleDC(hSrce); - IntPtr hBmp = CreateCompatibleBitmap(hSrce, sz.Width, sz.Height); - IntPtr hOldBmp = SelectObject(hDest, hBmp); - bool b = BitBlt(hDest, 0, 0, sz.Width, sz.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt); - Bitmap bmpScreenCapture = Bitmap.FromHbitmap(hBmp); - SelectObject(hDest, hOldBmp); - DeleteObject(hBmp); - DeleteDC(hDest); - ReleaseDC(hDesk, hSrce); - - //bmpScreenCapture.Save("bitmapsave.png"); - - screenCapture = new ImageBuffer(bmpScreenCapture.Width, bmpScreenCapture.Height, 32, new BlenderBGRA()); - BitmapData bitmapData = bmpScreenCapture.LockBits(new Rectangle(0, 0, bmpScreenCapture.Width, bmpScreenCapture.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bmpScreenCapture.PixelFormat); - - int offset; - byte[] buffer = screenCapture.GetBuffer(out offset); - int bitmapDataStride = bitmapData.Stride; - int backBufferStrideInBytes = screenCapture.StrideInBytes(); - int backBufferHeight = screenCapture.Height; - int backBufferHeightMinusOne = backBufferHeight - 1; - - unsafe - { - byte* bitmapDataScan0 = (byte*)bitmapData.Scan0; - fixed (byte* pSourceFixed = &buffer[offset]) - { - byte* pSource = bitmapDataScan0 + bitmapDataStride * backBufferHeightMinusOne; - byte* pDestBuffer = pSourceFixed; - for (int y = 0; y < screenCapture.Height; y++) - { - int* pSourceInt = (int*)pSource; - pSourceInt -= (bitmapDataStride * y / 4); - - int* pDestBufferInt = (int*)pDestBuffer; - pDestBufferInt += (backBufferStrideInBytes * y / 4); - - for (int x = 0; x < screenCapture.Width; x++) - { - pDestBufferInt[x] = pSourceInt[x]; - } - } - } - } - - bmpScreenCapture.UnlockBits(bitmapData); - - bmpScreenCapture.Dispose(); - - return screenCapture; - } - } -} \ No newline at end of file diff --git a/TestRunner/TestFramework.cs b/TestRunner/TestFramework.cs deleted file mode 100644 index e3b1de73b..000000000 --- a/TestRunner/TestFramework.cs +++ /dev/null @@ -1,212 +0,0 @@ -/* -Copyright (c) 2014, Lars Brubaker -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those -of the authors and should not be interpreted as representing official policies, -either expressed or implied, of the FreeBSD Project. -*/ - -using MatterHackers.Agg; -using MatterHackers.Agg.Image; -using MatterHackers.Agg.PlatformAbstract; -using MatterHackers.Agg.UI; -using MatterHackers.VectorMath; -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Threading; - -namespace MatterHackers.TestRunner -{ - public class TestFramework - { - private string imageDirectory; - - public TestFramework(string imageDirectory) - { - this.imageDirectory = imageDirectory; - } - - public enum ClickOrigin { LowerLeft, Center }; - - public bool ClickByName(string widgetName, int xOffset = 0, int yOffset = 0, double upDelaySeconds = .2, ClickOrigin origin = ClickOrigin.Center) - { - foreach (SystemWindow window in SystemWindow.OpenWindows) - { - GuiWidget widgetToClick = window.FindNamedChildRecursive(widgetName); - if (widgetToClick != null) - { - RectangleDouble childBounds = widgetToClick.TransformToParentSpace(window, widgetToClick.LocalBounds); - - if (origin == ClickOrigin.Center) - { - xOffset += (int)childBounds.Width / 2; - yOffset += (int)childBounds.Height / 2; - } - - Point2D screenPosition = new Point2D((int)childBounds.Left + xOffset, (int)window.Height - (int)(childBounds.Bottom + yOffset)); - - screenPosition.x += WidgetForWindowsFormsAbstract.MainWindowsFormsWindow.Location.X; - screenPosition.y += WidgetForWindowsFormsAbstract.MainWindowsFormsWindow.Location.Y + WidgetForWindowsFormsAbstract.MainWindowsFormsWindow.TitleBarHeight; - - SetCursorPos(screenPosition.x, screenPosition.y); - NativeMethods.mouse_event(NativeMethods.MOUSEEVENTF_LEFTDOWN, screenPosition.x, screenPosition.y, 0, 0); - - Wait(upDelaySeconds); - - NativeMethods.mouse_event(NativeMethods.MOUSEEVENTF_LEFTUP, screenPosition.x, screenPosition.y, 0, 0); - - return true; - } - } - return false; - } - - public Point2D CurrentMousPosition() - { - Point2D mousePos = new Point2D(System.Windows.Forms.Control.MousePosition.X, System.Windows.Forms.Control.MousePosition.Y); - return mousePos; - } - - public enum InterpolationType { LINEAR, EASE_IN, EASE_OUT, EASE_IN_OUT }; - - public double GetInterpolatedValue(double compleatedRatio0To1, InterpolationType interpolationType) - { - switch (interpolationType) - { - case InterpolationType.LINEAR: - return compleatedRatio0To1; - - case InterpolationType.EASE_IN: - return Math.Pow(compleatedRatio0To1, 3); - - case InterpolationType.EASE_OUT: - return (Math.Pow(compleatedRatio0To1 - 1, 3) + 1); - - case InterpolationType.EASE_IN_OUT: - if (compleatedRatio0To1 < .5) - { - return Math.Pow(compleatedRatio0To1 * 2, 3) / 2; - } - else - { - return (Math.Pow(compleatedRatio0To1 * 2 - 2, 3) + 2) / 2; - } - - default: - throw new NotImplementedException(); - } - } - - public void SetCursorPos(int x, int y) - { - Vector2 start = new Vector2(CurrentMousPosition().x, CurrentMousPosition().y); - Vector2 end = new Vector2(x, y); - Vector2 delta = end - start; - int steps = 50; - for (int i = 0; i < steps; i++) - { - double ratio = i / (double)steps; - ratio = GetInterpolatedValue(ratio, InterpolationType.EASE_IN_OUT); - Vector2 current = start + delta * ratio; - NativeMethods.SetCursorPos((int)current.x, (int)current.y); - Thread.Sleep(20); - } - - NativeMethods.SetCursorPos((int)end.x, (int)end.y); - } - - public bool ClickImage(string imageName, int xOffset = 0, int yOffset = 0, double upDelaySeconds = .2, ClickOrigin origin = ClickOrigin.Center) - { - string pathToImage = Path.Combine(imageDirectory, imageName); - - if (File.Exists(pathToImage)) - { - ImageBuffer imageToLookFor = new ImageBuffer(); - - if (ImageIO.LoadImageData(pathToImage, imageToLookFor)) - { - if (origin == ClickOrigin.Center) - { - xOffset += imageToLookFor.Width / 2; - yOffset += imageToLookFor.Height / 2; - } - - ImageBuffer currentScreen = NativeMethods.GetCurrentScreen(); - - Vector2 matchPosition; - double bestMatch; - if (currentScreen.FindLeastSquaresMatch(imageToLookFor, out matchPosition, out bestMatch, 50)) - { - // TODO: figure out which window the position is in - Point2D screenPosition = new Point2D((int)matchPosition.x + xOffset, currentScreen.Height - (int)(matchPosition.y + yOffset)); - SetCursorPos(screenPosition.x, screenPosition.y); - NativeMethods.mouse_event(NativeMethods.MOUSEEVENTF_LEFTDOWN, screenPosition.x, screenPosition.y, 0, 0); - Wait(upDelaySeconds); - NativeMethods.mouse_event(NativeMethods.MOUSEEVENTF_LEFTUP, screenPosition.x, screenPosition.y, 0, 0); - - return true; - } - } - } - - return false; - } - - public ImageBuffer GetCurrentScreen() - { - return NativeMethods.GetCurrentScreen(); - } - - public bool ImageExists(ImageBuffer image) - { - return false; - } - - public bool ImageExists(string imageFileName) - { - return false; - } - - public bool NameExists(string widgetName) - { - foreach (SystemWindow window in SystemWindow.OpenWindows) - { - GuiWidget widgetToClick = window.FindNamedChildRecursive(widgetName); - if (widgetToClick != null) - { - return true; - } - } - - return false; - } - - public void Wait(double timeInSeconds) - { - Thread.Sleep((int)(timeInSeconds * 1000)); - } - } -} \ No newline at end of file diff --git a/TestRunner/TestRunner.csproj b/TestRunner/TestRunner.csproj deleted file mode 100644 index 205d287ac..000000000 --- a/TestRunner/TestRunner.csproj +++ /dev/null @@ -1,173 +0,0 @@ - - - - Release - AnyCPU - 8.0.50727 - 2.0 - {9D193B5C-BEF4-44B2-AD6D-597B7A2C52C5} - Library - Properties - MatterHackers.TestRunner - TestRunner - - - - - 2.0 - v4.5 - - - - True - full - False - ..\bin\Debug\ - DEBUG;TRACE - prompt - 4 - True - x86 - false - - - pdbonly - True - ..\bin\Release\ - TRACE - prompt - 4 - True - x86 - false - - - false - - - bin\Release64\ - TRACE - true - true - pdbonly - x64 - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - false - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - false - false - false - - - true - bin\Debug64\ - DEBUG;TRACE - true - full - x86 - prompt - false - false - - - true - bin\x64\Debug\ - DEBUG;TRACE - true - full - x64 - prompt - false - false - false - - - bin\x64\Release\ - TRACE - true - true - pdbonly - x64 - prompt - false - false - false - - - bin\x64\Release64\ - TRACE - true - true - pdbonly - x64 - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - false - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - false - false - - - true - bin\x64\Debug64\ - DEBUG;TRACE - true - full - x64 - prompt - false - false - false - - - - - - - - - - - - - {657DBC6D-C3EA-4398-A3FA-DDB73C14F71B} - Agg - - - {74F6BB6C-9D02-4512-A59A-21940E35C532} - Gui - - - {036BCCBA-52D8-457C-84AE-8821F209FE4A} - ImageProcessing - - - {3e4aaba8-d85f-4922-88c6-5c1b2d2308fb} - PlatformAbstract - - - {670bddff-927b-425d-9dd1-22acb14356eb} - PlatformWin32 - - - {D3E41B4E-BFBB-44CA-94C8-95C00F754FDD} - VectorMath - - - - - - - - - - - - \ No newline at end of file diff --git a/TestRunner/app.config b/TestRunner/app.config deleted file mode 100644 index f4aff65b5..000000000 --- a/TestRunner/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/TestRunner/packages.config b/TestRunner/packages.config deleted file mode 100644 index e226b8b70..000000000 --- a/TestRunner/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file