[ https://issues.apache.org/jira/browse/MRESOLVER-336?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17807314#comment-17807314 ]
ASF GitHub Bot commented on MRESOLVER-336: ------------------------------------------ cstamas commented on code in PR #406: URL: https://github.com/apache/maven-resolver/pull/406#discussion_r1453635292 ########## maven-resolver-util/src/test/java/org/eclipse/aether/util/version/GenericVersionTest.java: ########## @@ -44,6 +41,155 @@ void testEmptyVersion() { assertOrder(X_EQ_Y, "0", ""); } + // Block of tests from https://issues.apache.org/jira/browse/MRESOLVER-336 + @Test + void testTrimPadding() { + // 1.0.0 -> 1 + List<GenericVersion.Item> items = new ArrayList<>(Arrays.asList( + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 1), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0))); + assertEquals(3, items.size()); + GenericVersion.trimPadding(items); + assertEquals(1, items.size()); + } + + @Test + void testTrimPaddingNotNeededString() { + // 1.0.0.string -> 1.string + List<GenericVersion.Item> items = new ArrayList<>(Arrays.asList( + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 1), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_STRING, "string"))); + assertEquals(4, items.size()); + GenericVersion.trimPadding(items); + assertEquals(2, items.size()); + } + + @Test + void testTrimPaddingNeededQualifier() { + // 1.0.0.ga -> 1 + List<GenericVersion.Item> items = new ArrayList<>(Arrays.asList( + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 1), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_QUALIFIER, 0))); + assertEquals(4, items.size()); + GenericVersion.trimPadding(items); + assertEquals(1, items.size()); + } + + @Test + void testTrimPaddingNeededQualifierMixed() { + // 1.0.0.string.0.ga -> 1.string + List<GenericVersion.Item> items = new ArrayList<>(Arrays.asList( + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 1), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_STRING, "string"), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_QUALIFIER, 0))); + assertEquals(6, items.size()); + GenericVersion.trimPadding(items); + assertEquals(2, items.size()); + } + + @Test + void testTrimPaddingNeededQualifierMixedInBetweenGa() { + // 1.0.ga.0.string.0.ga -> 1.ga.0.string + List<GenericVersion.Item> items = new ArrayList<>(Arrays.asList( + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 1), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_QUALIFIER, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_STRING, "string"), + new GenericVersion.Item(GenericVersion.Item.KIND_INT, 0), + new GenericVersion.Item(GenericVersion.Item.KIND_QUALIFIER, 0))); + assertEquals(7, items.size()); + GenericVersion.trimPadding(items); + assertEquals(4, items.size()); + } + + @Test + void testEdgeCase_1_1() { + Version v1 = newVersion("0.0.0.ga.ga.foo"); + Version v2 = newVersion("foo"); + // they were equal in Resolver 1.x + assertNotEquals(v1, v2); + } + + @Test + void testEdgeCase_1_2() { + // as expected + assertOrder(X_LT_Y, "ga.ga.foo", "foo"); Review Comment: As noted on JIRA, after discussing with teammates, we consider this undefined (more than undocumented). In short, it is very uncommon and atypical to start version with qualifier. I myself consider this example stretched. Also, "ga" is not and must not be considered as a "replacement for" or "alternative to" of "0". One is qualifier other is number. The "0" value carried by `ga` qualifier serves the purpose of inter-qualifier comparison, not as "number value". > Unexpected handling of qualifiers in GenericVersionScheme > --------------------------------------------------------- > > Key: MRESOLVER-336 > URL: https://issues.apache.org/jira/browse/MRESOLVER-336 > Project: Maven Resolver > Issue Type: Bug > Components: Resolver > Affects Versions: 1.9.5 > Reporter: David M. Lloyd > Assignee: Tamas Cservenak > Priority: Major > > Given the following: > {code} > $ jbang --main=org.eclipse.aether.util.version.GenericVersionScheme > org.apache.maven.resolver:maven-resolver-util:1.9.5 0.0.0.ga.ga.foo foo > Display parameters as parsed by Maven Resolver (in canonical form and as a > list of tokens) and comparison result: > 1. 0.0.0.ga.ga.foo -> 0.0.0.ga.ga.foo; tokens: [0, 0, 0, foo] > 0.0.0.ga.ga.foo == foo > 2. foo -> foo; tokens: [foo] > {code} > This is expected iff zero-prefixed qualifiers are considered equal to the > bare qualifier, which does seem to be the case *mostly*. However, we also > have this: > {code} > $ jbang --main=org.eclipse.aether.util.version.GenericVersionScheme > org.apache.maven.resolver:maven-resolver-util:1.9.5 ga.ga.foo foo > Display parameters as parsed by Maven Resolver (in canonical form and as a > list of tokens) and comparison result: > 1. ga.ga.foo -> ga.ga.foo; tokens: [0, 0, foo] > ga.ga.foo < foo > 2. foo -> foo; tokens: [foo] > {code} > In this case we have "zero"-valued qualifiers but no leading numerical > segment, which unexpectedly changes the parsing rules. I would expect > {{ga.ga.foo == foo}} as above. Is this a bug? Is there an explanation for > this behavior? The spec doesn't seem to directly address this. -- This message was sent by Atlassian Jira (v8.20.10#820010)