[ https://issues.apache.org/jira/browse/GROOVY-7581?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Thibault Kruse closed GROOVY-7581. ---------------------------------- Resolution: Duplicate reopened as https://issues.apache.org/jira/browse/GROOVY-7636 https://issues.apache.org/jira/browse/GROOVY-7637 > Multiple bugs in DefaultTypeTransformation.compareToWithEqualityCheck() > ----------------------------------------------------------------------- > > Key: GROOVY-7581 > URL: https://issues.apache.org/jira/browse/GROOVY-7581 > Project: Groovy > Issue Type: Bug > Reporter: Thibault Kruse > > The purpose of compareToWithEqualityCheck() seems to be to allow comparing > instances of different classes that cannot easily be compared with Java. All > Numbers should be comparable to each other, numbers should be comparable to > chars by the chars int value, and Strings, GStrings and chars should be > inter-comparable. The comparison should be symmetric and generally simulate > Comparable.compareTo(), meaning: > EDIT: [ wrong: - a value of -1, 0, 1 should be returned] > - an integer value returned compatible with java.lang.Comparable.compareTo() > - if compareToWithEqualityCheck(a, b) returns a value, then > compareToWithEqualityCheck(b, a) == -compareToWithEqualityCheck(a, b) should > hold > - if compareToWithEqualityCheck(a, b) thorws an exception, then > compareToWithEqualityCheck(a, b) should also throw one (of the same type) > That's what the method seemingly attempts, so this will be considered the > methods specification. > However, there are several cases where these requirements do nothold, as > shown by the following failing asserts: > {code} > static class MyNumber extends Number { > def n > MyNumber(n) { > this.n = n > } > int intValue(){n} > long longValue(){n} > float floatValue(){n} > double doubleValue(){n} > int hashCode(){-n} > boolean equals(other) { > if (other instanceof MyNumber) { return n==other.n} > return false > } > String toString(){"MyNumber($n)"} > } > static class MyNumberComparable extends MyNumber implements > Comparable<MyNumber> { > MyNumberComparable(Object n) { > super(n) > } > int compareTo(Object other) { > return n <=> (MyNumber) other; > } > } > // works > checkCompareToSymmetricSmallerThan(numComp1, 50) > // Bug, NumberFormatException, comparison to all other Number types works > // checkCompareToSymmetricSmallerThan(numComp1, 50G) > // assert compareTo('aa1', '2' as Character) == 47 > // bug, classCast exception. Should be some negative value? > // assert compareTo('2' as Character, 'aa1') == 1 > // assert compareTo("aa${1}", '2' as Character) == 47 > // bug, classCast exception. Should be some negative value? > //assert compareTo('2' as Character, "aa${1}") == 1 > MyNumber number2 = new MyNumber(50) > // works > assert compareTo(49, number2) == -1 > // bug: GroovyRuntimeException, but other way round works > //assert compareTo(number2, 49) == -1 > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)