summaryrefslogtreecommitdiff
path: root/test/ruby/test_continuation.rb
blob: c719db8c35838fe2f2319d950c737e98a7cbae74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
require 'test/unit'
require 'continuation'
require 'fiber'
require_relative 'envutil'

class TestContinuation < Test::Unit::TestCase
  def test_create
    assert_equal(:ok, callcc{:ok})
    assert_equal(:ok, callcc{|c| c.call :ok})
  end

  def test_call
    assert_equal(:ok, callcc{|c| c.call :ok})

    ary = []
    ary << callcc{|c|
      @cont = c
      :a
    }
    @cont.call :b if ary.length < 3
    assert_equal([:a, :b, :b], ary)
  end

  def test_check_localvars
    vv = 0
    @v = 0
    @ary = []
    [1, 2, 3].each{|i|
      callcc {|k| @k = k}
      @v += 1
      vv += 1
    }
    @ary << [vv, @v]
    @k.call if @v < 10
    assert_equal((3..10).map{|e| [e, e]}, @ary)
  end

  def test_error
    cont = callcc{|c| c}
    assert_raise(RuntimeError){
      Thread.new{cont.call}.join
    }
    assert_raise(LocalJumpError){
      callcc
    }
    assert_raise(RuntimeError){
      c = nil
      Fiber.new do
        callcc {|c2| c = c2 }
      end.resume
      c.call
    }
  end

  def test_ary_flatten
    assert_normal_exit %q{
      require 'continuation'
      n = 0
      o = Object.new
      def o.to_ary() callcc {|k| $k = k; [1,2,3]} end
      [10,20,o,30,o,40].flatten.inspect
      n += 1
      $k.call if n < 100
    }, '[ruby-dev:34798]'
  end

  def test_marshal_dump
    assert_normal_exit %q{
      require 'continuation'
      n = 0
      o = Object.new
      def o.marshal_dump() callcc {|k| $k = k };  "fofof" end
      a = [1,2,3,o,4,5,6]
      Marshal.dump(a).inspect
      n += 1
      $k.call if n < 100
    }, '[ruby-dev:34802]'
  end

end