spec/csl/node_spec.rb in csl-1.2.3 vs spec/csl/node_spec.rb in csl-1.3.0

- old
+ new

@@ -1,16 +1,16 @@ require 'spec_helper' module CSL - describe Node do + describe Node do it { is_expected.not_to be nil } it { is_expected.not_to have_children } - it { is_expected.not_to have_attributes } + it { is_expected.to have_attributes(:attributes => {}) } - describe 'given a FooBarNode with attributes :foo and :bar and a TestNode without defined attributes' do + describe 'given a FooBarNode with attributes :foo and :bar and a TestNode without defined attributes' do before(:all) do class FooBarNode < Node attr_struct :foo, :bar end class TestNode < Node @@ -23,114 +23,125 @@ it 'does not create TestNode::Attributes' do expect(TestNode.const_defined?(:Attributes)).not_to be_truthy end - it 'TestNode attributes are a regular Hash' do - expect(TestNode.new.attributes).to be_a(Hash) - end + it 'TestNode attributes are a regular Hash' do + expect(TestNode.new.attributes).to be_a(Hash) + end - it 'FooBarNode attributes are a Struct' do - expect(FooBarNode.new.attributes).to be_a(Struct) - end + it 'FooBarNode attributes are a Struct' do + expect(FooBarNode.new.attributes).to be_a(Struct) + end - describe '#match?' do - it 'matches an empty query' do - expect(FooBarNode.new.match?({})).to be_truthy - expect(FooBarNode.new(:foo => 'Foo').match?({})).to be_truthy - expect(TestNode.new.match?({})).to be_truthy - expect(TestNode.new(:foo => 'Foo').match?({})).to be_truthy - end + describe '#match?' do + it 'matches an empty query' do + expect(FooBarNode.new.match?({})).to be_truthy + expect(FooBarNode.new(:foo => 'Foo').match?({})).to be_truthy + expect(TestNode.new.match?({})).to be_truthy + expect(TestNode.new(:foo => 'Foo').match?({})).to be_truthy + end it 'returns true for a matching query' do - expect(FooBarNode.new(:foo => 'bar').match?(:foo => 'bar')).to be_truthy - expect(FooBarNode.new(:bar => 'b', :foo => 'f').match?(:foo => 'f', :bar => 'b')).to be_truthy + expect(FooBarNode.new(:foo => 'bar').match?(:foo => 'bar')).to be_truthy + expect(FooBarNode.new(:bar => 'b', :foo => 'f').match?(:foo => 'f', :bar => 'b')).to be_truthy end it 'returns false for non-matching query' do - expect(FooBarNode.new.match?(:foo => 'bar')).to be_falsey - expect(FooBarNode.new(:foo => 'f').match?(:foo => 'f', :bar => 'b')).to be_falsey + expect(FooBarNode.new.match?(:foo => 'bar')).to be_falsey + expect(FooBarNode.new(:foo => 'f').match?(:foo => 'f', :bar => 'b')).to be_falsey end it 'returns false if the query contains unknown attributes' do - expect(FooBarNode.new(:foo => 'f').match?(:foo => 'f', :unknown => 'u')).to be_falsey + expect(FooBarNode.new(:foo => 'f').match?(:foo => 'f', :unknown => 'u')).to be_falsey end it 'matches irrespective of order' do - expect(FooBarNode.new(:bar => 'b', :foo => 'f').match?(:foo => 'f', :bar => 'b')).to be_truthy - expect(FooBarNode.new(:foo => 'f', :bar => 'b').match?(:foo => 'f', :bar => 'b')).to be_truthy - expect(FooBarNode.new(:foo => 'f', :bar => 'b').match?(:bar => 'b', :foo => 'f')).to be_truthy - expect(FooBarNode.new(:bar => 'b', :foo => 'f').match?(:bar => 'b', :foo => 'f')).to be_truthy + expect(FooBarNode.new(:bar => 'b', :foo => 'f').match?(:foo => 'f', :bar => 'b')).to be_truthy + expect(FooBarNode.new(:foo => 'f', :bar => 'b').match?(:foo => 'f', :bar => 'b')).to be_truthy + expect(FooBarNode.new(:foo => 'f', :bar => 'b').match?(:bar => 'b', :foo => 'f')).to be_truthy + expect(FooBarNode.new(:bar => 'b', :foo => 'f').match?(:bar => 'b', :foo => 'f')).to be_truthy end - it 'matches an empty query with the correct node name' do - expect(FooBarNode.new.match?('foo-bar-node', {})).to be_truthy - expect(FooBarNode.new(:foo => 'Foo').match?('foo-bar-node', {})).to be_truthy - expect(TestNode.new.match?('test-node', {})).to be_truthy - expect(TestNode.new(:foo => 'Foo').match?('test-node', {})).to be_truthy - end + it 'matches an empty query with the correct node name' do + expect(FooBarNode.new.match?('foo-bar-node', {})).to be_truthy + expect(FooBarNode.new(:foo => 'Foo').match?('foo-bar-node', {})).to be_truthy + expect(TestNode.new.match?('test-node', {})).to be_truthy + expect(TestNode.new(:foo => 'Foo').match?('test-node', {})).to be_truthy + end - it 'does not match other node names' do - expect(FooBarNode.new.match?(:name, {})).not_to be_truthy - expect(FooBarNode.new(:foo => 'Foo').match?(:name, {})).not_to be_truthy - expect(TestNode.new.match?(:name, {})).not_to be_truthy - expect(TestNode.new(:foo => 'Foo').match?(:name, {})).not_to be_truthy - end - end + it 'does not match other node names' do + expect(FooBarNode.new.match?(:name, {})).not_to be_truthy + expect(FooBarNode.new(:foo => 'Foo').match?(:name, {})).not_to be_truthy + expect(TestNode.new.match?(:name, {})).not_to be_truthy + expect(TestNode.new(:foo => 'Foo').match?(:name, {})).not_to be_truthy + end + end - describe '#attributes_for' do - it 'returns an empty hash when there no attributes are set' do - expect(TestNode.new.attributes_for).to be_empty - expect(TestNode.new.attributes_for(:x, :y)).to be_empty + describe '#attributes_for' do + it 'returns an empty hash when there no attributes are set' do + expect(TestNode.new.attributes_for).to be_empty + expect(TestNode.new.attributes_for(:x, :y)).to be_empty - expect(FooBarNode.new.attributes_for).to be_empty - expect(FooBarNode.new.attributes_for(:x, :y)).to be_empty - expect(FooBarNode.new.attributes_for(:foo, :bar)).to be_empty - end + expect(FooBarNode.new.attributes_for).to be_empty + expect(FooBarNode.new.attributes_for(:x, :y)).to be_empty + expect(FooBarNode.new.attributes_for(:foo, :bar)).to be_empty + end - it 'returns an empty hash when no attributes match the filter' do - expect(TestNode.new(:foo => 'foo').attributes_for).to be_empty - expect(TestNode.new(:foo => 'foo').attributes_for(:x, :y)).to be_empty + it 'returns an empty hash when no attributes match the filter' do + expect(TestNode.new(:foo => 'foo').attributes_for).to be_empty + expect(TestNode.new(:foo => 'foo').attributes_for(:x, :y)).to be_empty - expect(FooBarNode.new(:foo => 'foo').attributes_for).to be_empty - expect(FooBarNode.new(:foo => 'foo').attributes_for(:x, :y)).to be_empty - end + expect(FooBarNode.new(:foo => 'foo').attributes_for).to be_empty + expect(FooBarNode.new(:foo => 'foo').attributes_for(:x, :y)).to be_empty + end - it 'returns a hash of all set attributes that match the filter' do - expect(TestNode.new(:foo => 'foo', :bar => 'bar').attributes_for(:x, :foo)).to eq({ :foo => 'foo' }) - expect(FooBarNode.new(:foo => 'foo', :bar => 'bar').attributes_for(:x, :foo)).to eq({ :foo => 'foo' }) - end - end + it 'returns a hash of all set attributes that match the filter' do + expect(TestNode.new(:foo => 'foo', :bar => 'bar').attributes_for(:x, :foo)).to eq({ :foo => 'foo' }) + expect(FooBarNode.new(:foo => 'foo', :bar => 'bar').attributes_for(:x, :foo)).to eq({ :foo => 'foo' }) + end + end - describe '#formatting_options' do - it 'returns an empty hash by default' do - expect(TestNode.new.formatting_options).to be_empty - expect(FooBarNode.new.formatting_options).to be_empty - end + describe '#formatting_options' do + it 'returns an empty hash by default' do + expect(TestNode.new.formatting_options).to be_empty + expect(FooBarNode.new.formatting_options).to be_empty + end - it 'returns an empty hash if there are no formatting attributes' do - expect(TestNode.new(:foo => 'foo', :bar => 'bar').formatting_options).to be_empty - expect(FooBarNode.new(:foo => 'foo', :bar => 'bar').formatting_options).to be_empty - end + it 'returns an empty hash if there are no formatting attributes' do + expect(TestNode.new(:foo => 'foo', :bar => 'bar').formatting_options).to be_empty + expect(FooBarNode.new(:foo => 'foo', :bar => 'bar').formatting_options).to be_empty + end - it "returns a hash of the node's formatting attributes" do - expect(TestNode.new(:foo => 'foo', :'font-style' => 'italic').formatting_options).to eq({ :'font-style' => 'italic' }) - end - end + it "returns a hash of the node's formatting attributes" do + expect( + TestNode.new(:foo => 'foo', :'font-style' => 'italic').formatting_options + ).to eq({ :'font-style' => 'italic' }) + end + end - describe '#values_at' do - it 'FooBarNode accepts attribute names' do - expect(FooBarNode.new(:foo => 'Foo', :bar => 'Bar').values_at(:bar, :foo)).to eq(%w{ Bar Foo }) - expect(FooBarNode.new(:foo => 'Foo').values_at(:bar, :foo)).to eq([nil, 'Foo']) - expect(FooBarNode.new(:foo => 'Foo').values_at(:unknown, :foo)).to eq([nil, 'Foo']) - end + describe '#values_at' do + it 'FooBarNode accepts attribute names' do + expect(FooBarNode.new(:foo => 'Foo', :bar => 'Bar').values_at(:bar, :foo)) + .to eq(%w{ Bar Foo }) - it 'TestNode accepts attribute names' do - expect(TestNode.new(:foo => 'Foo', :bar => 'Bar').values_at(:bar, :foo)).to eq(%w{ Bar Foo }) - expect(TestNode.new(:foo => 'Foo').values_at(:bar, :foo)).to eq([nil, 'Foo']) - expect(TestNode.new(:foo => 'Foo').values_at(:unknown, :foo)).to eq([nil, 'Foo']) - end + expect(FooBarNode.new(:foo => 'Foo').values_at(:bar, :foo)) + .to eq([nil, 'Foo']) + + expect(FooBarNode.new(:foo => 'Foo').values_at(:unknown, :foo)) + .to eq([nil, 'Foo']) + end + + it 'TestNode accepts attribute names' do + expect(TestNode.new(:foo => 'Foo', :bar => 'Bar').values_at(:bar, :foo)) + .to eq(%w{ Bar Foo }) + + expect(TestNode.new(:foo => 'Foo').values_at(:bar, :foo)) + .to eq([nil, 'Foo']) + expect(TestNode.new(:foo => 'Foo').values_at(:unknown, :foo)) + .to eq([nil, 'Foo']) + end end describe '#to_a' do it 'returns an empty list by default' do expect(Node.new.attributes.to_a).to eq([]) @@ -158,34 +169,109 @@ expect(TestNode.new.attributes.keys).to be_empty expect(FooBarNode.new.attributes.keys).to eq([:foo, :bar]) end end end - end + describe 'comparing nodes' do + it 'empty nodes are equal' do + expect(Node.new).to eq(Node.new) + end + + it 'considers node names' do + expect(Node.new).not_to eq(Node.new { |n| n.nodename = 'foo' }) + end + + it 'considers attributes' do + expect(Node.new(:foo => 'bar')).to eq(Node.new(:foo => 'bar')) + expect(Node.new(:foo => 'bar')).not_to eq(Node.new(:foo => 'baz')) + + expect(Node.new(:foo => 'bar', :baz => 'qux')) + .not_to eq(Node.new(:foo => 'bar')) + + expect(Node.new(:foo => 'bar', :baz => 'qux')) + .to eq(Node.new(:baz => 'qux', :foo => 'bar')) + end + + it 'considers children' do + n1, n2 = Node.new, Node.new + + n1 << Node.new + expect(n1).not_to eq(n2) + + n2 << Node.new + expect(n1).to eq(n2) + + n2.children[0][:foo] = 'bar' + expect(n1).not_to eq(n2) + + n1.children[0][:foo] = 'bar' + expect(n1).to eq(n2) + end + end + end + describe TextNode do it { is_expected.not_to be nil } it { is_expected.not_to have_children } - it { is_expected.not_to have_attributes } + it { is_expected.to have_attributes(:attributes => {}) } describe '.new' do it 'accepts a hash of attributes' do - expect(TextNode.new(:foo => 'bar')).to have_attributes + expect(TextNode.new(:foo => 'bar').attributes).to have_key(:foo) end it 'yields itself to the optional block' do expect(TextNode.new { |n| n.text = 'foo' }.text).to eq('foo') end it 'accepts hash and yields itself to the optional block' do - expect(TextNode.new(:foo => 'bar') { |n| n.text = 'foo' }.to_xml).to eq('<text-node foo="bar">foo</text-node>') + expect(TextNode.new(:foo => 'bar') { |n| n.text = 'foo' }.to_xml) + .to eq('<text-node foo="bar">foo</text-node>') end end describe '#pretty_print' do it 'prints the text node as XML' do - expect(TextNode.new(:foo => 'bar') { |n| n.text = 'foo' }.pretty_print).to eq('<text-node foo="bar">foo</text-node>') + expect(TextNode.new(:foo => 'bar') { |n| n.text = 'foo' }.pretty_print) + .to eq('<text-node foo="bar">foo</text-node>') + end + end + + describe 'comparing nodes' do + it 'empty nodes are equal' do + expect(TextNode.new).to eq(TextNode.new) + end + + it 'considers node names' do + expect(TextNode.new).not_to eq(TextNode.new { |n| n.nodename = 'foo' }) + end + + it 'considers attributes' do + expect(TextNode.new(:foo => 'bar')).to eq(TextNode.new(:foo => 'bar')) + expect(TextNode.new(:foo => 'bar')).not_to eq(TextNode.new(:foo => 'baz')) + + expect(TextNode.new(:foo => 'bar', :baz => 'qux')) + .not_to eq(TextNode.new(:foo => 'bar')) + + expect(TextNode.new(:foo => 'bar', :baz => 'qux')) + .to eq(TextNode.new(:baz => 'qux', :foo => 'bar')) + end + + it 'considers text' do + n1, n2 = TextNode.new, TextNode.new + + n1.text = 'foo' + expect(n1).not_to eq(n2) + + n2.text = 'foo' + expect(n1).to eq(n2) + end + + it 'text nodes are less than other nodes' do + expect(TextNode.new).to be < Node.new + expect(Node.new).not_to be < TextNode.new end end end end