summaryrefslogtreecommitdiff
path: root/spec/mspec/lib/mspec/helpers/numeric.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/mspec/lib/mspec/helpers/numeric.rb')
-rw-r--r--spec/mspec/lib/mspec/helpers/numeric.rb72
1 files changed, 72 insertions, 0 deletions
diff --git a/spec/mspec/lib/mspec/helpers/numeric.rb b/spec/mspec/lib/mspec/helpers/numeric.rb
new file mode 100644
index 0000000000..ff30cf2b83
--- /dev/null
+++ b/spec/mspec/lib/mspec/helpers/numeric.rb
@@ -0,0 +1,72 @@
+require 'mspec/guards/platform'
+
+class Object
+ def nan_value
+ 0/0.0
+ end
+
+ def infinity_value
+ 1/0.0
+ end
+
+ def bignum_value(plus=0)
+ 0x8000_0000_0000_0000 + plus
+ end
+
+ # This is a bit hairy, but we need to be able to write specs that cover the
+ # boundary between Fixnum and Bignum for operations like Fixnum#<<. Since
+ # this boundary is implementation-dependent, we use these helpers to write
+ # specs based on the relationship between values rather than specific
+ # values.
+ if PlatformGuard.standard? or PlatformGuard.implementation? :topaz
+ if PlatformGuard.wordsize? 32
+ def fixnum_max
+ (2**30) - 1
+ end
+
+ def fixnum_min
+ -(2**30)
+ end
+ elsif PlatformGuard.wordsize? 64
+ def fixnum_max
+ (2**62) - 1
+ end
+
+ def fixnum_min
+ -(2**62)
+ end
+ end
+ elsif PlatformGuard.implementation? :opal
+ def fixnum_max
+ Integer::MAX
+ end
+
+ def fixnum_min
+ Integer::MIN
+ end
+ elsif PlatformGuard.implementation? :rubinius
+ def fixnum_max
+ Fixnum::MAX
+ end
+
+ def fixnum_min
+ Fixnum::MIN
+ end
+ elsif PlatformGuard.implementation?(:jruby) || PlatformGuard.implementation?(:truffleruby)
+ def fixnum_max
+ 9223372036854775807
+ end
+
+ def fixnum_min
+ -9223372036854775808
+ end
+ else
+ def fixnum_max
+ raise "unknown implementation for fixnum_max() helper"
+ end
+
+ def fixnum_min
+ raise "unknown implementation for fixnum_min() helper"
+ end
+ end
+end