public void Dispose_causes_handler_not_to_be_called()
        {
            var doc  = new DomDocument();
            var attr = doc.AppendElement("hello").AppendAttribute("a");

            var evts     = new TestActionDispatcher <DomAttributeEvent>(_ => {});
            var observer = doc.ObserveAttributes(doc.DocumentElement, evts.Invoke);

            observer.Dispose();

            attr.Value = "changed";
            Assert.Equal(0, evts.CallCount);
        }
        public void ObserveAttributes_should_invoke_optimized_registration()
        {
            var doc = new DomDocument();

            doc.AppendElement("hello").AppendElement("world");

            var evts     = new TestActionDispatcher <DomAttributeEvent>(_ => {});
            var observer = doc.ObserveAttributes(doc.DocumentElement, "l", evts.Invoke, DomScope.TargetAndDescendants);

            doc.QuerySelectorAll("*").Attribute("l", "k");
            Assert.Equal(2, evts.CallCount);
            Assert.Equal("hello", evts.ArgsForCall(0).Target.LocalName);
            Assert.Equal("world", evts.ArgsForCall(1).Target.LocalName);
            Assert.Equal("l", evts.ArgsForCall(1).LocalName);
        }
        public void ObserveAttributes_callback_should_be_invoked_at_time_after_attribute_value_has_changed(Action <DomElement> op)
        {
            var doc     = new DomDocument();
            var element = doc.AppendElement("e");

            element.Attribute("attr", "oldValue");

            string attributeValueInCallback = null;

            doc.ObserveAttributes(element, e => {
                attributeValueInCallback = element.Attribute("attr");
            });
            op(element);

            Assert.NotEqual("oldValue", attributeValueInCallback);
        }
        public void ObserveAttributes_callback_should_be_invoked_on_removing_an_attribute(Action <DomElement> callback)
        {
            var doc = new DomDocument().LoadXml(@"
                <root attr='root value' />
            ".Replace("'", "\""));

            var element = doc.QuerySelector("root");

            var evts = new TestActionDispatcher <DomAttributeEvent>(_ => {});

            doc.ObserveAttributes(element, evts.Invoke);

            callback(element);

            Assert.Equal(1, evts.CallCount);
            Assert.Equal("root value", evts.ArgsForCall(0).OldValue);
            Assert.Null(evts.ArgsForCall(0).Value);
            Assert.Equal("attr", evts.ArgsForCall(0).LocalName);
        }