Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@ public void testIdStructureTestCompleteness() throws IOException {
support.failOnError();
}

@Test
public void testTypeVersionClassNamingTestCompleteness() throws IOException {
TypeVersionClassNamingTestSupport support = createTypeVersionClassNamingTestSupport();
getPathExclusions().forEach(support::addPathExclusion);
support.doTest();
support.failOnError();
}

protected DataObjectSignatureTestSupport createSignatureTestSupport() {
return BEANS.get(DataObjectSignatureTestSupport.class);
}
Expand All @@ -55,6 +63,10 @@ protected IdStructureTestSupport createIdStructureTestSupport() {
return BEANS.get(IdStructureTestSupport.class);
}

protected TypeVersionClassNamingTestSupport createTypeVersionClassNamingTestSupport() {
return BEANS.get(TypeVersionClassNamingTestSupport.class);
}

protected List<Path> getPathExclusions() {
return CollectionUtility.arrayList();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Copyright (c) 2010, 2025 BSI Business Systems Integration AG
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.scout.rt.dataobject.testing;

import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;

import org.eclipse.scout.rt.dataobject.AbstractTypeVersion;
import org.eclipse.scout.rt.dataobject.ITypeVersion;
import org.eclipse.scout.rt.platform.BEANS;
import org.eclipse.scout.rt.platform.util.CollectionUtility;
import org.eclipse.scout.rt.platform.util.StringUtility;
import org.eclipse.scout.rt.testing.platform.runner.PlatformTestRunner;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(PlatformTestRunner.class)
public abstract class AbstractTypeVersionClassNamingTest {

@Test
public final void testTypeVersions() {
List<String> malformedTypeVersionClassNames = collectMalformedTypeVersionClassNames();
if (!malformedTypeVersionClassNames.isEmpty()) {
Assert.fail("Malformed type version class names found.\nType version class names must follow the following pattern: "
+ "<Namespace>_<version1>[_<version2>[_<versionN>]][__<comment>] where <Namespace> must be called after the respective scout namespace with all "
+ "letters in lower case except for the first letter, which must be capitalized.\n- " + String.join("\n- ", malformedTypeVersionClassNames));
}
}

protected abstract String getPackageNamePrefix();

protected Set<Class<ITypeVersion>> getExclusionList() {
return CollectionUtility.emptyHashSet();
}

protected List<String> collectMalformedTypeVersionClassNames() {
String packagePrefix = getPackageNamePrefix();

Set<Class<ITypeVersion>> excludedTypeVersions = getExclusionList();

return BEANS.all(ITypeVersion.class).stream()
.map(Object::getClass)
.filter(typeVersionClass -> !excludedTypeVersions.contains(typeVersionClass))
.filter(typeVersionClass -> typeVersionClass.getPackageName().startsWith(packagePrefix))
.map(Class::getSimpleName)
.filter(this::isMalformedTypeVersionClassName)
.toList();
}

protected boolean isMalformedTypeVersionClassName(String className) {
Matcher matcher = AbstractTypeVersion.CLASS_NAME_PATTERN.matcher(className);
if (!matcher.matches()) {
return false;
}

String actualNamespaceIdString = matcher.group(1);
String expectedNamespaceIdString = StringUtility.uppercaseFirst(actualNamespaceIdString.toLowerCase());

return !actualNamespaceIdString.equals(expectedNamespaceIdString);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What will we do with all the Fixture Type Versions that we have in Scout? For example DataObjectFixture_1_0_0 will be invalid. Rename them all? Or just exclude them?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thats a good point which also raises the question why they do have a "wrong" name in the first place.
While developing this change I found it increasingly strange, that the rule we are testing for is not enforced more strictly in the code (e.g. when constructing a NamespaceVersion object).
On the other hand: why are we selectively converting only the first letter to lower case and not the whole namespace part of the type version class name?

What are your thoughts on that?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure why we use these names for the Fixture Type Versions that don't match the naming pattern. Maybe @paolobazzi or @LukasHuser know more about this topic?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think those names are a (legacy) shortcut choosen to simplify tests (and using differtent namespaces we did not have to deal with duplicated type names).
Those namespace could be adjusted/fixed (+ check for duplicated type names)

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright (c) 2010, 2025 BSI Business Systems Integration AG
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.scout.rt.dataobject.testing;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

import java.util.regex.Pattern;

import org.eclipse.scout.rt.platform.BEANS;
import org.junit.Test;

public abstract class AbstractTypeVersionClassNamingTestSupportTest {

@Test
public void testFilePattern() {
Pattern filePattern = BEANS.get(TypeVersionClassNamingTestSupport.class).getFilePattern();

assertThat(filePattern.matcher("class MyVersion extends AbstractTypeVersion {}").find(), is(true));
assertThat(filePattern.matcher("public class MyVersion extends AbstractTypeVersion {}").find(), is(true));
assertThat(filePattern.matcher("final class MyVersion extends AbstractTypeVersion {}").find(), is(true));
assertThat(filePattern.matcher("public final class MyVersion extends AbstractTypeVersion {}").find(), is(true));
assertThat(filePattern.matcher("class MyVersion extends AbstractTypeVersionTest {}").find(), is(false));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright (c) 2010, 2025 BSI Business Systems Integration AG
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.scout.rt.dataobject.testing;

import java.nio.file.Path;
import java.util.regex.Pattern;

public class TypeVersionClassNamingTestSupport extends AbstractDataObjectTestSupport {

@Override
protected Pattern createFilePattern() {
return Pattern.compile("class \\w+ extends AbstractTypeVersion\\b");
}

@Override
protected Pattern createTestFilePattern() {
return Pattern.compile("\\bextends AbstractTypeVersionClassNamingTest\\b");
}

@Override
protected Pattern createPackageNamePrefixPattern() {
return Pattern.compile("String getPackageNamePrefix\\(\\)\\s*\\{\\s*return \\s*\"(.+?)\";\\s*}");
}

@Override
protected boolean acceptFile(Path path, String content) {
return !path.toString().contains(Path.of("src/test").toString()) && !path.getFileName().toString().endsWith("Test.java") && getFilePattern().matcher(content).find();
}

@Override
protected boolean acceptTestFile(Path path, String content) {
return path.getFileName().toString().endsWith("TypeVersionClassNamingTest.java") && getTestFilePattern().matcher(content).find();
}

@Override
protected String getErrorTitle() {
return "No TypeVersionClassNamingTest found for the following files:";
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, 2023 BSI Business Systems Integration AG
* Copyright (c) 2010, 2025 BSI Business Systems Integration AG
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
Expand All @@ -13,13 +13,13 @@
import static org.eclipse.scout.rt.platform.util.Assertions.assertEquals;
import static org.junit.Assert.assertNull;

import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_0_0;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_3_002__suffix;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_3_0__123456;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_3_0__loremIpsumDolor_3;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_3_0__lorem_ipsum;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_3_0__suffix;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectProjectFixtureTypeVersions.DataObjectProjectFixture_1_2_3_004;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.Dataobjectfixture_1_0_0;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.Dataobjectfixture_1_3_002__suffix;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.Dataobjectfixture_1_3_0__loremIpsumDolor_3;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.Dataobjectfixture_1_3_0__lorem_ipsum;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.Dataobjectfixture_1_3_0__suffix;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectProjectFixtureTypeVersions.Dataobjectprojectfixture_1_2_3_004;
import org.eclipse.scout.rt.platform.namespace.NamespaceVersion;
import org.junit.Assert;
import org.junit.Test;
Expand All @@ -34,14 +34,14 @@ public void testFromClassName() {
assertNull(fromClassName(null));
Assert.assertThrows(IllegalArgumentException.class, () -> fromClassName(AbstractTypeVersion.class));

assertEquals(NamespaceVersion.of("dataObjectFixture", "1.0.0"), fromClassName(DataObjectFixture_1_0_0.class));
assertEquals(NamespaceVersion.of("dataObjectProjectFixture", "1.2.3.004"), fromClassName(DataObjectProjectFixture_1_2_3_004.class));
assertEquals(NamespaceVersion.of("dataObjectFixture", "1.0.0"), fromClassName(Dataobjectfixture_1_0_0.class));
assertEquals(NamespaceVersion.of("dataObjectProjectFixture", "1.2.3.004"), fromClassName(Dataobjectprojectfixture_1_2_3_004.class));

// with suffix
assertEquals(NamespaceVersion.of("dataObjectFixture", "1.3.0"), fromClassName(DataObjectFixture_1_3_0__suffix.class));
assertEquals(NamespaceVersion.of("dataObjectFixture", "1.3.0"), fromClassName(Dataobjectfixture_1_3_0__suffix.class));
assertEquals(NamespaceVersion.of("dataObjectFixture", "1.3.0"), fromClassName(DataObjectFixture_1_3_0__123456.class));
assertEquals(NamespaceVersion.of("dataObjectFixture", "1.3.0"), fromClassName(DataObjectFixture_1_3_0__lorem_ipsum.class));
assertEquals(NamespaceVersion.of("dataObjectFixture", "1.3.0"), fromClassName(DataObjectFixture_1_3_0__loremIpsumDolor_3.class));
assertEquals(NamespaceVersion.of("dataObjectFixture", "1.3.002"), fromClassName(DataObjectFixture_1_3_002__suffix.class));
assertEquals(NamespaceVersion.of("dataObjectFixture", "1.3.0"), fromClassName(Dataobjectfixture_1_3_0__lorem_ipsum.class));
assertEquals(NamespaceVersion.of("dataObjectFixture", "1.3.0"), fromClassName(Dataobjectfixture_1_3_0__loremIpsumDolor_3.class));
assertEquals(NamespaceVersion.of("dataObjectFixture", "1.3.002"), fromClassName(Dataobjectfixture_1_3_002__suffix.class));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, 2023 BSI Business Systems Integration AG
* Copyright (c) 2010, 2025 BSI Business Systems Integration AG
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
Expand All @@ -22,12 +22,12 @@
import org.eclipse.scout.rt.dataobject.fixture.BiCompositeFixtureObject;
import org.eclipse.scout.rt.dataobject.fixture.BiCompositeFixtureObjectDataObjectVisitorExtension;
import org.eclipse.scout.rt.dataobject.fixture.CollectionFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_0_0;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_0_0_034;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_1_0_0_Duplicate;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.DataObjectFixture_No_Version;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.NonRegisteredNamespaceFixture_1_0_0;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectProjectFixtureTypeVersions.DataObjectProjectFixture_1_2_3_004;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.Dataobjectfixture_1_0_0;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.Dataobjectfixture_1_0_0_034;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.Dataobjectfixture_1_0_0_Duplicate;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.Dataobjectfixture_No_Version;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectFixtureTypeVersions.Nonregisterednamespacefixture_1_0_0;
import org.eclipse.scout.rt.dataobject.fixture.DataObjectProjectFixtureTypeVersions.Dataobjectprojectfixture_1_2_3_004;
import org.eclipse.scout.rt.dataobject.fixture.DateFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.EntityFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.EntityFixtureInvalidTypeNameDo;
Expand Down Expand Up @@ -113,23 +113,23 @@ public void testValidateTypeVersionImplementors() {
m_inventory.validateTypeVersionImplementors(); // no exception

BeanTestingHelper beanTestingHelper = BEANS.get(BeanTestingHelper.class);
IBean<Object> fixtureNoVersionBean = beanTestingHelper.registerBean(new BeanMetaData(DataObjectFixture_No_Version.class));
IBean<Object> fixtureNoVersionBean = beanTestingHelper.registerBean(new BeanMetaData(Dataobjectfixture_No_Version.class));
try {
assertThrows(AssertionException.class, () -> m_inventory.validateTypeVersionImplementors());
}
finally {
beanTestingHelper.unregisterBean(fixtureNoVersionBean);
}

IBean<Object> fixtureNoRegisteredNamespaceBean = beanTestingHelper.registerBean(new BeanMetaData(NonRegisteredNamespaceFixture_1_0_0.class));
IBean<Object> fixtureNoRegisteredNamespaceBean = beanTestingHelper.registerBean(new BeanMetaData(Nonregisterednamespacefixture_1_0_0.class));
try {
assertThrows(AssertionException.class, () -> m_inventory.validateTypeVersionImplementors());
}
finally {
beanTestingHelper.unregisterBean(fixtureNoRegisteredNamespaceBean);
}

IBean<Object> fixtureDuplicateVersionBean = beanTestingHelper.registerBean(new BeanMetaData(DataObjectFixture_1_0_0_Duplicate.class));
IBean<Object> fixtureDuplicateVersionBean = beanTestingHelper.registerBean(new BeanMetaData(Dataobjectfixture_1_0_0_Duplicate.class));
try {
assertThrows(AssertionException.class, () -> m_inventory.validateTypeVersionImplementors());
}
Expand Down Expand Up @@ -342,14 +342,14 @@ public void testResolveTypeName() {
@Test
public void testResolveTypeVersionClass() {
assertNull(m_inventory.resolveTypeVersionClass(EntityFixtureDo.class));
assertEquals(DataObjectFixture_1_0_0.class, m_inventory.resolveTypeVersionClass(OtherEntityFixtureDo.class));
assertEquals(Dataobjectfixture_1_0_0.class, m_inventory.resolveTypeVersionClass(OtherEntityFixtureDo.class));
assertNull(m_inventory.resolveTypeVersionClass(Object.class));

m_inventory.registerClassByTypeVersion(ScoutFixtureDo.class);
assertEquals(DataObjectFixture_1_0_0_034.VERSION, m_inventory.getTypeVersion(ScoutFixtureDo.class));
assertEquals(Dataobjectfixture_1_0_0_034.VERSION, m_inventory.getTypeVersion(ScoutFixtureDo.class));

m_inventory.registerClassByTypeVersion(ProjectFixtureDo.class);
assertEquals(DataObjectProjectFixture_1_2_3_004.VERSION, m_inventory.getTypeVersion(ProjectFixtureDo.class));
assertEquals(Dataobjectprojectfixture_1_2_3_004.VERSION, m_inventory.getTypeVersion(ProjectFixtureDo.class));
assertNull(m_inventory.getTypeVersion(ProjectSubFixtureDo.class));
}

Expand All @@ -369,8 +369,8 @@ public void testInit() {
assertEquals("ScoutFixture", inv.toTypeName(ProjectFixtureDo.class));
assertEquals("ScoutFixture", inv.toTypeName(ProjectSubFixtureDo.class));

assertEquals(DataObjectFixture_1_0_0_034.VERSION, inv.getTypeVersion(ScoutFixtureDo.class));
assertEquals(DataObjectProjectFixture_1_2_3_004.VERSION, inv.getTypeVersion(ProjectFixtureDo.class));
assertEquals(Dataobjectfixture_1_0_0_034.VERSION, inv.getTypeVersion(ScoutFixtureDo.class));
assertEquals(Dataobjectprojectfixture_1_2_3_004.VERSION, inv.getTypeVersion(ProjectFixtureDo.class));

assertNull(inv.getTypeVersion(ProjectSubFixtureDo.class));

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright (c) 2010, 2025 BSI Business Systems Integration AG
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.scout.rt.dataobject;

import org.eclipse.scout.rt.dataobject.testing.AbstractTypeVersionClassNamingTest;

public class ScoutDataObjectTypeVersionClassNamingTest extends AbstractTypeVersionClassNamingTest {
@Override
protected String getPackageNamePrefix() {
return "org.eclipse.scout.rt.dataobject";
}
}
Loading
Loading