github.com/lenartj/cfitsio@v0.0.0-20210325092924-ef692a403eb8/image_test.go (about) 1 package cfitsio 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "math" 7 "os" 8 "reflect" 9 "testing" 10 ) 11 12 func TestImageRW(t *testing.T) { 13 curdir, err := os.Getwd() 14 if err != nil { 15 t.Fatalf(err.Error()) 16 } 17 defer os.Chdir(curdir) 18 19 workdir, err := ioutil.TempDir("", "go-cfitsio-test-") 20 if err != nil { 21 t.Fatalf(err.Error()) 22 } 23 defer os.RemoveAll(workdir) 24 25 err = os.Chdir(workdir) 26 if err != nil { 27 t.Fatalf(err.Error()) 28 } 29 30 for ii, table := range []struct { 31 name string 32 version int 33 cards []Card 34 bitpix int64 35 bzero uint64 36 unsigned bool 37 axes []int64 38 image interface{} 39 }{ 40 { 41 name: "new.fits", 42 version: 2, 43 cards: []Card{ 44 { 45 "EXTNAME", 46 "primary hdu", 47 "the primary HDU", 48 }, 49 { 50 "EXTVER", 51 2, 52 "the primary hdu version", 53 }, 54 }, 55 bitpix: 8, 56 axes: []int64{3, 4}, 57 image: []int8{ 58 0, 1, 2, 3, 59 4, 5, 6, 7, 60 8, 9, 0, 1, 61 }, 62 }, 63 { 64 name: "new.fits", 65 version: 2, 66 cards: []Card{ 67 { 68 "EXTNAME", 69 "primary hdu", 70 "the primary HDU", 71 }, 72 { 73 "EXTVER", 74 2, 75 "the primary hdu version", 76 }, 77 }, 78 bitpix: 16, 79 axes: []int64{3, 4}, 80 image: []int16{ 81 0, 1, 2, 3, 82 4, 5, 6, 7, 83 8, 9, 0, 1, 84 }, 85 }, 86 { 87 name: "new.fits", 88 version: 2, 89 cards: []Card{ 90 { 91 "EXTNAME", 92 "primary hdu", 93 "the primary HDU", 94 }, 95 { 96 "EXTVER", 97 2, 98 "the primary hdu version", 99 }, 100 }, 101 bitpix: 16, 102 bzero: -math.MinInt16, 103 unsigned: true, 104 axes: []int64{3, 4}, 105 image: []uint16{ 106 0, 1, 2, 3, 107 4, 5, 6, 7, 108 8, 9, 0, math.MaxUint16, 109 }, 110 }, 111 { 112 name: "new.fits", 113 version: 2, 114 cards: []Card{ 115 { 116 "EXTNAME", 117 "primary hdu", 118 "the primary HDU", 119 }, 120 { 121 "EXTVER", 122 2, 123 "the primary hdu version", 124 }, 125 }, 126 bitpix: 32, 127 axes: []int64{3, 4}, 128 image: []int32{ 129 0, 1, 2, 3, 130 4, 5, 6, 7, 131 8, 9, 0, 1, 132 }, 133 }, 134 { 135 name: "new.fits", 136 version: 2, 137 cards: []Card{ 138 { 139 "EXTNAME", 140 "primary hdu", 141 "the primary HDU", 142 }, 143 { 144 "EXTVER", 145 2, 146 "the primary hdu version", 147 }, 148 }, 149 bitpix: 32, 150 bzero: -math.MinInt32, 151 unsigned: true, 152 axes: []int64{3, 4}, 153 image: []uint32{ 154 0, 1, 2, 3, 155 4, 5, 6, 7, 156 8, 9, 0, math.MaxUint32, 157 }, 158 }, 159 { 160 name: "new.fits", 161 version: 2, 162 cards: []Card{ 163 { 164 "EXTNAME", 165 "primary hdu", 166 "the primary HDU", 167 }, 168 { 169 "EXTVER", 170 2, 171 "the primary hdu version", 172 }, 173 }, 174 bitpix: 64, 175 axes: []int64{3, 4}, 176 image: []int64{ 177 0, 1, 2, 3, 178 4, 5, 6, 7, 179 8, 9, 0, 1, 180 }, 181 }, 182 { 183 name: "new.fits", 184 version: 2, 185 cards: []Card{ 186 { 187 "EXTNAME", 188 "primary hdu", 189 "the primary HDU", 190 }, 191 { 192 "EXTVER", 193 2, 194 "the primary hdu version", 195 }, 196 }, 197 bitpix: 64, 198 bzero: -math.MinInt64, 199 unsigned: true, 200 axes: []int64{3, 4}, 201 image: []uint64{ 202 0, 1, 2, 3, 203 4, 5, 6, 7, 204 8, 9, 0, math.MaxUint64, 205 }, 206 }, 207 { 208 name: "new.fits", 209 version: 2, 210 cards: []Card{ 211 { 212 "EXTNAME", 213 "primary hdu", 214 "the primary HDU", 215 }, 216 { 217 "EXTVER", 218 2, 219 "the primary hdu version", 220 }, 221 }, 222 bitpix: -32, 223 axes: []int64{3, 4}, 224 image: []float32{ 225 0, 1, 2, 3, 226 4, 5, 6, 7, 227 8, 9, 0, 1, 228 }, 229 }, 230 { 231 name: "new.fits", 232 version: 2, 233 cards: []Card{ 234 { 235 "EXTNAME", 236 "primary hdu", 237 "the primary HDU", 238 }, 239 { 240 "EXTVER", 241 2, 242 "the primary hdu version", 243 }, 244 }, 245 bitpix: -64, 246 axes: []int64{3, 4}, 247 image: []float64{ 248 0, 1, 2, 3, 249 4, 5, 6, 7, 250 8, 9, 0, 1, 251 }, 252 }, 253 } { 254 fname := fmt.Sprintf("%03d_%s", ii, table.name) 255 for i := 0; i < 2; i++ { 256 func(i int) { 257 var f File 258 var err error 259 var hdu HDU 260 261 switch i { 262 263 case 0: // create 264 f, err = Create(fname) 265 if err != nil { 266 t.Fatalf("error creating new file [%v]: %v", fname, err) 267 } 268 defer f.Close() 269 270 phdr := NewHeader( 271 table.cards, 272 IMAGE_HDU, 273 table.bitpix, 274 table.axes, 275 ) 276 if table.bzero != 0 { 277 phdr.Set("BZERO", table.bzero, "offset data range") 278 } 279 phdu, err := NewPrimaryHDU(&f, phdr) 280 if err != nil { 281 t.Fatalf("error creating PHDU: %v", err) 282 } 283 defer phdu.Close() 284 hdu = phdu 285 286 err = phdu.(*PrimaryHDU).Write(&table.image) 287 if err != nil { 288 t.Fatalf("error writing image: %v", err) 289 } 290 291 case 1: // read 292 f, err = Open(fname, ReadOnly) 293 if err != nil { 294 t.Fatalf("error opening file [%v]: %v", fname, err) 295 } 296 defer f.Close() 297 298 hdu = f.HDU(0) 299 hdr := hdu.Header() 300 nelmts := 1 301 for _, axe := range hdr.Axes() { 302 nelmts *= int(axe) 303 } 304 305 var data interface{} 306 switch hdr.Bitpix() { 307 case 8: 308 v := make([]int8, nelmts) 309 data = v 310 err = hdu.Data(&v) 311 312 case 16: 313 if table.unsigned { 314 v := make([]uint16, nelmts) 315 data = v 316 err = hdu.Data(&v) 317 } else { 318 v := make([]int16, nelmts) 319 data = v 320 err = hdu.Data(&v) 321 } 322 323 case 32: 324 if table.unsigned { 325 v := make([]uint32, nelmts) 326 data = v 327 err = hdu.Data(&v) 328 } else { 329 v := make([]int32, nelmts) 330 data = v 331 err = hdu.Data(&v) 332 } 333 334 case 64: 335 if table.unsigned { 336 v := make([]uint64, nelmts) 337 data = v 338 err = hdu.Data(&v) 339 } else { 340 v := make([]int64, nelmts) 341 data = v 342 err = hdu.Data(&v) 343 } 344 345 case -32: 346 v := make([]float32, nelmts) 347 data = v 348 err = hdu.Data(&v) 349 350 case -64: 351 v := make([]float64, nelmts) 352 data = v 353 err = hdu.Data(&v) 354 } 355 356 if err != nil { 357 t.Fatalf("error reading image: %v", err) 358 } 359 360 if !reflect.DeepEqual(data, table.image) { 361 t.Fatalf("expected image:\nref=%v\ngot=%v", table.image, data) 362 } 363 } 364 365 hdr := hdu.Header() 366 if hdr.bitpix != table.bitpix { 367 t.Fatalf("expected BITPIX=%v. got %v", table.bitpix, hdr.bitpix) 368 } 369 370 if !reflect.DeepEqual(hdr.Axes(), table.axes) { 371 t.Fatalf("expected AXES==%v. got %v (i=%v)", table.axes, hdr.Axes(), i) 372 } 373 374 name := hdu.Name() 375 if name != "primary hdu" { 376 t.Fatalf("expected EXTNAME==%q. got %q", "primary hdu", name) 377 } 378 379 vers := hdu.Version() 380 if vers != table.version { 381 t.Fatalf("expected EXTVER==%v. got %v", table.version, vers) 382 } 383 384 card := hdr.Get("EXTNAME") 385 if card == nil { 386 t.Fatalf("error retrieving card [EXTNAME]") 387 } 388 if card.Comment != "the primary HDU" { 389 t.Fatalf("expected EXTNAME.Comment==%q. got %q", "the primary HDU", card.Comment) 390 } 391 392 card = hdr.Get("EXTVER") 393 if card == nil { 394 t.Fatalf("error retrieving card [EXTVER]") 395 } 396 if card.Comment != "the primary hdu version" { 397 t.Fatalf("expected EXTVER.Comment==%q. got %q", "the primary hdu version", card.Comment) 398 399 } 400 401 for _, ref := range table.cards { 402 card := hdr.Get(ref.Name) 403 if card == nil { 404 t.Fatalf("error retrieving card [%v]", ref.Name) 405 } 406 rv := reflect.ValueOf(ref.Value) 407 var val interface{} 408 switch rv.Type().Kind() { 409 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 410 val = rv.Int() 411 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: 412 val = int64(rv.Uint()) 413 case reflect.Float32, reflect.Float64: 414 val = rv.Float() 415 case reflect.Complex64, reflect.Complex128: 416 val = rv.Complex() 417 case reflect.String: 418 val = ref.Value.(string) 419 } 420 if !reflect.DeepEqual(card.Value, val) { 421 t.Fatalf( 422 "card %q. expected [%v](%T). got [%v](%T)", 423 ref.Name, 424 val, val, 425 card.Value, card.Value, 426 ) 427 } 428 if card.Comment != ref.Comment { 429 t.Fatalf("card %q. comment differ. expected %q. got %q", ref.Name, ref.Comment, card.Comment) 430 } 431 } 432 433 card = hdr.Get("NOT THERE") 434 if card != nil { 435 t.Fatalf("expected no card. got [%v]", card) 436 } 437 }(i) 438 } 439 } 440 } 441 442 // EOF