Skip to content

Commit a26282d

Browse files
authored
Fix rounding when the dividend is smaller than the divisor (#57)
Fixes the regressions on boa-dev/boa#3880.
1 parent 21ea17d commit a26282d

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

src/components/time.rs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,4 +435,86 @@ mod tests {
435435
assert_eq!(result.hours(), -1.0);
436436
assert_eq!(result.minutes(), -37.0);
437437
}
438+
439+
#[test]
440+
// test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-nanoseconds.js
441+
fn rounding_increment_nanos() {
442+
let time = Time::new(3, 34, 56, 987, 654, 321, ArithmeticOverflow::Constrain).unwrap();
443+
444+
assert_eq!(
445+
time.round(TemporalUnit::Nanosecond, Some(1.0), None)
446+
.unwrap(),
447+
Time::new(3, 34, 56, 987, 654, 321, ArithmeticOverflow::Constrain).unwrap()
448+
);
449+
assert_eq!(
450+
time.round(TemporalUnit::Nanosecond, Some(2.0), None)
451+
.unwrap(),
452+
Time::new(3, 34, 56, 987, 654, 322, ArithmeticOverflow::Constrain).unwrap()
453+
);
454+
assert_eq!(
455+
time.round(TemporalUnit::Nanosecond, Some(4.0), None)
456+
.unwrap(),
457+
Time::new(3, 34, 56, 987, 654, 320, ArithmeticOverflow::Constrain).unwrap()
458+
);
459+
assert_eq!(
460+
time.round(TemporalUnit::Nanosecond, Some(5.0), None)
461+
.unwrap(),
462+
Time::new(3, 34, 56, 987, 654, 320, ArithmeticOverflow::Constrain).unwrap()
463+
);
464+
assert_eq!(
465+
time.round(TemporalUnit::Nanosecond, Some(8.0), None)
466+
.unwrap(),
467+
Time::new(3, 34, 56, 987, 654, 320, ArithmeticOverflow::Constrain).unwrap()
468+
);
469+
assert_eq!(
470+
time.round(TemporalUnit::Nanosecond, Some(10.0), None)
471+
.unwrap(),
472+
Time::new(3, 34, 56, 987, 654, 320, ArithmeticOverflow::Constrain).unwrap()
473+
);
474+
assert_eq!(
475+
time.round(TemporalUnit::Nanosecond, Some(20.0), None)
476+
.unwrap(),
477+
Time::new(3, 34, 56, 987, 654, 320, ArithmeticOverflow::Constrain).unwrap()
478+
);
479+
assert_eq!(
480+
time.round(TemporalUnit::Nanosecond, Some(25.0), None)
481+
.unwrap(),
482+
Time::new(3, 34, 56, 987, 654, 325, ArithmeticOverflow::Constrain).unwrap()
483+
);
484+
assert_eq!(
485+
time.round(TemporalUnit::Nanosecond, Some(40.0), None)
486+
.unwrap(),
487+
Time::new(3, 34, 56, 987, 654, 320, ArithmeticOverflow::Constrain).unwrap()
488+
);
489+
assert_eq!(
490+
time.round(TemporalUnit::Nanosecond, Some(50.0), None)
491+
.unwrap(),
492+
Time::new(3, 34, 56, 987, 654, 300, ArithmeticOverflow::Constrain).unwrap()
493+
);
494+
assert_eq!(
495+
time.round(TemporalUnit::Nanosecond, Some(100.0), None)
496+
.unwrap(),
497+
Time::new(3, 34, 56, 987, 654, 300, ArithmeticOverflow::Constrain).unwrap()
498+
);
499+
assert_eq!(
500+
time.round(TemporalUnit::Nanosecond, Some(125.0), None)
501+
.unwrap(),
502+
Time::new(3, 34, 56, 987, 654, 375, ArithmeticOverflow::Constrain).unwrap()
503+
);
504+
assert_eq!(
505+
time.round(TemporalUnit::Nanosecond, Some(200.0), None)
506+
.unwrap(),
507+
Time::new(3, 34, 56, 987, 654, 400, ArithmeticOverflow::Constrain).unwrap()
508+
);
509+
assert_eq!(
510+
time.round(TemporalUnit::Nanosecond, Some(250.0), None)
511+
.unwrap(),
512+
Time::new(3, 34, 56, 987, 654, 250, ArithmeticOverflow::Constrain).unwrap()
513+
);
514+
assert_eq!(
515+
time.round(TemporalUnit::Nanosecond, Some(500.0), None)
516+
.unwrap(),
517+
Time::new(3, 34, 56, 987, 654, 500, ArithmeticOverflow::Constrain).unwrap()
518+
);
519+
}
438520
}

src/rounding.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ impl<T: Roundable> IncrementRounder<T> {
4848
) -> TemporalResult<Self> {
4949
let increment = <T as NumCast>::from(increment.get()).temporal_unwrap()?;
5050
Ok(Self {
51-
sign: number / increment > T::ZERO,
51+
sign: number >= T::ZERO,
5252
dividend: number,
5353
divisor: increment,
5454
})

0 commit comments

Comments
 (0)