mirror of
https://github.com/ruby/ruby.git
synced 2025-08-23 13:04:13 +02:00
33 lines
1,012 B
Ruby
33 lines
1,012 B
Ruby
# frozen_string_literal: true
|
|
|
|
require_relative "../test_helper"
|
|
|
|
module Prism
|
|
class IntegerBaseFlagsTest < TestCase
|
|
# Through some bit hackery, we want to allow consumers to use the integer
|
|
# base flags as the base itself. It has a nice property that the current
|
|
# alignment provides them in the correct order. So here we test that our
|
|
# assumption holds so that it doesn't change out from under us.
|
|
#
|
|
# In C, this would look something like:
|
|
#
|
|
# ((flags & ~DECIMAL) >> 1) || 10
|
|
#
|
|
# We have to do some other work in Ruby because 0 is truthy and ~ on an
|
|
# integer doesn't have a fixed width.
|
|
def test_flags
|
|
assert_equal 2, base("0b1")
|
|
assert_equal 8, base("0o1")
|
|
assert_equal 10, base("0d1")
|
|
assert_equal 16, base("0x1")
|
|
end
|
|
|
|
private
|
|
|
|
def base(source)
|
|
node = Prism.parse_statement(source)
|
|
value = (node.send(:flags) & (0b111100 - IntegerBaseFlags::DECIMAL)) >> 1
|
|
value == 0 ? 10 : value
|
|
end
|
|
end
|
|
end
|