inflector_test.rb 8.2 KB
Newer Older
1
require 'abstract_unit'
2
require 'inflector_test_cases'
3

D
David Heinemeier Hansson 已提交
4 5 6
module Ace
  module Base
    class Case
7 8 9 10
    end
  end
end

11
class InflectorTest < Test::Unit::TestCase
12
  include InflectorTestCases
13

14 15 16 17 18
  def test_pluralize_plurals
    assert_equal "plurals", Inflector.pluralize("plurals")
    assert_equal "Plurals", Inflector.pluralize("Plurals")
  end

19 20 21 22
  def test_pluralize_empty_string
    assert_equal "", Inflector.pluralize("")
  end

23 24
  SingularToPlural.each do |singular, plural|
    define_method "test_pluralize_#{singular}" do
25
      assert_equal(plural, Inflector.pluralize(singular))
26
      assert_equal(plural.capitalize, Inflector.pluralize(singular.capitalize))
27 28 29
    end
  end

30 31
  SingularToPlural.each do |singular, plural|
    define_method "test_singularize_#{plural}" do
32
      assert_equal(singular, Inflector.singularize(plural))
33
      assert_equal(singular.capitalize, Inflector.singularize(plural.capitalize))
34 35 36
    end
  end

37 38 39
  MixtureToTitleCase.each do |before, titleized|
    define_method "test_titleize_#{before}" do
      assert_equal(titleized, Inflector.titleize(before))
40 41 42
    end
  end

43 44 45 46 47 48 49 50 51 52
  def test_camelize
    CamelToUnderscore.each do |camel, underscore|
      assert_equal(camel, Inflector.camelize(underscore))
    end
  end

  def test_underscore
    CamelToUnderscore.each do |camel, underscore|
      assert_equal(underscore, Inflector.underscore(camel))
    end
53 54 55
    CamelToUnderscoreWithoutReverse.each do |camel, underscore|
      assert_equal(underscore, Inflector.underscore(camel))
    end
56 57
  end

58 59 60 61 62
  def test_camelize_with_module
    CamelWithModuleToUnderscoreWithSlash.each do |camel, underscore|
      assert_equal(camel, Inflector.camelize(underscore))
    end
  end
63

64 65 66 67 68 69
  def test_underscore_with_slashes
    CamelWithModuleToUnderscoreWithSlash.each do |camel, underscore|
      assert_equal(underscore, Inflector.underscore(camel))
    end
  end

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
  def test_demodulize
    assert_equal "Account", Inflector.demodulize("MyApplication::Billing::Account")
  end

  def test_foreign_key
    ClassNameToForeignKeyWithUnderscore.each do |klass, foreign_key|
      assert_equal(foreign_key, Inflector.foreign_key(klass))
    end

    ClassNameToForeignKeyWithoutUnderscore.each do |klass, foreign_key|
      assert_equal(foreign_key, Inflector.foreign_key(klass, false))
    end
  end

  def test_tableize
    ClassNameToTableName.each do |class_name, table_name|
      assert_equal(table_name, Inflector.tableize(class_name))
    end
  end

  def test_classify
    ClassNameToTableName.each do |class_name, table_name|
      assert_equal(class_name, Inflector.classify(table_name))
93
      assert_equal(class_name, Inflector.classify("table_prefix." + table_name))
94 95
    end
  end
96 97 98

  def test_classify_with_symbol
    assert_nothing_raised do
99
      assert_equal 'FooBar', Inflector.classify(:foo_bars)
100 101
    end
  end
102

103 104 105 106
  def test_classify_with_leading_schema_name
    assert_equal 'FooBar', Inflector.classify('schema.foo_bar')
  end

107 108 109 110 111
  def test_humanize
    UnderscoreToHuman.each do |underscore, human|
      assert_equal(human, Inflector.humanize(underscore))
    end
  end
112

113
  def test_constantize
114 115 116 117
    assert_nothing_raised { assert_equal Ace::Base::Case, Inflector.constantize("Ace::Base::Case") }
    assert_nothing_raised { assert_equal Ace::Base::Case, Inflector.constantize("::Ace::Base::Case") }
    assert_nothing_raised { assert_equal InflectorTest, Inflector.constantize("InflectorTest") }
    assert_nothing_raised { assert_equal InflectorTest, Inflector.constantize("::InflectorTest") }
118
    assert_raises(NameError) { Inflector.constantize("UnknownClass") }
119
    assert_raises(NameError) { Inflector.constantize("An invalid string") }
120
    assert_raises(NameError) { Inflector.constantize("InvalidClass\n") }
121
  end
122

