File: load_parser_test.rb

package info (click to toggle)
ruby-multi-xml 0.8.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 472 kB
  • sloc: ruby: 2,822; sh: 4; makefile: 2
file content (134 lines) | stat: -rw-r--r-- 3,585 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
require "test_helper"

# Tests for LoadParserTest
class LoadParserTest < Minitest::Test
  cover "MultiXml*"

  def test_load_parser_with_symbol
    result = MultiXml.send(:load_parser, :nokogiri)

    assert_equal MultiXml::Parsers::Nokogiri, result
  end

  def test_load_parser_with_string
    result = MultiXml.send(:load_parser, "nokogiri")

    assert_equal MultiXml::Parsers::Nokogiri, result
  end

  def test_load_parser_converts_to_string_and_downcases
    result = MultiXml.send(:load_parser, :NOKOGIRI)

    assert_equal MultiXml::Parsers::Nokogiri, result
  end
end

# Tests for LoadParserDetailedTest
class LoadParserDetailedTest < Minitest::Test
  cover "MultiXml*"

  def test_load_parser_downcases_symbol
    result = MultiXml.send(:load_parser, :NOKOGIRI)

    assert_equal MultiXml::Parsers::Nokogiri, result
  end

  def test_load_parser_converts_to_string
    result = MultiXml.send(:load_parser, "nokogiri")

    assert_equal MultiXml::Parsers::Nokogiri, result
  end
end

# Tests for LoadParserCamelizeTest
class LoadParserCamelizeTest < Minitest::Test
  cover "MultiXml*"

  def test_load_parser_converts_to_camelcase
    result = MultiXml.send(:load_parser, :NOKOGIRI)

    assert_equal MultiXml::Parsers::Nokogiri, result
  end

  def test_load_parser_handles_underscore_names
    skip "libxml not available on Windows/JRuby" if windows? || jruby?
    # libxml_sax should become LibxmlSax
    result = MultiXml.send(:load_parser, :libxml_sax)

    assert_equal MultiXml::Parsers::LibxmlSax, result
  end

  def test_load_parser_handles_underscore_names_nokogiri_sax
    # nokogiri_sax should become NokogiriSax
    result = MultiXml.send(:load_parser, :nokogiri_sax)

    assert_equal MultiXml::Parsers::NokogiriSax, result
  end
end

# Tests load_parser string conversion
class LoadParserStringConversionTest < Minitest::Test
  cover "MultiXml*"

  def test_load_parser_calls_to_s_on_symbol
    # Symbols don't have downcase method directly in older Ruby
    result = MultiXml.send(:load_parser, :NOKOGIRI)

    assert_equal MultiXml::Parsers::Nokogiri, result
  end

  def test_load_parser_calls_downcase
    # Without downcase, "NOKOGIRI" wouldn't match "nokogiri" file
    result = MultiXml.send(:load_parser, "NOKOGIRI")

    assert_equal MultiXml::Parsers::Nokogiri, result
  end

  def test_load_parser_with_mixed_case_string
    # Ensure downcase is called on the string
    result = MultiXml.send(:load_parser, "Nokogiri")

    assert_equal MultiXml::Parsers::Nokogiri, result
  end
end

# Tests that verify downcase is actually called on the require path
class LoadParserRequirePathTest < Minitest::Test
  cover "MultiXml*"

  def test_load_parser_requires_lowercase_path
    required_paths = []
    stub_require(required_paths) { MultiXml.send(:load_parser, "REXML") }

    assert_includes required_paths, "multi_xml/parsers/rexml"
  end

  private

  def stub_require(required_paths)
    original_require = Kernel.instance_method(:require)
    suppress_warnings { define_require(required_paths, original_require) }
    yield
  ensure
    suppress_warnings { restore_require(original_require) }
  end

  def define_require(required_paths, original_require)
    Kernel.define_method(:require) do |path|
      required_paths << path
      original_require.bind_call(self, path)
    end
  end

  def restore_require(original_require)
    Kernel.define_method(:require) { |path| original_require.bind_call(self, path) }
  end

  def suppress_warnings
    old_verbose = $VERBOSE
    $VERBOSE = nil
    yield
  ensure
    $VERBOSE = old_verbose
  end
end