Skip to content

Commit 323ad8d

Browse files
committed
Polish built-in descriptors
1 parent aa66397 commit 323ad8d

File tree

14 files changed

+168
-35
lines changed

14 files changed

+168
-35
lines changed

scijava-ops-engine/src/main/java/module-info.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@
282282
org.scijava.ops.engine.conversionLoss.impl.PrimitiveLossReporters,
283283
org.scijava.ops.engine.copy.CopyOpCollection,
284284
org.scijava.ops.engine.create.CreateOpCollection,
285-
org.scijava.ops.engine.describe.PrimitiveDescriptors,
285+
org.scijava.ops.engine.describe.BaseDescriptors,
286286
org.scijava.ops.engine.matcher.convert.IdentityCollection,
287287
org.scijava.ops.engine.matcher.convert.UtilityConverters,
288288
org.scijava.ops.engine.math.Add,

scijava-ops-engine/src/main/java/org/scijava/ops/engine/describe/PrimitiveDescriptors.java renamed to scijava-ops-engine/src/main/java/org/scijava/ops/engine/describe/BaseDescriptors.java

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,28 @@
22
package org.scijava.ops.engine.describe;
33

44
import org.scijava.ops.spi.OpCollection;
5+
import org.scijava.ops.spi.OpDependency;
56
import org.scijava.ops.spi.OpField;
7+
import org.scijava.ops.spi.OpMethod;
68
import org.scijava.priority.Priority;
9+
import org.scijava.types.Nil;
710
import org.scijava.types.Types;
811

912
import java.util.List;
13+
import java.util.function.Function;
1014