123 124 125 126 127 128 129 130
  if RUBY_VERSION < '1.9.0'
    def test_constantize_does_lexical_lookup
      assert_raises(NameError) { Inflector.constantize("Ace::Base::InflectorTest") }
    end
  else
    def test_constantize_does_dynamic_lookup
      assert_equal self.class, Inflector.constantize("Ace::Base::InflectorTest")
    end
131
  end
132 133 134 135 136 137

  def test_ordinal
    OrdinalNumbers.each do |number, ordinalized|
      assert_equal(ordinalized, Inflector.ordinalize(number))
    end
  end
138 139 140 141 142 143

  def test_dasherize
    UnderscoresToDashes.each do |underscored, dasherized|
      assert_equal(dasherized, Inflector.dasherize(underscored))
    end
  end
144 145 146 147 148 149

  def test_underscore_as_reverse_of_dasherize
    UnderscoresToDashes.each do |underscored, dasherized|
      assert_equal(underscored, Inflector.underscore(Inflector.dasherize(underscored)))
    end
  end
150 151 152 153 154 155

  def test_underscore_to_lower_camel
    UnderscoreToLowerCamel.each do |underscored, lower_camel|
      assert_equal(lower_camel, Inflector.camelize(underscored, false))
    end
  end
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
  
  %w{plurals singulars uncountables}.each do |inflection_type|
    class_eval "
      def test_clear_#{inflection_type}
        cached_values = Inflector.inflections.#{inflection_type}
        Inflector.inflections.clear :#{inflection_type}
        assert Inflector.inflections.#{inflection_type}.empty?, \"#{inflection_type} inflections should be empty after clear :#{inflection_type}\"
        Inflector.inflections.instance_variable_set :@#{inflection_type}, cached_values
      end
    "
  end
  
  def test_clear_all
    cached_values = Inflector.inflections.plurals, Inflector.inflections.singulars, Inflector.inflections.uncountables
    Inflector.inflections.clear :all
    assert Inflector.inflections.plurals.empty?
    assert Inflector.inflections.singulars.empty?
    assert Inflector.inflections.uncountables.empty?
    Inflector.inflections.instance_variable_set :@plurals, cached_values[0]
    Inflector.inflections.instance_variable_set :@singulars, cached_values[1]
    Inflector.inflections.instance_variable_set :@uncountables, cached_values[2]
  end
  
  def test_clear_with_default
    cached_values = Inflector.inflections.plurals, Inflector.inflections.singulars, Inflector.inflections.uncountables
    Inflector.inflections.clear
    assert Inflector.inflections.plurals.empty?
    assert Inflector.inflections.singulars.empty?
    assert Inflector.inflections.uncountables.empty?
    Inflector.inflections.instance_variable_set :@plurals, cached_values[0]
    Inflector.inflections.instance_variable_set :@singulars, cached_values[1]
    Inflector.inflections.instance_variable_set :@uncountables, cached_values[2]
  end
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247

  Irregularities.each do |irregularity|
    singular, plural = *irregularity
    Inflector.inflections do |inflect|
      define_method("test_irregularity_between_#{singular}_and_#{plural}") do
        inflect.irregular(singular, plural)
        assert_equal singular, Inflector.singularize(plural)
        assert_equal plural, Inflector.pluralize(singular)
      end
    end
  end

  [ :all, [] ].each do |scope|
    Inflector.inflections do |inflect|
      define_method("test_clear_inflections_with_#{scope.kind_of?(Array) ? "no_arguments" : scope}") do
        # save all the inflections
        singulars, plurals, uncountables = inflect.singulars, inflect.plurals, inflect.uncountables

        # clear all the inflections
        inflect.clear(*scope)

        assert_equal [], inflect.singulars
        assert_equal [], inflect.plurals
        assert_equal [], inflect.uncountables

        # restore all the inflections
        singulars.reverse.each { |singular| inflect.singular(*singular) }
        plurals.reverse.each   { |plural|   inflect.plural(*plural) }
        inflect.uncountable(uncountables)

        assert_equal singulars, inflect.singulars
        assert_equal plurals, inflect.plurals
        assert_equal uncountables, inflect.uncountables
      end
    end
  end

  { :singulars => :singular, :plurals => :plural, :uncountables => :uncountable }.each do |scope, method|
    Inflector.inflections do |inflect|
      define_method("test_clear_inflections_with_#{scope}") do
        # save the inflections
        values = inflect.send(scope)

        # clear the inflections
        inflect.clear(scope)

        assert_equal [], inflect.send(scope)

        # restore the inflections
        if scope == :uncountables
          inflect.send(method, values)
        else
          values.reverse.each { |value| inflect.send(method, *value) }
        end

        assert_equal values, inflect.send(scope)
      end
    end
  end
248
end