Skip to content

Commit cc59b24

Browse files
authored
Merge pull request #16 from ctessum/array
Add read/write slice and strided slice
2 parents 6208ede + 2c1b3eb commit cc59b24

14 files changed

+1935
-0
lines changed

netcdf/datasets_test.go

Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,282 @@ func TestAt(t *testing.T) {
567567
}
568568
}
569569

570+
func testWriteFileViaSlice(t *testing.T, filename string, ft *FileTest) {
571+
f, err := CreateFile(filename, CLOBBER|NETCDF4)
572+
if err != nil {
573+
t.Fatalf("Create failed: %v\n", err)
574+
}
575+
dims := make([]Dim, len(ft.DimNames))
576+
for i, name := range ft.DimNames {
577+
if dims[i], err = f.AddDim(name, ft.DimLens[i]); err != nil {
578+
t.Fatalf("PutDim failed: %v\n", err)
579+
}
580+
}
581+
v, err := f.AddVar(ft.VarName, ft.DataType, dims)
582+
if err != nil {
583+
t.Fatalf("PutVar failed: %v\n", err)
584+
}
585+
ft.putAttrs(t, v)
586+
587+
n, err := v.LenDims()
588+
if err != nil {
589+
t.Fatalf("Var.LenDims failed: %v\n", err)
590+
}
591+
switch ft.DataType {
592+
default:
593+
t.Fatalf("unexpected type %v\n", ft.DataType)
594+
case UINT64:
595+
err = testWriteUint64Slice(v, n)
596+
case INT64:
597+
err = testWriteInt64Slice(v, n)
598+
case DOUBLE:
599+
err = testWriteFloat64Slice(v, n)
600+
case UINT:
601+
err = testWriteUint32Slice(v, n)
602+
case INT:
603+
err = testWriteInt32Slice(v, n)
604+
case FLOAT:
605+
err = testWriteFloat32Slice(v, n)
606+
case USHORT:
607+
err = testWriteUint16Slice(v, n)
608+
case SHORT:
609+
err = testWriteInt16Slice(v, n)
610+
case UBYTE:
611+
err = testWriteUint8Slice(v, n)
612+
case BYTE:
613+
err = testWriteInt8Slice(v, n)
614+
case CHAR:
615+
err = testWriteBytesSlice(v, n)
616+
}
617+
if err != nil {
618+
t.Errorf("%v: writing data failed: %v\n", ft.DataType, err)
619+
}
620+
if err := f.Close(); err != nil {
621+
t.Fatalf("Close failed: %v\n", err)
622+
}
623+
}
624+
625+
func testReadFileViaSlice(t *testing.T, filename string, ft *FileTest) {
626+
f, err := OpenFile(filename, NOWRITE)
627+
if err != nil {
628+
t.Fatalf("Open failed: %v\n", err)
629+
}
630+
for i, name := range ft.DimNames {
631+
d, err := f.Dim(name)
632+
if err != nil {
633+
t.Fatalf("GetDim failed: %v\n", err)
634+
}
635+
s, err := d.Name()
636+
if err != nil {
637+
t.Fatalf("Dim.Name failed: %v\n", err)
638+
}
639+
if err == nil && s != name {
640+
t.Fatalf("Dim name is %q; expected %q\n", s, name)
641+
}
642+
n, err := d.Len()
643+
if err != nil {
644+
t.Fatalf("Dim.Len failed: %v\n", err)
645+
}
646+
if err == nil && n != ft.DimLens[i] {
647+
t.Fatalf("Dim length is %d; expected %d\n", n, ft.DimLens[i])
648+
}
649+
}
650+
v, err := f.Var(ft.VarName)
651+
if err != nil {
652+
t.Errorf("GetVar failed: %v\n", err)
653+
}
654+
ft.getAttrs(t, v)
655+
656+
n, err := v.LenDims()
657+
if err != nil {
658+
t.Fatalf("Var.LenDims failed: %v\n", err)
659+
}
660+
switch ft.DataType {
661+
default:
662+
t.Fatalf("unexpected type %v\n", ft.DataType)
663+
case UINT64:
664+
err = testReadUint64Slice(v, n)
665+
case INT64:
666+
err = testReadInt64Slice(v, n)
667+
case DOUBLE:
668+
err = testReadFloat64Slice(v, n)
669+
case UINT:
670+
err = testReadUint32Slice(v, n)
671+
case INT:
672+
err = testReadInt32Slice(v, n)
673+
case FLOAT:
674+
err = testReadFloat32Slice(v, n)
675+
case USHORT:
676+
err = testReadUint16Slice(v, n)
677+
case SHORT:
678+
err = testReadInt16Slice(v, n)
679+
case UBYTE:
680+
err = testReadUint8Slice(v, n)
681+
case BYTE:
682+
err = testReadInt8Slice(v, n)
683+
case CHAR:
684+
err = testReadBytesSlice(v, n)
685+
}
686+
if err != nil {
687+
t.Fatalf("reading data failed: %v\n", err)
688+
}
689+
if err := f.Close(); err != nil {
690+
t.Fatalf("Close failed: %v\n", err)
691+
}
692+
}
693+
694+
func TestSlice(t *testing.T) {
695+
for _, ft := range getFileTests() {
696+
f, err := ioutil.TempFile("", "netcdf_test")
697+
if err != nil {
698+
t.Fatalf("creating temporary file failed: %v\n", err)
699+
}
700+
testWriteFileViaSlice(t, f.Name(), &ft)
701+
testReadFileViaSlice(t, f.Name(), &ft)
702+
if err := os.Remove(f.Name()); err != nil {
703+
t.Errorf("removing temporary file failed: %v\n", err)
704+
}
705+
}
706+
}
707+
708+
func testWriteFileViaStridedSlice(t *testing.T, filename string, ft *FileTest) {
709+
f, err := CreateFile(filename, CLOBBER|NETCDF4)
710+
if err != nil {
711+
t.Fatalf("Create failed: %v\n", err)
712+
}
713+
dims := make([]Dim, len(ft.DimNames))
714+
for i, name := range ft.DimNames {
715+
if dims[i], err = f.AddDim(name, ft.DimLens[i]); err != nil {
716+
t.Fatalf("PutDim failed: %v\n", err)
717+
}
718+
}
719+
v, err := f.AddVar(ft.VarName, ft.DataType, dims)
720+
if err != nil {
721+
t.Fatalf("PutVar failed: %v\n", err)
722+
}
723+
ft.putAttrs(t, v)
724+
725+
n, err := v.LenDims()
726+
if err != nil {
727+
t.Fatalf("Var.LenDims failed: %v\n", err)
728+
}
729+
switch ft.DataType {
730+
default:
731+
t.Fatalf("unexpected type %v\n", ft.DataType)
732+
case UINT64:
733+
err = testWriteUint64StridedSlice(v, n)
734+
case INT64:
735+
err = testWriteInt64StridedSlice(v, n)
736+
case DOUBLE:
737+
err = testWriteFloat64StridedSlice(v, n)
738+
case UINT:
739+
err = testWriteUint32StridedSlice(v, n)
740+
case INT:
741+
err = testWriteInt32StridedSlice(v, n)
742+
case FLOAT:
743+
err = testWriteFloat32StridedSlice(v, n)
744+
case USHORT:
745+
err = testWriteUint16StridedSlice(v, n)
746+
case SHORT:
747+
err = testWriteInt16StridedSlice(v, n)
748+
case UBYTE:
749+
err = testWriteUint8StridedSlice(v, n)
750+
case BYTE:
751+
err = testWriteInt8StridedSlice(v, n)
752+
case CHAR:
753+
err = testWriteBytesStridedSlice(v, n)
754+
}
755+
if err != nil {
756+
t.Errorf("%v: writing data failed: %v\n", ft.DataType, err)
757+
}
758+
if err := f.Close(); err != nil {
759+
t.Fatalf("Close failed: %v\n", err)
760+
}
761+
}
762+
763+
func testReadFileViaStridedSlice(t *testing.T, filename string, ft *FileTest) {
764+
f, err := OpenFile(filename, NOWRITE)
765+
if err != nil {
766+
t.Fatalf("Open failed: %v\n", err)
767+
}
768+
for i, name := range ft.DimNames {
769+
d, err := f.Dim(name)
770+
if err != nil {
771+
t.Fatalf("GetDim failed: %v\n", err)
772+
}
773+
s, err := d.Name()
774+
if err != nil {
775+
t.Fatalf("Dim.Name failed: %v\n", err)
776+
}
777+
if err == nil && s != name {
778+
t.Fatalf("Dim name is %q; expected %q\n", s, name)
779+
}
780+
n, err := d.Len()
781+
if err != nil {
782+
t.Fatalf("Dim.Len failed: %v\n", err)
783+
}
784+
if err == nil && n != ft.DimLens[i] {
785+
t.Fatalf("Dim length is %d; expected %d\n", n, ft.DimLens[i])
786+
}
787+
}
788+
v, err := f.Var(ft.VarName)
789+
if err != nil {
790+
t.Errorf("GetVar failed: %v\n", err)
791+
}
792+
ft.getAttrs(t, v)
793+
794+
n, err := v.LenDims()
795+
if err != nil {
796+
t.Fatalf("Var.LenDims failed: %v\n", err)
797+
}
798+
switch ft.DataType {
799+
default:
800+
t.Fatalf("unexpected type %v\n", ft.DataType)
801+
case UINT64:
802+
err = testReadUint64StridedSlice(v, n)
803+
case INT64:
804+
err = testReadInt64StridedSlice(v, n)
805+
case DOUBLE:
806+
err = testReadFloat64StridedSlice(v, n)
807+
case UINT:
808+
err = testReadUint32StridedSlice(v, n)
809+
case INT:
810+
err = testReadInt32StridedSlice(v, n)
811+
case FLOAT:
812+
err = testReadFloat32StridedSlice(v, n)
813+
case USHORT:
814+
err = testReadUint16StridedSlice(v, n)
815+
case SHORT:
816+
err = testReadInt16StridedSlice(v, n)
817+
case UBYTE:
818+
err = testReadUint8StridedSlice(v, n)
819+
case BYTE:
820+
err = testReadInt8StridedSlice(v, n)
821+
case CHAR:
822+
err = testReadBytesStridedSlice(v, n)
823+
}
824+
if err != nil {
825+
t.Fatalf("reading data failed: %v\n", err)
826+
}
827+
if err := f.Close(); err != nil {
828+
t.Fatalf("Close failed: %v\n", err)
829+
}
830+
}
831+
832+
func TestStridedSlice(t *testing.T) {
833+
for _, ft := range getFileTests() {
834+
f, err := ioutil.TempFile("", "netcdf_test")
835+
if err != nil {
836+
t.Fatalf("creating temporary file failed: %v\n", err)
837+
}
838+
testWriteFileViaStridedSlice(t, f.Name(), &ft)
839+
testReadFileViaStridedSlice(t, f.Name(), &ft)
840+
if err := os.Remove(f.Name()); err != nil {
841+
t.Errorf("removing temporary file failed: %v\n", err)
842+
}
843+
}
844+
}
845+
570846
func TestCompression(t *testing.T) {
571847
f, err := ioutil.TempFile("", "netcdf_test")
572848
if err != nil {

netcdf/generate.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,33 @@ var TheFile = File{
4141
"C.nc_get_att_double",
4242
"C.nc_get_var_double",
4343
"C.nc_get_var1_double",
44+
"C.nc_get_vara_double",
45+
"C.nc_get_vars_double",
4446
"C.nc_put_att_double",
4547
"C.nc_put_var_double",
4648
"C.nc_put_var1_double",
49+
"C.nc_put_vara_double",
50+
"C.nc_put_vars_double",
4751
},
4852
DocIdents: []string{
4953
"testReadFloat64s",
5054
"testWriteFloat64s",
5155
"testWriteFloat64At",
5256
"testReadFloat64At",
57+
"testWriteFloat64Slice",
58+
"testReadFloat64Slice",
59+
"testWriteFloat64StridedSlice",
60+
"testReadFloat64StridedSlice",
5361
"Float64sReader",
5462
"GetFloat64s",
5563
"ReadFloat64s",
5664
"WriteFloat64s",
5765
"ReadFloat64At",
5866
"WriteFloat64At",
67+
"ReadFloat64Slice",
68+
"WriteFloat64Slice",
69+
"ReadFloat64StridedSlice",
70+
"WriteFloat64StridedSlice",
5971
},
6072
Keys: []string{"float64", "Float64s", "DOUBLE", "Float64", "C.double", "_double"},
6173
}

0 commit comments

Comments
 (0)