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