11-
public class PrimitiveDescriptors<T, N extends Number> implements OpCollection {
15+
/**
16+
* {@code engine.describe} Ops pertaining to built-in Java classes.
17+
*
18+
* @param <T>
19+
* @param <N>
20+
* @author Gabriel Selzer
21+
*/
22+
public class BaseDescriptors<T, N extends Number> implements OpCollection {
1223

1324
@OpField(names = "engine.describe")
1425
public final TypeDescriptor<N> boxedPrimitiveDescriptor = in -> "number";
1526

16-
@OpField(names = "engine.describe")
17-
public final TypeDescriptor<N[]> boxedPrimitiveArrayDescriptor =
18-
in -> "number[]";
19-
2027
@OpField(names = "engine.describe")
2128
public final TypeDescriptor<byte[]> byteArrayDescriptor = in -> "number[]";
2229

@@ -36,12 +43,20 @@ public class PrimitiveDescriptors<T, N extends Number> implements OpCollection {
3643
public final TypeDescriptor<double[]> doubleArrayDescriptor =
3744
in -> "number[]";
3845

39-
@OpField(names = "engine.describe")
40-
public final TypeDescriptor<List<N>> boxedPrimitiveListDescriptor =
41-
in -> "list<number>";
42-
43-
@OpField(names = "engine.describe", priority = Priority.LAST)
44-
public final TypeDescriptor<T> identityDescriptor = in -> Types.raw(in
45-
.getType()).getSimpleName();
46+
@OpMethod(names = "engine.describe", type = Function.class)
47+
public static <T> String arrayDescriptor( //
48+
@OpDependency(name = "engine.describe") Function<Nil<T>, String> dep, //
49+
Nil<T[]> in //
50+
) {
51+
return dep.apply(new Nil<>() {}) + "[]";
52+
}
53+
54+
@OpMethod(names = "engine.describe", type = Function.class)
55+
public static <T> String listDescriptor( //
56+
@OpDependency(name = "engine.describe") Function<Nil<T>, String> dep, //
57+
Nil<List<T>> in //
58+
) {
59+
return "list<" + dep.apply(new Nil<>() {}) + ">";
60+
}
4661

4762
}

scijava-ops-engine/src/main/java/org/scijava/ops/engine/impl/DefaultOpDescriptionGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ private static <T> String describeType(OpEnvironment env, Nil<T> from) {
133133
return op.apply(from);
134134
}
135135
catch (OpMatchingException e) {
136-
return from.getType().getTypeName();
136+
return Types.raw(from.getType()).getSimpleName();
137137
}
138138
}
139139

scijava-ops-engine/src/main/resources/META-INF/services/org.scijava.ops.spi.OpCollection

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ org.scijava.ops.engine.adapt.lift.ComputerToIterables
55
org.scijava.ops.engine.adapt.lift.FunctionToArrays
66
org.scijava.ops.engine.adapt.lift.FunctionToIterables
77
org.scijava.ops.engine.adapt.lift.InplaceToArrays
8-
org.scijava.ops.engine.describe.PrimitiveDescriptors
8+
org.scijava.ops.engine.describe.BaseDescriptors
99
org.scijava.ops.engine.matcher.convert.IdentityCollection
1010
org.scijava.ops.engine.conversionLoss.impl.PrimitiveArrayLossReporters
1111
org.scijava.ops.engine.conversionLoss.impl.PrimitiveLossReporters
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
2+
package org.scijava.ops.engine.describe;
3+
4+
import org.junit.jupiter.api.Assertions;
5+
import org.junit.jupiter.api.BeforeAll;
6+
import org.junit.jupiter.api.Test;
7+
import org.scijava.function.Producer;
8+
import org.scijava.ops.engine.AbstractTestEnvironment;
9+
import org.scijava.ops.spi.OpCollection;
10+
import org.scijava.ops.spi.OpField;
11+
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
/**
16+
* Tests the {@code engine.describe} Ops in {@link BaseDescriptors}.
17+
*
18+
* @author Gabriel Selzer
19+
*/
20+
public class BaseDescriptorsTest extends AbstractTestEnvironment implements
21+
OpCollection
22+
{
23+
24+
@BeforeAll
25+
public static void addNeededOps() {
26+
ops.register(new BaseDescriptors<>());
27+
ops.register(new BaseDescriptorsTest());
28+
}
29+
30+
@OpField(names = "test.byteDescriptor")
31+
public final Producer<Byte> byteProducer = //
32+
() -> (byte) 0;
33+
34+
@OpField(names = "test.shortDescriptor")
35+
public final Producer<Short> shortProducer = //
36+
() -> (short) 0;
37+
38+
@OpField(names = "test.intDescriptor")
39+
public final Producer<Integer> intProducer = //
40+
() -> 0;
41+
42+
@OpField(names = "test.longDescriptor")
43+
public final Producer<Long> longProducer = //
44+
() -> 0L;
45+
46+
@OpField(names = "test.floatDescriptor")
47+
public final Producer<Float> floatProducer = //
48+
() -> 0.0f;
49+
50+
@OpField(names = "test.doubleDescriptor")
51+
public final Producer<Double> doubleProducer = //
52+
() -> 0.0;
53+
54+
@Test
55+
public void testBoxedPrimitiveDescriptor() {
56+
String[] tests = { "byte", "short", "int", "long", "float", "double" };
57+
for (String t : tests) {
58+
var expected = "test." + t + "Descriptor:\n\t- () -> number";
59+
var actual = ops.help("test." + t + "Descriptor");
60+
Assertions.assertEquals(expected, actual);
61+
}
62+
}
63+
64+
@OpField(names = "test.listDescriptor")
65+
public final Producer<List<Double>> listDoubleProducer = ArrayList::new;
66+
67+
@Test
68+
public void testListDescriptor() {
69+
var expected = "test.listDescriptor:\n\t- () -> list<number>";
70+
var actual = ops.help("test.listDescriptor");
71+
Assertions.assertEquals(expected, actual);
72+
}
73+
74+
@OpField(names = "test.arrayDescriptor")
75+
public final Producer<double[]> doubleArrayProducer = //
76+
() -> new double[0];
77+
78+
@Test
79+
public void testArrayDescriptor() {
80+
var expected = "test.arrayDescriptor:\n\t- () -> number[]";
81+
var actual = ops.help("test.arrayDescriptor");
82+
Assertions.assertEquals(expected, actual);
83+
}
84+
85+
@OpField(names = "test.arrayArrayDescriptor")
86+
public final Producer<double[][]> doubleArrayArrayProducer = //
87+
() -> new double[0][0];
88+
89+
@Test
90+
public void testArrayArrayDescriptor() {
91+
var expected = "test.arrayArrayDescriptor:\n\t- () -> number[][]";
92+
var actual = ops.help("test.arrayArrayDescriptor");
93+
Assertions.assertEquals(expected, actual);
94+
}
95+
96+
@OpField(names = "test.listArrayDescriptor")
97+
public final Producer<List<Double[]>> listDoubleArrayProducer = //
98+
ArrayList::new;
99+
100+
@Test
101+
public void testListArrayDescriptor() {
102+
var expected = "test.listArrayDescriptor:\n\t- () -> list<number[]>";
103+
var actual = ops.help("test.listArrayDescriptor");
104+
Assertions.assertEquals(expected, actual);
105+
}
106+
107+
public static class Foo {
108+
109+
}
110+
111+
@OpField(names = "test.fooDescriptor")
112+
public final Producer<Foo> fooProducer = Foo::new;
113+
114+
/**
115+
* Test behavior when no {@code engine.describe} Op exists for a type.
116+
*/
117+
@Test
118+
public void testFallbackDescriptions() {
119+
var expected =
120+
"test.fooDescriptor:\n\t- () -> Foo";
121+
var actual = ops.help("test.fooDescriptor");
122+
Assertions.assertEquals(expected, actual);
123+
}
124+
125+
}

scijava-ops-engine/src/test/java/org/scijava/ops/engine/impl/DefaultOpDescriptionGeneratorTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.scijava.function.Computers;
88
import org.scijava.function.Inplaces;
99
import org.scijava.ops.engine.AbstractTestEnvironment;
10-
import org.scijava.ops.engine.describe.PrimitiveDescriptors;
10+
import org.scijava.ops.engine.describe.BaseDescriptors;
1111
import org.scijava.ops.spi.OpCollection;
1212
import org.scijava.ops.spi.OpField;
1313

@@ -22,7 +22,7 @@ public class DefaultOpDescriptionGeneratorTest extends AbstractTestEnvironment
2222
public static void addNeededOps() {
2323
ops.register( //
2424
new DefaultOpDescriptionGeneratorTest(), //
25-
new PrimitiveDescriptors() //
25+
new BaseDescriptors() //
2626
);
2727
}
2828

scijava-ops-engine/src/test/java/org/scijava/ops/engine/impl/ServiceLoaderDiscoveryIntegrationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public void opCollectionDiscoveryRegressionIT() {
6767
final List<OpInfo> infos = discoveries.stream() //
6868
.flatMap(c -> g.generateInfosFrom(c).stream()) //
6969
.collect(Collectors.toList());
70-
Assertions.assertEquals(295, infos.size());
70+
Assertions.assertEquals(294, infos.size());
7171
}
7272

7373
}

