/* * Copyright (c) 2013, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /** * @test * @bug 5077522 * @summary test INDETERMINATE relations * @run main DurationComparison */ import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeConstants; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.Duration; /** * * This is a JCK failure. The implementation fails with a list of * INDETERMINATE comparisons * * * @author Joe Wang <huizhe.wang@oracle.com> */ public class DurationComparison { static String errMsg; int passed = 0, failed = 0; public static void main(String[] args) { DurationComparison test = new DurationComparison(); test.testCompareWithInderterminateRelation(); test.testVerifyOtherRelations(); test.tearDown(); } /** * See JDK-5077522, Duration.compare returns equal for INDETERMINATE * comparisons */ public void testCompareWithInderterminateRelation() { final String [][] partialOrder = { // partialOrder {"P1Y", "<>", "P365D"}, {"P1Y", "<>", "P366D"}, {"P1M", "<>", "P28D"}, {"P1M", "<>", "P29D"}, {"P1M", "<>", "P30D"}, {"P1M", "<>", "P31D"}, {"P5M", "<>", "P150D"}, {"P5M", "<>", "P151D"}, {"P5M", "<>", "P152D"}, {"P5M", "<>", "P153D"}, {"PT2419200S", "<>", "P1M"}, {"PT2678400S", "<>", "P1M"}, {"PT31536000S", "<>", "P1Y"}, {"PT31622400S", "<>", "P1Y"}, {"PT525600M", "<>", "P1Y"}, {"PT527040M", "<>", "P1Y"}, {"PT8760H", "<>", "P1Y"}, {"PT8784H", "<>", "P1Y"}, {"P365D", "<>", "P1Y"}, }; DatatypeFactory df = null; try { df = DatatypeFactory.newInstance(); } catch (DatatypeConfigurationException ex) { ex.printStackTrace(); fail(ex.toString()); } for (int valueIndex = 0; valueIndex < partialOrder.length; ++valueIndex) { Duration duration1 = df.newDuration(partialOrder[valueIndex][0]); Duration duration2 = df.newDuration(partialOrder[valueIndex][2]); int cmp = duration1.compare(duration2); int expected = ">".equals(partialOrder[valueIndex][1]) ? DatatypeConstants.GREATER : "<".equals(partialOrder[valueIndex][1]) ? DatatypeConstants.LESSER : "==".equals(partialOrder[valueIndex][1]) ? DatatypeConstants.EQUAL : DatatypeConstants.INDETERMINATE; if (expected != cmp) { fail("returned " + cmp2str(cmp) + " for durations \'" + duration1 + "\' and " + duration2 + "\', but expected " + cmp2str(expected)); } else { success("Comparing " + duration1 + " and " + duration2 + ": INDETERMINATE"); } } } /** * Verify cases around the INDETERMINATE relations */ public void testVerifyOtherRelations() { final String [][] partialOrder = { // partialOrder {"P1Y", ">", "P364D"}, {"P1Y", "<", "P367D"}, {"P1Y2D", ">", "P366D"}, {"P1M", ">", "P27D"}, {"P1M", "<", "P32D"}, {"P1M", "<", "P31DT1H"}, {"P5M", ">", "P149D"}, {"P5M", "<", "P154D"}, {"P5M", "<", "P153DT1H"}, {"PT2419199S", "<", "P1M"}, //PT2419200S -> P28D {"PT2678401S", ">", "P1M"}, //PT2678400S -> P31D {"PT31535999S", "<", "P1Y"}, //PT31536000S -> P365D {"PT31622401S", ">", "P1Y"}, //PT31622400S -> P366D {"PT525599M59S", "<", "P1Y"}, //PT525600M -> P365D {"PT527040M1S", ">", "P1Y"}, //PT527040M -> P366D {"PT8759H59M59S", "<", "P1Y"}, //PT8760H -> P365D {"PT8784H1S", ">", "P1Y"}, //PT8784H -> P366D }; DatatypeFactory df = null; try { df = DatatypeFactory.newInstance(); } catch (DatatypeConfigurationException ex) { ex.printStackTrace(); fail(ex.toString()); } for (int valueIndex = 0; valueIndex < partialOrder.length; ++valueIndex) { Duration duration1 = df.newDuration(partialOrder[valueIndex][0]); Duration duration2 = df.newDuration(partialOrder[valueIndex][2]); int cmp = duration1.compare(duration2); int expected = ">".equals(partialOrder[valueIndex][1]) ? DatatypeConstants.GREATER : "<".equals(partialOrder[valueIndex][1]) ? DatatypeConstants.LESSER : "==".equals(partialOrder[valueIndex][1]) ? DatatypeConstants.EQUAL : DatatypeConstants.INDETERMINATE; if (expected != cmp) { fail("returned " + cmp2str(cmp) + " for durations \'" + duration1 + "\' and " + duration2 + "\', but expected " + cmp2str(expected)); } else { success("Comparing " + duration1 + " and " + duration2 + ": expected: " + cmp2str(expected) + " actual: " + cmp2str(cmp)); } } } public static String cmp2str(int cmp) { return cmp == DatatypeConstants.LESSER ? "LESSER" : cmp == DatatypeConstants.GREATER ? "GREATER" : cmp == DatatypeConstants.EQUAL ? "EQUAL" : cmp == DatatypeConstants.INDETERMINATE ? "INDETERMINATE" : "UNDEFINED"; } public void tearDown() { System.out.println("\nNumber of tests passed: " + passed); System.out.println("Number of tests failed: " + failed + "\n"); if (errMsg != null ) { throw new RuntimeException(errMsg); } } void fail(String msg) { if (errMsg == null) { errMsg = msg; } else { errMsg = errMsg + "\n" + msg; } failed++; } void success(String msg) { passed++; System.out.println(msg); } }