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