From 39817b4e8f93550de2d5e8cd7a9a2d829964d924 Mon Sep 17 00:00:00 2001 From: igerasim Date: Fri, 2 Feb 2018 13:00:55 -0800 Subject: [PATCH] 8194412: Adding 256 units of IsoFields.QUARTER_YEARS broken Reviewed-by: scolebourne, rriggs --- .../classes/java/time/temporal/IsoFields.java | 7 ++-- .../time/test/java/time/TestLocalDate.java | 39 ++++++++++++++++++- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/share/classes/java/time/temporal/IsoFields.java b/src/share/classes/java/time/temporal/IsoFields.java index d9f5101e3..9dc24fa04 100644 --- a/src/share/classes/java/time/temporal/IsoFields.java +++ b/src/share/classes/java/time/temporal/IsoFields.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -692,9 +692,8 @@ public final class IsoFields { return (R) temporal.with(WEEK_BASED_YEAR, Math.addExact(temporal.get(WEEK_BASED_YEAR), amount)); case QUARTER_YEARS: - // no overflow (256 is multiple of 4) - return (R) temporal.plus(amount / 256, YEARS) - .plus((amount % 256) * 3, MONTHS); + return (R) temporal.plus(amount / 4, YEARS) + .plus((amount % 4) * 3, MONTHS); default: throw new IllegalStateException("Unreachable"); } diff --git a/test/java/time/test/java/time/TestLocalDate.java b/test/java/time/test/java/time/TestLocalDate.java index a6bd18c5b..91eb2a45d 100644 --- a/test/java/time/test/java/time/TestLocalDate.java +++ b/test/java/time/test/java/time/TestLocalDate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,6 +67,7 @@ import static org.testng.Assert.assertTrue; import java.time.LocalDate; import java.time.Month; import java.time.temporal.ChronoUnit; +import java.time.temporal.IsoFields; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; @@ -444,4 +445,40 @@ public class TestLocalDate extends AbstractTest { } } + @DataProvider(name="quarterYearsToAdd") + Object[][] provider_quarterYearsToAdd() { + return new Object[][] { + {Long.valueOf(-1000000000)}, + {Long.valueOf(-256)}, + {Long.valueOf(-255)}, + {Long.valueOf(-1)}, + {Long.valueOf(0)}, + {Long.valueOf(1)}, + {Long.valueOf(255)}, + {Long.valueOf(256)}, + {Long.valueOf(1000000000)}, + }; + } + + @Test(dataProvider="quarterYearsToAdd") + public void test_plus_QuarterYears(long quarterYears) { + LocalDate t0 = TEST_2007_07_15 + .plus(quarterYears, IsoFields.QUARTER_YEARS); + LocalDate t1 = TEST_2007_07_15 + .plus(quarterYears, ChronoUnit.MONTHS) + .plus(quarterYears, ChronoUnit.MONTHS) + .plus(quarterYears, ChronoUnit.MONTHS); + assertEquals(t0, t1); + } + + @Test(dataProvider="quarterYearsToAdd") + public void test_minus_QuarterYears(long quarterYears) { + LocalDate t0 = TEST_2007_07_15 + .minus(quarterYears, IsoFields.QUARTER_YEARS); + LocalDate t1 = TEST_2007_07_15 + .minus(quarterYears, ChronoUnit.MONTHS) + .minus(quarterYears, ChronoUnit.MONTHS) + .minus(quarterYears, ChronoUnit.MONTHS); + assertEquals(t0, t1); + } } -- GitLab