require 'spec_helper' require 'browser/dom/element/custom' describe Browser::DOM::Element::Custom do before(:each) do $scratchpad = Hash.new { false } end def create_custom_class(name, observed_attrs = []) Class.new(Browser::DOM::Element::Custom) do def initialize(node) super $scratchpad[:initialized] = true end def attached $scratchpad[:attached] = true end def detached $scratchpad[:detached] = true end def adopted $scratchpad[:adopted] = true end def attribute_changed(attr, from, to) $scratchpad[:attribute_changed] = [attr, from, to] end self.observed_attributes = observed_attrs def_custom name end end describe "upgrades" do html <<-HTML HTML it "existing elements when they have been initialized before" do expect($document.at_css("app-ex1").class).to eq(Browser::DOM::Element) klass = create_custom_class("app-ex1") expect($document.at_css("app-ex1").class).to eq(klass) expect($scratchpad[:initialized]).to be(true) expect($scratchpad[:attached]).to be(true) end it "existing elements when they have not been initialized before" do klass = create_custom_class("app-ex2") expect($scratchpad[:initialized]).to be(true) expect($scratchpad[:attached]).to be(true) expect($document.at_css("app-ex2").class).to eq(klass) end it "and fires property update events when upgraded" do klass = create_custom_class("app-ex7", ["prop"]) expect($scratchpad[:attribute_changed]).to eq([:prop, nil, "true"]) end end it "creates and handles new elements correctly" do klass = create_custom_class("app-ex3") elem = klass.new expect($scratchpad[:initialized]).to be(true) expect($scratchpad[:attached]).to be(false) $document.body << elem expect($scratchpad[:detached]).to be(false) expect($scratchpad[:attached]).to be(true) elem.remove expect($scratchpad[:detached]).to be(true) end it "correctly tracks updated properties" do klass = create_custom_class("app-ex4") elem = klass.new expect($scratchpad[:attribute_changed]).to be(false) elem[:untracked] = "test" expect($scratchpad[:attribute_changed]).to be(false) klass = create_custom_class("app-ex5", ["tracked"]) elem = klass.new expect($scratchpad[:attribute_changed]).to be(false) elem[:untracked] = "test" expect($scratchpad[:attribute_changed]).to be(false) elem[:tracked] = "test" expect($scratchpad[:attribute_changed]).to eq([:tracked, nil, "test"]) end it "allows creation of custom elements in various ways" do klass = create_custom_class("app-ex6") elem = klass.new expect(elem).to be_a(klass) elem = $document.create_element("app-ex6") expect(elem).to be_a(klass) elem = DOM("") expect(elem).to be_a(klass) elem = DOM { e("app-ex6") } expect(elem).to be_a(klass) end end