public void DeleteOnItemRemove()
        {
            var dataDirectoryPath = TestHelper.GetCurrentMethodName() + "_data";
            var project           = new Project();

            var repository = new ProjectFileBasedItemRepository();

            repository.Initialize(project, dataDirectoryPath);

            var fileBased = mocks.Stub <IFileBased>();

            using (mocks.Record())
            {
                fileBased.Expect(fb => fb.CreateNew(null)).Repeat.Once().IgnoreArguments()
                .Do(new Action <string>(delegate(string path) { fileBased.Path = path; }));
                fileBased.Expect(fb => fb.IsOpen).Return(true);
                fileBased.Expect(fb => fb.Close()).Repeat.Once();
                fileBased.Expect(fb => fb.Delete()).Repeat.Once(); // <- files should be deleted after Remove and Close are called
            }

            using (mocks.Playback())
            {
                // add file based item to repository (will create a new path in repository since path is empty)
                project.RootFolder.Add(fileBased);

                // and now delete
                var fileBasedDataItem = project.RootFolder.DataItems.First();
                project.RootFolder.Items.Remove(fileBasedDataItem);

                repository.Close();
            }
        }
        public void SettingPropertyOfTypeFileBasedDoesNotCreateNewIfItemIsExternal()
        {
            var dataDirectoryPath = TestHelper.GetCurrentMethodName() + "_data";
            var project           = new Project();

            var repository = new ProjectFileBasedItemRepository();

            repository.Initialize(project, dataDirectoryPath);

            // add empty data item and set fileBased item to it.
            var container = new ClassContainingFileBasedProperty();

            project.RootFolder.Add(container);

            IFileBased fileBased;

            using (mocks.Record())
            {
                fileBased      = mocks.Stub <IFileBased>();
                fileBased.Path = "some_external_path";
            }

            using (mocks.Playback())
            {
                container.FileBased = fileBased; // <- triggers new Path generation since it is empty
            }

            repository.Close();

            fileBased.Path
            .Should("Path does not change if item has external path").Be.EqualTo("some_external_path");
        }
        public void SettingPropertyOfTypeFileBasedCreateNewPath()
        {
            var dataDirectoryPath = TestHelper.GetCurrentMethodName() + "_data";
            var project           = new Project();

            var repository = new ProjectFileBasedItemRepository();

            repository.Initialize(project, dataDirectoryPath);

            // add empty data item and set fileBased item to it.
            var container = new ClassContainingFileBasedProperty();

            project.RootFolder.Add(container);

            IFileBased fileBased;

            using (mocks.Record())
            {
                fileBased = mocks.Stub <IFileBased>();
                fileBased.Expect(fb => fb.CreateNew(null)).Repeat.Once().IgnoreArguments()
                .Do(new Action <string>(delegate(string path) { fileBased.Path = path; }));
            }

            using (mocks.Playback())
            {
                container.FileBased = fileBased; // <- triggers new Path generation since it is empty
            }

            string.IsNullOrEmpty(fileBased.Path)
            .Should("new path should be generated for an item after it is added to the project").Be.False();

            repository.Close();
        }
        public void NoDeleteOnItemRemoveAndAddForEditableObject()
        {
            IFileBased fileBased;

            using (mocks.Record())
            {
                fileBased = mocks.Stub <IFileBased>();
                fileBased.Expect(fb => fb.CreateNew(null)).IgnoreArguments().Repeat.Once()
                .Do(new Action <string>(delegate(string path) { fileBased.Path = path; }));
                fileBased.Expect(fb => fb.Close()).Repeat.Once();
                fileBased.Expect(fb => fb.Delete()).Repeat.Never();
            }

            var dataDirectoryPath = TestHelper.GetCurrentMethodName() + "_data";
            var project           = new Project();

            var repository = new ProjectFileBasedItemRepository();

            repository.Initialize(project, dataDirectoryPath);

            using (mocks.Playback())
            {
                // add file based item to repository
                project.RootFolder.Add(fileBased);

                // now remove it and add back
                project.BeginEdit("Moving item ...");

                // delete
                var fileBasedDataItem = project.RootFolder.DataItems.First();
                project.RootFolder.Items.Remove(fileBasedDataItem);

                // add it back, thus cancelling delete
                project.RootFolder.Items.Add(fileBasedDataItem);

                project.EndEdit();

                repository.Close();
            }
        }
        public void CloseShouldCloseAllItems()
        {
            var dataDirectoryPath = TestHelper.GetCurrentMethodName() + "_data";
            var project           = new Project();

            var repository = new ProjectFileBasedItemRepository();

            repository.Initialize(project, dataDirectoryPath);

            var fileBased = mocks.Stub <IFileBased>();

            using (mocks.Record())
            {
                fileBased.Expect(fb => fb.CreateNew(null)).Repeat.Once().IgnoreArguments();
                fileBased.Expect(fb => fb.Close()).Repeat.Once();
            }

            project.RootFolder.Add(fileBased);

            using (mocks.Playback())
            {
                repository.Close();
            }
        }
        public void NewFilePathOnItemAdd()
        {
            var dataDirectoryPath = TestHelper.GetCurrentMethodName() + "_data";
            var project           = new Project();

            var repository = new ProjectFileBasedItemRepository();

            repository.Initialize(project, dataDirectoryPath);

            IFileBased fileBased;

            using (mocks.Record())
            {
                fileBased = mocks.Stub <IFileBased>();
                fileBased.Expect(fb => fb.Close()).Repeat.Once();
                fileBased.Expect(fb => fb.CreateNew(null)).Repeat.Once().IgnoreArguments()
                .Do(new Action <string>(delegate(string path) { fileBased.Path = path; }));
            }

            using (mocks.Playback())
            {
                // add file based item to repository
                project.RootFolder.Add(fileBased);

                fileBased.Path
                .Should("new file path is generated").Not.Be.NullOrEmpty();

                fileBased.Path.StartsWith(dataDirectoryPath)
                .Should("data directory path is used as a prefix of new generated path").Be.True();

                File.Exists(fileBased.Path)
                .Should("repository does not create file, only sets path").Be.False();

                repository.Close();
            }
        }