aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/core_ext/module/qualified_const_test.rb
blob: 8af0b9a023335611f041b4437158b25914470f3b (plain) (blame)
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
require 'abstract_unit'
require 'active_support/core_ext/module/qualified_const'

module QualifiedConstTestMod
  X = false

  module M
    X = 1

    class C
      X = 2
    end
  end

  module N
    include M
  end
end

class QualifiedConstTest < ActiveSupport::TestCase
  test "Object.qualified_const_defined?" do
    assert Object.qualified_const_defined?("QualifiedConstTestMod")
    assert !Object.qualified_const_defined?("NonExistingQualifiedConstTestMod")

    assert Object.qualified_const_defined?("QualifiedConstTestMod::X")
    assert !Object.qualified_const_defined?("QualifiedConstTestMod::Y")

    assert Object.qualified_const_defined?("QualifiedConstTestMod::M::X")
    assert !Object.qualified_const_defined?("QualifiedConstTestMod::M::Y")

    if Module.method(:const_defined?).arity == 1
      assert !Object.qualified_const_defined?("QualifiedConstTestMod::N::X")
    else
      assert Object.qualified_const_defined?("QualifiedConstTestMod::N::X")
      assert !Object.qualified_const_defined?("QualifiedConstTestMod::N::X", false)
      assert Object.qualified_const_defined?("QualifiedConstTestMod::N::X", true)
    end
  end

  test "mod.qualified_const_defined?" do
    assert QualifiedConstTestMod.qualified_const_defined?("M")
    assert !QualifiedConstTestMod.qualified_const_defined?("NonExistingM")

    assert QualifiedConstTestMod.qualified_const_defined?("M::X")
    assert !QualifiedConstTestMod.qualified_const_defined?("M::Y")

    assert QualifiedConstTestMod.qualified_const_defined?("M::C::X")
    assert !QualifiedConstTestMod.qualified_const_defined?("M::C::Y")

    if Module.method(:const_defined?).arity == 1
      assert !QualifiedConstTestMod.qualified_const_defined?("QualifiedConstTestMod::N::X")
    else
      assert QualifiedConstTestMod.qualified_const_defined?("N::X")
      assert !QualifiedConstTestMod.qualified_const_defined?("N::X", false)
      assert QualifiedConstTestMod.qualified_const_defined?("N::X", true)
    end
  end

  test "qualified_const_get" do
    assert_equal false, Object.qualified_const_get("QualifiedConstTestMod::X")
    assert_equal false, QualifiedConstTestMod.qualified_const_get("X")
    assert_equal 1, QualifiedConstTestMod.qualified_const_get("M::X")
    assert_equal 1, QualifiedConstTestMod.qualified_const_get("N::X")
    assert_equal 2, QualifiedConstTestMod.qualified_const_get("M::C::X")

    assert_raise(NameError) { QualifiedConstTestMod.qualified_const_get("M::C::Y")}
  end

  test "qualified_const_set" do
    m = Module.new
    assert_equal m, Object.qualified_const_set("QualifiedConstTestMod2", m)
    assert_equal m, ::QualifiedConstTestMod2

    # We are going to assign to existing constants on purpose, so silence warnings.
    silence_warnings do
      assert_equal true, QualifiedConstTestMod.qualified_const_set("QualifiedConstTestMod::X", true)
      assert_equal true, QualifiedConstTestMod::X

      assert_equal 10, QualifiedConstTestMod::M.qualified_const_set("X", 10)
      assert_equal 10, QualifiedConstTestMod::M::X
    end
  end

  test "reject absolute paths" do
    assert_raise(NameError, "wrong constant name ::X") { Object.qualified_const_defined?("::X")}
    assert_raise(NameError, "wrong constant name ::X") { Object.qualified_const_defined?("::X::Y")}

    assert_raise(NameError, "wrong constant name ::X") { Object.qualified_const_get("::X")}
    assert_raise(NameError, "wrong constant name ::X") { Object.qualified_const_get("::X::Y")}

    assert_raise(NameError, "wrong constant name ::X") { Object.qualified_const_set("::X", nil)}
    assert_raise(NameError, "wrong constant name ::X") { Object.qualified_const_set("::X::Y", nil)}
  end
end