transliterate_test.rb 2.6 KB
Newer Older
1
# frozen_string_literal: true
2

3 4
require "abstract_unit"
require "active_support/inflector/transliterate"
5

6
class TransliterateTest < ActiveSupport::TestCase
7 8 9 10 11 12 13
  def test_transliterate_should_not_change_ascii_chars
    (0..127).each do |byte|
      char = [byte].pack("U")
      assert_equal char, ActiveSupport::Inflector.transliterate(char)
    end
  end

14
  def test_transliterate_should_approximate_ascii
A
ankit1910 已提交
15
    # create string with range of Unicode's western characters with
16 17
    # diacritics, excluding the division and multiplication signs which for
    # some reason or other are floating in the middle of all the letters.
18
    string = (0xC0..0x17E).to_a.reject { |c| [0xD7, 0xF7].include?(c) }.pack("U*")
19
    string.each_char do |char|
20
      assert_match %r{^[a-zA-Z']*$}, ActiveSupport::Inflector.transliterate(char)
21 22 23
    end
  end

24 25
  def test_transliterate_should_work_with_custom_i18n_rules_and_uncomposed_utf8
    char = [117, 776].pack("U*") # "ü" as ASCII "u" plus COMBINING DIAERESIS
26
    I18n.backend.store_translations(:de, i18n: { transliterate: { rule: { "ü" => "ue" } } })
27
    default_locale, I18n.locale = I18n.locale, :de
28
    assert_equal "ue", ActiveSupport::Inflector.transliterate(char)
29 30
  ensure
    I18n.locale = default_locale
31 32
  end

33 34 35 36 37 38
  def test_transliterate_respects_the_locale_argument
    char = [117, 776].pack("U*") # "ü" as ASCII "u" plus COMBINING DIAERESIS
    I18n.backend.store_translations(:de, i18n: { transliterate: { rule: { "ü" => "ue" } } })
    assert_equal "ue", ActiveSupport::Inflector.transliterate(char, locale: :de)
  end

39 40 41
  def test_transliterate_should_allow_a_custom_replacement_char
    assert_equal "a*b", ActiveSupport::Inflector.transliterate("a索b", "*")
  end
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

  def test_transliterate_handles_empty_string
    assert_equal "", ActiveSupport::Inflector.transliterate("")
  end

  def test_transliterate_handles_nil
    exception = assert_raises ArgumentError do
      ActiveSupport::Inflector.transliterate(nil)
    end
    assert_equal "Can only transliterate strings. Received NilClass", exception.message
  end

  def test_transliterate_handles_unknown_object
    exception = assert_raises ArgumentError do
      ActiveSupport::Inflector.transliterate(Object.new)
    end
    assert_equal "Can only transliterate strings. Received Object", exception.message
  end
60 61 62 63 64 65 66 67

  def test_transliterate_handles_non_unicode_strings
    ascii_8bit_string = "A".b
    exception = assert_raises ArgumentError do
      assert_equal "A", ActiveSupport::Inflector.transliterate(ascii_8bit_string)
    end
    assert_equal "Can only transliterate UTF-8 strings. Received string with encoding ASCII-8BIT", exception.message
  end
68
end