|
16 | 16 | import static io.github.dfa1.vortex.encoding.DTypes.I64; |
17 | 17 | import static io.github.dfa1.vortex.reader.array.TestArrays.bools; |
18 | 18 | import static io.github.dfa1.vortex.reader.array.TestArrays.bytes; |
| 19 | +import static io.github.dfa1.vortex.reader.array.TestArrays.doubles; |
| 20 | +import static io.github.dfa1.vortex.reader.array.TestArrays.floats; |
| 21 | +import static io.github.dfa1.vortex.reader.array.TestArrays.ints; |
19 | 22 | import static io.github.dfa1.vortex.reader.array.TestArrays.longs; |
| 23 | +import static io.github.dfa1.vortex.reader.array.TestArrays.shorts; |
20 | 24 | import static org.assertj.core.api.Assertions.assertThat; |
21 | 25 | import static org.assertj.core.api.Assertions.assertThatThrownBy; |
22 | 26 |
|
@@ -309,6 +313,84 @@ void unknownArrayThrows() { |
309 | 313 | } |
310 | 314 | } |
311 | 315 |
|
| 316 | + /// The scalar/per-element `materialize` fallback on each primitive [Array] interface, reached |
| 317 | + /// through an `Offset*Array` view (which does not override `materialize`, unlike the buffer-backed |
| 318 | + /// `Materialized*` records). The Long and Bool defaults are covered above; this group fills in the |
| 319 | + /// remaining numeric interfaces. |
| 320 | + @Nested |
| 321 | + class PrimitiveScalarDefaults { |
| 322 | + |
| 323 | + @Test |
| 324 | + void floatViewDecodesEveryElementThroughGetFloat() { |
| 325 | + // Given an OffsetFloatArray view (FloatArray.materialize default, not a buffer return) |
| 326 | + Array sut = floats(1.5f, 2.5f, 3.5f, 4.5f).limited(3); |
| 327 | + |
| 328 | + // When |
| 329 | + MemorySegment result = sut.materialize(arena); |
| 330 | + |
| 331 | + // Then the kept prefix is written as little-endian f32 |
| 332 | + assertThat(result.byteSize()).isEqualTo(3 * 4L); |
| 333 | + assertThat(result.getAtIndex(PTypeIO.LE_FLOAT, 0)).isEqualTo(1.5f); |
| 334 | + assertThat(result.getAtIndex(PTypeIO.LE_FLOAT, 2)).isEqualTo(3.5f); |
| 335 | + } |
| 336 | + |
| 337 | + @Test |
| 338 | + void byteViewDecodesEveryElementThroughGetByte() { |
| 339 | + // Given an OffsetByteArray view (ByteArray.materialize default) |
| 340 | + Array sut = bytes((byte) 10, (byte) 20, (byte) 30, (byte) 40).limited(3); |
| 341 | + |
| 342 | + // When |
| 343 | + MemorySegment result = sut.materialize(arena); |
| 344 | + |
| 345 | + // Then one byte per element |
| 346 | + assertThat(result.byteSize()).isEqualTo(3L); |
| 347 | + assertThat(result.get(ValueLayout.JAVA_BYTE, 0)).isEqualTo((byte) 10); |
| 348 | + assertThat(result.get(ValueLayout.JAVA_BYTE, 2)).isEqualTo((byte) 30); |
| 349 | + } |
| 350 | + |
| 351 | + @Test |
| 352 | + void shortViewDecodesEveryElementThroughGetShort() { |
| 353 | + // Given an OffsetShortArray view (ShortArray.materialize default) |
| 354 | + Array sut = shorts((short) 100, (short) 200, (short) 300, (short) 400).limited(3); |
| 355 | + |
| 356 | + // When |
| 357 | + MemorySegment result = sut.materialize(arena); |
| 358 | + |
| 359 | + // Then little-endian i16 |
| 360 | + assertThat(result.byteSize()).isEqualTo(3 * 2L); |
| 361 | + assertThat(result.getAtIndex(PTypeIO.LE_SHORT, 0)).isEqualTo((short) 100); |
| 362 | + assertThat(result.getAtIndex(PTypeIO.LE_SHORT, 2)).isEqualTo((short) 300); |
| 363 | + } |
| 364 | + |
| 365 | + @Test |
| 366 | + void intViewDecodesEveryElementThroughGetInt() { |
| 367 | + // Given an OffsetIntArray view (IntArray.materialize default) |
| 368 | + Array sut = ints(1, 2, 3, 4).limited(3); |
| 369 | + |
| 370 | + // When |
| 371 | + MemorySegment result = sut.materialize(arena); |
| 372 | + |
| 373 | + // Then little-endian i32 |
| 374 | + assertThat(result.byteSize()).isEqualTo(3 * 4L); |
| 375 | + assertThat(result.getAtIndex(PTypeIO.LE_INT, 0)).isEqualTo(1); |
| 376 | + assertThat(result.getAtIndex(PTypeIO.LE_INT, 2)).isEqualTo(3); |
| 377 | + } |
| 378 | + |
| 379 | + @Test |
| 380 | + void doubleViewDecodesEveryElementThroughGetDouble() { |
| 381 | + // Given an OffsetDoubleArray view (DoubleArray.materialize default) |
| 382 | + Array sut = doubles(1.5, 2.5, 3.5).limited(2); |
| 383 | + |
| 384 | + // When |
| 385 | + MemorySegment result = sut.materialize(arena); |
| 386 | + |
| 387 | + // Then little-endian f64 |
| 388 | + assertThat(result.byteSize()).isEqualTo(2 * 8L); |
| 389 | + assertThat(result.getAtIndex(PTypeIO.LE_DOUBLE, 0)).isEqualTo(1.5); |
| 390 | + assertThat(result.getAtIndex(PTypeIO.LE_DOUBLE, 1)).isEqualTo(2.5); |
| 391 | + } |
| 392 | + } |
| 393 | + |
312 | 394 | private MemorySegment encodedLongs(long... vs) { |
313 | 395 | MemorySegment seg = arena.allocate(vs.length * 8L, 8); |
314 | 396 | for (int i = 0; i < vs.length; i++) { |
|
0 commit comments