inflector_test.rb 13.6 KB
Newer Older
1
require 'abstract_unit'
2 3
require 'active_support/inflector'

4
require 'inflector_test_cases'
5

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

13
class InflectorTest < Test::Unit::TestCase
14
  include InflectorTestCases
15

16
  def test_pluralize_plurals
17 18
    assert_equal "plurals", ActiveSupport::Inflector.pluralize("plurals")
    assert_equal "Plurals", ActiveSupport::Inflector.pluralize("Plurals")
19 20
  end

21
  def test_pluralize_empty_string
22
    assert_equal "", ActiveSupport::Inflector.pluralize("")
23
  end
24

25 26 27 28 29 30 31
  ActiveSupport::Inflector.inflections.uncountable.each do |word|
    define_method "test_uncountability_of_#{word}" do
      assert_equal word, ActiveSupport::Inflector.singularize(word)
      assert_equal word, ActiveSupport::Inflector.pluralize(word)
      assert_equal ActiveSupport::Inflector.pluralize(word), ActiveSupport::Inflector.singularize(word)
    end
  end
32

33 34 35
  def test_uncountable_word_is_not_greedy
    uncountable_word = "ors"
    countable_word = "sponsor"
36

37
    cached_uncountables = ActiveSupport::Inflector.inflections.uncountables
38

39 40 41 42 43 44 45 46 47
    ActiveSupport::Inflector.inflections.uncountable << uncountable_word

    assert_equal uncountable_word, ActiveSupport::Inflector.singularize(uncountable_word)
    assert_equal uncountable_word, ActiveSupport::Inflector.pluralize(uncountable_word)
    assert_equal ActiveSupport::Inflector.pluralize(uncountable_word), ActiveSupport::Inflector.singularize(uncountable_word)

    assert_equal "sponsor", ActiveSupport::Inflector.singularize(countable_word)
    assert_equal "sponsors", ActiveSupport::Inflector.pluralize(countable_word)
    assert_equal "sponsor", ActiveSupport::Inflector.singularize(ActiveSupport::Inflector.pluralize(countable_word))
48 49

  ensure
50 51
    ActiveSupport::Inflector.inflections.instance_variable_set :@uncountables, cached_uncountables
  end
52

53
  SingularToPlural.each do |singular, plural|
54
    define_method "test_pluralize_singular_#{singular}" do
55 56
      assert_equal(plural, ActiveSupport::Inflector.pluralize(singular))
      assert_equal(plural.capitalize, ActiveSupport::Inflector.pluralize(singular.capitalize))
57 58 59
    end
  end

60
  SingularToPlural.each do |singular, plural|
61
    define_method "test_singularize_plural_#{plural}" do
62 63
      assert_equal(singular, ActiveSupport::Inflector.singularize(plural))
      assert_equal(singular.capitalize, ActiveSupport::Inflector.singularize(plural.capitalize))
64 65
    end
  end
66

67
  SingularToPlural.each do |singular, plural|
68
    define_method "test_pluralize_plural_#{plural}" do
69 70 71 72
      assert_equal(plural, ActiveSupport::Inflector.pluralize(plural))
      assert_equal(plural.capitalize, ActiveSupport::Inflector.pluralize(plural.capitalize))
    end
  end
73

74 75 76 77 78 79 80
  def test_overwrite_previous_inflectors
    assert_equal("series", ActiveSupport::Inflector.singularize("series"))
    ActiveSupport::Inflector.inflections.singular "series", "serie"
    assert_equal("serie", ActiveSupport::Inflector.singularize("series"))
    ActiveSupport::Inflector.inflections.uncountable "series" # Return to normal
  end

81 82
  MixtureToTitleCase.each do |before, titleized|
    define_method "test_titleize_#{before}" do
83
      assert_equal(titleized, ActiveSupport::Inflector.titleize(before))
84 85 86
    end
  end

87 88
  def test_camelize
    CamelToUnderscore.each do |camel, underscore|
89
      assert_equal(camel, ActiveSupport::Inflector.camelize(underscore))
90 91 92
    end
  end

93 94 95 96
  def test_camelize_with_lower_downcases_the_first_letter
    assert_equal('capital', ActiveSupport::Inflector.camelize('Capital', false))
  end

97 98
  def test_underscore
    CamelToUnderscore.each do |camel, underscore|
99
      assert_equal(underscore, ActiveSupport::Inflector.underscore(camel))
100
    end
101
    CamelToUnderscoreWithoutReverse.each do |camel, underscore|
102
      assert_equal(underscore, ActiveSupport::Inflector.underscore(camel))
103
    end
104 105
  end

106 107
  def test_camelize_with_module
    CamelWithModuleToUnderscoreWithSlash.each do |camel, underscore|
108
      assert_equal(camel, ActiveSupport::Inflector.camelize(underscore))
109 110
    end
  end
111

112 113
  def test_underscore_with_slashes
    CamelWithModuleToUnderscoreWithSlash.each do |camel, underscore|
