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