public async Task GetContent(Type type, bool found)
        {
            var attr1 = new ExportDocumentControllerExtensionAttribute {
                FileExtension = ".test"
            };

            try {
                ProducerExtension.ResetCounters();
                IdeServices.DocumentControllerService.RegisterControllerExtension(attr1, typeof(ProducerExtension));

                using (var controller = new TestControllerWithExtension()) {
                    await controller.Initialize(new FileDescriptor ("foo.test", null, null));

                    if (found)
                    {
                        Assert.IsNotNull(controller.GetContent(type));
                    }
                    else
                    {
                        Assert.IsNull(controller.GetContent(type));
                    }
                }
            } finally {
                IdeServices.DocumentControllerService.UnregisterControllerExtension(attr1);
            }
        }
        public async Task OwnerActivationDeactivation()
        {
            var attr1 = new ExportDocumentControllerExtensionAttribute {
                FileExtension = ".test"
            };

            try {
                ProducerExtension.ResetCounters();
                IdeServices.DocumentControllerService.RegisterControllerExtension(attr1, typeof(OwnerConditionedExtension));

                using (var controller = new TestControllerWithExtension()) {
                    await controller.Initialize(new FileDescriptor ("foo.test", null, new MyWorkspaceObject()));

                    Assert.IsNotNull(controller.GetContent <OwnerConditionedExtension> ());
                    Assert.AreEqual(1, OwnerConditionedExtension.LiveExtensions.Count);

                    controller.Owner = null;

                    Assert.IsNull(controller.GetContent <OwnerConditionedExtension> ());
                    Assert.AreEqual(0, OwnerConditionedExtension.LiveExtensions.Count);

                    controller.Owner = new MyWorkspaceObject();

                    Assert.IsNotNull(controller.GetContent <OwnerConditionedExtension> ());
                    Assert.AreEqual(1, OwnerConditionedExtension.LiveExtensions.Count);
                }
            } finally {
                IdeServices.DocumentControllerService.UnregisterControllerExtension(attr1);
            }
        }
        public async Task FileExtensionActivationDeactivation()
        {
            var attr1 = new ExportDocumentControllerExtensionAttribute {
                FileExtension = ".test"
            };

            try {
                ProducerExtension.ResetCounters();
                IdeServices.DocumentControllerService.RegisterControllerExtension(attr1, typeof(ProducerExtension));

                using (var controller = new TestControllerWithExtension()) {
                    await controller.Initialize(new FileDescriptor ("foo.bar", null, null));

                    Assert.AreEqual(0, ProducerExtension.InstancesCreated);

                    controller.FilePath = "foo.test";
                    Assert.AreEqual(1, ProducerExtension.InstancesCreated);
                    Assert.AreEqual(0, ProducerExtension.InstancesDisposed);
                    Assert.IsNotNull(controller.GetContent <ProducerExtension> ());

                    controller.FilePath = "foo.var";
                    Assert.AreEqual(1, ProducerExtension.InstancesCreated);
                    Assert.AreEqual(1, ProducerExtension.InstancesDisposed);
                    Assert.IsNull(controller.GetContent <ProducerExtension> ());
                }
            } finally {
                IdeServices.DocumentControllerService.UnregisterControllerExtension(attr1);
            }
        }
        public async Task OwnerChangedNotification()
        {
            var attr1 = new ExportDocumentControllerExtensionAttribute {
                FileExtension = ".test"
            };

            try {
                ProducerExtension.ResetCounters();
                IdeServices.DocumentControllerService.RegisterControllerExtension(attr1, typeof(ProducerExtension));

                using (var controller = new TestControllerWithExtension()) {
                    var owner = new MyWorkspaceObject();
                    await controller.Initialize(new FileDescriptor ("foo.test", null, owner));

                    var ext = controller.GetContent <ProducerExtension> ();
                    Assert.IsNotNull(ext);
                    Assert.AreSame(owner, ext.KnownOwner);

                    var owner2 = new MyWorkspaceObject();
                    controller.Owner = owner2;
                    Assert.AreSame(owner2, ext.KnownOwner);
                }
            } finally {
                IdeServices.DocumentControllerService.UnregisterControllerExtension(attr1);
            }
        }
        public async Task ExtensionDependingOnExtension()
        {
            var attr1 = new ExportDocumentControllerExtensionAttribute {
                FileExtension = ".test"
            };
            var attr2 = new ExportDocumentControllerExtensionAttribute {
                FileExtension = "*"
            };

            try {
                ProducerExtension.ResetCounters();
                IdeServices.DocumentControllerService.RegisterControllerExtension(attr1, typeof(ProducerExtension));
                IdeServices.DocumentControllerService.RegisterControllerExtension(attr2, typeof(ConsumerExtension));

                using (var controller = new TestControllerWithExtension()) {
                    await controller.Initialize(new FileDescriptor ("foo.test", null, null));

                    Assert.AreEqual(1, ProducerExtension.InstancesCreated);
                    Assert.AreEqual(0, ProducerExtension.InstancesDisposed);

                    Assert.AreEqual(2, ConsumerExtension.InstancesCreated);
                    Assert.AreEqual(1, ConsumerExtension.InstancesDisposed);

                    Assert.IsNotNull(controller.GetContent <ProducerExtension> ());
                    Assert.IsNotNull(controller.GetContent <ConsumerExtension> ());

                    // If Producer extension is removed, consumer should also be removed

                    controller.FilePath = "foo.txt";

                    Assert.IsNull(controller.GetContent <ProducerExtension> ());
                    Assert.IsNull(controller.GetContent <ConsumerExtension> ());
                    Assert.AreEqual(1, ProducerExtension.InstancesDisposed);
                    Assert.AreEqual(0, ConsumerExtension.LiveExtensions.Count);
                }

                Assert.AreEqual(0, ProducerExtension.LiveExtensions.Count);
                Assert.AreEqual(0, ConsumerExtension.LiveExtensions.Count);
            } finally {
                IdeServices.DocumentControllerService.UnregisterControllerExtension(attr1);
                IdeServices.DocumentControllerService.UnregisterControllerExtension(attr2);
            }
        }
        public async Task FileAttributeFilters(ExportDocumentControllerExtensionAttribute attribute, bool matches)
        {
            try {
                ProducerExtension.ResetCounters();
                IdeServices.DocumentControllerService.RegisterControllerExtension(attribute, typeof(ProducerExtension));

                using (var controller = new TestControllerWithExtension()) {
                    await controller.Initialize(new FileDescriptor ("foo.test", "application/test", null));

                    var ext = controller.GetContent <ProducerExtension> ();
                    if (matches)
                    {
                        Assert.IsNotNull(ext);
                    }
                    else
                    {
                        Assert.IsNull(ext);
                    }
                }
            } finally {
                IdeServices.DocumentControllerService.UnregisterControllerExtension(attribute);
            }
        }
        public async Task KeepExtensionInstanceOnRefresh()
        {
            // When reloading extensions, if an extension still applies it should be reused, not re-created

            var attr1 = new ExportDocumentControllerExtensionAttribute {
                FileExtension = ".test1, .test2"
            };
            var attr2 = new ExportDocumentControllerExtensionAttribute {
                FileExtension = ".test1"
            };
            var attr3 = new ExportDocumentControllerExtensionAttribute {
                FileExtension = ".test2"
            };

            try {
                TestExtension <Test1> .ResetCounters();

                TestExtension <Test2> .ResetCounters();

                TestExtension <Test3> .ResetCounters();

                IdeServices.DocumentControllerService.RegisterControllerExtension(attr1, typeof(TestExtension <Test1>));
                IdeServices.DocumentControllerService.RegisterControllerExtension(attr2, typeof(TestExtension <Test2>));
                IdeServices.DocumentControllerService.RegisterControllerExtension(attr3, typeof(TestExtension <Test3>));

                using (var controller = new TestControllerWithExtension()) {
                    await controller.Initialize(new FileDescriptor ("foo.test1", null, null));

                    var instance = controller.GetContent <TestExtension <Test1> > ();
                    Assert.IsNotNull(instance);
                    Assert.AreEqual(1, TestExtension <Test1> .LiveExtensions.Count());

                    Assert.IsNotNull(controller.GetContent <TestExtension <Test2> > ());
                    Assert.AreEqual(1, TestExtension <Test2> .LiveExtensions.Count());

                    Assert.IsNull(controller.GetContent <TestExtension <Test3> > ());
                    Assert.AreEqual(0, TestExtension <Test3> .LiveExtensions.Count());

                    controller.FilePath = "foo.test2";

                    Assert.AreSame(instance, controller.GetContent <TestExtension <Test1> > ());
                    Assert.AreEqual(1, TestExtension <Test1> .LiveExtensions.Count());

                    Assert.IsNull(controller.GetContent <TestExtension <Test2> > ());
                    Assert.AreEqual(0, TestExtension <Test2> .LiveExtensions.Count());

                    Assert.IsNotNull(controller.GetContent <TestExtension <Test3> > ());
                    Assert.AreEqual(1, TestExtension <Test3> .LiveExtensions.Count());

                    controller.FilePath = "foo.test1";

                    Assert.AreSame(instance, controller.GetContent <TestExtension <Test1> > ());
                    Assert.AreEqual(1, TestExtension <Test1> .LiveExtensions.Count());

                    Assert.IsNotNull(controller.GetContent <TestExtension <Test2> > ());
                    Assert.AreEqual(1, TestExtension <Test2> .LiveExtensions.Count());

                    Assert.IsNull(controller.GetContent <TestExtension <Test3> > ());
                    Assert.AreEqual(0, TestExtension <Test3> .LiveExtensions.Count());
                }
            } finally {
                IdeServices.DocumentControllerService.UnregisterControllerExtension(attr1);
                IdeServices.DocumentControllerService.UnregisterControllerExtension(attr2);
                IdeServices.DocumentControllerService.UnregisterControllerExtension(attr3);
            }
        }