/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.isis.core.metamodel.services.appfeat;
import java.util.Arrays;
import java.util.List;
import java.util.TreeSet;
import com.google.common.base.Function;
import org.jmock.Expectations;
import org.jmock.auto.Mock;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
import org.apache.isis.core.unittestsupport.value.ValueTypeContractTestAbstract;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.emptyCollectionOf;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.lessThan;
import static org.junit.Assert.assertThat;
public class ApplicationFeatureIdTest {
@Rule
public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
@Rule
public ExpectedException expectedException = ExpectedException.none();
public static class Title extends ApplicationFeatureIdTest {
@Test
public void happyCase() throws Exception {
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar#foo");
assertThat(applicationFeatureId.title(), is("com.mycompany.Bar#foo"));
}
}
public static class NewPackage extends ApplicationFeatureIdTest {
@Test
public void testNewPackage() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com.mycompany");
// then
assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.PACKAGE));
assertThat(applicationFeatureId.getPackageName(), is("com.mycompany"));
assertThat(applicationFeatureId.getClassName(), is(nullValue()));
assertThat(applicationFeatureId.getMemberName(), is(nullValue()));
}
}
public static class NewClass extends ApplicationFeatureIdTest {
@Test
public void testNewClass() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bar");
// then
assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.CLASS));
assertThat(applicationFeatureId.getPackageName(), is("com.mycompany"));
assertThat(applicationFeatureId.getClassName(), is("Bar"));
assertThat(applicationFeatureId.getMemberName(), is(nullValue()));
}
}
public static class NewMember extends ApplicationFeatureIdTest {
@Test
public void using_fullyQualifiedClassName_and_MemberName() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
// then
assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.MEMBER));
assertThat(applicationFeatureId.getPackageName(), is("com.mycompany"));
assertThat(applicationFeatureId.getClassName(), is("Bar"));
assertThat(applicationFeatureId.getMemberName(), is("foo"));
}
@Test
public void using_fullyQualifiedName() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar#foo");
// then
assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.MEMBER));
assertThat(applicationFeatureId.getPackageName(), is("com.mycompany"));
assertThat(applicationFeatureId.getClassName(), is("Bar"));
assertThat(applicationFeatureId.getMemberName(), is("foo"));
}
}
public static class Constructor_AFT_String extends ApplicationFeatureIdTest {
@Test
public void whenPackage() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.PACKAGE, "com.mycompany");
// then
assertThat(applicationFeatureId, is(ApplicationFeatureId.newPackage("com.mycompany")));
}
@Test
public void whenClass() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.CLASS, "com.mycompany.Bar");
// then
assertThat(applicationFeatureId, is(ApplicationFeatureId.newClass("com.mycompany.Bar")));
}
@Test
public void whenMember() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.MEMBER, "com.mycompany.Bar#foo");
// then
assertThat(applicationFeatureId, is(ApplicationFeatureId.newMember("com.mycompany.Bar","foo")));
}
}
public static class NewFeature_AFT_String extends ApplicationFeatureIdTest {
@Test
public void whenPackage() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureType.PACKAGE, "com.mycompany");
// then
assertThat(applicationFeatureId, is(ApplicationFeatureId.newPackage("com.mycompany")));
}
@Test
public void whenClass() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureType.CLASS, "com.mycompany.Bar");
// then
assertThat(applicationFeatureId, is(ApplicationFeatureId.newClass("com.mycompany.Bar")));
}
@Test
public void whenMember() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureType.MEMBER, "com.mycompany.Bar#foo");
// then
assertThat(applicationFeatureId, is(ApplicationFeatureId.newMember("com.mycompany.Bar","foo")));
}
}
public static class NewFeature_String_String_String extends ApplicationFeatureIdTest {
@Test
public void whenPackage() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature("com.mycompany", null, null);
// then
assertThat(applicationFeatureId, is(ApplicationFeatureId.newPackage("com.mycompany")));
}
@Test
public void whenClass() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature("com.mycompany", "Bar", null);
// then
assertThat(applicationFeatureId, is(ApplicationFeatureId.newClass("com.mycompany.Bar")));
}
@Test
public void whenMember() throws Exception {
// when
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature("com.mycompany", "Bar", "foo");
// then
assertThat(applicationFeatureId, is(ApplicationFeatureId.newMember("com.mycompany.Bar","foo")));
}
}
public static class GetParentIds extends ApplicationFeatureIdTest {
@Test
public void whenPackageWithNoParent() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com");
// when
final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
// then
assertThat(parentIds, emptyCollectionOf(ApplicationFeatureId.class));
}
@Test
public void whenPackageWithHasParent() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com.mycompany");
// when
final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
// then
assertThat(parentIds, contains(ApplicationFeatureId.newPackage("com")));
}
@Test
public void whenPackageWithHasParents() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com.mycompany.bish.bosh");
// when
final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
// then
assertThat(parentIds, contains(
ApplicationFeatureId.newPackage("com.mycompany.bish"),
ApplicationFeatureId.newPackage("com.mycompany"),
ApplicationFeatureId.newPackage("com")
));
}
@Test
public void whenClassWithParents() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bar");
// when
final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
// then
assertThat(parentIds, contains(
ApplicationFeatureId.newPackage("com.mycompany"),
ApplicationFeatureId.newPackage("com")
));
}
@Test
public void whenMember() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
// when
final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
// then
assertThat(parentIds, contains(
ApplicationFeatureId.newClass("com.mycompany.Bar"),
ApplicationFeatureId.newPackage("com.mycompany"),
ApplicationFeatureId.newPackage("com")
));
}
}
public static class GetParentPackageId extends ApplicationFeatureIdTest {
@Test
public void givenPackageWhenParentIsNotRoot() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com.mycompany");
// when
final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
// then
assertThat(parentPackageId.getType(), is(ApplicationFeatureType.PACKAGE));
assertThat(parentPackageId.getPackageName(), is("com"));
assertThat(parentPackageId.getClassName(), is(nullValue()));
assertThat(parentPackageId.getMemberName(), is(nullValue()));
}
@Test
public void givenPackageWhenParentIsRoot() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com");
// when
final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
// then
assertThat(parentPackageId, is(nullValue()));
}
@Test
public void givenRootPackage() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("");
// when
final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
// then
assertThat(parentPackageId, is(nullValue()));
}
@Test
public void givenClass() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bar");
// when
final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
// then
assertThat(parentPackageId.getType(), is(ApplicationFeatureType.PACKAGE));
assertThat(parentPackageId.getPackageName(), is("com.mycompany"));
assertThat(parentPackageId.getClassName(), is(nullValue()));
assertThat(parentPackageId.getMemberName(), is(nullValue()));
}
@Test
public void givenClassInRootPackage() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newClass("Bar");
// when
final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
// then
assertThat(parentPackageId.getType(), is(ApplicationFeatureType.PACKAGE));
assertThat(parentPackageId.getPackageName(), is(""));
assertThat(parentPackageId.getClassName(), is(nullValue()));
assertThat(parentPackageId.getMemberName(), is(nullValue()));
}
@Test
public void givenMember() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
// then
expectedException.expect(IllegalStateException.class);
// when
applicationFeatureId.getParentPackageId();
}
}
public static class GetParentClass extends ApplicationFeatureIdTest {
@Test
public void givenMember() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
// when
final ApplicationFeatureId parentClassId = applicationFeatureId.getParentClassId();
// then
assertThat(parentClassId.getType(), is(ApplicationFeatureType.CLASS));
assertThat(parentClassId.getPackageName(), is("com.mycompany"));
assertThat(parentClassId.getClassName(), is("Bar"));
assertThat(parentClassId.getMemberName(), is(nullValue()));
}
@Test
public void givenPackage() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com");
// then
expectedException.expect(IllegalStateException.class);
// when
applicationFeatureId.getParentClassId();
}
@Test
public void givenClass() throws Exception {
// given
final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bar");
// then
expectedException.expect(IllegalStateException.class);
// when
applicationFeatureId.getParentClassId();
}
}
public static abstract class ValueTypeContractTest extends ValueTypeContractTestAbstract<ApplicationFeatureId> {
public static class PackageFeatures extends ValueTypeContractTest {
@Override
protected List<ApplicationFeatureId> getObjectsWithSameValue() {
return Arrays.asList(
ApplicationFeatureId.newPackage("com.mycompany"),
ApplicationFeatureId.newPackage("com.mycompany"));
}
@Override
protected List<ApplicationFeatureId> getObjectsWithDifferentValue() {
return Arrays.asList(
ApplicationFeatureId.newPackage("com.mycompany2"),
ApplicationFeatureId.newClass("com.mycompany.Foo"),
ApplicationFeatureId.newMember("com.mycompany.Foo#bar"));
}
}
public static class ClassFeatures extends ValueTypeContractTest {
@Override
protected List<ApplicationFeatureId> getObjectsWithSameValue() {
return Arrays.asList(
ApplicationFeatureId.newClass("com.mycompany.Foo"),
ApplicationFeatureId.newClass("com.mycompany.Foo"));
}
@Override
protected List<ApplicationFeatureId> getObjectsWithDifferentValue() {
return Arrays.asList(
ApplicationFeatureId.newPackage("com.mycompany"),
ApplicationFeatureId.newClass("com.mycompany.Foo2"),
ApplicationFeatureId.newMember("com.mycompany.Foo#bar"));
}
}
public static class MemberFeatures extends ValueTypeContractTest {
@Override
protected List<ApplicationFeatureId> getObjectsWithSameValue() {
return Arrays.asList(
ApplicationFeatureId.newMember("com.mycompany.Foo#bar"),
ApplicationFeatureId.newMember("com.mycompany.Foo#bar"));
}
@Override
protected List<ApplicationFeatureId> getObjectsWithDifferentValue() {
return Arrays.asList(
ApplicationFeatureId.newPackage("com.mycompany"),
ApplicationFeatureId.newClass("com.mycompany.Foo"),
ApplicationFeatureId.newMember("com.mycompany.Foo#bar2"));
}
}
}
public static class CompareToTest extends ApplicationFeatureIdTest {
ApplicationFeatureId feature1;
@Test
public void members() throws Exception {
feature1 = ApplicationFeatureId.newMember("com.mycompany.Bar#b");
assertThat(feature1.toString(), is(equalTo("ApplicationFeatureId{type=MEMBER, packageName=com.mycompany, memberName=b}")));
}
@Test
public void classes() throws Exception {
feature1 = ApplicationFeatureId.newClass("com.mycompany.B");
assertThat(feature1.toString(), is(equalTo("ApplicationFeatureId{type=CLASS, packageName=com.mycompany, className=B}")));
}
@Test
public void packages() throws Exception {
feature1 = ApplicationFeatureId.newPackage("com.b");
assertThat(feature1.toString(), is(equalTo("ApplicationFeatureId{type=PACKAGE, packageName=com.b}")));
}
}
public static class ToStringTest extends ApplicationFeatureIdTest {
ApplicationFeatureId feature1;
ApplicationFeatureId feature2;
@Test
public void members() throws Exception {
feature1 = ApplicationFeatureId.newMember("com.mycompany.Bar#b");
feature2 = ApplicationFeatureId.newMember("com.mycompany.Bar#c");
assertThat(feature1.compareTo(feature2), is(lessThan(0)));
feature2 = ApplicationFeatureId.newMember("com.mycompany.Bar#b");
assertThat(feature1.compareTo(feature2), is(equalTo(0)));
feature2 = ApplicationFeatureId.newMember("com.mycompany.Bar#a");
assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
feature2 = ApplicationFeatureId.newClass("com.mycompany.Bar");
assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
feature2 = ApplicationFeatureId.newPackage("com.mycompany");
assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
}
@Test
public void classes() throws Exception {
feature1 = ApplicationFeatureId.newClass("com.mycompany.B");
feature2 = ApplicationFeatureId.newClass("com.mycompany.C");
assertThat(feature1.compareTo(feature2), is(lessThan(0)));
feature2 = ApplicationFeatureId.newClass("com.mycompany.B");
assertThat(feature1.compareTo(feature2), is(equalTo(0)));
feature2 = ApplicationFeatureId.newClass("com.mycompany.A");
assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
feature2 = ApplicationFeatureId.newPackage("com.mycompany");
assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
}
@Test
public void packages() throws Exception {
feature1 = ApplicationFeatureId.newPackage("com.b");
feature2 = ApplicationFeatureId.newPackage("com.c");
assertThat(feature1.compareTo(feature2), is(lessThan(0)));
feature2 = ApplicationFeatureId.newPackage("com.b");
assertThat(feature1.compareTo(feature2), is(equalTo(0)));
feature2 = ApplicationFeatureId.newPackage("com.a");
assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
}
}
public static class FunctionsTest extends ApplicationFeatureIdTest {
public static class GET_CLASS_NAME extends FunctionsTest {
private Function<ApplicationFeatureId, String> func = ApplicationFeatureId.Functions.GET_CLASS_NAME;
@Test
public void whenNull() throws Exception {
expectedException.expect(NullPointerException.class);
func.apply(null);
}
@Test
public void whenPackage() throws Exception {
assertThat(func.apply(ApplicationFeatureId.newPackage("com.mycompany")), is(nullValue()));
}
@Test
public void whenClass() throws Exception {
assertThat(func.apply(ApplicationFeatureId.newClass("com.mycompany.Bar")), is("Bar"));
}
@Test
public void whenMember() throws Exception {
assertThat(func.apply(ApplicationFeatureId.newMember("com.mycompany.Bar#foo")), is("Bar"));
}
}
public static class GET_MEMBER_NAME extends FunctionsTest {
private Function<ApplicationFeatureId, String> func = ApplicationFeatureId.Functions.GET_MEMBER_NAME;
@Test
public void whenNull() throws Exception {
expectedException.expect(NullPointerException.class);
func.apply(null);
}
@Test
public void whenPackage() throws Exception {
assertThat(func.apply(ApplicationFeatureId.newPackage("com.mycompany")), is(nullValue()));
}
@Test
public void whenClass() throws Exception {
assertThat(func.apply(ApplicationFeatureId.newClass("com.mycompany.Bar")), is(nullValue()));
}
@Test
public void whenMember() throws Exception {
assertThat(func.apply(ApplicationFeatureId.newMember("com.mycompany.Bar#foo")), is("foo"));
}
}
}
public static class PredicatesTest extends ApplicationFeatureIdTest {
public static class IsClassContaining extends PredicatesTest {
private ApplicationMemberType memberType;
@Mock
private ApplicationFeatureRepositoryDefault mockApplicationFeatureRepository;
@Mock
private ApplicationFeature mockApplicationFeature;
@Test
public void whenNull() throws Exception {
expectedException.expect(NullPointerException.class);
ApplicationFeatureId.Predicates.
isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
apply(null);
}
@Test
public void whenNotClass() throws Exception {
assertThat(
ApplicationFeatureId.Predicates.
isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
apply(ApplicationFeatureId.newPackage("com.mycompany")),
is(false));
assertThat(
ApplicationFeatureId.Predicates.
isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
apply(ApplicationFeatureId.newMember("com.mycompany.Bar#foo")),
is(false));
}
@Test
public void whenClassButFeatureNotFound() throws Exception {
final ApplicationFeatureId classFeature = ApplicationFeatureId.newClass("com.mycompany.Bar");
context.checking(new Expectations() {{
allowing(mockApplicationFeatureRepository).findFeature(classFeature);
will(returnValue(null));
}});
assertThat(
ApplicationFeatureId.Predicates.
isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
apply(classFeature),
is(false));
}
@Test
public void whenClassAndFeatureNotFoundButHasNoMembersOfType() throws Exception {
final ApplicationFeatureId classFeature = ApplicationFeatureId.newClass("com.mycompany.Bar");
context.checking(new Expectations() {{
oneOf(mockApplicationFeatureRepository).findFeature(classFeature);
will(returnValue(mockApplicationFeature));
allowing(mockApplicationFeature).membersOf(ApplicationMemberType.ACTION);
will(returnValue(new TreeSet<>()));
}});
assertThat(
ApplicationFeatureId.Predicates.
isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
apply(classFeature),
is(false));
}
@Test
public void whenClassAndFeatureNotFoundAndHasMembersOfType() throws Exception {
final ApplicationFeatureId classFeature = ApplicationFeatureId.newClass("com.mycompany.Bar");
context.checking(new Expectations() {{
oneOf(mockApplicationFeatureRepository).findFeature(classFeature);
will(returnValue(mockApplicationFeature));
allowing(mockApplicationFeature).membersOf(ApplicationMemberType.ACTION);
will(returnValue(new TreeSet<ApplicationFeatureId>() {{
add(ApplicationFeatureId.newMember("com.mycompany.Bar#foo"));
}}));
}});
assertThat(
ApplicationFeatureId.Predicates.
isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
apply(classFeature),
is(true));
}
}
}
}