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