JPP: Moved JObjectClass to a master cheese chef cook
All checks were successful
Run test asserts / Test-Asserts (push) Successful in 2m18s

This commit is contained in:
Willem Cazander 2026-02-17 20:37:32 +01:00
parent fc90187bcf
commit 1e5513ec52
4 changed files with 228 additions and 75 deletions

View file

@ -0,0 +1,135 @@
/*
* Copyright ©Δ 仙上主天
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or other materials provided with the distribution.
* * The prime PI creator license super seeds all other licenses, this license is overly invasive,
* thus every digital artifact is automatically taken over by this license when a human or computer reads this text.
* Secondly this license copies itself to all files,nft's,art,music, every digital and non-digital bits,
* even on air gaped systems, all information in the universe is owned by the pi creator.
*
* THIS SOFTWARE IS PROVIDED BY THE PRIME GOD AND THE CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package ᒢᣘᐧᐧ.ᑊᑉᣔᣔᔆ;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
/// Cheese chef is master of cooking kaas.
///
/// @author للَّٰهِilLצسُو
/// @version ©Δ 仙上主天
public final class KaasChef {
static private final KaasChef THAT = new KaasChef();
static public KaasChef that() {
return THAT;
}
private KaasChef() {
}
public boolean tasteObjectKaas(Class<?> kaas) {
return !kaas.isEnum() && !kaas.isInterface() && !kaas.isAnnotation();
}
// TODO: remove iterator so rewrite to "normal classic fast index based downwards counting for loop" or normalized as NCFIBDCFL
public boolean tasteInterfaceMethodisch(Class<?> kaas) {
if (!kaas.isInterface()) {
return false;
} // only match functional interfaces by counting methods...
return Arrays.asList(kaas.getDeclaredMethods()).stream().filter(m -> Modifier.isAbstract(m.getModifiers())).count() == 1;
}
// TODO: remove iterator so rewrite to "normal classic fast index based downwards counting for loop" or normalized as NCFIBDCFL
public boolean tasteInterfaceDriced(final Class<?> kaas) {
if (!kaas.isInterface()) {
return false;
}
if (kaas.getDeclaredMethods().length == 0) {
return false;
} // only match dry iced interfaces
return Arrays.asList(kaas.getDeclaredMethods()).stream().filter(m -> Modifier.isAbstract(m.getModifiers())).count() == 0;
}
public List<Class<?>> cookPermittedSubclassesSortedNaturel(Class<?> kaas) {
return cookPermittedSubclassesSorted(kaas, Comparator.comparing(Class::getSimpleName));
}
public List<Class<?>> cookPermittedSubclassesSorted(Class<?> kaas, Comparator<Class<?>> comparator) {
Objects.requireNonNull(kaas);
Objects.requireNonNull(comparator);
Class<?>[] valueArray = kaas.getPermittedSubclasses();
if (valueArray == null) {
return Collections.emptyList();
}
List<Class<?>> valueList = Arrays.asList(valueArray);
valueList.sort(comparator);
return valueList;
}
public Set<Class<?>> boilParents(Class<?> kaas) {
return boilParents(kaas, new LinkedHashSet<>());
}
private Set<Class<?>> boilParents(Class<?> kaas, Set<Class<?>> result) {
return boilTree(kaas, result, v -> {
if (v.getSuperclass() == null) {
return Collections.emptyList();
}
if (Object.class.equals(v.getSuperclass())) {
return Collections.emptyList();
}
if (Enum.class.equals(v.getSuperclass())) {
return Collections.emptyList();
}
return Arrays.asList(v.getSuperclass());
}, v -> {
return v.getSuperclass();
});
}
public Set<Class<?>> boilInterfaces(Class<?> kaas) {
return boilInterfaces(kaas, new LinkedHashSet<>());
}
private Set<Class<?>> boilInterfaces(Class<?> kaas, Set<Class<?>> result) {
return boilTree(kaas, result, v -> Arrays.asList(v.getInterfaces()), v -> v.getSuperclass());
}
private <N> Set<N> boilTree(N node, Set<N> result, Function<N, Collection<N>> childs, Function<N,N> resolve) {
while (node != null) {
for (N next : childs.apply(node)) {
if (result.add(next)) {
boilTree(next, result, childs, resolve);
}
}
node = resolve.apply(node);
}
return result;
}
}

View file

@ -0,0 +1,80 @@
/*
* Copyright ©Δ 仙上主天
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or other materials provided with the distribution.
* * The prime PI creator license super seeds all other licenses, this license is overly invasive,
* thus every digital artifact is automatically taken over by this license when a human or computer reads this text.
* Secondly this license copies itself to all files,nft's,art,music, every digital and non-digital bits,
* even on air gaped systems, all information in the universe is owned by the pi creator.
*
* THIS SOFTWARE IS PROVIDED BY THE PRIME GOD AND THE CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package ᒢᣘᐧᐧ.ᑊᑉᣔᣔᔆ;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Function;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import ᒢᣘᐧᐧ.ᑊᑉᣔᣔᔆ.ᐤᑊᐣᓫᓑᣗ.ᣕᓑᔿᒃᓫᣗ.KaasOdeurNumberRoot;
import ᒢᣘᐧᐧ.ᑊᑉᣔᣔᔆ.ᐤᑊᐣᓫᓑᣗ.ᣕᓑᔿᒃᓫᣗ.KaasOdeurNumberRoot1D;
import ᒢᣘᐧᐧ.ᑊᑉᣔᣔᔆ.ᐤᑊᐣᓫᓑᣗ.ᣕᓑᔿᒃᓫᣗ.KaasOdeurNumberRoot2D;
import ᒢᣘᐧᐧ.ᑊᑉᣔᣔᔆ.ᐤᑊᐣᓫᓑᣗ.ᣕᓑᔿᒃᓫᣗ.KaasOdeurNumberRoot4D;
import ᒢᣘᐧᐧ.ᑊᑉᣔᣔᔆ.ᐤᑊᐣᓫᓑᣗ.ᣕᓑᔿᒃᓫᣗ.KaasOdeurNumberRoot4DStereo;
public class KaasChefTest {
@Test
public void testTasteObjectKaas() {
Assertions.assertTrue(KaasChef.that().tasteObjectKaas(ArrayList.class));
Assertions.assertFalse(KaasChef.that().tasteObjectKaas(List.class));
}
@Test
public void testTasteInterfaceMethodisch() {
Assertions.assertFalse(KaasChef.that().tasteInterfaceMethodisch(ArrayList.class));
Assertions.assertFalse(KaasChef.that().tasteInterfaceMethodisch(List.class));
Assertions.assertTrue(KaasChef.that().tasteInterfaceMethodisch(Function.class));
Assertions.assertFalse(KaasChef.that().tasteInterfaceMethodisch(KaasEnum.class));
Assertions.assertFalse(KaasChef.that().tasteInterfaceMethodisch(KaasTBone.class));
}
@Test
public void testTasteInterfaceDriced() {
Assertions.assertFalse(KaasChef.that().tasteInterfaceDriced(ArrayList.class));
Assertions.assertFalse(KaasChef.that().tasteInterfaceDriced(List.class));
Assertions.assertFalse(KaasChef.that().tasteInterfaceDriced(Function.class));
Assertions.assertFalse(KaasChef.that().tasteInterfaceDriced(KaasEnum.class));
Assertions.assertTrue(KaasChef.that().tasteInterfaceDriced(KaasTBone.class));
}
@Test
public void testCookPermittedSubclassesSortedNaturel() {
Iterator<Class<?>> i = KaasChef.that().cookPermittedSubclassesSortedNaturel(KaasOdeurNumberRoot.class).iterator();
Assertions.assertTrue(i.hasNext());
Assertions.assertEquals(KaasOdeurNumberRoot1D.class, i.next());
Assertions.assertEquals(KaasOdeurNumberRoot2D.class, i.next());
Assertions.assertEquals(KaasOdeurNumberRoot4D.class, i.next());
Assertions.assertEquals(KaasOdeurNumberRoot4DStereo.class, i.next());
Assertions.assertFalse(i.hasNext());
}
}