nokogiri 1.9.0.rc1 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nokogiri/css/parser.rb +61 -61
  3. data/lib/nokogiri/version.rb +1 -1
  4. metadata +4 -146
  5. data/.autotest +0 -22
  6. data/.cross_rubies +0 -8
  7. data/.editorconfig +0 -17
  8. data/.gemtest +0 -0
  9. data/.travis.yml +0 -63
  10. data/CHANGELOG.md +0 -1402
  11. data/CONTRIBUTING.md +0 -42
  12. data/C_CODING_STYLE.rdoc +0 -33
  13. data/Gemfile +0 -23
  14. data/Gemfile-libxml-ruby +0 -3
  15. data/Manifest.txt +0 -371
  16. data/ROADMAP.md +0 -111
  17. data/Rakefile +0 -358
  18. data/SECURITY.md +0 -19
  19. data/STANDARD_RESPONSES.md +0 -47
  20. data/Y_U_NO_GEMSPEC.md +0 -155
  21. data/appveyor.yml +0 -29
  22. data/build_all +0 -48
  23. data/patches/sort-patches-by-date +0 -25
  24. data/suppressions/README.txt +0 -1
  25. data/suppressions/nokogiri_ruby-2.supp +0 -10
  26. data/tasks/test.rb +0 -100
  27. data/test/css/test_nthiness.rb +0 -226
  28. data/test/css/test_parser.rb +0 -386
  29. data/test/css/test_tokenizer.rb +0 -215
  30. data/test/css/test_xpath_visitor.rb +0 -96
  31. data/test/decorators/test_slop.rb +0 -23
  32. data/test/files/2ch.html +0 -108
  33. data/test/files/GH_1042.html +0 -18
  34. data/test/files/address_book.rlx +0 -12
  35. data/test/files/address_book.xml +0 -10
  36. data/test/files/atom.xml +0 -344
  37. data/test/files/bar/bar.xsd +0 -4
  38. data/test/files/bogus.xml +0 -0
  39. data/test/files/dont_hurt_em_why.xml +0 -422
  40. data/test/files/encoding.html +0 -82
  41. data/test/files/encoding.xhtml +0 -84
  42. data/test/files/exslt.xml +0 -8
  43. data/test/files/exslt.xslt +0 -35
  44. data/test/files/foo/foo.xsd +0 -4
  45. data/test/files/metacharset.html +0 -10
  46. data/test/files/namespace_pressure_test.xml +0 -1684
  47. data/test/files/noencoding.html +0 -47
  48. data/test/files/po.xml +0 -32
  49. data/test/files/po.xsd +0 -66
  50. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  51. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  52. data/test/files/saml/xenc_schema.xsd +0 -146
  53. data/test/files/saml/xmldsig_schema.xsd +0 -318
  54. data/test/files/shift_jis.html +0 -10
  55. data/test/files/shift_jis.xml +0 -5
  56. data/test/files/shift_jis_no_charset.html +0 -9
  57. data/test/files/slow-xpath.xml +0 -25509
  58. data/test/files/snuggles.xml +0 -3
  59. data/test/files/staff.dtd +0 -10
  60. data/test/files/staff.xml +0 -59
  61. data/test/files/staff.xslt +0 -32
  62. data/test/files/test_document_url/bar.xml +0 -2
  63. data/test/files/test_document_url/document.dtd +0 -4
  64. data/test/files/test_document_url/document.xml +0 -6
  65. data/test/files/tlm.html +0 -851
  66. data/test/files/to_be_xincluded.xml +0 -2
  67. data/test/files/valid_bar.xml +0 -2
  68. data/test/files/xinclude.xml +0 -4
  69. data/test/helper.rb +0 -271
  70. data/test/html/sax/test_parser.rb +0 -168
  71. data/test/html/sax/test_parser_context.rb +0 -46
  72. data/test/html/sax/test_parser_text.rb +0 -163
  73. data/test/html/sax/test_push_parser.rb +0 -87
  74. data/test/html/test_attributes.rb +0 -85
  75. data/test/html/test_builder.rb +0 -164
  76. data/test/html/test_document.rb +0 -722
  77. data/test/html/test_document_encoding.rb +0 -143
  78. data/test/html/test_document_fragment.rb +0 -310
  79. data/test/html/test_element_description.rb +0 -105
  80. data/test/html/test_named_characters.rb +0 -14
  81. data/test/html/test_node.rb +0 -212
  82. data/test/html/test_node_encoding.rb +0 -91
  83. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  84. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  85. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  86. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  87. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  88. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  89. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  90. data/test/test_convert_xpath.rb +0 -135
  91. data/test/test_css_cache.rb +0 -47
  92. data/test/test_encoding_handler.rb +0 -48
  93. data/test/test_memory_leak.rb +0 -226
  94. data/test/test_nokogiri.rb +0 -138
  95. data/test/test_soap4r_sax.rb +0 -52
  96. data/test/test_xslt_transforms.rb +0 -314
  97. data/test/xml/node/test_save_options.rb +0 -28
  98. data/test/xml/node/test_subclass.rb +0 -44
  99. data/test/xml/sax/test_parser.rb +0 -402
  100. data/test/xml/sax/test_parser_context.rb +0 -115
  101. data/test/xml/sax/test_parser_text.rb +0 -202
  102. data/test/xml/sax/test_push_parser.rb +0 -265
  103. data/test/xml/test_attr.rb +0 -96
  104. data/test/xml/test_attribute_decl.rb +0 -86
  105. data/test/xml/test_builder.rb +0 -353
  106. data/test/xml/test_c14n.rb +0 -180
  107. data/test/xml/test_cdata.rb +0 -54
  108. data/test/xml/test_comment.rb +0 -40
  109. data/test/xml/test_document.rb +0 -982
  110. data/test/xml/test_document_encoding.rb +0 -31
  111. data/test/xml/test_document_fragment.rb +0 -312
  112. data/test/xml/test_dtd.rb +0 -187
  113. data/test/xml/test_dtd_encoding.rb +0 -31
  114. data/test/xml/test_element_content.rb +0 -56
  115. data/test/xml/test_element_decl.rb +0 -73
  116. data/test/xml/test_entity_decl.rb +0 -122
  117. data/test/xml/test_entity_reference.rb +0 -262
  118. data/test/xml/test_namespace.rb +0 -96
  119. data/test/xml/test_node.rb +0 -1379
  120. data/test/xml/test_node_attributes.rb +0 -115
  121. data/test/xml/test_node_encoding.rb +0 -75
  122. data/test/xml/test_node_inheritance.rb +0 -32
  123. data/test/xml/test_node_reparenting.rb +0 -661
  124. data/test/xml/test_node_set.rb +0 -828
  125. data/test/xml/test_parse_options.rb +0 -64
  126. data/test/xml/test_processing_instruction.rb +0 -30
  127. data/test/xml/test_reader.rb +0 -620
  128. data/test/xml/test_reader_encoding.rb +0 -134
  129. data/test/xml/test_relax_ng.rb +0 -60
  130. data/test/xml/test_schema.rb +0 -142
  131. data/test/xml/test_syntax_error.rb +0 -36
  132. data/test/xml/test_text.rb +0 -69
  133. data/test/xml/test_unparented_node.rb +0 -483
  134. data/test/xml/test_xinclude.rb +0 -83
  135. data/test/xml/test_xpath.rb +0 -470
  136. data/test/xslt/test_custom_functions.rb +0 -133
  137. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,134 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- require "helper"
