Skip to content

Commit 17b46a6

Browse files
committed
Add tests
1 parent 2493e9c commit 17b46a6

3 files changed

Lines changed: 129 additions & 27 deletions

File tree

src/main/java/qupath/ext/imglib2/AccessibleScaler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ private AccessibleScaler() {
3636
* less than or equal to 0
3737
* @return the input if the provided scale is 1, or a new scaled {@link RandomAccessibleInterval} otherwise
3838
* @param <T> the type of elements of the random accessible interval. It must be {@link net.imglib2.type.numeric.ARGBType}
39-
* or an instance of {@link net.imglib2.type.numeric.RealType}
39+
* or an instance of {@link net.imglib2.type.numeric.RealType}, otherwise a {@link IllegalArgumentException}
40+
* will be thrown when accessing the output
4041
* @throws IllegalArgumentException if the input interval has at least one minimum different from 0, if the provided scale is less
41-
* than or equal to 0, if the input interval has less than two dimensions, or if the type T is invalid (see above)
42+
* than or equal to 0, or if the input interval has less than two dimensions
4243
*/
4344
public static <T extends NumericType<T>> RandomAccessibleInterval<T> scaleWithLinearInterpolation(
4445
RandomAccessibleInterval<T> input,

src/test/java/qupath/ext/imglib2/TestAccessibleScaler.java

Lines changed: 105 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import net.imglib2.Point;
55
import net.imglib2.RandomAccess;
66
import net.imglib2.RandomAccessibleInterval;
7+
import net.imglib2.type.numeric.ARGBType;
78
import net.imglib2.type.numeric.real.DoubleType;
89
import org.junit.jupiter.api.Assertions;
910
import org.junit.jupiter.api.Test;
@@ -13,36 +14,36 @@ public class TestAccessibleScaler {
1314
@Test
1415
void Check_Min_Different_From_Zero() {
1516
double scale = 2;
16-
RandomAccessibleInterval<DoubleType> accessible = new SampleAccessible(new long[] {0, 3, 0});
17+
RandomAccessibleInterval<DoubleType> accessible = new SampleDoubleAccessible(new long[] {0, 3, 0});
1718

1819
Assertions.assertThrows(IllegalArgumentException.class, () -> AccessibleScaler.scaleWithLinearInterpolation(accessible, scale));
1920
}
2021

2122
@Test
2223
void Check_Negative_Scale() {
2324
double scale = -2;
24-
RandomAccessibleInterval<DoubleType> accessible = new SampleAccessible();
25+
RandomAccessibleInterval<DoubleType> accessible = new SampleDoubleAccessible();
2526

2627
Assertions.assertThrows(IllegalArgumentException.class, () -> AccessibleScaler.scaleWithLinearInterpolation(accessible, scale));
2728
}
2829

2930
@Test
3031
void Check_Less_Than_Two_Dimensions() {
3132
double scale = 2;
32-
RandomAccessibleInterval<DoubleType> accessible = new SampleAccessible(new long[] {0});
33+
RandomAccessibleInterval<DoubleType> accessible = new SampleDoubleAccessible(new long[] {0});
3334

3435
Assertions.assertThrows(IllegalArgumentException.class, () -> AccessibleScaler.scaleWithLinearInterpolation(accessible, scale));
3536
}
3637

3738
@Test
38-
void Check_Linear_Interpolation_Scale_With_2_by_4_Array() {
39-
RandomAccessibleInterval<DoubleType> accessible = new SampleAccessible(new double[][] {
39+
void Check_Linear_Interpolation_Scale_With_2_by_4_Double_Array() {
40+
RandomAccessibleInterval<DoubleType> accessible = new SampleDoubleAccessible(new double[][] {
4041
new double[] {0.80, 0.97, 0.40, 0.99},
4142
new double[] {0.95, 0.22, 0.63, 0.25}
4243
});
4344
double scale = 0.5;
4445
double[][] expectedPixels = new double[][] {
45-
new double[] {0.735, 0.5675}
46+
new double[] {(0.80 + 0.97 + 0.95 + 0.22) / 4, (0.40 + 0.99 + 0.63 + 0.25) / 4}
4647
};
4748

4849
RandomAccessibleInterval<DoubleType> scaledAccessible = AccessibleScaler.scaleWithLinearInterpolation(accessible, scale);
@@ -51,13 +52,13 @@ void Check_Linear_Interpolation_Scale_With_2_by_4_Array() {
5152
}
5253

5354
@Test
54-
void Check_Linear_Interpolation_Scale_With_1_by_3_Array() {
55-
RandomAccessibleInterval<DoubleType> accessible = new SampleAccessible(new double[][] {
55+
void Check_Linear_Interpolation_Scale_With_1_by_3_Double_Array() {
56+
RandomAccessibleInterval<DoubleType> accessible = new SampleDoubleAccessible(new double[][] {
5657
new double[] {0.26, 0.66, 0.34}
5758
});
5859
double scale = 0.5;
5960
double[][] expectedPixels = new double[][] {
60-
new double[] {0.46}
61+
new double[] {(0.26 + 0.66) / 2}
6162
};
6263

6364
RandomAccessibleInterval<DoubleType> scaledAccessible = AccessibleScaler.scaleWithLinearInterpolation(accessible, scale);
@@ -66,8 +67,8 @@ void Check_Linear_Interpolation_Scale_With_1_by_3_Array() {
6667
}
6768

6869
@Test
69-
void Check_Linear_Interpolation_Interpolation_Scale_With_5_by_5_Array() {
70-
RandomAccessibleInterval<DoubleType> accessible = new SampleAccessible(new double[][] {
70+
void Check_Linear_Interpolation_Interpolation_Scale_With_5_by_5_Double_Array() {
71+
RandomAccessibleInterval<DoubleType> accessible = new SampleDoubleAccessible(new double[][] {
7172
new double[] {0.80, 0.72, 0.48, 0.27, 0.68},
7273
new double[] {0.41, 0.21, 0.60, 0.47, 0.86},
7374
new double[] {0.94, 0.32, 0.55, 0.22, 0.46},
@@ -76,18 +77,37 @@ void Check_Linear_Interpolation_Interpolation_Scale_With_5_by_5_Array() {
7677
});
7778
double scale = 0.5;
7879
double[][] expectedPixels = new double[][] {
79-
new double[] {0.535, 0.455},
80-
new double[] {0.63, 0.4825}
80+
new double[] {(0.80 + 0.72 + 0.41 + 0.21) / 4, (0.48 + 0.27 + 0.60 + 0.47) / 4},
81+
new double[] {(0.94 + 0.32 + 0.43 + 0.83) / 4, (0.55 + 0.22 + 0.49 + 0.67) / 4}
8182
};
8283

8384
RandomAccessibleInterval<DoubleType> scaledAccessible = AccessibleScaler.scaleWithLinearInterpolation(accessible, scale);
8485

8586
Utils.assertRandomAccessibleEquals(scaledAccessible, expectedPixels);
8687
}
8788

89+
@Test
90+
void Check_Linear_Interpolation_Scale_With_2_by_4_Argb_Array() {
91+
RandomAccessibleInterval<ARGBType> accessible = new SampleArgbAccessible(new int[][] {
92+
new int[] {ARGBType.rgba(82, 79, 61, 46), ARGBType.rgba(67, 94, 89, 62), ARGBType.rgba(13, 33, 3, 42), ARGBType.rgba(92, 41, 35, 54)},
93+
new int[] {ARGBType.rgba(32, 64, 90, 99), ARGBType.rgba(58, 55, 73, 84), ARGBType.rgba(81, 63, 45, 11), ARGBType.rgba(22, 24, 37, 34)}
94+
});
95+
double scale = 0.5;
96+
int[][] expectedPixels = new int[][] {
97+
new int[] {
98+
ARGBType.rgba(Math.round((82 + 67 + 32 + 58) / 4.), Math.round((79 + 94 + 64 + 55) / 4.), Math.round((61 + 89 + 90 + 73) / 4.), Math.round((46 + 62 + 99 + 84) / 4.)),
99+
ARGBType.rgba(Math.round((13 + 92 + 22 + 81) / 4.), Math.round((33 + 41 + 24 + 63) / 4.), Math.round((3 + 35 + 37 + 45) / 4.), Math.round((42 + 54 + 34 + 11) / 4.))
100+
}
101+
};
102+
103+
RandomAccessibleInterval<ARGBType> scaledAccessible = AccessibleScaler.scaleWithLinearInterpolation(accessible, scale);
104+
105+
Utils.assertArgbRandomAccessibleEquals(scaledAccessible, expectedPixels);
106+
}
107+
88108
@Test
89109
void Check_Nearest_Neighbor_Interpolation_Scale_With_2_by_4_Array() {
90-
RandomAccessibleInterval<DoubleType> accessible = new SampleAccessible(new double[][] {
110+
RandomAccessibleInterval<DoubleType> accessible = new SampleDoubleAccessible(new double[][] {
91111
new double[] {0.80, 0.97, 0.40, 0.99},
92112
new double[] {0.95, 0.22, 0.63, 0.25}
93113
});
@@ -103,7 +123,7 @@ void Check_Nearest_Neighbor_Interpolation_Scale_With_2_by_4_Array() {
103123

104124
@Test
105125
void Check_Nearest_Neighbor_Interpolation_Scale_With_1_by_3_Array() {
106-
RandomAccessibleInterval<DoubleType> accessible = new SampleAccessible(new double[][] {
126+
RandomAccessibleInterval<DoubleType> accessible = new SampleDoubleAccessible(new double[][] {
107127
new double[] {0.26, 0.66, 0.34}
108128
});
109129
double scale = 0.5;
@@ -118,7 +138,7 @@ void Check_Nearest_Neighbor_Interpolation_Scale_With_1_by_3_Array() {
118138

119139
@Test
120140
void Check_Nearest_Neighbor_Interpolation_Scale_With_5_by_5_Array() {
121-
RandomAccessibleInterval<DoubleType> accessible = new SampleAccessible(new double[][] {
141+
RandomAccessibleInterval<DoubleType> accessible = new SampleDoubleAccessible(new double[][] {
122142
new double[] {0.80, 0.72, 0.48, 0.27, 0.68},
123143
new double[] {0.41, 0.21, 0.60, 0.47, 0.86},
124144
new double[] {0.94, 0.32, 0.55, 0.22, 0.46},
@@ -136,27 +156,27 @@ void Check_Nearest_Neighbor_Interpolation_Scale_With_5_by_5_Array() {
136156
Utils.assertRandomAccessibleEquals(scaledAccessible, expectedPixels);
137157
}
138158

139-
private static class SampleAccessible implements RandomAccessibleInterval<DoubleType> {
159+
private static class SampleDoubleAccessible implements RandomAccessibleInterval<DoubleType> {
140160

141161
private final long[] min;
142162
private final long[] max;
143163
private final double[][] values;
144164

145-
public SampleAccessible() {
165+
public SampleDoubleAccessible() {
146166
this(new long[] {0, 0});
147167
}
148168

149-
public SampleAccessible(double[][] values) {
169+
public SampleDoubleAccessible(double[][] values) {
150170
this(new long[] {0, 0}, values);
151171
}
152172

153-
public SampleAccessible(long[] min) {
173+
public SampleDoubleAccessible(long[] min) {
154174
this(min, new double[][] {
155175
new double[] {}
156176
});
157177
}
158178

159-
private SampleAccessible(long[] min, double[][] values) {
179+
private SampleDoubleAccessible(long[] min, double[][] values) {
160180
this.min = min;
161181
this.max = new long[] {values.length - 1, values[0].length - 1};
162182
this.values = values;
@@ -174,7 +194,7 @@ public long max(int d) {
174194

175195
@Override
176196
public RandomAccess<DoubleType> randomAccess() {
177-
return new SampleAccess(values);
197+
return new SampleDoubleAccess(values);
178198
}
179199

180200
@Override
@@ -188,12 +208,12 @@ public int numDimensions() {
188208
}
189209
}
190210

191-
private static class SampleAccess extends Point implements RandomAccess<DoubleType> {
211+
private static class SampleDoubleAccess extends Point implements RandomAccess<DoubleType> {
192212

193213
private final DoubleType value = new DoubleType();
194214
private final double[][] values;
195215

196-
public SampleAccess(double[][] values) {
216+
public SampleDoubleAccess(double[][] values) {
197217
super(2);
198218

199219
this.values = values;
@@ -207,7 +227,67 @@ public DoubleType get() {
207227

208228
@Override
209229
public RandomAccess<DoubleType> copy() {
210-
return new SampleAccess(values);
230+
return new SampleDoubleAccess(values);
231+
}
232+
}
233+
234+
private static class SampleArgbAccessible implements RandomAccessibleInterval<ARGBType> {
235+
236+
private final long[] min = new long[] {0, 0};
237+
private final long[] max;
238+
private final int[][] values;
239+
240+
public SampleArgbAccessible(int[][] values) {
241+
this.max = new long[] {values.length - 1, values[0].length - 1};
242+
this.values = values;
243+
}
244+
245+
@Override
246+
public long min(int d) {
247+
return min[d];
248+
}
249+
250+
@Override
251+
public long max(int d) {
252+
return max[d];
253+
}
254+
255+
@Override
256+
public RandomAccess<ARGBType> randomAccess() {
257+
return new SampleArgbAccess(values);
258+
}
259+
260+
@Override
261+
public RandomAccess<ARGBType> randomAccess(Interval interval) {
262+
return randomAccess();
263+
}
264+
265+
@Override
266+
public int numDimensions() {
267+
return min.length;
268+
}
269+
}
270+
271+
private static class SampleArgbAccess extends Point implements RandomAccess<ARGBType> {
272+
273+
private final ARGBType value = new ARGBType();
274+
private final int[][] values;
275+
276+
public SampleArgbAccess(int[][] values) {
277+
super(2);
278+
279+
this.values = values;
280+
}
281+
282+
@Override
283+
public ARGBType get() {
284+
value.set(values[(int) position[0]][(int) position[1]]);
285+
return value;
286+
}
287+
288+
@Override
289+
public RandomAccess<ARGBType> copy() {
290+
return new SampleArgbAccess(values);
211291
}
212292
}
213293
}

src/test/java/qupath/ext/imglib2/Utils.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,27 @@ public static <T extends RealType<T>> void assertRandomAccessibleEquals(RandomAc
161161
}
162162
}
163163

164+
public static void assertArgbRandomAccessibleEquals(RandomAccessibleInterval<ARGBType> accessible, int[][] expectedPixels) {
165+
Assertions.assertEquals(expectedPixels.length, accessible.dimension(0));
166+
Assertions.assertEquals(expectedPixels[0].length, accessible.dimension(1));
167+
168+
int[] position = new int[accessible.numDimensions()];
169+
Cursor<ARGBType> cursor = accessible.localizingCursor();
170+
171+
while (cursor.hasNext()) {
172+
ARGBType pixel = cursor.next();
173+
cursor.localize(position);
174+
int x = position[1];
175+
int y = position[0];
176+
177+
Assertions.assertEquals(
178+
expectedPixels[y][x],
179+
pixel.get(),
180+
0.0000000001 // to avoid rounding errors
181+
);
182+
}
183+
}
184+
164185
public static void assertBufferedImagesEqual(BufferedImage expectedImage, BufferedImage actualImage, double delta) {
165186
Assertions.assertEquals(expectedImage.getWidth(), actualImage.getWidth());
166187
Assertions.assertEquals(expectedImage.getHeight(), actualImage.getHeight());

0 commit comments

Comments
 (0)