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
|
# 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
|