3
-
4
- module Nokogiri
5
- module XML
6
- class TestReaderEncoding < Nokogiri::TestCase
7
- def setup
8
- super
9
- @reader = Nokogiri::XML::Reader(
10
- File.read(XML_FILE),
11
- XML_FILE,
12
- 'UTF-8'
13
- )
14
- end
15
-
16
- def test_attribute_at
17
- @reader.each do |node|
18
- next unless attribute = node.attribute_at(0)
19
- assert_equal @reader.encoding, attribute.encoding.name
20
- end
21
- end
22
-
23
- def test_attributes
24
- @reader.each do |node|
25
- node.attributes.each do |k,v|
26
- assert_equal @reader.encoding, k.encoding.name
27
- assert_equal @reader.encoding, v.encoding.name
28
- end
29
- end
30
- end
31
-
32
- def test_attribute
33
- xml = <<-eoxml
34
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
35
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
36
- </x>
37
- eoxml
38
- reader = Nokogiri::XML::Reader(xml, nil, 'UTF-8')
39
- reader.each do |node|
40
- next unless attribute = node.attribute('awesome')
41
- assert_equal reader.encoding, attribute.encoding.name
42
- end
43
- end
44
-
45
- def test_xml_version
46
- @reader.each do |node|
47
- next unless version = node.xml_version
48
- assert_equal @reader.encoding, version.encoding.name
49
- end
50
- end
51
-
52
- def test_lang
53
- xml = <<-eoxml
54
- <awesome>
55
- <p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
56
- <p xml:lang="ja">日本語が上手です</p>
57
- </awesome>
58
- eoxml
59
-
60
- reader = Nokogiri::XML::Reader(xml, nil, 'UTF-8')
61
- reader.each do |node|
62
- next unless lang = node.lang
63
- assert_equal reader.encoding, lang.encoding.name
64
- end
65
- end
66
-
67
- def test_value
68
- called = false
69
- @reader.each do |node|
70
- next unless value = node.value
71
- assert_equal @reader.encoding, value.encoding.name
72
- called = true
73
- end
74
- assert called
75
- end
76
-
77
- def test_prefix
78
- xml = <<-eoxml
79
- <x xmlns:edi='http://ecommerce.example.org/schema'>
80
- <edi:foo>hello</edi:foo>
81
- </x>
82
- eoxml
83
- reader = Nokogiri::XML::Reader(xml, nil, 'UTF-8')
84
- reader.each do |node|
85
- next unless prefix = node.prefix
86
- assert_equal reader.encoding, prefix.encoding.name
87
- end
88
- end
89
-
90
- def test_ns_uri
91
- xml = <<-eoxml
92
- <x xmlns:edi='http://ecommerce.example.org/schema'>
93
- <edi:foo>hello</edi:foo>
94
- </x>
95
- eoxml
96
- reader = Nokogiri::XML::Reader(xml, nil, 'UTF-8')
97
- reader.each do |node|
98
- next unless uri = node.namespace_uri
99
- assert_equal reader.encoding, uri.encoding.name
100
- end
101
- end
102
-
103
- def test_local_name
104
- xml = <<-eoxml
105
- <x xmlns:edi='http://ecommerce.example.org/schema'>
106
- <edi:foo>hello</edi:foo>
107
- </x>
108
- eoxml
109
- reader = Nokogiri::XML::Reader(xml, nil, 'UTF-8')
110
- reader.each do |node|
111
- next unless lname = node.local_name
112
- assert_equal reader.encoding, lname.encoding.name
113
- end
114
- end
115
-
116
- def test_name
117
- @reader.each do |node|
118
- next unless name = node.name
119
- assert_equal @reader.encoding, name.encoding.name
120
- end
121
- end
122
-
123
- def test_value_lookup_segfault
124
- skip("JRuby doesn't do GC.") if Nokogiri.jruby?
125
- stress_memory_while do
126
- while node = @reader.read
127
- nodes = node.send(:attr_nodes)
128
- nodes.first.name if nodes.first
129
- end
130
- end
131
- end
132
- end
133
- end
134
- end
@@ -1,60 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestRelaxNG < Nokogiri::TestCase
6
- def setup
7
- assert @schema = Nokogiri::XML::RelaxNG(File.read(ADDRESS_SCHEMA_FILE))
8
- end
9
-
10
- def test_parse_with_memory
11
- assert_instance_of Nokogiri::XML::RelaxNG, @schema
12
- assert_equal 0, @schema.errors.length
13
- end
14
-
15
- def test_new
16
- assert schema = Nokogiri::XML::RelaxNG.new(
17
- File.read(ADDRESS_SCHEMA_FILE))
18
- assert_instance_of Nokogiri::XML::RelaxNG, schema
19
- end
20
-
21
- def test_parse_with_io
22
- xsd = nil
23
- File.open(ADDRESS_SCHEMA_FILE, 'rb') { |f|
24
- assert xsd = Nokogiri::XML::RelaxNG(f)
25
- }
26
- assert_equal 0, xsd.errors.length
27
- end
28
-
29
- def test_parse_with_errors
30
- xml = File.read(ADDRESS_SCHEMA_FILE).sub(/name="/, 'name=')
31
- assert_raises(Nokogiri::XML::SyntaxError) {
32
- Nokogiri::XML::RelaxNG(xml)
33
- }
34
- end
35
-
36
- def test_validate_document
37
- doc = Nokogiri::XML(File.read(ADDRESS_XML_FILE))
38
- assert errors = @schema.validate(doc)
39
- assert_equal 0, errors.length
40
- end
41
-
42
- def test_validate_invalid_document
43
- # Empty address book is not allowed
44
- read_doc = '<addressBook></addressBook>'
45
-
46
- assert errors = @schema.validate(Nokogiri::XML(read_doc))
47
- assert_equal 1, errors.length
48
- end
49
-
50
- def test_valid?
51
- valid_doc = Nokogiri::XML(File.read(ADDRESS_XML_FILE))
52
-
53
- invalid_doc = Nokogiri::XML('<addressBook></addressBook>')
54
-
55
- assert(@schema.valid?(valid_doc))
56
- assert(!@schema.valid?(invalid_doc))
57
- end
58
- end
59
- end
60
- end
@@ -1,142 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestSchema < Nokogiri::TestCase
6
- def setup
7
- assert @xsd = Nokogiri::XML::Schema(File.read(PO_SCHEMA_FILE))
8
- end
9
-
10
- def test_schema_from_document
11
- doc = Nokogiri::XML(File.open(PO_SCHEMA_FILE))
12
- assert doc
13
- xsd = Nokogiri::XML::Schema.from_document doc
14
- assert_instance_of Nokogiri::XML::Schema, xsd
15
- end
16
-
17
- def test_invalid_schema_do_not_raise_exceptions
18
- xsd = Nokogiri::XML::Schema.new <<EOF
19
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
20
- <xs:group name="foo1">
21
- <xs:sequence>
22
- <xs:element name="bar" type="xs:boolean" />
23
- </xs:sequence>
24
- </xs:group>
25
- <xs:group name="foo2">
26
- <xs:sequence>
27
- <xs:element name="bar" type="xs:string" />
28
- </xs:sequence>
29
- </xs:group>
30
- <xs:element name="foo">
31
- <xs:complexType>
32
- <xs:choice>
33
- <xs:group ref="foo1"/>
34
- <xs:group ref="foo2"/>
35
- </xs:choice>
36
- </xs:complexType>
37
- </xs:element>
38
- </xs:schema>
39
- EOF
40
- assert_instance_of Nokogiri::XML::Schema, xsd
41
- end
42
-
43
- def test_schema_from_document_node
44
- doc = Nokogiri::XML(File.open(PO_SCHEMA_FILE))
45
- assert doc
46
- xsd = Nokogiri::XML::Schema.from_document doc.root
47
- assert_instance_of Nokogiri::XML::Schema, xsd
48
- end
49
-
50
- def test_schema_validates_with_relative_paths
51
- xsd = File.join(ASSETS_DIR, 'foo', 'foo.xsd')
52
- xml = File.join(ASSETS_DIR, 'valid_bar.xml')
53
- doc = Nokogiri::XML(File.open(xsd))
54
- xsd = Nokogiri::XML::Schema.from_document doc
55
-
56
- doc = Nokogiri::XML(File.open(xml))
57
- assert xsd.valid?(doc)
58
- end
59
-
60
- def test_parse_with_memory
61
- assert_instance_of Nokogiri::XML::Schema, @xsd
62
- assert_equal 0, @xsd.errors.length
63
- end
64
-
65
- def test_new
66
- assert xsd = Nokogiri::XML::Schema.new(File.read(PO_SCHEMA_FILE))
67
- assert_instance_of Nokogiri::XML::Schema, xsd
68
- end
69
-
70
- def test_parse_with_io
71
- xsd = nil
72
- File.open(PO_SCHEMA_FILE, 'rb') { |f|
73
- assert xsd = Nokogiri::XML::Schema(f)
74
- }
75
- assert_equal 0, xsd.errors.length
76
- end
77
-
78
- def test_parse_with_errors
79
- xml = File.read(PO_SCHEMA_FILE).sub(/name="/, 'name=')
80
- assert_raises(Nokogiri::XML::SyntaxError) {
81
- Nokogiri::XML::Schema(xml)
82
- }
83
- end
84
-
85
- def test_validate_document
86
- doc = Nokogiri::XML(File.read(PO_XML_FILE))
87
- assert errors = @xsd.validate(doc)
88
- assert_equal 0, errors.length
89
- end
90
-
91
- def test_validate_file
92
- assert errors = @xsd.validate(PO_XML_FILE)
93
- assert_equal 0, errors.length
94
- end
95
-
96
- def test_validate_invalid_document
97
- doc = Nokogiri::XML File.read(PO_XML_FILE)
98
- doc.css("city").unlink
99
-
100
- assert errors = @xsd.validate(doc)
101
- assert_equal 2, errors.length
102
- end
103
-
104
- def test_validate_invalid_file
105
- tempfile = Tempfile.new("xml")
106
-
107
- doc = Nokogiri::XML File.read(PO_XML_FILE)
108
- doc.css("city").unlink
109
- tempfile.write doc.to_xml
110
- tempfile.close
111
-
112
- assert errors = @xsd.validate(tempfile.path)
113
- assert_equal 2, errors.length
114
- end
115
-
116
- def test_validate_non_document
117
- string = File.read(PO_XML_FILE)
118
- assert_raise(ArgumentError) {@xsd.validate(string)}
119
- end
120
-
121
- def test_valid?
122
- valid_doc = Nokogiri::XML(File.read(PO_XML_FILE))
123
-
124
- invalid_doc = Nokogiri::XML(
125
- File.read(PO_XML_FILE).gsub(/<city>[^<]*<\/city>/, '')
126
- )
127
-
128
- assert(@xsd.valid?(valid_doc))
129
- assert(!@xsd.valid?(invalid_doc))
130
- end
131
-
132
- def test_xsd_with_dtd
133
- Dir.chdir(File.join(ASSETS_DIR, 'saml')) do
134
- # works
135
- Nokogiri::XML::Schema(IO.read('xmldsig_schema.xsd'))
136
- # was not working
137
- Nokogiri::XML::Schema(IO.read('saml20protocol_schema.xsd'))
138
- end
139
- end
140
- end
141
- end
142
- end
@@ -1,36 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestSyntaxError < Nokogiri::TestCase
6
- def test_new
7
- error = Nokogiri::XML::SyntaxError.new 'hello'
8
- assert_equal 'hello', error.message
9
- end
10
-
11
- def test_line_column_level_libxml
12
- skip unless Nokogiri.uses_libxml?
13
-
14
- bad_doc = Nokogiri::XML('test')
15
- error = bad_doc.errors.first
16
-
17
- assert_equal "1:1: FATAL: Start tag expected, '<' not found", error.message
18
- assert_equal 1, error.line
19
- assert_equal 1, error.column
20
- assert_equal 3, error.level
21
- end
22
-
23
- def test_line_column_level_jruby
24
- skip unless Nokogiri.jruby?
25
-
26
- bad_doc = Nokogiri::XML('<root>test</bar>')
27
- error = bad_doc.errors.first
28
-
29
- assert_equal "The element type \"root\" must be terminated by the matching end-tag \"</root>\".", error.message
30
- assert_nil error.line
31
- assert_nil error.column
32
- assert_nil error.level
33
- end
34
- end
35
- end
36
- end
@@ -1,69 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestText < Nokogiri::TestCase
6
- def test_css_path
7
- doc = Nokogiri.XML "<root> foo <a>something</a> bar bazz </root>"
8
- node = doc.root.children[2]
9
- assert_instance_of Nokogiri::XML::Text, node
10
- assert_equal node, doc.at_css(node.css_path)
11
- end
12
-
13
- def test_inspect
14
- node = Text.new('hello world', Document.new)
15
- assert_equal "#<#{node.class.name}:#{sprintf("0x%x",node.object_id)} #{node.text.inspect}>", node.inspect
16
- end
17
-
18
- def test_new
19
- node = Text.new('hello world', Document.new)
20
- assert node
21
- assert_equal('hello world', node.content)
22
- assert_instance_of Nokogiri::XML::Text, node
23
- end
24
-
25
- def test_lots_of_text
26
- 100.times { Text.new('hello world', Document.new) }
27
- end
28
-
29
- def test_new_without_document
30
- doc = Document.new
31
- node = Nokogiri::XML::Element.new('foo', doc)
32
-
33
- assert Text.new('hello world', node)
34
- end
35
-
36
- def test_content=
37
- node = Text.new('foo', Document.new)
38
- assert_equal('foo', node.content)
39
- node.content = '& <foo> &amp;'
40
- assert_equal('& <foo> &amp;', node.content)
41
- assert_equal('&amp; &lt;foo&gt; &amp;amp;', node.to_xml)
42
- end
43
-
44
- def test_add_child
45
- node = Text.new('foo', Document.new)
46
- if Nokogiri.jruby?
47
- exc = RuntimeError
48
- else
49
- exc = ArgumentError
50
- end
51
- assert_raises(exc) {
52
- node.add_child Text.new('bar', Document.new)
53
- }
54
- assert_raises(exc) {
55
- node << Text.new('bar', Document.new)
56
- }
57
- end
58
-
59
- def test_wrap
60
- xml = '<root><thing><div class="title">important thing</div></thing></root>'
61
- doc = Nokogiri::XML(xml)
62
- text = doc.at_css("div").children.first
63
- text.wrap("<wrapper/>")
64
- assert_equal 'wrapper', text.parent.name
65
- assert_equal 'wrapper', doc.at_css("div").children.first.name
66
- end
67
- end
68
- end
69
- end
@@ -1,483 +0,0 @@
1
- require "helper"
2
-
3
- require 'stringio'
4
-
5
- module Nokogiri
6
- module XML
7
- class TestUnparentedNode < Nokogiri::TestCase
8
- def setup
9
- begin
10
- xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
11
- @node = xml.at('staff')
12
- @node.unlink
13
- end
14
- GC.start # try to GC the document
15
- end
16
-
17
- def test_node_still_has_document
18
- assert @node.document
19
- end
20
-
21
- def test_add_namespace
22
- node = @node.at('address')
23
- node.unlink
24
- node.add_namespace('foo', 'http://tenderlovemaking.com')
25
- assert_equal 'http://tenderlovemaking.com', node.namespaces['xmlns:foo']
26
- end
27
-
28
- def test_write_to
29
- io = StringIO.new
30
- @node.write_to io
31
- io.rewind
32
- assert_equal @node.to_xml, io.read
33
- end
34
-
35
- def test_attribute_with_symbol
36
- assert_equal 'Yes', @node.css('address').first[:domestic]
37
- end
38
-
39
- def test_write_to_with_block
40
- called = false
41
- io = StringIO.new
42
- conf = nil
43
- @node.write_to io do |config|
44
- called = true
45
- conf = config
46
- config.format.as_html.no_empty_tags
47
- end
48
- io.rewind
49
- assert called
50
- assert_equal @node.serialize(:save_with => conf.options), io.read
51
- end
52
-
53
- %w{ xml html xhtml }.each do |type|
54
- define_method(:"test_write_#{type}_to") do
55
- io = StringIO.new
56
- assert @node.send(:"write_#{type}_to", io)
57
- io.rewind
58
- assert_match @node.send(:"to_#{type}"), io.read
59
- end
60
- end
61
-
62
- def test_serialize_with_block
63
- called = false
64
- conf = nil
65
- string = @node.serialize do |config|
66
- called = true
67
- conf = config
68
- config.format.as_html.no_empty_tags
69
- end
70
- assert called
71
- assert_equal @node.serialize(nil, conf.options), string
72
- end
73
-
74
- def test_values
75
- assert_equal %w{ Yes Yes }, @node.xpath('.//address')[1].values
76
- end
77
-
78
- def test_keys
79
- assert_equal %w{ domestic street }, @node.xpath('.//address')[1].keys
80
- end
81
-
82
- def test_each
83
- attributes = []
84
- @node.xpath('.//address')[1].each do |key, value|
85
- attributes << [key, value]
86
- end
87
- assert_equal [['domestic', 'Yes'], ['street', 'Yes']], attributes
88
- end
89
-
90
- def test_new
91
- assert node = Nokogiri::XML::Node.new('input', @node)
92
- assert_equal 1, node.node_type
93
- end
94
-
95
- def test_to_str
96
- assert name = @node.xpath('.//name').first
97
- assert_match(/Margaret/, '' + name)
98
- assert_equal('Margaret Martin', '' + name.children.first)
99
- end
100
-
101
- def test_ancestors
102
- assert(address = @node.xpath('.//address').first)
103
- assert_equal 2, address.ancestors.length
104
- assert_equal ['employee', 'staff'],
105
- address.ancestors.map { |x| x ? x.name : x }
106
- end
107
-
108
- def test_read_only?
109
- assert entity_decl = @node.internal_subset.children.find { |x|
110
- x.type == Node::ENTITY_DECL
111
- }
112
- assert entity_decl.read_only?
113
- end
114
-
115
- def test_remove_attribute
116
- address = @node.xpath('./employee/address').first
117
- assert_equal 'Yes', address['domestic']
118
- address.remove_attribute 'domestic'
119
- assert_nil address['domestic']
120
- end
121
-
122
- def test_delete
123
- address = @node.xpath('./employee/address').first
124
- assert_equal 'Yes', address['domestic']
125
- address.delete 'domestic'
126
- assert_nil address['domestic']
127
- end
128
-
129
- def test_add_child_in_same_document
130
- child = @node.css('employee').first
131
-
132
- assert child.children.last
133
- assert new_child = child.children.first
134
-
135
- last = child.children.last
136
-
137
- child.add_child(new_child)
138
- assert_equal new_child, child.children.last
139
- assert_equal last, child.children.last
140
- end
141
-
142
- def test_add_child_from_other_document
143
- d1 = Nokogiri::XML("<root><item>1</item><item>2</item></root>")
144
- d2 = Nokogiri::XML("<root><item>3</item><item>4</item></root>")
145
-
146
- d2.at('root').search('item').each do |i|
147
- d1.at('root').add_child i
148
- end
149
-
150
- assert_equal 0, d2.search('item').size
151
- assert_equal 4, d1.search('item').size
152
- end
153
-
154
- def test_add_child
155
- xml = Nokogiri::XML(<<-eoxml)
156
- <root>
157
- <a>Hello world</a>
158
- </root>
159
- eoxml
160
- text_node = Nokogiri::XML::Text.new('hello', xml)
161
- assert_equal Nokogiri::XML::Node::TEXT_NODE, text_node.type
162
- xml.root.add_child text_node
163
- assert_match 'hello', xml.to_s
164
- end
165
-
166
- def test_chevron_works_as_add_child
167
- xml = Nokogiri::XML(<<-eoxml)
168
- <root>
169
- <a>Hello world</a>
170
- </root>
171
- eoxml
172
- text_node = Nokogiri::XML::Text.new('hello', xml)
173
- xml.root << text_node
174
- assert_match 'hello', xml.to_s
175
- end
176
-
177
- def test_add_previous_sibling
178
- xml = Nokogiri::XML(<<-eoxml)
179
- <root>
180
- <a>Hello world</a>
181
- </root>
182
- eoxml
183
- b_node = Nokogiri::XML::Node.new('a', xml)
184
- assert_equal Nokogiri::XML::Node::ELEMENT_NODE, b_node.type
185
- b_node.content = 'first'
186
- a_node = xml.xpath('.//a').first
187
- a_node.add_previous_sibling(b_node)
188
- assert_equal('first', xml.xpath('.//a').first.text)
189
- end
190
-
191
- def test_add_previous_sibling_merge
192
- xml = Nokogiri::XML(<<-eoxml)
193
- <root>
194
- <a>Hello world</a>
195
- </root>
196
- eoxml
197
-
198
- assert a_tag = xml.css('a').first
199
-
200
- left_space = a_tag.previous
201
- right_space = a_tag.next
202
- assert left_space.text?
203
- assert right_space.text?
204
-
205
- left_space.add_previous_sibling(right_space)
206
- assert_equal left_space, right_space
207
- end
208
-
209
- def test_add_next_sibling_merge
210
- xml = Nokogiri::XML(<<-eoxml)
211
- <root>
212
- <a>Hello world</a>
213
- </root>
214
- eoxml
215
-
216
- assert a_tag = xml.css('a').first
217
-
218
- left_space = a_tag.previous
219
- right_space = a_tag.next
220
- assert left_space.text?
221
- assert right_space.text?
222
-
223
- right_space.add_next_sibling(left_space)
224
- assert_equal left_space, right_space
225
- end
226
-
227
- def test_add_next_sibling_to_root_raises_exception
228
- xml = Nokogiri::XML(<<-eoxml)
229
- <root />
230
- eoxml
231
-
232
- node = Nokogiri::XML::Node.new 'child', xml
233
-
234
- assert_raise(ArgumentError) do
235
- xml.root.add_next_sibling(node)
236
- end
237
- end
238
-
239
- def test_add_previous_sibling_to_root_raises_exception
240
- xml = Nokogiri::XML(<<-eoxml)
241
- <root />
242
- eoxml
243
-
244
- node = Nokogiri::XML::Node.new 'child', xml
245
-
246
- assert_raise(ArgumentError) do
247
- xml.root.add_previous_sibling(node)
248
- end
249
- end
250
-
251
- def test_document_root_can_have_a_comment_sibling_via_add_child
252
- doc = Nokogiri::XML "<root>foo</root>"
253
- comment = Nokogiri::XML::Comment.new(doc, "this is a comment")
254
- doc.add_child comment
255
- assert_equal [doc.root, comment], doc.children.to_a
256
- end
257
-
258
- def test_document_root_can_have_a_comment_sibling_via_prepend_child
259
- doc = Nokogiri::XML "<root>foo</root>"
260
- comment = Nokogiri::XML::Comment.new(doc, "this is a comment")
261
- doc.prepend_child comment
262
- assert_equal [comment, doc.root], doc.children.to_a
263
- end
264
-
265
- def test_document_root_can_have_a_comment_sibling_via_add_next_sibling
266
- doc = Nokogiri::XML "<root>foo</root>"
267
- comment = Nokogiri::XML::Comment.new(doc, "this is a comment")
268
- doc.root.add_next_sibling comment
269
- assert_equal [doc.root, comment], doc.children.to_a
270
- end
271
-
272
- def test_document_root_can_have_a_comment_sibling_via_add_previous_sibling
273
- doc = Nokogiri::XML "<root>foo</root>"
274
- comment = Nokogiri::XML::Comment.new(doc, "this is a comment")
275
- doc.root.add_previous_sibling comment
276
- assert_equal [comment, doc.root], doc.children.to_a
277
- end
278
-
279
- def test_document_root_can_have_a_processing_instruction_sibling_via_add_child
280
- doc = Nokogiri::XML "<root>foo</root>"
281
- pi = Nokogiri::XML::ProcessingInstruction.new(doc, "xml-stylesheet", %q{type="text/xsl" href="foo.xsl"})
282
- doc.add_child pi
283
- assert_equal [doc.root, pi], doc.children.to_a
284
- end
285
-
286
- def test_document_root_can_have_a_processing_instruction_sibling_via_prepend_child
287
- doc = Nokogiri::XML "<root>foo</root>"
288
- pi = Nokogiri::XML::ProcessingInstruction.new(doc, "xml-stylesheet", %q{type="text/xsl" href="foo.xsl"})
289
- doc.prepend_child pi
290
- assert_equal [pi, doc.root], doc.children.to_a
291
- end
292
-
293
- def test_document_root_can_have_a_processing_instruction_sibling_via_add_next_sibling
294
- doc = Nokogiri::XML "<root>foo</root>"
295
- pi = Nokogiri::XML::ProcessingInstruction.new(doc, "xml-stylesheet", %q{type="text/xsl" href="foo.xsl"})
296
- doc.root.add_next_sibling pi
297
- assert_equal [doc.root, pi], doc.children.to_a
298
- end
299
-
300
- def test_document_root_can_have_a_processing_instruction_sibling_via_add_previous_sibling
301
- doc = Nokogiri::XML "<root>foo</root>"
302
- pi = Nokogiri::XML::ProcessingInstruction.new(doc, "xml-stylesheet", %q{type="text/xsl" href="foo.xsl"})
303
- doc.root.add_previous_sibling pi
304
- assert_equal [pi, doc.root], doc.children.to_a
305
- end
306
-
307
- def test_find_by_css_with_tilde_eql
308
- xml = Nokogiri::XML.parse(<<-eoxml)
309
- <root>
310
- <a>Hello world</a>
311
- <a class='foo bar'>Bar</a>
312
- <a class='bar foo'>Bar</a>
313
- <a class='bar'>Bar</a>
314
- <a class='baz bar foo'>Bar</a>
315
- <a class='bazbarfoo'>Awesome</a>
316
- <a class='bazbar'>Awesome</a>
317
- </root>
318
- eoxml
319
- set = xml.css('a[@class~="bar"]')
320
- assert_equal 4, set.length
321
- assert_equal ['Bar'], set.map { |node| node.content }.uniq
322
- end
323
-
324
- def test_unlink
325
- xml = Nokogiri::XML.parse(<<-eoxml)
326
- <root>
327
- <a class='foo bar'>Bar</a>
328
- <a class='bar foo'>Bar</a>
329
- <a class='bar'>Bar</a>
330
- <a>Hello world</a>
331
- <a class='baz bar foo'>Bar</a>
332
- <a class='bazbarfoo'>Awesome</a>
333
- <a class='bazbar'>Awesome</a>
334
- </root>
335
- eoxml
336
- node = xml.xpath('.//a')[3]
337
- assert_equal('Hello world', node.text)
338
- assert_match(/Hello world/, xml.to_s)
339
- assert node.parent
340
- assert node.document
341
- assert node.previous_sibling
342
- assert node.next_sibling
343
- node.unlink
344
- assert !node.parent
345
- # assert !node.document
346
- assert !node.previous_sibling
347
- assert !node.next_sibling
348
- assert_no_match(/Hello world/, xml.to_s)
349
- end
350
-
351
- def test_next_sibling
352
- assert sibling = @node.child.next_sibling
353
- assert_equal('employee', sibling.name)
354
- end
355
-
356
- def test_previous_sibling
357
- assert sibling = @node.child.next_sibling
358
- assert_equal('employee', sibling.name)
359
- assert_equal(sibling.previous_sibling, @node.child)
360
- end
361
-
362
- def test_name=
363
- @node.name = 'awesome'
364
- assert_equal('awesome', @node.name)
365
- end
366
-
367
- def test_child
368
- assert child = @node.child
369
- assert_equal('text', child.name)
370
- end
371
-
372
- def test_key?
373
- assert node = @node.search('.//address').first
374
- assert(!node.key?('asdfasdf'))
375
- end
376
-
377
- def test_set_property
378
- assert node = @node.search('.//address').first
379
- node['foo'] = 'bar'
380
- assert_equal('bar', node['foo'])
381
- end
382
-
383
- def test_attributes
384
- assert node = @node.search('.//address').first
385
- assert_nil(node['asdfasdfasdf'])
386
- assert_equal('Yes', node['domestic'])
387
-
388
- assert node = @node.search('.//address')[2]
389
- attr = node.attributes
390
- assert_equal 2, attr.size
391
- assert_equal 'Yes', attr['domestic'].value
392
- assert_equal 'Yes', attr['domestic'].to_s
393
- assert_equal 'No', attr['street'].value
394
- end
395
-
396
- def test_path
397
- assert set = @node.search('.//employee')
398
- assert node = set.first
399
- assert_equal('/staff/employee[1]', node.path)
400
- end
401
-
402
- def test_search_by_symbol
403
- assert set = @node.search(:employee)
404
- assert 5, set.length
405
-
406
- assert node = @node.at(:employee)
407
- assert node.text =~ /EMP0001/
408
- end
409
-
410
- def test_new_node
411
- node = Nokogiri::XML::Node.new('form', @node.document)
412
- assert_equal('form', node.name)
413
- assert(node.document)
414
- end
415
-
416
- def test_encode_special_chars
417
- foo = @node.css('employee').first.encode_special_chars('&')
418
- assert_equal '&amp;', foo
419
- end
420
-
421
- def test_content
422
- node = Nokogiri::XML::Node.new('form', @node)
423
- assert_equal('', node.content)
424
-
425
- node.content = 'hello world!'
426
- assert_equal('hello world!', node.content)
427
- end
428
-
429
- def test_whitespace_nodes
430
- doc = Nokogiri::XML.parse("<root><b>Foo</b>\n<i>Bar</i> <p>Bazz</p></root>")
431
- children = doc.at('.//root').children.collect(&:to_s)
432
- assert_equal "\n", children[1]
433
- assert_equal " ", children[3]
434
- end
435
-
436
- def test_replace
437
- set = @node.search('.//employee')
438
- assert 5, set.length
439
- assert 0, @node.search('.//form').length
440
-
441
- first = set[0]
442
- second = set[1]
443
-
444
- node = Nokogiri::XML::Node.new('form', @node)
445
- first.replace(node)
446
-
447
- assert set = @node.search('.//employee')
448
- assert_equal 4, set.length
449
- assert 1, @node.search('.//form').length
450
-
451
- assert_equal set[0].to_xml, second.to_xml
452
- end
453
-
454
- def test_replace_on_unparented_node
455
- foo = Node.new('foo', @node.document)
456
- if Nokogiri.jruby? # JRuby Nokogiri doesn't raise an exception
457
- @node.replace(foo)
458
- else
459
- assert_raises(RuntimeError){ @node.replace(foo) }
460
- end
461
- end
462
-
463
- def test_illegal_replace_of_node_with_doc
464
- new_node = Nokogiri::XML.parse('<foo>bar</foo>')
465
- old_node = @node.at('.//employee')
466
- assert_raises(ArgumentError){ old_node.replace new_node }
467
- end
468
-
469
- def test_unlink_on_unlinked_node_1
470
- node = Nokogiri::XML::Node.new 'div', Nokogiri::XML::Document.new
471
- node.unlink # must_not_raise
472
- assert_nil node.parent
473
- end
474
-
475
- def test_unlink_on_unlinked_node_2
476
- node = Nokogiri::XML('<div>foo</div>').at_css("div")
477
- node.unlink
478
- node.unlink # must_not_raise
479
- assert_nil node.parent
480
- end
481
- end
482
- end
483
- end