[前][次][番号順一覧][スレッド一覧]

ruby-changes:5295

From: knu <ko1@a...>
Date: Tue, 3 Jun 2008 20:06:53 +0900 (JST)
Subject: [ruby-changes:5295] Ruby:r16794 (ruby_1_8_7): * enumerator.c (enumerator_init_copy): Take care of

knu	2008-06-03 20:06:38 +0900 (Tue, 03 Jun 2008)

  New Revision: 16794

  Added files:
    branches/ruby_1_8_7/test/ruby/test_enumerator.rb
  Modified files:
    branches/ruby_1_8_7/ChangeLog
    branches/ruby_1_8_7/enumerator.c
    branches/ruby_1_8_7/version.h

  Log:
    * enumerator.c (enumerator_init_copy): Take care of
      initialize_copy as well as initialize.
    
    * test/ruby/test_enumerator.rb: Pull in the test suite for
      enumerator from trunk.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_7/enumerator.c?r1=16794&r2=16793&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_7/ChangeLog?r1=16794&r2=16793&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_7/test/ruby/test_enumerator.rb
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_7/version.h?r1=16794&r2=16793&diff_format=u

Index: ruby_1_8_7/ChangeLog
===================================================================
--- ruby_1_8_7/ChangeLog	(revision 16793)
+++ ruby_1_8_7/ChangeLog	(revision 16794)
@@ -1,3 +1,11 @@
+Tue Jun  3 19:33:22 2008  Akinori MUSHA  <knu@i...>
+
+	* enumerator.c (enumerator_init_copy): Take care of
+	  initialize_copy as well as initialize.
+
+	* test/ruby/test_enumerator.rb: Pull in the test suite for
+	  enumerator from trunk.
+
 Tue Jun  3 12:51:57 2008  Akinori MUSHA  <knu@i...>
 
 	* enumerator.c (enumerator_allocate, enumerator_ptr): Properly
Index: ruby_1_8_7/enumerator.c
===================================================================
--- ruby_1_8_7/enumerator.c	(revision 16793)
+++ ruby_1_8_7/enumerator.c	(revision 16794)
@@ -293,8 +293,13 @@
     struct enumerator *ptr0, *ptr1;
 
     ptr0 = enumerator_ptr(orig);
-    ptr1 = enumerator_ptr(obj);
 
+    Data_Get_Struct(obj, struct enumerator, ptr1);
+
+    if (!ptr1) {
+	rb_raise(rb_eArgError, "unallocated enumerator");
+    }
+
     ptr1->obj  = ptr0->obj;
     ptr1->meth = ptr0->meth;
     ptr1->iter = ptr0->iter;
Index: ruby_1_8_7/version.h
===================================================================
--- ruby_1_8_7/version.h	(revision 16793)
+++ ruby_1_8_7/version.h	(revision 16794)
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2008-06-03"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20080603
-#define RUBY_PATCHLEVEL 3
+#define RUBY_PATCHLEVEL 4
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
Index: ruby_1_8_7/test/ruby/test_enumerator.rb
===================================================================
--- ruby_1_8_7/test/ruby/test_enumerator.rb	(revision 0)
+++ ruby_1_8_7/test/ruby/test_enumerator.rb	(revision 16794)
@@ -0,0 +1,105 @@
+require 'test/unit'
+
+class TestEnumerator < Test::Unit::TestCase
+  def setup
+    @obj = Object.new
+    class << @obj
+      include Enumerable
+      def foo(*a)
+        a.each {|x| yield x }
+      end
+    end
+  end
+
+  def enum_test obj
+    i = 0
+    obj.map{|e|
+      e
+    }.sort
+  end
+
+  def test_iterators
+    assert_equal [0, 1, 2], enum_test(3.times)
+    assert_equal ["x", "y", "z"], enum_test(["z", "y", "x"].each)
+    assert_equal [["x", 1], ["y", 2]], enum_test({"y"=>2, "x"=>1})
+  end
+
+  ## Enumerator as Iterator
+
+  def test_next
+    e = 3.times
+    3.times{|i|
+      assert_equal i, e.next
+    }
+    assert_raise(StopIteration){e.next}
+  end
+
+  def test_loop
+    e = 3.times
+    i = 0
+    loop{
+      assert_equal(i, e.next)
+      i += 1
+    }
+  end
+
+  def test_nested_itaration
+    def (o = Object.new).each
+      yield :ok1
+      yield [:ok2, :x].each.next
+    end
+    e = o.to_enum
+    assert_equal :ok1, e.next
+    assert_equal :ok2, e.next
+    assert_raise(StopIteration){e.next}
+  end
+
+
+  def test_initialize
+    assert_equal([1, 2, 3], @obj.to_enum(:foo, 1, 2, 3).to_a)
+    assert_equal([1, 2, 3], Enumerable::Enumerator.new(@obj, :foo, 1, 2, 3).to_a)
+    assert_raise(ArgumentError) { Enumerable::Enumerator.new }
+  end
+
+  def test_initialize_copy
+    assert_equal([1, 2, 3], @obj.to_enum(:foo, 1, 2, 3).dup.to_a)
+    e = @obj.to_enum(:foo, 1, 2, 3)
+    assert_nothing_raised { assert_equal(1, e.next) }
+    #assert_raise(TypeError) { e.dup }
+  end
+
+  def test_gc
+    assert_nothing_raised do
+      1.times do
+        foo = [1,2,3].to_enum
+        GC.start
+      end
+      GC.start
+    end
+  end
+
+  def test_slice
+    assert_equal([[1,2,3],[4,5,6],[7,8,9],[10]], (1..10).each_slice(3).to_a)
+  end
+
+  def test_cons
+    a = [[1,2,3], [2,3,4], [3,4,5], [4,5,6], [5,6,7], [6,7,8], [7,8,9], [8,9,10]]
+    assert_equal(a, (1..10).each_cons(3).to_a)
+  end
+
+  def test_with_index
+    assert_equal([[1,0],[2,1],[3,2]], @obj.to_enum(:foo, 1, 2, 3).with_index.to_a)
+  end
+
+  def test_next_rewind
+    e = @obj.to_enum(:foo, 1, 2, 3)
+    assert_equal(1, e.next)
+    assert_equal(2, e.next)
+    e.rewind
+    assert_equal(1, e.next)
+    assert_equal(2, e.next)
+    assert_equal(3, e.next)
+    assert_raise(StopIteration) { e.next }
+  end
+end
+

Property changes on: ruby_1_8_7/test/ruby/test_enumerator.rb
___________________________________________________________________
Name: svn:eol-style
   + LF


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]