public void ExistingFileOwnership()
        {
            string text = "A";

            string filePath = fileFixture.GetPath(TargetFile.PrimaryTextFile);

            fileFixture.PrepareTargetFile(TargetFile.PrimaryTextFile, text);

            // wcFile does not own textFile: textFile must still be open after wcFile is disposed.
            using (var textFile = new LiveTextFile(filePath))
                using (var wcFile = WorkingCopyTextFile.FromLiveTextFile(textFile, null))
                {
                    Assert.False(wcFile.IsTextFileOwner);
                    wcFile.Dispose();
                    Assert.NotNull(wcFile.OpenTextFile);
                    Assert.False(textFile.IsDisposed);
                    textFile.Dispose();
                    Assert.True(textFile.IsDisposed);
                }

            // wcFile owns textFile: textFile must be disposed together with wcFile.
            using (var wcFile = WorkingCopyTextFile.Open(filePath, null))
            {
                var textFile = wcFile.OpenTextFile;
                Assert.NotNull(textFile);
                Assert.False(textFile.IsDisposed);
                wcFile.Dispose();
                Assert.Same(textFile, wcFile.OpenTextFile);
                Assert.True(textFile.IsDisposed);
            }
        }
        public void LiveTextFilePathUnchanged()
        {
            string filePath = fileFixture.GetPath(TargetFile.PrimaryTextFile);

            using (var textFile = new LiveTextFile(filePath))
            {
                Assert.Equal(filePath, textFile.AbsoluteFilePath);
            }
        }
        public void ExistingFileInitialState(string text)
        {
            string filePath = fileFixture.GetPath(TargetFile.PrimaryTextFile);

            fileFixture.PrepareTargetFile(TargetFile.PrimaryTextFile, text);

            using (var textFile = new LiveTextFile(filePath))
                using (var wcFile = WorkingCopyTextFile.FromLiveTextFile(textFile, null))
                {
                    Assert.False(wcFile.IsTextFileOwner);
                    Assert.Same(textFile, wcFile.OpenTextFile);
                    Assert.Equal(filePath, wcFile.OpenTextFilePath);

                    AssertLiveTextFileSuccessfulLoad(text, wcFile);
                }
        }
        public void ReplaceFailsWhenNotOwner()
        {
            PrepareForReplaceTest("A", "B");

            using (var textFile = new LiveTextFile(fileFixture.GetPath(TargetFile.PrimaryTextFile)))
            {
                string replacePath = fileFixture.GetPath(TargetFile.SecondaryTextFile);

                var wcFile = WorkingCopyTextFile.FromLiveTextFile(textFile, null);
                using (wcFile)
                {
                    Assert.Throws <InvalidOperationException>(() => wcFile.Replace(replacePath));
                    Assert.Same(textFile, wcFile.OpenTextFile);
                }

                // Also assert that the ObjectDisposedException has precedence.
                Assert.Throws <ObjectDisposedException>(() => wcFile.Replace(replacePath));
            }
        }
        public void AutoSavedExistingFileInitialState(string autoSaveFileText)
        {
            string expectedLoadedText = "A";

            string filePath = fileFixture.GetPath(TargetFile.PrimaryTextFile);

            fileFixture.PrepareTargetFile(TargetFile.PrimaryTextFile, expectedLoadedText);
            PrepareAutoSave(autoSaveFileText);

            using (var textFile = new LiveTextFile(filePath))
                using (var wcFile = WorkingCopyTextFile.FromLiveTextFile(textFile, AutoSaveFiles()))
                {
                    Assert.False(wcFile.IsTextFileOwner);
                    Assert.Same(textFile, wcFile.OpenTextFile);
                    Assert.Equal(filePath, wcFile.OpenTextFilePath);

                    AssertLiveTextFileSuccessfulLoadWithAutoSave(expectedLoadedText, autoSaveFileText, wcFile);
                }
        }
        public void InaccessibleFileInitialState(FileState fileState, Type exceptionType)
        {
            string filePath = fileFixture.GetPath(TargetFile.PrimaryTextFile);

            fileFixture.PrepareTargetFile(TargetFile.PrimaryTextFile, fileState);

            using (var textFile = new LiveTextFile(filePath))
                using (var wcFile = WorkingCopyTextFile.FromLiveTextFile(textFile, null))
                {
                    Assert.False(wcFile.IsTextFileOwner);
                    Assert.Same(textFile, wcFile.OpenTextFile);
                    Assert.Equal(filePath, wcFile.OpenTextFilePath);
                    Assert.Null(wcFile.AutoSaveFile);

                    Assert.Equal(string.Empty, wcFile.LoadedText);
                    Assert.IsType(exceptionType, wcFile.LoadException);
                    Assert.Equal(string.Empty, wcFile.LocalCopyText);
                    Assert.False(wcFile.ContainsChanges);
                }
        }