summaryrefslogtreecommitdiff
path: root/test/prism/ruby_api_test.rb
diff options
context:
space:
mode:
authorKevin Newton <[email protected]>2023-12-07 10:39:21 -0500
committergit <[email protected]>2023-12-07 16:00:41 +0000
commitc05278e425a7b7cadf0bf299ecfbe0ae9525c75c (patch)
treeeda8da8cc72f9e50f904ff12d17fa926f51c6451 /test/prism/ruby_api_test.rb
parent0dc40bd2b740898fac4c6d4193ab6cd7ad52c05d (diff)
[ruby/prism] Update ordering of integer base flags
https://github.com/ruby/prism/commit/d711950d5f
Diffstat (limited to 'test/prism/ruby_api_test.rb')
-rw-r--r--test/prism/ruby_api_test.rb23
1 files changed, 23 insertions, 0 deletions
diff --git a/test/prism/ruby_api_test.rb b/test/prism/ruby_api_test.rb
index 9da326b2b8..3bf89f3339 100644
--- a/test/prism/ruby_api_test.rb
+++ b/test/prism/ruby_api_test.rb
@@ -124,6 +124,29 @@ module Prism
assert parse_expression("<<~`HERE`\nfoo \#{1}\nHERE\n").heredoc?
end
+ # 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_integer_base_flags
+ base = -> (node) do
+ value = (node.send(:flags) & (0b1111 - IntegerBaseFlags::DECIMAL)) << 1
+ value == 0 ? 10 : value
+ end
+
+ assert_equal 2, base[parse_expression("0b1")]
+ assert_equal 8, base[parse_expression("0o1")]
+ assert_equal 10, base[parse_expression("0d1")]
+ assert_equal 16, base[parse_expression("0x1")]
+ end
+
private
def parse_expression(source)