@@ -407,4 +407,114 @@ public void testMemoryStore() throws ZarrException, IOException {
407407 System .out .println (s );
408408 }
409409
410- }
410+ @ Test
411+ public void testDefaultChunkShape () throws IOException , ZarrException {
412+ // Test with a small array (< 512 elements per dimension)
413+ Array smallArray = Array .create (
414+ new FilesystemStore (TESTOUTPUT ).resolve ("v2_default_chunks_small" ),
415+ Array .metadataBuilder ()
416+ .withShape (100 , 50 )
417+ .withDataType (DataType .UINT8 )
418+ .build ()
419+ );
420+ Assertions .assertEquals (2 , smallArray .metadata ().chunks .length );
421+ // Both dimensions < 512, so chunks should equal shape
422+ Assertions .assertEquals (100 , smallArray .metadata ().chunks [0 ]);
423+ Assertions .assertEquals (50 , smallArray .metadata ().chunks [1 ]);
424+
425+ // Test with a larger array (> 512 elements per dimension)
426+ Array largeArray = Array .create (
427+ new FilesystemStore (TESTOUTPUT ).resolve ("v2_default_chunks_large" ),
428+ Array .metadataBuilder ()
429+ .withShape (2000 , 1500 )
430+ .withDataType (DataType .UINT8 )
431+ .build ()
432+ );
433+ Assertions .assertEquals (2 , largeArray .metadata ().chunks .length );
434+ // Chunks should be calculated based on division by 512
435+ Assertions .assertTrue (largeArray .metadata ().chunks [0 ] > 0 );
436+ Assertions .assertTrue (largeArray .metadata ().chunks [0 ] < 2000 );
437+ Assertions .assertTrue (largeArray .metadata ().chunks [1 ] > 0 );
438+ Assertions .assertTrue (largeArray .metadata ().chunks [1 ] < 1500 );
439+
440+ // Test with mixed dimensions
441+ Array mixedArray = Array .create (
442+ new FilesystemStore (TESTOUTPUT ).resolve ("v2_default_chunks_mixed" ),
443+ Array .metadataBuilder ()
444+ .withShape (1024 , 100 , 2048 )
445+ .withDataType (DataType .UINT8 )
446+ .build ()
447+ );
448+ Assertions .assertEquals (3 , mixedArray .metadata ().chunks .length );
449+ // Verify chunks are reasonable
450+ Assertions .assertTrue (mixedArray .metadata ().chunks [0 ] > 0 );
451+ Assertions .assertTrue (mixedArray .metadata ().chunks [0 ] <= 1024 );
452+ Assertions .assertEquals (100 , mixedArray .metadata ().chunks [1 ]); // < 512, should equal shape
453+ Assertions .assertTrue (mixedArray .metadata ().chunks [2 ] > 0 );
454+ Assertions .assertTrue (mixedArray .metadata ().chunks [2 ] <= 2048 );
455+ }
456+
457+ @ Test
458+ public void testDimensionSeparatorAutoDetection () throws IOException , ZarrException {
459+ // Test with SLASH separator
460+ StoreHandle slashStoreHandle = new FilesystemStore (TESTOUTPUT ).resolve ("v2_separator_detection_slash" );
461+ Array slashArray = Array .create (
462+ slashStoreHandle ,
463+ Array .metadataBuilder ()
464+ .withShape (10 , 10 )
465+ .withDataType (DataType .UINT8 )
466+ .withChunks (5 , 5 )
467+ .withDimensionSeparator (dev .zarr .zarrjava .core .chunkkeyencoding .Separator .SLASH )
468+ .build ()
469+ );
470+
471+ // Write some data to create chunk files
472+ slashArray .write (new long []{0 , 0 }, ucar .ma2 .Array .factory (ucar .ma2 .DataType .UBYTE , new int []{5 , 5 }));
473+
474+ // Now open without specifying separator - it should auto-detect SLASH
475+ Array reopenedSlashArray = Array .open (slashStoreHandle );
476+ Assertions .assertEquals (dev .zarr .zarrjava .core .chunkkeyencoding .Separator .SLASH ,
477+ reopenedSlashArray .metadata ().dimensionSeparator );
478+
479+ // Test with DOT separator
480+ StoreHandle dotStoreHandle = new FilesystemStore (TESTOUTPUT ).resolve ("v2_separator_detection_dot" );
481+ Array dotArray = Array .create (
482+ dotStoreHandle ,
483+ Array .metadataBuilder ()
484+ .withShape (10 , 10 )
485+ .withDataType (DataType .UINT8 )
486+ .withChunks (5 , 5 )
487+ .withDimensionSeparator (dev .zarr .zarrjava .core .chunkkeyencoding .Separator .DOT )
488+ .build ()
489+ );
490+
491+ // Write some data to create chunk files
492+ dotArray .write (new long []{0 , 0 }, ucar .ma2 .Array .factory (ucar .ma2 .DataType .UBYTE , new int []{5 , 5 }));
493+
494+ // Now open without specifying separator - it should auto-detect DOT
495+ Array reopenedDotArray = Array .open (dotStoreHandle );
496+ Assertions .assertEquals (dev .zarr .zarrjava .core .chunkkeyencoding .Separator .DOT ,
497+ reopenedDotArray .metadata ().dimensionSeparator );
498+ }
499+
500+ @ Test
501+ public void testDimensionSeparatorDefaultFallback () throws IOException , ZarrException {
502+ // Test that when no chunks exist, the separator defaults to DOT (as per ArrayMetadata.chunkKeyEncoding())
503+ StoreHandle emptyStoreHandle = new FilesystemStore (TESTOUTPUT ).resolve ("v2_separator_detection_empty" );
504+ Array emptyArray = Array .create (
505+ emptyStoreHandle ,
506+ Array .metadataBuilder ()
507+ .withShape (10 , 10 )
508+ .withDataType (DataType .UINT8 )
509+ .withChunks (5 , 5 )
510+ .build ()
511+ );
512+
513+ // Open without writing any chunks
514+ Array reopenedEmptyArray = Array .open (emptyStoreHandle );
515+ // Should use default DOT separator from ArrayMetadata.chunkKeyEncoding()
516+ // When dimensionSeparator is null, chunkKeyEncoding() defaults to DOT
517+ Assertions .assertEquals (dev .zarr .zarrjava .core .chunkkeyencoding .Separator .DOT ,
518+ reopenedEmptyArray .metadata ().chunkKeyEncoding ().separator );
519+ }
520+ }
0 commit comments