114
      assert_equal(underscore, ActiveSupport::Inflector.underscore(camel))
115 116 117
    end
  end

118
  def test_demodulize
119
    assert_equal "Account", ActiveSupport::Inflector.demodulize("MyApplication::Billing::Account")
120 121 122 123
  end

  def test_foreign_key
    ClassNameToForeignKeyWithUnderscore.each do |klass, foreign_key|
124
      assert_equal(foreign_key, ActiveSupport::Inflector.foreign_key(klass))
125 126 127
    end

    ClassNameToForeignKeyWithoutUnderscore.each do |klass, foreign_key|
128
      assert_equal(foreign_key, ActiveSupport::Inflector.foreign_key(klass, false))
129 130 131 132 133
    end
  end

  def test_tableize
    ClassNameToTableName.each do |class_name, table_name|
134
      assert_equal(table_name, ActiveSupport::Inflector.tableize(class_name))
135 136 137
    end
  end

138 139 140 141 142 143
  def test_parameterize
    StringToParameterized.each do |some_string, parameterized_string|
      assert_equal(parameterized_string, ActiveSupport::Inflector.parameterize(some_string))
    end
  end

144 145 146 147 148 149
  def test_parameterize_and_normalize
    StringToParameterizedAndNormalized.each do |some_string, parameterized_string|
      assert_equal(parameterized_string, ActiveSupport::Inflector.parameterize(some_string))
    end
  end

150 151 152 153 154 155
  def test_parameterize_with_custom_separator
    StringToParameterized.each do |some_string, parameterized_string|
      assert_equal(parameterized_string.gsub('-', '_'), ActiveSupport::Inflector.parameterize(some_string, '_'))
    end
  end

156 157 158 159 160 161
  def test_parameterize_with_multi_character_separator
    StringToParameterized.each do |some_string, parameterized_string|
      assert_equal(parameterized_string.gsub('-', '__sep__'), ActiveSupport::Inflector.parameterize(some_string, '__sep__'))
    end
  end

162 163
  def test_classify
    ClassNameToTableName.each do |class_name, table_name|
164 165
      assert_equal(class_name, ActiveSupport::Inflector.classify(table_name))
      assert_equal(class_name, ActiveSupport::Inflector.classify("table_prefix." + table_name))
166 167
    end
  end
168 169 170

  def test_classify_with_symbol
    assert_nothing_raised do
171
      assert_equal 'FooBar', ActiveSupport::Inflector.classify(:foo_bars)
172 173
    end
  end
174

175
  def test_classify_with_leading_schema_name
176
    assert_equal 'FooBar', ActiveSupport::Inflector.classify('schema.foo_bar')
177 178
  end

179 180
  def test_humanize
    UnderscoreToHuman.each do |underscore, human|
181
      assert_equal(human, ActiveSupport::Inflector.humanize(underscore))
182 183
    end
  end
184

185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
  def test_humanize_by_rule
    ActiveSupport::Inflector.inflections do |inflect|
      inflect.human(/_cnt$/i, '\1_count')
      inflect.human(/^prefx_/i, '\1')
    end
    assert_equal("Jargon count", ActiveSupport::Inflector.humanize("jargon_cnt"))
    assert_equal("Request", ActiveSupport::Inflector.humanize("prefx_request"))
  end

  def test_humanize_by_string
    ActiveSupport::Inflector.inflections do |inflect|
      inflect.human("col_rpted_bugs", "Reported bugs")
    end
    assert_equal("Reported bugs", ActiveSupport::Inflector.humanize("col_rpted_bugs"))
    assert_equal("Col rpted bugs", ActiveSupport::Inflector.humanize("COL_rpted_bugs"))
  end

202
  def test_constantize
203 204 205 206
    assert_nothing_raised { assert_equal Ace::Base::Case, ActiveSupport::Inflector.constantize("Ace::Base::Case") }
    assert_nothing_raised { assert_equal Ace::Base::Case, ActiveSupport::Inflector.constantize("::Ace::Base::Case") }
    assert_nothing_raised { assert_equal InflectorTest, ActiveSupport::Inflector.constantize("InflectorTest") }
    assert_nothing_raised { assert_equal InflectorTest, ActiveSupport::Inflector.constantize("::InflectorTest") }
207 208 209
    assert_raise(NameError) { ActiveSupport::Inflector.constantize("UnknownClass") }
    assert_raise(NameError) { ActiveSupport::Inflector.constantize("An invalid string") }
    assert_raise(NameError) { ActiveSupport::Inflector.constantize("InvalidClass\n") }
210
  end
211

212
  def test_constantize_does_lexical_lookup
213
    assert_raise(NameError) { ActiveSupport::Inflector.constantize("Ace::Base::InflectorTest") }
214
  end
215 216 217

  def test_ordinal
    OrdinalNumbers.each do |number, ordinalized|
218
      assert_equal(ordinalized, ActiveSupport::Inflector.ordinalize(number))
219 220
    end
  end
