Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

RubysUnicodeサポートのテスト

Ruby 2.4に同梱されている新機能の中には、改善されたUnicodeサポートがあります。具体的には、upcaseのようなメソッド およびdowncase 「ä」を「Ä」に変えて、元に戻します。これは私に興味をそそられました:AndréArkoのブログ投稿を読んだ2013年以降、他にどのようなUnicodeの改善がなされましたか?Rubyの文字列はUTF-8になりました…そうですか??

私はRubyのすべての文字列メソッドをテストしました。技術的なエラーではなく、「驚き最小の原則」の違反を探しました。具体的には、私の仮定は次のとおりでした:

  1. ユニークなキャラクターはユニークです: 「e」と「ë」は、「e」と「E」と同じように異なります。
  2. 単一の文字は単一の文字としてカウントされます それらがUnicodeでどのように表現されていても。これは、後者が2つのコードポイントで表されている場合でも、「e」と「ë」がそれぞれ1文字であることを意味します。
  3. 文字は不変です。 文字列を逆にしても、個々の文字は変更されません。
  4. 空白は空白として扱われます。 それらのトリッキーなユニコード空白文字ですら。
  5. 数字は数字として扱われます。 2番は、どのように書かれても常に2番です。

残念ながら、Rubyの文字列操作メソッドのほとんどはこれらのテストに失敗します。したがって、Unicode文字列を使用している場合は、使用する文字列に細心の注意を払う必要があります。

注:公開後、一部の読者は、Unicodeテスト文字列を正規化した場合、私が言及した失敗の多くは発生しなかったと指摘しました。これは本当です。ただし、文字列はRubyまたはRailsによって自動的に正規化されません(私がテストしたどのアプリでも)。これらのテストは常に最悪のケースを説明することを目的としており、その点ではまだ有用だと思います。

Ruby2.4.0を使用したUnicodeテスト

