public async Task ReuseFileDocumentWithNoReuseFlag()
        {
            var f1 = new ReusableFileControllerFactory();
            var f2 = new ReusableFileControllerFactory();

            documentControllerService.RegisterFactory(f1);
            documentControllerService.RegisterFactory(f2);

            f1.Enabled = true;
            f2.Enabled = false;

            var project = Services.ProjectService.CreateDotNetProject("C#");

            var file = GetTempFile(".dll_test");

            try {
                var doc = await documentManager.OpenDocument(new FileOpenInformation (file, project));

                Assert.NotNull(doc);
                var controller = (ReusableFileController)doc.DocumentController;
                controller.AllowReuse = false;

                // If the reusable flag is set, reuse the doc since even if TryReuseDocument returns false, the file names match.

                var doc2 = await documentManager.OpenDocument(new FileOpenInformation (file, project) { Options = OpenDocumentOptions.TryToReuseViewer });

                Assert.AreSame(doc, doc2);

                // If the reusable flag is not set, the document can't be reused, even if names match

                doc2 = await documentManager.OpenDocument(new FileOpenInformation (file, project) { Options = OpenDocumentOptions.None });

                Assert.AreNotSame(doc, doc2);

                // The old non-reusable document must have been closed
                Assert.AreEqual(1, documentManager.Documents.Count);
            } finally {
                documentControllerService.UnregisterFactory(f1);
                documentControllerService.UnregisterFactory(f2);
                project.Dispose();
                File.Delete(file);
            }
        }
        public async Task ReuseFileDocumentChangingOwner()
        {
            var f2 = new ReusableFileControllerFactory();

            documentControllerService.RegisterFactory(f2);
            var project  = Services.ProjectService.CreateDotNetProject("C#");
            var project2 = Services.ProjectService.CreateDotNetProject("C#");

            var file = GetTempFile(".dll_test");

            try {
                var doc = await documentManager.OpenDocument(new FileOpenInformation (file, project));

                Assert.NotNull(doc);
                Assert.AreSame(project, doc.DocumentController.Owner);

                // Reuse

                var doc2 = await documentManager.OpenDocument(new FileOpenInformation (file, project));

                Assert.AreSame(doc, doc2);
                Assert.AreSame(project, doc.DocumentController.Owner);

                // Reuse, changing owner

                doc2 = await documentManager.OpenDocument(new FileOpenInformation (file, project2));

                Assert.AreSame(doc, doc2);
                Assert.AreSame(project2, doc.DocumentController.Owner);
            } finally {
                documentControllerService.UnregisterFactory(f2);
                project.Dispose();
                project2.Dispose();
                File.Delete(file);
            }
        }
        public async Task ReuseFileDocument()
        {
            var f1 = new ReusableControllerFactory();
            var f2 = new ReusableFileControllerFactory();

            documentControllerService.RegisterFactory(f1);
            documentControllerService.RegisterFactory(f2);

            var foo_dll_test = GetTempFile(".dll_test");
            var bar_dll_test = GetTempFile(".dll_test");
            var bar_exe_test = GetTempFile(".exe_test");
            var foo_txt      = GetTempFile(".txt");

            try {
                var controller = new ReusableFileController();
                var descriptor = new FileDescriptor(foo_dll_test, null, null);
                await controller.Initialize(descriptor);

                var doc = await documentManager.OpenDocument(controller);

                Assert.NotNull(doc);

                var doc2 = await documentManager.OpenDocument(new FileDescriptor (foo_dll_test, null, null));

                Assert.AreSame(doc, doc2);

                doc2 = await documentManager.OpenDocument(new FileDescriptor (bar_dll_test, null, null));

                Assert.AreSame(doc, doc2);

                doc2 = await documentManager.OpenDocument(new FileDescriptor (bar_exe_test, null, null));

                Assert.AreSame(doc, doc2);

                doc2 = await documentManager.OpenDocument(new FileDescriptor (foo_txt, null, null));

                Assert.AreNotSame(doc, doc2);
                await doc2.Close();

                doc2 = await documentManager.OpenDocument(new FileOpenInformation (foo_dll_test));

                Assert.AreSame(doc, doc2);

                doc2 = await documentManager.OpenDocument(new FileOpenInformation (bar_dll_test));

                Assert.AreSame(doc, doc2);

                doc2 = await documentManager.OpenDocument(new FileOpenInformation (bar_exe_test));

                Assert.AreSame(doc, doc2);

                doc2 = await documentManager.OpenDocument(new FileOpenInformation (foo_txt));

                Assert.AreNotSame(doc, doc2);
                await doc2.Close();

                await documentManager.CloseAllDocuments(false);

                doc2 = await documentManager.OpenDocument(new FileOpenInformation (foo_dll_test) { Options = OpenDocumentOptions.None });

                Assert.AreNotSame(doc, doc2);
                await doc2.Close();

                doc2 = await documentManager.OpenDocument(new FileOpenInformation (bar_dll_test) { Options = OpenDocumentOptions.None });

                Assert.AreNotSame(doc, doc2);
                await doc2.Close();

                doc2 = await documentManager.OpenDocument(new FileOpenInformation (bar_exe_test) { Options = OpenDocumentOptions.None });

                Assert.AreNotSame(doc, doc2);
                await doc2.Close();

                doc2 = await documentManager.OpenDocument(new FileOpenInformation (foo_txt) { Options = OpenDocumentOptions.None });

                Assert.AreNotSame(doc, doc2);
                await doc2.Close();
            } finally {
                documentControllerService.UnregisterFactory(f1);
                documentControllerService.UnregisterFactory(f2);
                File.Delete(foo_dll_test);
                File.Delete(bar_dll_test);
                File.Delete(bar_exe_test);
                File.Delete(foo_txt);
            }
        }