summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/-test-/arith_seq/extract/extconf.rb2
-rw-r--r--ext/-test-/arith_seq/extract/extract.c27
-rw-r--r--test/-ext-/arith_seq/test_arith_seq_extract.rb40
3 files changed, 69 insertions, 0 deletions
diff --git a/ext/-test-/arith_seq/extract/extconf.rb b/ext/-test-/arith_seq/extract/extconf.rb
new file mode 100644
index 0000000000..9c368bf50e
--- /dev/null
+++ b/ext/-test-/arith_seq/extract/extconf.rb
@@ -0,0 +1,2 @@
+# frozen_string_literal: false
+create_makefile("-test-/arith_seq/extract")
diff --git a/ext/-test-/arith_seq/extract/extract.c b/ext/-test-/arith_seq/extract/extract.c
new file mode 100644
index 0000000000..602afa7ca1
--- /dev/null
+++ b/ext/-test-/arith_seq/extract/extract.c
@@ -0,0 +1,27 @@
+#include "ruby/ruby.h"
+
+static VALUE
+arith_seq_s_extract(VALUE mod, VALUE obj)
+{
+ rb_arithmetic_sequence_components_t x;
+ VALUE ret;
+ int f, r;
+
+ r = rb_arithmetic_sequence_extract(obj, &x);
+
+ ret = rb_ary_new2(5);
+ rb_ary_store(ret, 0, r ? x.begin : Qnil);
+ rb_ary_store(ret, 1, r ? x.end : Qnil);
+ rb_ary_store(ret, 2, r ? x.step : Qnil);
+ rb_ary_store(ret, 3, r ? INT2FIX(x.exclude_end) : Qnil);
+ rb_ary_store(ret, 4, INT2FIX(r));
+
+ return ret;
+}
+
+void
+Init_extract(void)
+{
+ VALUE cArithSeq = rb_path2class("Enumerator::ArithmeticSequence");
+ rb_define_singleton_method(cArithSeq, "__extract__", arith_seq_s_extract, 1);
+}
diff --git a/test/-ext-/arith_seq/test_arith_seq_extract.rb b/test/-ext-/arith_seq/test_arith_seq_extract.rb
new file mode 100644
index 0000000000..d64fe6a7b5
--- /dev/null
+++ b/test/-ext-/arith_seq/test_arith_seq_extract.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: false
+require 'test/unit'
+
+class Test_ArithSeq < Test::Unit::TestCase
+ def test_extract_with_arith_seq
+ assert_separately([], <<-"end;") #do
+ require '-test-/arith_seq/extract'
+
+ b, e, s, f, r = Enumerator::ArithmeticSequence.__extract__(1.step(10, 2))
+ assert_equal([1, 10, 2, 0, 1], [b, e, s, f, r])
+
+ b, e, s, f, r = Enumerator::ArithmeticSequence.__extract__((1..10) % 2)
+ assert_equal([1, 10, 2, 0, 1], [b, e, s, f, r])
+
+ b, e, s, f, r = Enumerator::ArithmeticSequence.__extract__((1...10) % 2)
+ assert_equal([1, 10, 2, 1, 1], [b, e, s, f, r])
+ end;
+ end
+
+ def test_extract_with_range
+ assert_separately([], <<-"end;") #do
+ require '-test-/arith_seq/extract'
+
+ b, e, s, f, r = Enumerator::ArithmeticSequence.__extract__(1..10)
+ assert_equal([1, 10, 1, 0, 1], [b, e, s, f, r])
+
+ b, e, s, f, r = Enumerator::ArithmeticSequence.__extract__(1...10)
+ assert_equal([1, 10, 1, 1, 1], [b, e, s, f, r])
+ end;
+ end
+
+ def test_extract_with_others
+ assert_separately([], <<-"end;") #do
+ require '-test-/arith_seq/extract'
+
+ b, e, s, f, r = Enumerator::ArithmeticSequence.__extract__(nil)
+ assert_equal([nil, nil, nil, nil, 0], [b, e, s, f, r])
+ end;
+ end
+end