public void Extensibility_DeserializeWithInvalidRegisteredExtensionHandlers()
        {
            XliffDocument document;
            XliffDataList expectedChildren;
            List<IExtensionAttribute> expectedAttributes;
            Dictionary<string, IExtensionHandler> handlers;
            IExtensible extensible;
            XliffData data1;
            XliffData data2;
            XliffData data3;

            handlers = new Dictionary<string, IExtensionHandler>();
            handlers["bogus"] = new CustomHandler("bogus", "bogus");
            document = TestUtilities.Deserialize(TestData.DocumentWithExtensions, true, handlers);

            Console.WriteLine("Verifying document extensions.");
            extensible = (IExtensible)document;
            Assert.IsNotNull(extensible.Extensions, "Extensions should not be null");
            Assert.AreEqual(1, extensible.Extensions.Count, "Extensions count is incorrect.");

            Console.WriteLine("  Verifying Extensions[0].");
            Assert.AreEqual(ExtensibilityTests.DefaultExtensionName, extensible.Extensions[0].Name, "Extension name is incorrect.");
            expectedAttributes = new List<IExtensionAttribute>();
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "attribute1", "attribute 1"));
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "attribute2", "attribute 2"));
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace2, "attribute1", "attribute 3"));
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace2, "attribute2", "attribute 4"));
            this.VerifyAttributes(expectedAttributes, extensible.Extensions[0]);
            this.VerifyExtensionChildren("    ", null, extensible.Extensions[0]);

            Console.WriteLine("Verifying file extensions.");
            extensible = (IExtensible)document.Files[0];
            Assert.IsNotNull(extensible.Extensions, "Extensions should not be null");
            Assert.AreEqual(1, extensible.Extensions.Count, "Extensions count is incorrect.");

            Console.WriteLine("  Verifying Extensions[0].");
            Assert.AreEqual(ExtensibilityTests.DefaultExtensionName, extensible.Extensions[0].Name, "Extension name is incorrect.");
            expectedAttributes = new List<IExtensionAttribute>();
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "attribute1", "attribute 5"));
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "attribute2", "attribute 6"));
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace2, "attribute1", "attribute 7"));
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace2, "attribute2", "attribute 8"));
            this.VerifyAttributes(expectedAttributes, extensible.Extensions[0]);

            expectedChildren = new XliffDataList();
            // Child 0.
            data1 = expectedChildren.AddChild(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "element1", typeof(GenericElement));
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute1", "attribute 9");
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute2", "attribute 10");
            data2 = data1.Children.AddChild(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "element2", typeof(GenericElement));
            data2.AddAttribute(ExtensibilityTests.Namespace1, "attribute3", "attribute 11");
            data3 = data2.Children.AddChild(NamespaceValues.Core, "source", typeof(Source));
            data3.AddAttribute(NamespacePrefixes.Xml, null, "lang", "de-de", true);
            data3.AddAttribute(NamespacePrefixes.Xml, null, "space", Preservation.Preserve, true);

            // Child 1.
            data1 = expectedChildren.AddChild(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "element1", typeof(GenericElement));
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute1", "attribute 12");
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute2", "attribute 13");
            data2 = data1.Children.AddChild(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "element2", typeof(GenericElement));
            data2.AddAttribute(ExtensibilityTests.Namespace1, "attribute3", "attribute 14");
            data2.Text = "text 1";

            // Child 2.
            data1 = expectedChildren.AddChild(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "element1", typeof(GenericElement));
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute1", "attribute 15");
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute2", "attribute 16");
            data1.AddAttribute(ExtensibilityTests.Namespace2, "attribute1", "attribute 17");
            data2 = data1.Children.AddChild(ExtensibilityTests.Prefix2, ExtensibilityTests.Namespace2, "element1", typeof(GenericElement));
            data2.AddAttribute(ExtensibilityTests.Namespace1, "attribute2", "attribute 18");
            data2.Text = "text 3";

            // Child 3.
            data1 = expectedChildren.AddChild(ExtensibilityTests.Prefix2, ExtensibilityTests.Namespace2, "element1", typeof(GenericElement));
            data1.AddAttribute(ExtensibilityTests.Namespace2, "attribute1", "attribute 19");
            data1.AddAttribute(ExtensibilityTests.Namespace2, "attribute2", "attribute 20");
            data2 = data1.Children.AddChild(ExtensibilityTests.Prefix2, ExtensibilityTests.Namespace2, "element2", typeof(GenericElement));
            data2.AddAttribute(ExtensibilityTests.Namespace2, "attribute3", "attribute 21");
            data3 = data2.Children.AddChild(NamespaceValues.Core, "target", typeof(Target));
            data3.AddAttribute(null, "order", null, false);
            data3.AddAttribute(NamespacePrefixes.Xml, null, "lang", null, false);
            data3.AddAttribute(NamespacePrefixes.Xml, null, "space", Preservation.Default, false);

            // Child 4.
            data1 = expectedChildren.AddChild(ExtensibilityTests.Prefix2, ExtensibilityTests.Namespace2, "element1", typeof(GenericElement));
            data1.AddAttribute(ExtensibilityTests.Namespace2, "attribute1", "attribute 22");
            data1.AddAttribute(ExtensibilityTests.Namespace2, "attribute2", "attribute 23");
            data2 = data1.Children.AddChild(ExtensibilityTests.Prefix2, ExtensibilityTests.Namespace2, "element2", typeof(GenericElement));
            data2.AddAttribute(ExtensibilityTests.Namespace2, "attribute3", "attribute 24");
            data2.Text = "text 2";

            this.VerifyExtensionChildren("    ", expectedChildren, extensible.Extensions[0]);

            Console.WriteLine("Verifying unit extensions.");
            extensible = (IExtensible)document.Files[0].Containers[0];
            Assert.IsFalse(extensible.HasExtensions, "HasExtensions is incorrect.");
        }
        public void Extensibility_DeserializeWithTwoRegisteredExtensionHandlers()
        {
            CustomExtension extension;
            XliffDocument document;
            XliffDataList expectedChildren;
            List<IExtensionAttribute> expectedAttributes;
            Dictionary<string, IExtensionHandler> handlers;
            IExtensible extensible;
            XliffData data1;
            XliffData data2;
            XliffData data3;

            handlers = new Dictionary<string, IExtensionHandler>();
            handlers[ExtensibilityTests.Namespace1] = new CustomHandler(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1);
            handlers[ExtensibilityTests.Namespace2] = new CustomHandler(ExtensibilityTests.Prefix2, ExtensibilityTests.Namespace2);
            document = TestUtilities.Deserialize(TestData.DocumentWithExtensions, true, handlers);

            Console.WriteLine("Verifying document extensions.");
            extensible = (IExtensible)document;
            Assert.IsNotNull(extensible.Extensions, "Extensions should not be null");
            Assert.AreEqual(2, extensible.Extensions.Count, "Extensions count is incorrect.");

            Console.WriteLine("  Verifying Extensions[0].");
            Assert.IsInstanceOfType(extensible.Extensions[0], typeof(CustomExtension), "Extension[0] type is incorrect.");
            Assert.AreEqual(ExtensibilityTests.Namespace1, extensible.Extensions[0].Name, "Extension name is incorrect.");
            expectedAttributes = new List<IExtensionAttribute>();
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "attribute1", "attribute 1"));
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "attribute2", "attribute 2"));
            this.VerifyAttributes(expectedAttributes, extensible.Extensions[0]);
            this.VerifyExtensionChildren("    ", null, extensible.Extensions[0]);

            Console.WriteLine("  Verifying Extensions[1].");
            Assert.IsInstanceOfType(extensible.Extensions[1], typeof(CustomExtension), "Extension[1] type is incorrect.");
            Assert.AreEqual(ExtensibilityTests.Namespace2, extensible.Extensions[1].Name, "Extension name is incorrect.");
            expectedAttributes = new List<IExtensionAttribute>();
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace2, "attribute1", "attribute 3"));
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace2, "attribute2", "attribute 4"));
            this.VerifyAttributes(expectedAttributes, extensible.Extensions[1]);
            this.VerifyExtensionChildren("    ", null, extensible.Extensions[1]);

            Console.WriteLine("Verifying file extensions.");
            extensible = (IExtensible)document.Files[0];
            Assert.IsNotNull(extensible.Extensions, "Extensions should not be null");
            Assert.AreEqual(2, extensible.Extensions.Count, "Extensions count is incorrect.");

            Console.WriteLine("  Verifying Extensions[0].");
            Assert.AreEqual(ExtensibilityTests.Namespace1, extensible.Extensions[0].Name, "Extension name is incorrect.");
            expectedAttributes = new List<IExtensionAttribute>();
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "attribute1", "attribute 5"));
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "attribute2", "attribute 6"));
            this.VerifyAttributes(expectedAttributes, extensible.Extensions[0]);

            expectedChildren = new XliffDataList();
            // Child 0.
            data1 = expectedChildren.AddChild(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "element1", typeof(CustomElement1));
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute1", "attribute 9");
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute2", "attribute 10");
            data2 = data1.Children.AddChild(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "element2", typeof(CustomElement2));
            data2.AddAttribute(ExtensibilityTests.Namespace1, "attribute3", "attribute 11");
            data3 = data2.Children.AddChild(NamespaceValues.Core, "source", typeof(GenericElement));
            data3.AddAttribute(null, "http://www.w3.org/XML/1998/namespace", "lang", "de-de", true);
            data3.AddAttribute(null, "http://www.w3.org/XML/1998/namespace", "space", "preserve", true);

            // Child 1.
            data1 = expectedChildren.AddChild(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "element1", typeof(CustomElement1));
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute1", "attribute 12");
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute2", "attribute 13");
            data2 = data1.Children.AddChild(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "element2", typeof(CustomElement2));
            data2.AddAttribute(ExtensibilityTests.Namespace1, "attribute3", "attribute 14");
            data2.Text = "text 1";

            // Child 2.
            data1 = expectedChildren.AddChild(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace1, "element1", typeof(CustomElement1));
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute1", "attribute 15");
            data1.AddAttribute(ExtensibilityTests.Namespace1, "attribute2", "attribute 16");
            // Attribute22 is in a different namespace than CustomElement1 so it is discarded.
            data2 = data1.Children.AddChild(ExtensibilityTests.Prefix2, ExtensibilityTests.Namespace2, "element1", typeof(GenericElement));
            data2.AddAttribute(ExtensibilityTests.Namespace1, "attribute2", "attribute 18");
            data2.Text = "text 3";

            this.VerifyExtensionChildren("    ", expectedChildren, extensible.Extensions[0]);

            // Verify the attribute got set.
            extension = (CustomExtension)extensible.Extensions[0];
            Assert.AreEqual(
                            "attribute 9",
                            ((CustomElement1)extension.GetChildren().ToList()[0].Element).Attribute1,
                            "Attribute1 is incorrect.");

            Console.WriteLine("  Verifying Extensions[1].");
            Assert.AreEqual(ExtensibilityTests.Namespace2, extensible.Extensions[1].Name, "Extension name is incorrect.");
            expectedAttributes = new List<IExtensionAttribute>();
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace2, "attribute1", "attribute 7"));
            expectedAttributes.Add(new GenericExtensionAttribute(ExtensibilityTests.Prefix1, ExtensibilityTests.Namespace2, "attribute2", "attribute 8"));
            this.VerifyAttributes(expectedAttributes, extensible.Extensions[1]);

            expectedChildren = new XliffDataList();
            // Child 0.
            data1 = expectedChildren.AddChild(ExtensibilityTests.Prefix2, ExtensibilityTests.Namespace2, "element1", typeof(CustomElement1));
            data1.AddAttribute(ExtensibilityTests.Namespace2, "attribute1", "attribute 19");
            data1.AddAttribute(ExtensibilityTests.Namespace2, "attribute2", "attribute 20");
            data2 = data1.Children.AddChild(ExtensibilityTests.Prefix2, ExtensibilityTests.Namespace2, "element2", typeof(CustomElement2));
            data2.AddAttribute(ExtensibilityTests.Namespace2, "attribute3", "attribute 21");
            data3 = data2.Children.AddChild(NamespaceValues.Core, "target", typeof(GenericElement));

            // Child 1.
            data1 = expectedChildren.AddChild(ExtensibilityTests.Prefix2, ExtensibilityTests.Namespace2, "element1", typeof(CustomElement1));
            data1.AddAttribute(ExtensibilityTests.Namespace2, "attribute1", "attribute 22");
            data1.AddAttribute(ExtensibilityTests.Namespace2, "attribute2", "attribute 23");
            data2 = data1.Children.AddChild(ExtensibilityTests.Prefix2, ExtensibilityTests.Namespace2, "element2", typeof(CustomElement2));
            data2.AddAttribute(ExtensibilityTests.Namespace2, "attribute3", "attribute 24");
            data2.Text = "text 2";

            this.VerifyExtensionChildren("    ", expectedChildren, extensible.Extensions[1]);

            Console.WriteLine("Verifying unit extensions.");
            extensible = (IExtensible)document.Files[0].Containers[0];
            Assert.IsFalse(extensible.HasExtensions, "HasExtensions is incorrect.");
        }