scijava-ops-engine/src/test/java/org/scijava/ops/engine/matcher/convert/ConvertedOpInfoTest.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,16 @@
2929

3030
package org.scijava.ops.engine.matcher.convert;
3131

32-
import java.util.List;
3332
import java.util.function.BiFunction;
34-
import java.util.function.Function;
3533

3634
import org.junit.jupiter.api.Assertions;
3735
import org.junit.jupiter.api.BeforeAll;
3836
import org.junit.jupiter.api.Test;
3937
import org.scijava.collections.ObjectArray;
40-
import org.scijava.function.Computers;
41-
import org.scijava.function.Inplaces;
4238
import org.scijava.ops.engine.AbstractTestEnvironment;
43-
import org.scijava.ops.engine.describe.PrimitiveDescriptors;
4439
import org.scijava.ops.spi.Op;
4540
import org.scijava.ops.spi.OpClass;
4641
import org.scijava.ops.spi.OpCollection;
47-
import org.scijava.ops.spi.OpField;
4842
import org.scijava.types.Nil;
4943

5044
public class ConvertedOpInfoTest extends AbstractTestEnvironment implements

scijava-ops-engine/src/test/java/org/scijava/ops/engine/reduce/NullableArgumentsTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@
3636
import org.scijava.function.Container;
3737
import org.scijava.function.Functions;
3838
import org.scijava.ops.engine.AbstractTestEnvironment;
39-
import org.scijava.ops.engine.copy.CopyOpCollection;
40-
import org.scijava.ops.engine.describe.PrimitiveDescriptors;
41-
import org.scijava.ops.engine.matcher.convert.PrimitiveArrayConverters;
39+
import org.scijava.ops.engine.describe.BaseDescriptors;
4240
import org.scijava.ops.spi.Nullable;
4341
import org.scijava.ops.spi.OpCollection;
4442
import org.scijava.ops.spi.OpField;
@@ -52,7 +50,7 @@ public class NullableArgumentsTest extends AbstractTestEnvironment //
5250

5351
@BeforeAll
5452
public static void addNeededOps() {
55-
ops.register(new PrimitiveDescriptors<>());
53+
ops.register(new BaseDescriptors<>());
5654
ops.register(new NullableArgumentsTest());
5755
ops.register(new TestOpNullableArg());
5856
}

scijava-ops-engine/src/test/java/org/scijava/ops/engine/util/InfosTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.junit.jupiter.api.BeforeAll;
66
import org.junit.jupiter.api.Test;
77
import org.scijava.ops.engine.AbstractTestEnvironment;
8-
import org.scijava.ops.engine.describe.PrimitiveDescriptors;
8+
import org.scijava.ops.engine.describe.BaseDescriptors;
99
import org.scijava.ops.spi.Nullable;
1010
import org.scijava.ops.spi.OpCollection;
1111
import org.scijava.ops.spi.OpMethod;
@@ -23,7 +23,7 @@ public class InfosTest extends AbstractTestEnvironment implements OpCollection {
2323
public static void addNeededOps() {
2424
ops.register( //
2525
new InfosTest(), //
26-
new PrimitiveDescriptors<>() //
26+
new BaseDescriptors<>() //
2727
);
2828
}
2929

0 commit comments

Comments
 (0)