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