summaryrefslogtreecommitdiff
path: root/spec/ruby/core/integer/pow_spec.rb
blob: 5811576d92350c10415f1b318a8d6f1e1c160d68 (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
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../fixtures/classes', __FILE__)
require File.expand_path('../shared/exponent', __FILE__)

ruby_version_is "2.5" do
  describe "Integer#pow" do
    context "one argument is passed" do
      it_behaves_like :integer_exponent, :pow
    end

    context "two arguments are passed" do
      it "returns modulo of self raised to the given power" do
        2.pow(5, 12).should == 8
        2.pow(6, 13).should == 12
        2.pow(7, 14).should == 2
        2.pow(8, 15).should == 1
      end

      ruby_bug '#13669', '2.5'...'2.5.1' do
        it "works well with bignums" do
          2.pow(61, 5843009213693951).should eql 3697379018277258
          2.pow(62, 5843009213693952).should eql 1551748822859776
          2.pow(63, 5843009213693953).should eql 3103497645717974
          2.pow(64, 5843009213693954).should eql  363986077738838
        end
      end

      it "handles sign like #divmod does" do
         2.pow(5,  12).should ==  8
         2.pow(5, -12).should == -4
        -2.pow(5,  12).should ==  4
        -2.pow(5, -12).should == -8
      end

      it "ensures all arguments are integers" do
        -> { 2.pow(5, 12.0) }.should raise_error(TypeError, /2nd argument not allowed unless all arguments are integers/)
        -> { 2.pow(5, Rational(12, 1)) }.should raise_error(TypeError, /2nd argument not allowed unless all arguments are integers/)
      end

      it "raises TypeError for non-numeric value" do
        -> { 2.pow(5, "12") }.should raise_error(TypeError)
        -> { 2.pow(5, []) }.should raise_error(TypeError)
        -> { 2.pow(5, nil) }.should raise_error(TypeError)
      end

      it "raises a ZeroDivisionError when the given argument is 0" do
        -> { 2.pow(5, 0) }.should raise_error(ZeroDivisionError)
      end
    end
  end
end