diff --git a/MouseAlive.AcceptanceTests/App.config b/MouseAlive.AcceptanceTests/App.config
new file mode 100644
index 0000000..dfe587f
--- /dev/null
+++ b/MouseAlive.AcceptanceTests/App.config
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MouseAlive.AcceptanceTests/MouseAlive.AcceptanceTests.csproj b/MouseAlive.AcceptanceTests/MouseAlive.AcceptanceTests.csproj
new file mode 100644
index 0000000..e877e67
--- /dev/null
+++ b/MouseAlive.AcceptanceTests/MouseAlive.AcceptanceTests.csproj
@@ -0,0 +1,76 @@
+
+
+
+ Debug
+ x86
+ 8.0.30703
+ 2.0
+ {AF3E4F64-5C96-4055-B4A6-3ED747A0F762}
+ Library
+ Properties
+ MouseAlive.AcceptanceTests
+ MouseAlive.AcceptanceTests
+ v4.0
+ Client
+ 512
+
+
+ x86
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ x86
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+ SpecFlowSingleFileGenerator
+ MouseUtilities.feature.cs
+
+
+
+
+ True
+ True
+ MouseUtilities.feature
+
+
+
+
+
+
+
+
+ C:\Program Files (x86)\TechTalk\SpecFlow\TechTalk.SpecFlow.dll
+
+
+
+
+ {284DE1A9-7189-4B58-8573-81681A982F9F}
+ MouseAlive
+
+
+
+
+
\ No newline at end of file
diff --git a/MouseAlive.AcceptanceTests/MouseUtilities.feature b/MouseAlive.AcceptanceTests/MouseUtilities.feature
new file mode 100644
index 0000000..6f037d6
--- /dev/null
+++ b/MouseAlive.AcceptanceTests/MouseUtilities.feature
@@ -0,0 +1,9 @@
+Feature: Mouse Utilities
+ In order to keep the screen saver from activating
+ As a remote support agent
+ I want to have the mouse moved for me automatically
+
+Scenario: Move Mouse
+ Given I am working on a machine with MouseAlive
+ When a certain amount of time has elapsed
+ Then the mouse should move automatically
diff --git a/MouseAlive.AcceptanceTests/MouseUtilities.feature.cs b/MouseAlive.AcceptanceTests/MouseUtilities.feature.cs
new file mode 100644
index 0000000..a1151ab
--- /dev/null
+++ b/MouseAlive.AcceptanceTests/MouseUtilities.feature.cs
@@ -0,0 +1,75 @@
+// ------------------------------------------------------------------------------
+//
+// This code was generated by SpecFlow (http://www.specflow.org/).
+// SpecFlow Version:1.6.1.0
+// SpecFlow Generator Version:1.6.0.0
+// Runtime Version:4.0.30319.235
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+// ------------------------------------------------------------------------------
+#region Designer generated code
+namespace MouseAlive.AcceptanceTests
+{
+ using TechTalk.SpecFlow;
+
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "1.6.1.0")]
+ [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [NUnit.Framework.TestFixtureAttribute()]
+ [NUnit.Framework.DescriptionAttribute("Mouse Utilities")]
+ public partial class MouseUtilitiesFeature
+ {
+
+ private static TechTalk.SpecFlow.ITestRunner testRunner;
+
+#line 1 "MouseUtilities.feature"
+#line hidden
+
+ [NUnit.Framework.TestFixtureSetUpAttribute()]
+ public virtual void FeatureSetup()
+ {
+ testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner();
+ TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "Mouse Utilities", "In order to keep the screen saver from activating\r\nAs a remote support agent\r\nI w" +
+ "ant to have the mouse moved for me automatically", GenerationTargetLanguage.CSharp, ((string[])(null)));
+ testRunner.OnFeatureStart(featureInfo);
+ }
+
+ [NUnit.Framework.TestFixtureTearDownAttribute()]
+ public virtual void FeatureTearDown()
+ {
+ testRunner.OnFeatureEnd();
+ testRunner = null;
+ }
+
+ public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo)
+ {
+ testRunner.OnScenarioStart(scenarioInfo);
+ }
+
+ [NUnit.Framework.TearDownAttribute()]
+ public virtual void ScenarioTearDown()
+ {
+ testRunner.OnScenarioEnd();
+ }
+
+ [NUnit.Framework.TestAttribute()]
+ [NUnit.Framework.DescriptionAttribute("Move Mouse")]
+ public virtual void MoveMouse()
+ {
+ TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Move Mouse", ((string[])(null)));
+#line 6
+this.ScenarioSetup(scenarioInfo);
+#line 7
+ testRunner.Given("I am working on a machine with MouseAlive");
+#line 8
+ testRunner.When("a certain amount of time has elapsed");
+#line 9
+ testRunner.Then("the mouse should move automatically");
+#line hidden
+ testRunner.CollectScenarioErrors();
+ }
+ }
+}
+#endregion
diff --git a/MouseAlive.AcceptanceTests/MouseUtilitiesSteps.cs b/MouseAlive.AcceptanceTests/MouseUtilitiesSteps.cs
new file mode 100644
index 0000000..c6c5f24
--- /dev/null
+++ b/MouseAlive.AcceptanceTests/MouseUtilitiesSteps.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using TechTalk.SpecFlow;
+using NUnit.Framework;
+using System.Drawing;
+
+namespace MouseAlive.AcceptanceTests {
+ [Binding]
+ public class MouseUtilitiesSteps {
+
+ private Point point;
+
+ [Given("I am working on a machine with MouseAlive")]
+ public void GivenIAmWorkingOnAMachineWithMouseAlive() {
+ point = MouseUtilities.GetMousePosition();
+ }
+
+ [When("a certain amount of time has elapsed")]
+ public void WhenIAmAwayFromMyDesk() {
+ var oldPoint = point;
+ MouseUtilities.MoveMouse();
+
+ }
+
+ [Then("the mouse should move automatically")]
+ public void ThenTheMouseShouldMoveAutomaticallyOverATimeInterval() {
+ var newPoint = MouseUtilities.GetMousePosition();
+ Assert.AreNotEqual(point, newPoint);
+ }
+ }
+}
diff --git a/MouseAlive.sln b/MouseAlive.sln
index dc4d16d..8f32219 100644
--- a/MouseAlive.sln
+++ b/MouseAlive.sln
@@ -5,6 +5,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MouseAlive", "MouseAlive\Mo
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MouseAlive.Tests", "MouseAlive.Tests\MouseAlive.Tests.csproj", "{49D09C41-50AE-4D6E-AA19-30CA7687AEEC}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MouseAlive.AcceptanceTests", "MouseAlive.AcceptanceTests\MouseAlive.AcceptanceTests.csproj", "{AF3E4F64-5C96-4055-B4A6-3ED747A0F762}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -35,6 +37,16 @@ Global
{49D09C41-50AE-4D6E-AA19-30CA7687AEEC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{49D09C41-50AE-4D6E-AA19-30CA7687AEEC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{49D09C41-50AE-4D6E-AA19-30CA7687AEEC}.Release|x86.ActiveCfg = Release|Any CPU
+ {AF3E4F64-5C96-4055-B4A6-3ED747A0F762}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {AF3E4F64-5C96-4055-B4A6-3ED747A0F762}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+ {AF3E4F64-5C96-4055-B4A6-3ED747A0F762}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {AF3E4F64-5C96-4055-B4A6-3ED747A0F762}.Debug|x86.ActiveCfg = Debug|x86
+ {AF3E4F64-5C96-4055-B4A6-3ED747A0F762}.Debug|x86.Build.0 = Debug|x86
+ {AF3E4F64-5C96-4055-B4A6-3ED747A0F762}.Release|Any CPU.ActiveCfg = Release|x86
+ {AF3E4F64-5C96-4055-B4A6-3ED747A0F762}.Release|Mixed Platforms.ActiveCfg = Release|x86
+ {AF3E4F64-5C96-4055-B4A6-3ED747A0F762}.Release|Mixed Platforms.Build.0 = Release|x86
+ {AF3E4F64-5C96-4055-B4A6-3ED747A0F762}.Release|x86.ActiveCfg = Release|x86
+ {AF3E4F64-5C96-4055-B4A6-3ED747A0F762}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE