ruby/test/prism/result/integer_base_flags_test.rb
2024-07-11 14:25:54 -04:00

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