[#36071] サマータイムでのsleepの動作について — Yoshikawa <yoshixool@...>
吉川と申します。
こんにちは、なかむら(う)です。
吉川です。
こんにちは、なかむら(う)です。
久保です。
> 2008/9/2 U.Nakamura <usa@garbagecollect.jp>:
久保です。
こんにちは、なかむら(う)です。
[#36082] x86_64環境でMarshal.dumpの不具合 — Kouichi Ushijima <ushijima@...>
NTTレゾナントの牛島と申します。
[#36096] [ANN] Ruby 1.9.1仕様凍結 — "Yugui (Yuki Sonoda)" <yugui@...>
Yuguiです。
成瀬です。
[#36124] [Bug: 1.9] undefined method `readpartial' for TestFileUtils::Stream — SASADA Koichi <ko1@...>
ささだです.
[#36132] [Feature #542] cgi.rb : CGI::unescape return encoding — Takeyuki Fujioka <redmine@...>
Feature #542: cgi.rb : CGI::unescape return encoding
In article <48be847681f43_55585b236f8341@redmine.ruby-lang.org>,
成瀬です。
藤岡です。
藤岡です。
In article <48C0C20E.4000307@rabbix.jp>,
藤岡です。
In article <48C76705.5000202@rabbix.jp>,
藤岡です。
In article <48C8A83E.8000200@rabbix.jp>,
藤岡です。
成瀬です。
藤岡です。
藤岡です。
藤岡です。
西山和広です。
藤岡です。
成瀬です。
藤岡です。
藤岡です。
西山和広です。
[#36147] GNU iconv dependency — Takahiro Kambe <taca@...>
こんにちは。
成瀬です。
In message <48C544C3.6090607@airemix.jp>
成瀬です。
In message <48C7D1E1.5040403@airemix.jp>
Takahiro Kambe wrote:
In message <48C7EC6B.5060306@airemix.jp>
Takahiro Kambe wrote:
In message <48C7F8DD.7060001@airemix.jp>
成瀬です。
In message <48C7FE1B.1050900@airemix.jp>
Takahiro Kambe wrote:
なかだです。
In message <48C95715.5080708@ruby-lang.org>
[#36167] OpenSSL Test Failure — Tadashi Saito <shiba@...2.accsnet.ne.jp>
斎藤です。
[#36174] [Feature #546] String#gsub と Strnig#scan のブロックパラメータの一致 — Motonori IWAMURO <redmine@...>
Feature #546: String#gsub と Strnig#scan のブロックパラメータの一致
[#36201] ソケット関連の定数がいろいろ未定義 (Re: [Bug #547](Closed) IPV6系の定数が未定義) — "IWAMURO Motonori" <deenheart+ruby@...>
岩室です。
岩室です。
[#36233] [Bug #554] Sync_m#sync_try_lockの引数が無視されている — akira yamada <redmine@...>
Bug #554: Sync_m#sync_try_lockの引数が無視されている
[#36245] [Feature #546] String#gsub と Strnig#scan のブロックパラメータの一致 — Yui NARUSE <redmine@...>
チケット #546 が更新されました。 (by Yui NARUSE)
[#36281] 合成文字の2コードポイント目 — "NARUSE, Yui" <naruse@...>
成瀬です。
まつもと ゆきひろです
In article <E1KeKG9-0004NC-Jb@x61.netlab.jp>,
まつもと ゆきひろです
In article <E1KeRWe-00037N-Vb@x61.netlab.jp>,
成瀬です。
In article <48CC86FD.3000409@airemix.jp>,
Tanaka Akira wrote:
In article <48CE068E.3080701@airemix.jp>,
成瀬です。
まつもと ゆきひろです
In article <E1KfNyE-0005XO-0P@x61.netlab.jp>,
まつもと ゆきひろです
In article <E1KfQYp-00032T-F6@x61.netlab.jp>,
まつもと ゆきひろです
In article <E1KfRzT-0004jm-DU@x61.netlab.jp>,
In article <87tzcg3dt2.fsf@fsij.org>,
At 21:44 08/09/18, Tanaka Akira wrote:
[#36290] adding Pathname#abspath() — "Akinori MUSHA" <knu@...>
SUSv3のrealpath(3)の項には、存在しないコンポーネントがあったら
名前が良くなかったですね。Pathname#resolve()でどうでしょうか。
In article <86wshfn0zl.knu@iDaemons.org>,
At Sun, 14 Sep 2008 23:20:56 +0900,
In article <86vdwxn9rh.knu@iDaemons.org>,
At Mon, 22 Sep 2008 12:43:18 +0900,
In article <86od2gcvvj.knu@iDaemons.org>,
At Wed, 24 Sep 2008 02:02:59 +0900,
In article <86ljxgd0jt.knu@iDaemons.org>,
At Fri, 26 Sep 2008 02:29:43 +0900,
田中さん、この件はどうでしょう。
In article <86tz7s28my.knu@iDaemons.org>,
At Wed, 21 Jan 2009 21:54:34 +0900,
In article <86sknc0y2o.knu@iDaemons.org>,
[#36300] [patch] performance improvement patch for benchmark/bm_so_count_words.rb — "masayoshi takahashi" <maki@...>
高橋征義です。
まつもと ゆきひろです
高橋征義です。
[#36325] mathn (#**) — Tadayoshi Funaba <tadf@...>
mahtn した場合、
けいじゅ@いしつかです.
> 消したのは [ruby-dev: 20780] からのスレッドなのですが, その中で消して
mathn の課題はそれはそれとして、1.9 ではこの場合、やはり mathn しなくて
[#36329] [Bug:1.9] emacs21で色が付かない — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#36336] [Bug #571] IPv6系の定数が未定義 (for 1.8) — Motonori IWAMURO <redmine@...>
Bug #571: IPv6系の定数が未定義 (for 1.8)
[#36346] add "Error" suffix for Encoding Exceptions — Tadashi Saito <shiba@...2.accsnet.ne.jp>
斎藤と申します。
成瀬です。
斎藤と申します。
遠藤です。
こんにちは、なかむら(う)です。
At 22:25 08/09/18, U.Nakamura wrote:
まつもと ゆきひろです
In article <E1KgbIm-00010I-Qi@x61.netlab.jp>,
成瀬です。
[#36349] Complex/image — Tadayoshi Funaba <tadf@...>
[ruby-math:00543] を読んで、image はやめて imag に変更したらどうか、つ
けいじゅ@いしつかです.
> imageとimagの件ですが, 現行では両方定義されているけど, imageは削除って
けいじゅ@いしつかです.
> Pythonは複素数リテラルあるみたいですね. そしたら, Rubyも分数リテラルと
[#36352] Temporarily removing Precision module — Yugui <yugui@...>
Yuguiです。
[#36448] [Feature #583] TmpdirとTempfile — Yuki Sonoda <redmine@...>
Feature #583: TmpdirとTempfile
[#36461] {Complex,Rational}::Unify — Tadayoshi Funaba <tadf@...>
Complex と Rational では、Unify が定義された場合、可能なら整数等に正規
まつもと ゆきひろです
> mathn.rbはcomplex.rbなどと同一の作者が同時に(一体として)作成
けいじゅ@いしつかです.
> まず, Unifyなしで動作するように, mathn側で対応させてください. それから,
けいじゅ@いしつかです.
> mathn動かなくなっていると思うので, あまり大丈夫ではありません.
けいじゅ@いしつかです.
> これらのメソッドを呼び出すのではなく, 再定義することによって振る舞いを
けいじゅ@いしつかです.
> 当然, mathnで対応することはできます.
けいじゅ@いしつかです.
> >それで、僕が改めて言うまでもないことですが、mathn は石塚さんの担当なの
けいじゅ@いしつかです.
まつもと ゆきひろです
けいじゅ@いしつかです.
まつもと ゆきひろです
けいじゅ@いしつかです.
Yuguiです。
けいじゅ@いしつかです.
Yuguiです。
こんにちは、なかむら(う)です。
[#36493] [Bug: 1.9] tmpdir on mswin32 — SASADA Koichi <ko1@...>
ささだです.
[#36505] 文字コード変換の追加 (悲鳴) — Martin Duerst <duerst@...>
http://redmine.ruby-lang.org/wiki/ruby/DevelopersMeeting20080922
[#36511] [Bug #595] Fiber ignores ensure clause — Koichi Sasada <redmine@...>
Bug #595: Fiber ignores ensure clause
[#36512] Encoding.default_internal のためのパッチ — Martin Duerst <duerst@...>
[ruby-core:18774] に Michael Selig から Encoding::default_internal
成瀬です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
成瀬です。
まつもと ゆきひろです
永井@知能.九工大です.
まつもと ゆきひろです
Yukihiro Matsumoto さんは書きました:
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
At 14:58 08/09/25, Yukihiro Matsumoto wrote:
まつもと ゆきひろです
成瀬です。
まつもと ゆきひろです
In article <E1Kj3Iz-0003yT-HU@x61.netlab.jp>,
[#36528] driver and target of test-knownbug/btest-miniruby — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#36628] [IA-64]BigDecimal#sqrt の仕様 — TAKANO Mitsuhiro <takano32@...>
こんにちは
高野です。
まつもと ゆきひろです
高野です。
まつもと ゆきひろです
[#36631] net/pop.rb: APOPの脆弱性対応 — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[ruby-dev:36519] Re: [Feature #471] pack format 'm' based on RFC 4648
遠藤です。
2008/09/24 7:13 Tanaka Akira <akr@fsij.org>:
> In article <e0b1e5700809231144n376fd4eencfe06c49ed66665e@mail.gmail.com>,
> "Yusuke ENDOH" <mame@tsg.ne.jp> writes:
>
>> うーん。base64.rb には decode_b とか b64encode とか禍々しい
>> メソッドがあるので、個人的にはあまり復活させたくないところ
>> です。
>
> そのへんは消しちゃっていいと思います。
そのへんと deprecated なコードを消しちゃったらだいぶすっきりしました。
module Base64 は以下の 6 つの module_function を持ちます。
- Base64.encode64 : RFC 2045 準拠なエンコード (改行を入れる)
- Base64.decode64 : RFC 2045 準拠なデコード (改行などを無視する)
- Base64.strict_encode64 : RFC 4648 準拠なエンコード (改行を入れない)
- Base64.strict_decode64 : RFC 4648 準拠なデコード (改行や = の不足は例外)
- Base64.urlsafe_encode64 : URL セーフなバリアントのエンコード
- Base64.urlsafe_decode64 : URL セーフなバリアントのデコード
standard_encode64 は RFC を意識しすぎな名前だなぁと思ったので、
一般ユーザにわかりやすそうな strict にしてみました。
standard の方が良ければ直します。
これでよければコミットしたいと思いますが、いかがでしょうか。
Index: pack.c
===================================================================
--- pack.c (revision 19526)
+++ pack.c (working copy)
@@ -362,7 +362,7 @@
#endif
static const char toofew[] = "too few arguments";
-static void encodes(VALUE,const char*,long,int);
+static void encodes(VALUE,const char*,long,int,int);
static void qpencode(VALUE,VALUE,long);
static unsigned long utf8_to_uv(const char*,long*);
@@ -887,6 +887,11 @@
ptr = RSTRING_PTR(from);
plen = RSTRING_LEN(from);
+ if (len == 0) {
+ encodes(res, ptr, plen, type, 0);
+ ptr += plen;
+ break;
+ }
if (len <= 2)
len = 45;
else
@@ -898,7 +903,7 @@
todo = len;
else
todo = plen;
- encodes(res, ptr, todo, type);
+ encodes(res, ptr, todo, type, 1);
plen -= todo;
ptr += todo;
}
@@ -1007,7 +1012,7 @@
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static void
-encodes(VALUE str, const char *s, long len, int type)
+encodes(VALUE str, const char *s, long len, int type, int tail_lf)
{
char buff[4096];
long i = 0;
@@ -1048,7 +1053,7 @@
buff[i++] = padding;
buff[i++] = padding;
}
- buff[i++] = '\n';
+ if (tail_lf) buff[i++] = '\n';
rb_str_buf_cat(str, buff, i);
}
@@ -1793,7 +1798,7 @@
{
VALUE buf = infected_str_new(0, (send - s)*3/4, str);
char *ptr = RSTRING_PTR(buf);
- int a = -1,b = -1,c = 0,d;
+ int a = -1,b = -1,c = 0,d = 0;
static signed char b64_xtable[256];
if (b64_xtable['/'] <= 0) {
@@ -1806,32 +1811,64 @@
b64_xtable[(unsigned char)b64_table[i]] = i;
}
}
- while (s < send) {
- a = b = c = d = -1;
- while ((a = b64_xtable[(unsigned char)*s]) == -1 && s < send) {s++;}
- if (s >= send) break;
- s++;
- while ((b = b64_xtable[(unsigned char)*s]) == -1 && s < send) {s++;}
- if (s >= send) break;
- s++;
- while ((c = b64_xtable[(unsigned char)*s]) == -1 && s < send)
{if (*s == '=') break; s++;}
- if (*s == '=' || s >= send) break;
- s++;
- while ((d = b64_xtable[(unsigned char)*s]) == -1 && s < send)
{if (*s == '=') break; s++;}
- if (*s == '=' || s >= send) break;
- s++;
- *ptr++ = a << 2 | b >> 4;
- *ptr++ = b << 4 | c >> 2;
- *ptr++ = c << 6 | d;
- }
- if (a != -1 && b != -1) {
- if (c == -1 && *s == '=')
+ if (len == 0) {
+ while (s < send) {
+ a = b = c = d = -1;
+ a = b64_xtable[(unsigned char)*s++];
+ if (s >= send || a == -1) rb_raise(rb_eArgError, "invalid base64");
+ b = b64_xtable[(unsigned char)*s++];
+ if (s >= send || b == -1) rb_raise(rb_eArgError, "invalid base64");
+ if (*s == '=') {
+ if (s + 2 == send && *(s + 1) == '=') break;
+ rb_raise(rb_eArgError, "invalid base64");
+ }
+ c = b64_xtable[(unsigned char)*s++];
+ if (s >= send || c == -1) rb_raise(rb_eArgError, "invalid base64");
+ if (s + 1 == send && *s == '=') break;
+ d = b64_xtable[(unsigned char)*s++];
+ if (d == -1) rb_raise(rb_eArgError, "invalid base64");
*ptr++ = a << 2 | b >> 4;
- else if (c != -1 && *s == '=') {
+ *ptr++ = b << 4 | c >> 2;
+ *ptr++ = c << 6 | d;
+ }
+ if (c == -1) {
*ptr++ = a << 2 | b >> 4;
+ if (b & 0xf) rb_raise(rb_eArgError, "invalid base64");
+ }
+ else if (d == -1) {
+ *ptr++ = a << 2 | b >> 4;
*ptr++ = b << 4 | c >> 2;
+ if (c & 0x3) rb_raise(rb_eArgError, "invalid base64");
}
}
+ else {
+ while (s < send) {
+ a = b = c = d = -1;
+ while ((a = b64_xtable[(unsigned char)*s]) == -1 && s < send) {s++;}
+ if (s >= send) break;
+ s++;
+ while ((b = b64_xtable[(unsigned char)*s]) == -1 && s < send) {s++;}
+ if (s >= send) break;
+ s++;
+ while ((c = b64_xtable[(unsigned char)*s]) == -1 && s < send) {if
(*s == '=') break; s++;}
+ if (*s == '=' || s >= send) break;
+ s++;
+ while ((d = b64_xtable[(unsigned char)*s]) == -1 && s < send) {if
(*s == '=') break; s++;}
+ if (*s == '=' || s >= send) break;
+ s++;
+ *ptr++ = a << 2 | b >> 4;
+ *ptr++ = b << 4 | c >> 2;
+ *ptr++ = c << 6 | d;
+ }
+ if (a != -1 && b != -1) {
+ if (c == -1 && *s == '=')
+ *ptr++ = a << 2 | b >> 4;
+ else if (c != -1 && *s == '=') {
+ *ptr++ = a << 2 | b >> 4;
+ *ptr++ = b << 4 | c >> 2;
+ }
+ }
+ }
rb_str_set_len(buf, ptr - RSTRING_PTR(buf));
UNPACK_PUSH(buf);
}
Index: lib/base64.rb
===================================================================
--- lib/base64.rb (revision 0)
+++ lib/base64.rb (revision 0)
@@ -0,0 +1,91 @@
+#
+# = base64.rb: methods for base64-encoding and -decoding stings
+#
+
+# The Base64 module provides for the encoding (#encode64, #strict_encode64,
+# #urlsafe_encode64) and decoding (#decode64, #strict_decode64,
+# #urlsafe_decode64) of binary data using a Base64 representation.
+#
+# == Example
+#
+# A simple encoding and decoding.
+#
+# require "base64"
+#
+# enc = Base64.encode64('Send reinforcements')
+# # -> "U2VuZCByZWluZm9yY2VtZW50cw==\n"
+# plain = Base64.decode64(enc)
+# # -> "Send reinforcements"
+#
+# The purpose of using base64 to encode data is that it translates any
+# binary data into purely printable characters.
+
+module Base64
+ module_function
+
+ # Returns the Base64-encoded version of +bin+.
+ # This method complies with RFC 2045.
+ # Line feeds are added to every 60 encoded charactors.
+ #
+ # require 'base64'
+ # Base64.encode64("Now is the time for all good coders\nto learn Ruby")
+ #
+ # <i>Generates:</i>
+ #
+ # Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
+ # UnVieQ==
+ def encode64(bin)
+ [bin].pack("m")
+ end
+
+ # Returns the Base64-decoded version of +str+.
+ # This method complies with RFC 2045.
+ # Characters outside the base alphabet are ignored.
+ #
+ # require 'base64'
+ # str = 'VGhpcyBpcyBsaW5lIG9uZQpUaGlzIG' +
+ # 'lzIGxpbmUgdHdvClRoaXMgaXMgbGlu' +
+ # 'ZSB0aHJlZQpBbmQgc28gb24uLi4K'
+ # puts Base64.decode64(str)
+ #
+ # <i>Generates:</i>
+ #
+ # This is line one
+ # This is line two
+ # This is line three
+ # And so on...
+ def decode64(str)
+ str.unpack("m").first
+ end
+
+ # Returns the Base64-encoded version of +bin+.
+ # This method complies with RFC 4648.
+ # No line feeds are added.
+ def strict_encode64(bin)
+ [bin].pack("m0")
+ end
+
+ # Returns the Base64-decoded version of +str+.
+ # This method complies with RFC 4648.
+ # ArgumentError is raised if +str+ is incorrectly padded or contains
+ # non-alphabet characters. Note that CR or LF are also rejected.
+ def strict_decode64(str)
+ str.unpack("m0").first
+ end
+
+ # Returns the Base64-encoded version of +bin+.
+ # This method complies with ``Base 64 Encoding with URL and Filename Safe
+ # Alphabet'' in RFC 4648.
+ # The alphabet uses '-' instead of '+' and '_' instead of '/'.
+ def urlsafe_encode64(bin)
+ strict_encode64(bin).tr("+/", "-_")
+ end
+
+ # Returns the Base64-decoded version of +str+.
+ # This method complies with ``Base 64 Encoding with URL and Filename Safe
+ # Alphabet'' in RFC 4648.
+ # The alphabet uses '-' instead of '+' and '_' instead of '/'.
+ def urlsafe_decode64(str)
+ strict_decode64(str.tr("-_", "+/"))
+ end
+end
Index: test/ruby/test_pack.rb
===================================================================
--- test/ruby/test_pack.rb (revision 19526)
+++ test/ruby/test_pack.rb (working copy)
@@ -379,6 +379,36 @@
assert_equal(["\377\377\377"], "////\n".unpack("m"))
end
+ def test_pack_unpack_m0
+ assert_equal("", [""].pack("m0"))
+ assert_equal("AA==", ["\0"].pack("m0"))
+ assert_equal("AAA=", ["\0\0"].pack("m0"))
+ assert_equal("AAAA", ["\0\0\0"].pack("m0"))
+ assert_equal("/w==", ["\377"].pack("m0"))
+ assert_equal("//8=", ["\377\377"].pack("m0"))
+ assert_equal("////", ["\377\377\377"].pack("m0"))
+
+ assert_equal([""], "".unpack("m0"))
+ assert_equal(["\0"], "AA==".unpack("m0"))
+ assert_equal(["\0\0"], "AAA=".unpack("m0"))
+ assert_equal(["\0\0\0"], "AAAA".unpack("m0"))
+ assert_equal(["\377"], "/w==".unpack("m0"))
+ assert_equal(["\377\377"], "//8=".unpack("m0"))
+ assert_equal(["\377\377\377"], "////".unpack("m0"))
+
+ assert_raise(ArgumentError) { "^".unpack("m0") }
+ assert_raise(ArgumentError) { "A".unpack("m0") }
+ assert_raise(ArgumentError) { "A^".unpack("m0") }
+ assert_raise(ArgumentError) { "AA".unpack("m0") }
+ assert_raise(ArgumentError) { "AA=".unpack("m0") }
+ assert_raise(ArgumentError) { "AA===".unpack("m0") }
+ assert_raise(ArgumentError) { "AA=x".unpack("m0") }
+ assert_raise(ArgumentError) { "AAA".unpack("m0") }
+ assert_raise(ArgumentError) { "AAA^".unpack("m0") }
+ assert_raise(ArgumentError) { "AB==".unpack("m0") }
+ assert_raise(ArgumentError) { "AAB=".unpack("m0") }
+ end
+
def test_pack_unpack_M
assert_equal("a b c\td =\n\ne=\n", ["a b c\td \ne"].pack("M"))
assert_equal(["a b c\td \ne"], "a b c\td =\n\ne=\n".unpack("M"))
Index: test/base64/test_base64.rb
===================================================================
--- test/base64/test_base64.rb (revision 0)
+++ test/base64/test_base64.rb (revision 0)
@@ -0,0 +1,99 @@
+require "test/unit"
+require "base64"
+
+class TestBase64 < Test::Unit::TestCase
+ def test_sample
+ assert_equal("U2VuZCByZWluZm9yY2VtZW50cw==\n",
Base64.encode64('Send reinforcements'))
+ assert_equal('Send reinforcements',
Base64.decode64("U2VuZCByZWluZm9yY2VtZW50cw==\n"))
+ assert_equal(
+ "Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g\nUnVieQ==\n",
+ Base64.encode64("Now is the time for all good coders\nto learn Ruby"))
+ assert_equal(
+ "Now is the time for all good coders\nto learn Ruby",
+ Base64.decode64("Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g\nUnVieQ==\n"))
+ assert_equal(
+ "VGhpcyBpcyBsaW5lIG9uZQpUaGlzIGlzIGxpbmUgdHdvClRoaXMgaXMgbGlu\nZSB0aHJlZQpBbmQgc28gb24uLi4K\n",
+ Base64.encode64("This is line one\nThis is line two\nThis is
line three\nAnd so on...\n"))
+ assert_equal(
+ "This is line one\nThis is line two\nThis is line three\nAnd so on...\n",
+ Base64.decode64("VGhpcyBpcyBsaW5lIG9uZQpUaGlzIGlzIGxpbmUgdHdvClRoaXMgaXMgbGluZSB0aHJlZQpBbmQgc28gb24uLi4K"))
+ end
+
+ def test_encode64
+ assert_equal("", Base64.encode64(""))
+ assert_equal("AA==\n", Base64.encode64("\0"))
+ assert_equal("AAA=\n", Base64.encode64("\0\0"))
+ assert_equal("AAAA\n", Base64.encode64("\0\0\0"))
+ assert_equal("/w==\n", Base64.encode64("\377"))
+ assert_equal("//8=\n", Base64.encode64("\377\377"))
+ assert_equal("////\n", Base64.encode64("\377\377\377"))
+ assert_equal("/+8=\n", Base64.encode64("\xff\xef"))
+ end
+
+ def test_decode64
+ assert_equal("", Base64.decode64(""))
+ assert_equal("\0", Base64.decode64("AA==\n"))
+ assert_equal("\0\0", Base64.decode64("AAA=\n"))
+ assert_equal("\0\0\0", Base64.decode64("AAAA\n"))
+ assert_equal("\377", Base64.decode64("/w==\n"))
+ assert_equal("\377\377", Base64.decode64("//8=\n"))
+ assert_equal("\377\377\377", Base64.decode64("////\n"))
+ assert_equal("\xff\xef", Base64.decode64("/+8=\n"))
+ end
+
+ def test_strict_encode64
+ assert_equal("", Base64.strict_encode64(""))
+ assert_equal("AA==", Base64.strict_encode64("\0"))
+ assert_equal("AAA=", Base64.strict_encode64("\0\0"))
+ assert_equal("AAAA", Base64.strict_encode64("\0\0\0"))
+ assert_equal("/w==", Base64.strict_encode64("\377"))
+ assert_equal("//8=", Base64.strict_encode64("\377\377"))
+ assert_equal("////", Base64.strict_encode64("\377\377\377"))
+ assert_equal("/+8=", Base64.strict_encode64("\xff\xef"))
+ end
+
+ def test_strict_decode64
+ assert_equal("", Base64.strict_decode64(""))
+ assert_equal("\0", Base64.strict_decode64("AA=="))
+ assert_equal("\0\0", Base64.strict_decode64("AAA="))
+ assert_equal("\0\0\0", Base64.strict_decode64("AAAA"))
+ assert_equal("\377", Base64.strict_decode64("/w=="))
+ assert_equal("\377\377", Base64.strict_decode64("//8="))
+ assert_equal("\377\377\377", Base64.strict_decode64("////"))
+ assert_equal("\xff\xef", Base64.strict_decode64("/+8="))
+
+ assert_raise(ArgumentError) { Base64.strict_decode64("^") }
+ assert_raise(ArgumentError) { Base64.strict_decode64("A") }
+ assert_raise(ArgumentError) { Base64.strict_decode64("A^") }
+ assert_raise(ArgumentError) { Base64.strict_decode64("AA") }
+ assert_raise(ArgumentError) { Base64.strict_decode64("AA=") }
+ assert_raise(ArgumentError) { Base64.strict_decode64("AA===") }
+ assert_raise(ArgumentError) { Base64.strict_decode64("AA=x") }
+ assert_raise(ArgumentError) { Base64.strict_decode64("AAA") }
+ assert_raise(ArgumentError) { Base64.strict_decode64("AAA^") }
+ assert_raise(ArgumentError) { Base64.strict_decode64("AB==") }
+ assert_raise(ArgumentError) { Base64.strict_decode64("AAB=") }
+ end
+
+ def test_urlsafe_encode64
+ assert_equal("", Base64.urlsafe_encode64(""))
+ assert_equal("AA==", Base64.urlsafe_encode64("\0"))
+ assert_equal("AAA=", Base64.urlsafe_encode64("\0\0"))
+ assert_equal("AAAA", Base64.urlsafe_encode64("\0\0\0"))
+ assert_equal("_w==", Base64.urlsafe_encode64("\377"))
+ assert_equal("__8=", Base64.urlsafe_encode64("\377\377"))
+ assert_equal("____", Base64.urlsafe_encode64("\377\377\377"))
+ assert_equal("_-8=", Base64.urlsafe_encode64("\xff\xef"))
+ end
+
+ def test_urlsafe_decode64
+ assert_equal("", Base64.urlsafe_decode64(""))
+ assert_equal("\0", Base64.urlsafe_decode64("AA=="))
+ assert_equal("\0\0", Base64.urlsafe_decode64("AAA="))
+ assert_equal("\0\0\0", Base64.urlsafe_decode64("AAAA"))
+ assert_equal("\377", Base64.urlsafe_decode64("_w=="))
+ assert_equal("\377\377", Base64.urlsafe_decode64("__8="))
+ assert_equal("\377\377\377", Base64.urlsafe_decode64("____"))
+ assert_equal("\xff\xef", Base64.urlsafe_decode64("_+8="))
+ end
+end
--
Yusuke ENDOH <mame@tsg.ne.jp>