public void SetOperationData(LinkOperationData data)
        {
            _linkOperationData = data;
            BindToFields();

            //Set up defaults
            _linkOperationData.CopyBeforeDelete = true;
        }
        public Form Start()
        {
            _operationData = new LinkOperationData();

            _view.SetOperationData(_operationData);
            _view.ValidatePath += ValidatePath;
            _view.PerformOperation += PerformOperation;
            _view.ValidOperation = ValidateOperationData;
            return _view.MainForm;
        }
        private bool TryingToLinkFileToFolder(LinkOperationData linkData)
        {
            var linkToAsFolder = _folderFactory(linkData.LinkTo);
            var createLinkAtAsFile = _fileFactory(linkData.CreateLinkAt);

            if (linkToAsFolder.FolderExists() && createLinkAtAsFile.Exists())
            {
                return true;
            }

            return false;
        }
        private Boolean IsValidFileLink(LinkOperationData linkData)
        {
            IFile createLinkAtFile = _fileFactory(linkData.CreateLinkAt);
            IFile linkToFile = _fileFactory(linkData.LinkTo);

            if (linkToFile.Exists())
            {
                return createLinkAtFile.Exists() || linkData.CopyBeforeDelete;
            }

            return true;
        }
        public void ValidOperation_File_LinkToExists_ValidOperation()
        {
            String createLinkAt = "linkAt";
            String linkTo = "linkTo";
            var fileFactory = GetFileFactoryThatReturnsExistsFor(linkTo);
            var validator = new OperationValidation(fileFactory, f => new FakeFolder(f));

            var data = new LinkOperationData() { LinkTo = createLinkAt, CreateLinkAt = linkTo, CopyBeforeDelete = true };

            String errorMessage;
            Boolean valid = validator.ValidOperation(data, out errorMessage);

            Assert.IsTrue(valid);
        }
        public void ValidOperation_AttemptsToLinkFolderToFile_NotValid()
        {
            String createLinkAt = "linkAt";
            String linkTo = "linkTo";
            var fileFactory = GetFileFactoryThatReturnsExistsFor(createLinkAt);
            var folderFactory = CommandDiscoveryTests.GetFolderFactoryThatReturnsExistsFor(linkTo);
            var validator = new OperationValidation(fileFactory, folderFactory);

            var data = new LinkOperationData() { LinkTo = linkTo, CreateLinkAt = createLinkAt, CopyBeforeDelete = true };

            String errorMessage;
            Boolean valid = validator.ValidOperation(data, out errorMessage);

            Assert.IsFalse(valid);
        }
        public Form Start()
        {
            try
            {
                Process.Start("ElevatedWorker.exe");
            }
            catch (Win32Exception E)
            {
                MessageBox.Show("Could not start elevated worker.\r\n" + E.Message, "DirLinker");
                Environment.Exit(0);
            }

            _operationData = new LinkOperationData();

            _view.SetOperationData(_operationData);
            _view.ValidatePath += ValidatePath;
            _view.PerformOperation += PerformOperation;
            _view.ValidOperation = ValidateOperationData;
            return _view.MainForm;
        }
        public Boolean ValidOperation(LinkOperationData linkData, out String errorMessage)
        {
            errorMessage = String.Empty;

            if(PathsMatch(linkData))
            {
                errorMessage = "A path can not be linked to itself";
                return false;
            }

            if(!IsValidFileLink(linkData))
            {
                errorMessage = "When creating a file link the linked to file must exist";
                return false;
            }

            if (TryingToLinkFileToFolder(linkData))
            {
                errorMessage = "A file can not be linked to a folder";
                return false;
            }

            return true;
        }
 private Boolean PathsMatch(LinkOperationData linkData)
 {
     return linkData.CreateLinkAt.Equals(linkData.LinkTo, StringComparison.CurrentCultureIgnoreCase);
 }
        public void ValidOperation_ValidData_TrueIsReturned()
        {
            var validator = new OperationValidation(f => new FakeFile(f), f => new FakeFolder(f));

            var data = new LinkOperationData() { LinkTo = "test1", CreateLinkAt = "test2" };

            String errorMessage;
            Boolean valid = validator.ValidOperation(data, out errorMessage);

            Assert.IsTrue(valid);
        }
        public void ValidOperation_LinkAndPathDoNotMatch_FalseIsReturnedAlongWithErrorMessage()
        {
            var validator = new OperationValidation(f => new FakeFile(f), f => new FakeFolder(f));

            var data = new LinkOperationData() { LinkTo = "test", CreateLinkAt = "test" };
            String errorMessage;
            Boolean valid = validator.ValidOperation(data, out errorMessage);

            Assert.IsFalse(valid);
            Assert.AreEqual("A path can not be linked to itself", errorMessage);
        }
        public void ValidOperation__CreateLinkAtExistsNoCopyBeforeDeleteLinkToDoesNotExist_FalseIsReturnedAlongWithErrorMessage()
        {
            String createLinkAt = "linkAt";
            String linkTo = "linkTo";
            var fileFactory = GetFileFactoryThatReturnsExistsFor(createLinkAt);
            var validator = new OperationValidation(fileFactory, f => new FakeFolder(f));

            var data = new LinkOperationData() { LinkTo = createLinkAt, CreateLinkAt = linkTo, CopyBeforeDelete = false };

            String errorMessage;
            Boolean valid = validator.ValidOperation(data, out errorMessage);

            Assert.IsFalse(valid);
            Assert.AreEqual("When creating a file link the linked to file must exist", errorMessage);
        }
        public void PerformOperation_ValidData_CommandsQueuedInCommandRunnerFromCommandDiscovery()
        {
            List<ICommand> commandList = new List<ICommand>();
            var commandDiscovery = MockRepository.GenerateMock<ICommandDiscovery>();
            commandDiscovery.Stub(c => c.GetCommandListTask(Arg<String>.Is.Anything, Arg<String>.Is.Anything, Arg<Boolean>.Is.Anything, Arg<Boolean>.Is.Anything))
                .Return(commandList);

            var runner = MockRepository.GenerateMock<ITransactionalCommandRunner>();
            var linker = GetLinkerService(commandDiscovery, runner);

            LinkOperationData data = new LinkOperationData { CopyBeforeDelete = true, CreateLinkAt = "", LinkTo = "", OverwriteExistingFiles = true };

            linker.SetOperationData(data);

            linker.PerformOperation();

            runner.AssertWasCalled(r => r.QueueRange(commandList));
        }
        public void PerformOperation_ValidData_CommandIsRequestedFromCommandDiscovery()
        {
            String linkTo = "Test2";
            String linkFrom = "Test1";

            var commandDiscovery = MockRepository.GenerateMock<ICommandDiscovery>();
            var linker = GetLinkerService(commandDiscovery);

            LinkOperationData data = new LinkOperationData { CopyBeforeDelete = true, CreateLinkAt = linkFrom, LinkTo = linkTo, OverwriteExistingFiles = true };

            linker.SetOperationData(data);

            linker.PerformOperation();

            commandDiscovery.AssertWasCalled(d => d.GetCommandListTask(
                                                  Arg<String>.Is.Equal(linkTo),
                                                  Arg<String>.Is.Equal(linkFrom),
                                                  Arg<Boolean>.Matches(b => data.CopyBeforeDelete),
                                                  Arg<Boolean>.Matches(b => data.OverwriteExistingFiles)));
        }
        public void PerformOperation_ValidDataAndDispatcher_StatusSetToCommandDiscoveryRunning()
        {
            var commandDiscovery = MockRepository.GenerateMock<ICommandDiscovery>();
            var runner = MockRepository.GenerateMock<ITransactionalCommandRunner>();

            var linker = GetLinkerService(commandDiscovery, runner);
            var statusData = linker.GetStatusData(Dispatcher.CurrentDispatcher);
            LinkOperationData data = new LinkOperationData { CopyBeforeDelete = true, CreateLinkAt = "", LinkTo = "", OverwriteExistingFiles = true };

            linker.SetOperationData(data);

            Boolean statusSet = false;
            statusData.PropertyChanged += (s, ea) => statusSet |= ea.PropertyName.Equals("Message") && statusData.Message.Equals("Building Task List");

            linker.PerformOperation();

            Assert.IsTrue(statusSet);
        }
 public void SetOperationData(LinkOperationData linkData)
 {
     _operationData = linkData;
 }