1require 'test/unit'
2require_relative 'ruby/envutil'
3
4# mathn redefines too much. It must be isolated to child processes.
5class TestMathn < Test::Unit::TestCase
6  def test_power
7    assert_in_out_err ['-r', 'mathn', '-e', 'a=1**2;!a'], "", [], [], '[ruby-core:25740]'
8    assert_in_out_err ['-r', 'mathn', '-e', 'a=(1 << 126)**2;!a'], "", [], [], '[ruby-core:25740]'
9    assert_in_out_err ['-r', 'mathn/complex', '-e', 'a=Complex(0,1)**4;!a'], "", [], [], '[ruby-core:44170]'
10    assert_in_out_err ['-r', 'mathn/complex', '-e', 'a=Complex(0,1)**5;!a'], "", [], [], '[ruby-core:44170]'
11  end
12
13  def test_floor
14    assert_separately(%w[-rmathn], <<-EOS)
15      assert_equal( 2, ( 13/5).floor)
16      assert_equal( 2, (  5/2).floor)
17      assert_equal( 2, ( 12/5).floor)
18      assert_equal(-3, (-12/5).floor)
19      assert_equal(-3, ( -5/2).floor)
20      assert_equal(-3, (-13/5).floor)
21
22      assert_equal( 2, ( 13/5).floor(0))
23      assert_equal( 2, (  5/2).floor(0))
24      assert_equal( 2, ( 12/5).floor(0))
25      assert_equal(-3, (-12/5).floor(0))
26      assert_equal(-3, ( -5/2).floor(0))
27      assert_equal(-3, (-13/5).floor(0))
28
29      assert_equal(( 13/5), ( 13/5).floor(2))
30      assert_equal((  5/2), (  5/2).floor(2))
31      assert_equal(( 12/5), ( 12/5).floor(2))
32      assert_equal((-12/5), (-12/5).floor(2))
33      assert_equal(( -5/2), ( -5/2).floor(2))
34      assert_equal((-13/5), (-13/5).floor(2))
35    EOS
36  end
37
38  def test_ceil
39    assert_separately(%w[-rmathn], <<-EOS)
40      assert_equal( 3, ( 13/5).ceil)
41      assert_equal( 3, (  5/2).ceil)
42      assert_equal( 3, ( 12/5).ceil)
43      assert_equal(-2, (-12/5).ceil)
44      assert_equal(-2, ( -5/2).ceil)
45      assert_equal(-2, (-13/5).ceil)
46
47      assert_equal( 3, ( 13/5).ceil(0))
48      assert_equal( 3, (  5/2).ceil(0))
49      assert_equal( 3, ( 12/5).ceil(0))
50      assert_equal(-2, (-12/5).ceil(0))
51      assert_equal(-2, ( -5/2).ceil(0))
52      assert_equal(-2, (-13/5).ceil(0))
53
54      assert_equal(( 13/5), ( 13/5).ceil(2))
55      assert_equal((  5/2), (  5/2).ceil(2))
56      assert_equal(( 12/5), ( 12/5).ceil(2))
57      assert_equal((-12/5), (-12/5).ceil(2))
58      assert_equal(( -5/2), ( -5/2).ceil(2))
59      assert_equal((-13/5), (-13/5).ceil(2))
60    EOS
61  end
62
63  def test_truncate
64    assert_separately(%w[-rmathn], <<-EOS)
65      assert_equal( 2, ( 13/5).truncate)
66      assert_equal( 2, (  5/2).truncate)
67      assert_equal( 2, ( 12/5).truncate)
68      assert_equal(-2, (-12/5).truncate)
69      assert_equal(-2, ( -5/2).truncate)
70      assert_equal(-2, (-13/5).truncate)
71
72      assert_equal( 2, ( 13/5).truncate(0))
73      assert_equal( 2, (  5/2).truncate(0))
74      assert_equal( 2, ( 12/5).truncate(0))
75      assert_equal(-2, (-12/5).truncate(0))
76      assert_equal(-2, ( -5/2).truncate(0))
77      assert_equal(-2, (-13/5).truncate(0))
78
79      assert_equal(( 13/5), ( 13/5).truncate(2))
80      assert_equal((  5/2), (  5/2).truncate(2))
81      assert_equal(( 12/5), ( 12/5).truncate(2))
82      assert_equal((-12/5), (-12/5).truncate(2))
83      assert_equal(( -5/2), ( -5/2).truncate(2))
84      assert_equal((-13/5), (-13/5).truncate(2))
85    EOS
86  end
87
88  def test_round
89    assert_separately(%w[-rmathn], <<-EOS)
90      assert_equal( 3, ( 13/5).round)
91      assert_equal( 3, (  5/2).round)
92      assert_equal( 2, ( 12/5).round)
93      assert_equal(-2, (-12/5).round)
94      assert_equal(-3, ( -5/2).round)
95      assert_equal(-3, (-13/5).round)
96
97      assert_equal( 3, ( 13/5).round(0))
98      assert_equal( 3, (  5/2).round(0))
99      assert_equal( 2, ( 12/5).round(0))
100      assert_equal(-2, (-12/5).round(0))
101      assert_equal(-3, ( -5/2).round(0))
102      assert_equal(-3, (-13/5).round(0))
103
104      assert_equal(( 13/5), ( 13/5).round(2))
105      assert_equal((  5/2), (  5/2).round(2))
106      assert_equal(( 12/5), ( 12/5).round(2))
107      assert_equal((-12/5), (-12/5).round(2))
108      assert_equal(( -5/2), ( -5/2).round(2))
109      assert_equal((-13/5), (-13/5).round(2))
110    EOS
111  end
112end
113