メソッド テスト 期待される 結果 評決
#% "%s" % "noël" "noël" "noël" OK
#* "noël" * 2 "noëlnoël" "noëlnoël" OK
#<< "noël" << "ë" "noëlë" "noëlë" OK
#<=> "ä" <=> "z" -1 -1 OK
#== "ä" == "ä" true true OK
#=〜 "ä" =~ /a./ nil 0 注意してください!
#[] "ä"[0] "ä" "a" 注意してください!
#[] = "ä"[0] = "u" "u" "u" OK
#b "ä".b.encoding.to_s "ASCII-8BIT" "ASCII-8BIT" OK
#bytes "ä".bytes [97, 204, 136] [97, 204, 136] OK
#bytesize "ä".bytesize 3 3 OK
#byteslice "ä".byteslice(1) "\xCC" "\xCC" OK
#capitalize "ä".capitalize "Ä" "Ä" OK
#casecmp "äa".casecmp("äz") -1 -1 OK
#center "ä".center(3) "ä" "ä" 注意してください!
#chars "ä".chars ["ä"] ["a", "̈"] 注意してください!
#chomp "ä ".chomp "ä" "ä" OK
#chop "ä".chop "" "a" 注意してください!
#chr "ä".chr "ä" "a" 注意してください!
#clear "ä".clear "" "" OK
#codepoints "ä".codepoints [97, 776] [97, 776] OK
#concat "ä".concat("x") "äx" "äx" OK
#count "ä".count("a") 0 1 注意してください!
#crypt "123".crypt("ää") == "123".crypt("aa") false false OK
#delete "ä".delete("a") "ä" "̈" 注意してください!
#downcase "Ä".downcase "ä" "ä" OK
#dump "ä".dump "\"a\\u0308\"" "\"a\\u0308\"" OK
#each_byte "ä".each_byte.to_a [97, 204, 136] [97, 204, 136] OK
#each_char "ä".each_char.to_a ["ä"] ["a", "̈"] 注意してください!
#each_codepoint "ä".each_codepoint.to_a [97, 776] [97, 776] OK
#each_line "ä".each_line.to_a ["ä"] ["ä"] OK
#empty? "ä".empty? false false OK
#encode "ä".encode("ASCII", undef: :replace) "a?" "a?" OK
#encoding "ä".encoding.to_s "UTF-8" "UTF-8" OK
#end_with? "ä".end_with?("ä") true true OK
#eql? "ä".eql?("a") false false OK
#force_encoding "ä".force_encoding("ASCII") "a\xCC\x88" "a\xCC\x88" OK
#getbyte "ä".getbyte(2) 136 136 OK
#gsub "ä".gsub("a", "x") "ä" "ẍ" 注意してください!
#hash "ä".hash == "a".hash false false OK
#include? "ä".include?("a") false true 注意してください!
#index "ä".index("a") nil 0 注意してください!
#replace "ä".replace("u") "u" "u" OK
#insert "ä".insert(1, "u") "äu" "aü" 注意してください!
#inspect "ä".inspect "\"ä\"" "\"ä\"" OK
#intern "ä".intern :ä :ä OK
#length "ä".length 1 2 注意してください!
#ljust "ä".ljust(3, "_") "ä__" "ä_" 注意してください!
#lstrip " ä".lstrip "ä" "ä" OK
#match "ä".match("a") nil # 注意してください!
#next "ä".next "ä" "b̈" 注意してください!
#ord "ä".ord 97 97 OK
#partition "händ".partition("a") ["händ"] ["h", "a", "̈nd"] 注意してください!
#prepend "ä".prepend("ä") "ää" "ää" OK
#replace "ä".replace("ẍ") "ẍ" "ẍ" OK
#reverse "händ".reverse "dnäh" "dn̈ah" 注意してください!
#rpartition "händ".rpartition("a") ["händ"] ["h", "a", "̈nd"] 注意してください!
#rstrip "line ".rstrip "line" "line" 注意してください!
#scrub "ä".scrub "ä" "ä" OK
#setbyte s = "ä"; s.setbyte(0, "x".ord); s "ẍ" "ẍ" OK
#size "ä".size 1 2 注意してください!
#slice "ä".slice(0) "ä" "a" 注意してください!
#split "ä".split("a") ["ä"] ["", "̈"] 注意してください!
#squeeze "ää".squeeze("ä") "ä" "ää" 注意してください!
#start_with? "ä".start_with?("a") false true 注意してください!
#strip " line ".strip "line" "line" 注意してください!
#sub "ä".sub("a", "x") "ä" "ẍ" 注意してください!
#succ "ä".succ "b̈" "b̈" OK
#swapcase "ä".swapcase "Ä" "Ä" OK
#to_c "١".to_c (1+0i) (0+0i) 注意してください!
#to_f "١".to_f 1.0 0.0 注意してください!
#to_i "١".to_i 1 0 注意してください!
#to_r "١".to_r (1/1) (0/1) 注意してください!
#to_sym "ä".to_sym :ä :ä OK
#tr "ä".tr("a", "b") "ä" "b̈" 注意してください!
#unpack "ä".unpack("CCC") [97, 204, 136] [97, 204, 136] OK
#upto "ä".upto("c̈").to_a ["ä", "b̈", "c̈"] ["ä", "b̈", "c̈"] OK
#valid_encoding? "ä".valid_encoding? true true OK

  1. 25 のベスト API テスト ツール

    クラウド アプリと関連するプラットフォームの数が増えるにつれて、API テストはますます重要になっています。基本的に、API (アプリケーション プログラミング インターフェース) は、2 つのソフトウェア プログラムがやり取りしてデータを共有できるようにするメッセンジャーです。 .存在しないため、フロント エンドでは実行できない一種のソフトウェア テストです。この記事では、最高の無料 API テスト ツールをいくつか調べました。それでは、読み続けてください! 25 のベスト API テスト ツール API がソフトウェア開発の重要な側面になるにつれて、API テストはますます開発者と

  2. 17 の最高のモバイル テスト ツール

    モバイル領域は急速に拡大しています。モバイル アプリケーションは、ビデオからモバイル バンキングまで、さまざまな形式で利用できるようになりました。莫大な収益性があるため、多くの企業がモバイル アプリ業界での存在感を確立しようとしています。アプリを作成するためのモバイル テストに最適なシミュレーターをお探しですか?見つけるお手伝いをいたします。この投稿では、Android と iOS のテスト範囲、効率、精度を向上させるのに役立つ最適なモバイル テスト ツールを見ていきます。 17 の最高のモバイル アプリ テスト ツール モバイル アプリの開発中に考慮すべきさまざまなプラットフォームと