Feature #14550 » date-step-2.patch
ext/date/date_core.c | ||
---|---|---|
#define USE_PACK
|
||
static ID id_cmp, id_le_p, id_ge_p, id_eqeq_p;
|
||
static ID id_cmp, id_le_p, id_ge_p, id_eqeq_p, id_to, id_by;
|
||
static VALUE cDate, cDateTime;
|
||
static VALUE half_days_in_day, day_in_nanoseconds;
|
||
static double positive_inf, negative_inf;
|
||
... | ... | |
/*
|
||
* call-seq:
|
||
* d.step(limit[, step=1]) -> enumerator
|
||
* d.step(limit[, step=1]){|date| ...} -> self
|
||
* d.step(limit[, step=1]) -> enumerator
|
||
* d.step(limit[, step=1]){|date| ...} -> self
|
||
* d.step(to: limit, by: step) -> enumerator
|
||
* d.step(to: limit, by: step) {|date| ...} -> self
|
||
*
|
||
* Iterates evaluation of the given block, which takes a date object.
|
||
* The limit should be a date object.
|
||
*
|
||
* Date.new(2001).step(Date.new(2001,-1,-1)).select{|d| d.sunday?}.size
|
||
* #=> 52
|
||
* Date.new(2001, 1, 1).step(to: Date.new(2001,-1,-1), by: 5).count
|
||
* #=> 73
|
||
*/
|
||
static VALUE
|
||
d_lite_step(int argc, VALUE *argv, VALUE self)
|
||
{
|
||
VALUE limit, step, date;
|
||
VALUE limit, step, hash, date;
|
||
rb_scan_args(argc, argv, "11", &limit, &step);
|
||
RETURN_ENUMERATOR(self, argc, argv);
|
||
if (argc < 2)
|
||
argc = rb_scan_args(argc, argv, "02:", &limit, &step, &hash);
|
||
if (!NIL_P(hash)) {
|
||
ID keys[2];
|
||
VALUE values[2];
|
||
keys[0] = id_to;
|
||
keys[1] = id_by;
|
||
rb_get_kwargs(hash, keys, 0, 2, values);
|
||
if (values[0] != Qundef) {
|
||
if (argc > 0) rb_raise(rb_eArgError, "to is given twice");
|
||
limit = values[0];
|
||
}
|
||
if (values[1] != Qundef) {
|
||
if (argc > 1) rb_raise(rb_eArgError, "step is given twice");
|
||
step = values[1];
|
||
}
|
||
}
|
||
if (NIL_P(step)) {
|
||
step = INT2FIX(1);
|
||
}
|
||
#if 0
|
||
if (f_zero_p(step))
|
||
rb_raise(rb_eArgError, "step can't be 0");
|
||
#endif
|
||
RETURN_ENUMERATOR(self, argc, argv);
|
||
date = self;
|
||
switch (FIX2INT(f_cmp(step, INT2FIX(0)))) {
|
||
case -1:
|
||
... | ... | |
date_s_test_unit_conv, 0);
|
||
de_define_singleton_method(cDate, "test_all", date_s_test_all, 0);
|
||
#endif
|
||
id_to = rb_intern("to");
|
||
id_by = rb_intern("by");
|
||
}
|
||
/*
|
test/date/test_date_arith.rb | ||
---|---|---|
end
|
||
assert_equal(4, i)
|
||
i = 0
|
||
p.step(q, by: 2) do
|
||
i += 1
|
||
end
|
||
assert_equal(4, i)
|
||
i = 0
|
||
p.step(to: q, by: 2) do
|
||
i += 1
|
||
end
|
||
assert_equal(4, i)
|
||
i = 0
|
||
p.step(q) do
|
||
i += 1
|
||
end
|
||
assert_equal(8, i)
|
||
i = 0
|
||
p.step(to: q) do
|
||
i += 1
|
||
end
|
||
assert_equal(8, i)
|
||
assert_raise(ArgumentError) { p.step(q, to: q) { } }
|
||
assert_raise(ArgumentError) { p.step(q, 1, by: 1) { } }
|
||
assert_raise(ArgumentError) { p.step(q, foo: nil) { } }
|
||
end
|
||
def test_step__noblock
|
||
p = Date.new(2001,1,14)
|
||
q = Date.new(2001,1,21)
|
||
e = p.step(q, 2)
|
||
assert_equal(4, e.to_a.size)
|
||
e = p.step(q, by: 2)
|
||
assert_equal(4, e.to_a.size)
|
||
e = p.step(to: q, by: 2)
|
||
assert_equal(4, e.to_a.size)
|
||
e = p.step(q)
|
||
assert_equal(8, e.to_a.size)
|
||
e = p.step(to: q)
|
||
assert_equal(8, e.to_a.size)
|
||
end
|
||
end
|
- « Previous
- 1
- 2
- Next »