221 222 223

  def test_dasherize
    UnderscoresToDashes.each do |underscored, dasherized|
224
      assert_equal(dasherized, ActiveSupport::Inflector.dasherize(underscored))
225 226
    end
  end
227 228 229

  def test_underscore_as_reverse_of_dasherize
    UnderscoresToDashes.each do |underscored, dasherized|
230
      assert_equal(underscored, ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.dasherize(underscored)))
231 232
    end
  end
233 234 235

  def test_underscore_to_lower_camel
    UnderscoreToLowerCamel.each do |underscored, lower_camel|
236
      assert_equal(lower_camel, ActiveSupport::Inflector.camelize(underscored, false))
237 238
    end
  end
239

240 241 242 243 244 245
  def test_symbol_to_lower_camel
    SymbolToLowerCamel.each do |symbol, lower_camel|
      assert_equal(lower_camel, ActiveSupport::Inflector.camelize(symbol, false))
    end
  end

246
  %w{plurals singulars uncountables humans}.each do |inflection_type|
247
    class_eval <<-RUBY, __FILE__, __LINE__ + 1
248
      def test_clear_#{inflection_type}
249 250 251 252
        cached_values = ActiveSupport::Inflector.inflections.#{inflection_type}
        ActiveSupport::Inflector.inflections.clear :#{inflection_type}
        assert ActiveSupport::Inflector.inflections.#{inflection_type}.empty?, \"#{inflection_type} inflections should be empty after clear :#{inflection_type}\"
        ActiveSupport::Inflector.inflections.instance_variable_set :@#{inflection_type}, cached_values
253
      end
254
    RUBY
255
  end
256

257
  def test_clear_all
258
    cached_values = ActiveSupport::Inflector.inflections.plurals, ActiveSupport::Inflector.inflections.singulars, ActiveSupport::Inflector.inflections.uncountables, ActiveSupport::Inflector.inflections.humans
259 260 261 262
    ActiveSupport::Inflector.inflections.clear :all
    assert ActiveSupport::Inflector.inflections.plurals.empty?
    assert ActiveSupport::Inflector.inflections.singulars.empty?
    assert ActiveSupport::Inflector.inflections.uncountables.empty?
263
    assert ActiveSupport::Inflector.inflections.humans.empty?
264 265 266
    ActiveSupport::Inflector.inflections.instance_variable_set :@plurals, cached_values[0]
    ActiveSupport::Inflector.inflections.instance_variable_set :@singulars, cached_values[1]
    ActiveSupport::Inflector.inflections.instance_variable_set :@uncountables, cached_values[2]
267
    ActiveSupport::Inflector.inflections.instance_variable_set :@humans, cached_values[3]
268 269
  end

270
  def test_clear_with_default
271
    cached_values = ActiveSupport::Inflector.inflections.plurals, ActiveSupport::Inflector.inflections.singulars, ActiveSupport::Inflector.inflections.uncountables, ActiveSupport::Inflector.inflections.humans
272 273 274 275
    ActiveSupport::Inflector.inflections.clear
    assert ActiveSupport::Inflector.inflections.plurals.empty?
    assert ActiveSupport::Inflector.inflections.singulars.empty?
    assert ActiveSupport::Inflector.inflections.uncountables.empty?
276
    assert ActiveSupport::Inflector.inflections.humans.empty?
277 278 279
    ActiveSupport::Inflector.inflections.instance_variable_set :@plurals, cached_values[0]
    ActiveSupport::Inflector.inflections.instance_variable_set :@singulars, cached_values[1]
    ActiveSupport::Inflector.inflections.instance_variable_set :@uncountables, cached_values[2]
280
    ActiveSupport::Inflector.inflections.instance_variable_set :@humans, cached_values[3]
281
  end
282 283 284

  Irregularities.each do |irregularity|
    singular, plural = *irregularity
285
    ActiveSupport::Inflector.inflections do |inflect|
286 287
      define_method("test_irregularity_between_#{singular}_and_#{plural}") do
        inflect.irregular(singular, plural)
288 289
        assert_equal singular, ActiveSupport::Inflector.singularize(plural)
        assert_equal plural, ActiveSupport::Inflector.pluralize(singular)
290 291 292 293
      end
    end
  end

294 295 296 297 298 299 300 301 302 303
  Irregularities.each do |irregularity|
    singular, plural = *irregularity
    ActiveSupport::Inflector.inflections do |inflect|
      define_method("test_pluralize_of_irregularity_#{plural}_should_be_the_same") do
        inflect.irregular(singular, plural)
        assert_equal plural, ActiveSupport::Inflector.pluralize(plural)
      end
    end
  end

304
  [ :all, [] ].each do |scope|
305
    ActiveSupport::Inflector.inflections do |inflect|
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328
      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

329
  { :singulars => :singular, :plurals => :plural, :uncountables => :uncountable, :humans => :human }.each do |scope, method|
330
    ActiveSupport::Inflector.inflections do |inflect|
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350
      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
351
end