# encoding: UTF-8 require "test_helper" require "stringex" if RUBY_VERSION.to_f < 1.9 $KCODE = "U" end class StringExtensionsTest < Test::Unit::TestCase def setup Stringex::Localization.reset! end def test_to_url { "

This has 100% too much formatting

" => "this-has-100-percent-too-much-formatting", "Tea & crumpets & crêpes for me!" => "tea-and-crumpets-and-crepes-for-me", "The Suspense... Is... Killing Me" => "the-suspense-dot-dot-dot-is-dot-dot-dot-killing-me", "How to use attr_accessible and attr_protected" => "how-to-use-attr-accessible-and-attr-protected", "I'm just making sure there's nothing wrong with things!" => "im-just-making-sure-theres-nothing-wrong-with-things", "foo = bar and bar=foo" => "foo-equals-bar-and-bar-equals-foo", "Period.period" => "period-dot-period", "Will…This Work?" => "will-dot-dot-dot-this-work", "We check the D.N.A for matches" => "we-check-the-dna-for-matches", "We check the D.N.A. for matches" => "we-check-the-dna-for-matches", "Go to the Y.M.C.America" => "go-to-the-ymcamerica", "He shops at J.C. Penney" => "he-shops-at-jc-penney", "¼ pound with cheese" => "one-fourth-pound-with-cheese", "Will's Ferrel" => "wills-ferrel", "Капитал" => "kapital", "Ελλάδα" => "ellada", "中文" => "zhong-wen", "Paul Cézanne" => "paul-cezanne", "21'17ʼ51" => "21-17-51", "ITCZ÷1 (21°17ʼ51.78”N / 89°35ʼ28.18”O / 26-04-08 / 09:00 am)" => "itcz-divided-by-1-21-degrees-17-51-dot-78-n-slash-89-degrees-35-28-dot-18-o-slash-26-04-08-slash-09-00-am", "/" => "slash", "私はガラスを食べられます。それは私を傷つけません。" => "si-hagarasuwoshi-beraremasu-sorehasi-woshang-tukemasen", "ǝ is a magical string" => "at-is-a-magical-string", "either | or" => "either-or", "La Maison d`Uliva" => "la-maison-duliva", "カッページ・テラスに日系カフェ&バー、店内にDJブースも - シンガポール経済新聞" => "katupeziterasuniri-xi-kahue-and-ba-dian-nei-nidjbusumo-singaporujing-ji-xin-wen", "AVアンプ、ホームシアターシステム、スピーカーシステム等" => "avanpu-homusiatasisutemu-supikasisutemudeng", "У лукоморья дуб зеленый" => "u-lukomoria-dub-zielienyi", "Here are some {braces}" => "here-are-some-braces", "$1,000" => "1000-dollars", "«zut alors»" => "zut-alors" }.each do |html, plain| assert_equal plain, html.to_url end end def test_to_url_with_excludes assert_equal "So Fucking Special", "So Fucking Special".to_url(:exclude => "So Fucking Special") end def test_to_url_without_forcing_downcase assert_equal "I-have-CAPS", "I have CAPS".to_url(:force_downcase => false) end def test_to_url_with_limit assert_equal "I am much too long".to_url(:limit => 13), "i-am-much-too" end def test_to_url_with_alternate_whitespace_replacement assert_equal "under_scores", "Under Scores".to_url(:replace_whitespace_with => "_") end def test_remove_formatting { "

This has 100% too much formatting

" => "This has 100 percent too much formatting", "Tea & crumpets & crêpes for me!" => "Tea and crumpets and crepes for me" }.each do |html, plain| assert_equal plain, html.remove_formatting end end def test_strip_html_tags { "

This is good but that is better

" => "This is good but that is better", "

This is invalid XHTML but valid HTML, right?" => "This is invalid XHTML but valid HTML, right?", "

Everything goes!

" => "Everything goes!", "
    This is completely invalid and just plain wrong

    " => "This is completely invalid and just plain wrong" }.each do |html, plain| assert_equal plain, html.strip_html_tags end end def test_convert_accented_html_entities { "å" => "a", "è" => "e", "î" => "i", "Ø" => "O", "ü" => "u", "Ñ" => "N", "ç" => "c" }.each do |entitied, plain| assert_equal plain, entitied.convert_accented_html_entities end end def test_localized_vulgar_fractions_conversion Stringex::Localization.backend = :internal Stringex::Localization.store_translations :de, :vulgar_fractions, { :one_fourth => "en fjerdedel", :half => "en halv" } Stringex::Localization.locale = :de { "¼" => "en fjerdedel", "½" => "en halv" }.each do |entitied, plain| assert_equal plain, entitied.convert_vulgar_fractions end end def test_localized_html_entities_conversion Stringex::Localization.backend = :internal Stringex::Localization.store_translations :de, :html_entities, { :amp => "und", :ellipsis => " prik prik prik", :frac14 => "en fjerdedel" } Stringex::Localization.locale = :de { "Tea & Sympathy" => "Tea und Sympathy", "To be continued…" => "To be continued prik prik prik", "Det var til ¼ af prisen" => "Det var til en fjerdedel af prisen" }.each do |entitied, plain| assert_equal plain, entitied.convert_miscellaneous_html_entities end end def test_convert_smart_punctuation { "“smart quotes”" => '"smart quotes"', "‘dumb quotes’" => "'dumb quotes'", "I love you, but…" => "I love you, but...", }.each do |smart, plain| assert_equal plain, smart.convert_smart_punctuation end end def test_localized_character_conversions Stringex::Localization.backend = :internal Stringex::Localization.store_translations :de, :characters, { "and" => "und", :percent => "procent" } Stringex::Localization.locale = :de { "ich & dich" => "ich und dich", "det var 100% godt" => "det var 100 procent godt" }.each do |misc, plain| assert_equal plain, misc.convert_miscellaneous_characters end end def test_replace_whitespace { "this has too much space" => "this has too much space", "\t\tThis is merely formatted with superfluous whitespace\n" => " This is merely formatted with superfluous whitespace " }.each do |whitespaced, plain| assert_equal plain, whitespaced.replace_whitespace end assert_equal "now-with-more-hyphens", "now with more hyphens".replace_whitespace("-") end def test_collapse { "too much space" => "too much space", " at the beginning" => "at the beginning" }.each do |uncollapsed, plain| assert_equal plain, uncollapsed.collapse end assert_equal "now-with-hyphens", "----now---------with-hyphens--------".collapse("-") end def test_empty_translations Stringex::Localization.backend = :internal Stringex::Localization.store_translations :de, :characters, { :star => "", :percent => "prozent" } Stringex::Localization.locale = :de assert_equal "foobar ist 100 prozent gut", "foo*bar ist 100% gut".convert_miscellaneous_characters end def test_overriding_to_ascii_allows_utf8_urls String.class_eval do alias :old_to_ascii :to_ascii def to_ascii self end end { "مصدر أمني: مجهولون يطلقون «خرطوش» على متظاهرين بمترو عزبة النخل وإصابة 16" => "مصدر-أمني-مجهولون-يطلقون-«خرطوش»-على-متظاهرين-بمترو-عزبة-النخل-وإصابة-16", "c'est ça" => "cest-ça", "la muñeca" => "la-muñeca" }.each do |original, converted| assert_equal converted, original.to_url end ensure String.class_eval do remove_method :to_ascii def to_ascii old_to_ascii end end end end