github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/gift/rank_test.go (about)

     1  package gift
     2  
     3  import (
     4  	"image"
     5  	"testing"
     6  )
     7  
     8  func TestMedian(t *testing.T) {
     9  	testData := []struct {
    10  		desc           string
    11  		ksize          int
    12  		disk           bool
    13  		srcb, dstb     image.Rectangle
    14  		srcPix, dstPix []uint8
    15  	}{
    16  		{
    17  			"median (0, false)",
    18  			0, false,
    19  			image.Rect(-1, -1, 4, 2),
    20  			image.Rect(0, 0, 5, 3),
    21  			[]uint8{
    22  				0x11, 0x99, 0x55, 0x22, 0x66,
    23  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
    24  				0x33, 0x77, 0xBB, 0x88, 0xEE,
    25  			},
    26  			[]uint8{
    27  				0x11, 0x99, 0x55, 0x22, 0x66,
    28  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
    29  				0x33, 0x77, 0xBB, 0x88, 0xEE,
    30  			},
    31  		},
    32  		{
    33  			"median (1, false)",
    34  			1, false,
    35  			image.Rect(-1, -1, 4, 2),
    36  			image.Rect(0, 0, 5, 3),
    37  			[]uint8{
    38  				0x11, 0x99, 0x55, 0x22, 0x66,
    39  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
    40  				0x33, 0x77, 0xBB, 0x88, 0xEE,
    41  			},
    42  			[]uint8{
    43  				0x11, 0x99, 0x55, 0x22, 0x66,
    44  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
    45  				0x33, 0x77, 0xBB, 0x88, 0xEE,
    46  			},
    47  		},
    48  		{
    49  			"median (2, false)",
    50  			2, false,
    51  			image.Rect(-1, -1, 4, 2),
    52  			image.Rect(0, 0, 5, 3),
    53  			[]uint8{
    54  				0x11, 0x99, 0x55, 0x22, 0x66,
    55  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
    56  				0x33, 0x77, 0xBB, 0x88, 0xEE,
    57  			},
    58  			[]uint8{
    59  				0x11, 0x99, 0x55, 0x22, 0x66,
    60  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
    61  				0x33, 0x77, 0xBB, 0x88, 0xEE,
    62  			},
    63  		},
    64  		{
    65  			"median (3, false)",
    66  			3, false,
    67  			image.Rect(-1, -1, 4, 2),
    68  			image.Rect(0, 0, 5, 3),
    69  			[]uint8{
    70  				0x11, 0x99, 0x55, 0x22, 0x66,
    71  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
    72  				0x33, 0x77, 0xBB, 0x88, 0xEE,
    73  			},
    74  			[]uint8{
    75  				0x44, 0x55, 0x55, 0x55, 0x66,
    76  				0x44, 0x77, 0x88, 0x88, 0x66,
    77  				0x44, 0x77, 0x88, 0xBB, 0xCC,
    78  			},
    79  		},
    80  		{
    81  			"median (3, true)",
    82  			3, true,
    83  			image.Rect(-1, -1, 4, 2),
    84  			image.Rect(0, 0, 5, 3),
    85  			[]uint8{
    86  				0x11, 0x99, 0x55, 0x22, 0x66,
    87  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
    88  				0x33, 0x77, 0xBB, 0x88, 0xEE,
    89  			},
    90  			[]uint8{
    91  				0x11, 0x55, 0x55, 0x55, 0x66,
    92  				0x44, 0x99, 0xBB, 0x88, 0x66,
    93  				0x33, 0x77, 0xBB, 0xBB, 0xEE,
    94  			},
    95  		},
    96  		{
    97  			"median (4, true)",
    98  			4, true,
    99  			image.Rect(-1, -1, 4, 2),
   100  			image.Rect(0, 0, 5, 3),
   101  			[]uint8{
   102  				0x11, 0x99, 0x55, 0x22, 0x66,
   103  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   104  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   105  			},
   106  			[]uint8{
   107  				0x11, 0x55, 0x55, 0x55, 0x66,
   108  				0x44, 0x99, 0xBB, 0x88, 0x66,
   109  				0x33, 0x77, 0xBB, 0xBB, 0xEE,
   110  			},
   111  		},
   112  	}
   113  
   114  	for _, d := range testData {
   115  		src := image.NewGray(d.srcb)
   116  		src.Pix = d.srcPix
   117  
   118  		f := Median(d.ksize, d.disk)
   119  		dst := image.NewGray(f.Bounds(src.Bounds()))
   120  		f.Draw(dst, src, nil)
   121  
   122  		if !checkBoundsAndPix(dst.Bounds(), d.dstb, dst.Pix, d.dstPix) {
   123  			t.Errorf("test [%s] failed: %#v, %#v", d.desc, dst.Bounds(), dst.Pix)
   124  		}
   125  	}
   126  
   127  	testDataNRGBA := []struct {
   128  		desc           string
   129  		ksize          int
   130  		disk           bool
   131  		srcb, dstb     image.Rectangle
   132  		srcPix, dstPix []uint8
   133  	}{
   134  		{
   135  			"median nrgba (3, true)",
   136  			3, true,
   137  			image.Rect(-1, -1, 4, 2),
   138  			image.Rect(0, 0, 5, 3),
   139  			[]uint8{
   140  				0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x66,
   141  				0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00,
   142  				0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xEE,
   143  			},
   144  			[]uint8{
   145  				0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x66,
   146  				0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x66,
   147  				0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0xEE,
   148  			},
   149  		},
   150  	}
   151  
   152  	for _, d := range testDataNRGBA {
   153  		src := image.NewNRGBA(d.srcb)
   154  		src.Pix = d.srcPix
   155  
   156  		f := Median(d.ksize, d.disk)
   157  		dst := image.NewNRGBA(f.Bounds(src.Bounds()))
   158  		f.Draw(dst, src, nil)
   159  
   160  		if !checkBoundsAndPix(dst.Bounds(), d.dstb, dst.Pix, d.dstPix) {
   161  			t.Errorf("test [%s] failed: %#v, %#v", d.desc, dst.Bounds(), dst.Pix)
   162  		}
   163  	}
   164  
   165  	// check no panics
   166  	Median(5, false).Draw(image.NewGray(image.Rect(0, 0, 1, 1)), image.NewGray(image.Rect(0, 0, 1, 1)), nil)
   167  	Median(5, false).Draw(image.NewGray(image.Rect(0, 0, 0, 0)), image.NewGray(image.Rect(0, 0, 0, 0)), nil)
   168  }
   169  
   170  func TestMinimum(t *testing.T) {
   171  	testData := []struct {
   172  		desc           string
   173  		ksize          int
   174  		disk           bool
   175  		srcb, dstb     image.Rectangle
   176  		srcPix, dstPix []uint8
   177  	}{
   178  		{
   179  			"minimum (0, false)",
   180  			0, false,
   181  			image.Rect(-1, -1, 4, 2),
   182  			image.Rect(0, 0, 5, 3),
   183  			[]uint8{
   184  				0x11, 0x99, 0x55, 0x22, 0x66,
   185  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   186  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   187  			},
   188  			[]uint8{
   189  				0x11, 0x99, 0x55, 0x22, 0x66,
   190  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   191  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   192  			},
   193  		},
   194  		{
   195  			"minimum (1, false)",
   196  			1, false,
   197  			image.Rect(-1, -1, 4, 2),
   198  			image.Rect(0, 0, 5, 3),
   199  			[]uint8{
   200  				0x11, 0x99, 0x55, 0x22, 0x66,
   201  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   202  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   203  			},
   204  			[]uint8{
   205  				0x11, 0x99, 0x55, 0x22, 0x66,
   206  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   207  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   208  			},
   209  		},
   210  		{
   211  			"minimum (2, false)",
   212  			2, false,
   213  			image.Rect(-1, -1, 4, 2),
   214  			image.Rect(0, 0, 5, 3),
   215  			[]uint8{
   216  				0x11, 0x99, 0x55, 0x22, 0x66,
   217  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   218  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   219  			},
   220  			[]uint8{
   221  				0x11, 0x99, 0x55, 0x22, 0x66,
   222  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   223  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   224  			},
   225  		},
   226  		{
   227  			"minimum (3, false)",
   228  			3, false,
   229  			image.Rect(-1, -1, 4, 2),
   230  			image.Rect(0, 0, 5, 3),
   231  			[]uint8{
   232  				0x11, 0x99, 0x55, 0x22, 0x66,
   233  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   234  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   235  			},
   236  			[]uint8{
   237  				0x11, 0x11, 0x22, 0x00, 0x00,
   238  				0x11, 0x11, 0x22, 0x00, 0x00,
   239  				0x33, 0x33, 0x44, 0x00, 0x00,
   240  			},
   241  		},
   242  		{
   243  			"minimum (3, true)",
   244  			3, true,
   245  			image.Rect(-1, -1, 4, 2),
   246  			image.Rect(0, 0, 5, 3),
   247  			[]uint8{
   248  				0x11, 0x99, 0x55, 0x22, 0x66,
   249  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   250  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   251  			},
   252  			[]uint8{
   253  				0x11, 0x11, 0x22, 0x22, 0x00,
   254  				0x11, 0x44, 0x44, 0x00, 0x00,
   255  				0x33, 0x33, 0x77, 0x88, 0x00,
   256  			},
   257  		},
   258  		{
   259  			"minimum (4, true)",
   260  			4, true,
   261  			image.Rect(-1, -1, 4, 2),
   262  			image.Rect(0, 0, 5, 3),
   263  			[]uint8{
   264  				0x11, 0x99, 0x55, 0x22, 0x66,
   265  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   266  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   267  			},
   268  			[]uint8{
   269  				0x11, 0x11, 0x22, 0x22, 0x00,
   270  				0x11, 0x44, 0x44, 0x00, 0x00,
   271  				0x33, 0x33, 0x77, 0x88, 0x00,
   272  			},
   273  		},
   274  	}
   275  
   276  	for _, d := range testData {
   277  		src := image.NewGray(d.srcb)
   278  		src.Pix = d.srcPix
   279  
   280  		f := Minimum(d.ksize, d.disk)
   281  		dst := image.NewGray(f.Bounds(src.Bounds()))
   282  		f.Draw(dst, src, nil)
   283  
   284  		if !checkBoundsAndPix(dst.Bounds(), d.dstb, dst.Pix, d.dstPix) {
   285  			t.Errorf("test [%s] failed: %#v, %#v", d.desc, dst.Bounds(), dst.Pix)
   286  		}
   287  	}
   288  
   289  	testDataNRGBA := []struct {
   290  		desc           string
   291  		ksize          int
   292  		disk           bool
   293  		srcb, dstb     image.Rectangle
   294  		srcPix, dstPix []uint8
   295  	}{
   296  		{
   297  			"minimum nrgba (3, true)",
   298  			3, true,
   299  			image.Rect(-1, -1, 4, 2),
   300  			image.Rect(0, 0, 5, 3),
   301  			[]uint8{
   302  				0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x66,
   303  				0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00,
   304  				0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xEE,
   305  			},
   306  			[]uint8{
   307  				0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00,
   308  				0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   309  				0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00,
   310  			},
   311  		},
   312  	}
   313  
   314  	for _, d := range testDataNRGBA {
   315  		src := image.NewNRGBA(d.srcb)
   316  		src.Pix = d.srcPix
   317  
   318  		f := Minimum(d.ksize, d.disk)
   319  		dst := image.NewNRGBA(f.Bounds(src.Bounds()))
   320  		f.Draw(dst, src, nil)
   321  
   322  		if !checkBoundsAndPix(dst.Bounds(), d.dstb, dst.Pix, d.dstPix) {
   323  			t.Errorf("test [%s] failed: %#v, %#v", d.desc, dst.Bounds(), dst.Pix)
   324  		}
   325  	}
   326  }
   327  
   328  func TestMaximum(t *testing.T) {
   329  	testData := []struct {
   330  		desc           string
   331  		ksize          int
   332  		disk           bool
   333  		srcb, dstb     image.Rectangle
   334  		srcPix, dstPix []uint8
   335  	}{
   336  		{
   337  			"maximum (0, false)",
   338  			0, false,
   339  			image.Rect(-1, -1, 4, 2),
   340  			image.Rect(0, 0, 5, 3),
   341  			[]uint8{
   342  				0x11, 0x99, 0x55, 0x22, 0x66,
   343  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   344  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   345  			},
   346  			[]uint8{
   347  				0x11, 0x99, 0x55, 0x22, 0x66,
   348  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   349  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   350  			},
   351  		},
   352  		{
   353  			"maximum (1, false)",
   354  			1, false,
   355  			image.Rect(-1, -1, 4, 2),
   356  			image.Rect(0, 0, 5, 3),
   357  			[]uint8{
   358  				0x11, 0x99, 0x55, 0x22, 0x66,
   359  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   360  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   361  			},
   362  			[]uint8{
   363  				0x11, 0x99, 0x55, 0x22, 0x66,
   364  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   365  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   366  			},
   367  		},
   368  		{
   369  			"maximum (2, false)",
   370  			2, false,
   371  			image.Rect(-1, -1, 4, 2),
   372  			image.Rect(0, 0, 5, 3),
   373  			[]uint8{
   374  				0x11, 0x99, 0x55, 0x22, 0x66,
   375  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   376  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   377  			},
   378  			[]uint8{
   379  				0x11, 0x99, 0x55, 0x22, 0x66,
   380  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   381  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   382  			},
   383  		},
   384  		{
   385  			"maximum (3, false)",
   386  			3, false,
   387  			image.Rect(-1, -1, 4, 2),
   388  			image.Rect(0, 0, 5, 3),
   389  			[]uint8{
   390  				0x11, 0x99, 0x55, 0x22, 0x66,
   391  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   392  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   393  			},
   394  			[]uint8{
   395  				0xFF, 0xFF, 0xFF, 0xFF, 0xCC,
   396  				0xFF, 0xFF, 0xFF, 0xFF, 0xEE,
   397  				0xFF, 0xFF, 0xFF, 0xFF, 0xEE,
   398  			},
   399  		},
   400  		{
   401  			"maximum (3, true)",
   402  			3, true,
   403  			image.Rect(-1, -1, 4, 2),
   404  			image.Rect(0, 0, 5, 3),
   405  			[]uint8{
   406  				0x11, 0x99, 0x55, 0x22, 0x66,
   407  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   408  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   409  			},
   410  			[]uint8{
   411  				0xFF, 0x99, 0xFF, 0xCC, 0x66,
   412  				0xFF, 0xFF, 0xFF, 0xFF, 0xEE,
   413  				0xFF, 0xBB, 0xFF, 0xEE, 0xEE,
   414  			},
   415  		},
   416  		{
   417  			"maximum (4, true)",
   418  			4, true,
   419  			image.Rect(-1, -1, 4, 2),
   420  			image.Rect(0, 0, 5, 3),
   421  			[]uint8{
   422  				0x11, 0x99, 0x55, 0x22, 0x66,
   423  				0xFF, 0x44, 0xFF, 0xCC, 0x00,
   424  				0x33, 0x77, 0xBB, 0x88, 0xEE,
   425  			},
   426  			[]uint8{
   427  				0xFF, 0x99, 0xFF, 0xCC, 0x66,
   428  				0xFF, 0xFF, 0xFF, 0xFF, 0xEE,
   429  				0xFF, 0xBB, 0xFF, 0xEE, 0xEE,
   430  			},
   431  		},
   432  	}
   433  
   434  	for _, d := range testData {
   435  		src := image.NewGray(d.srcb)
   436  		src.Pix = d.srcPix
   437  
   438  		f := Maximum(d.ksize, d.disk)
   439  		dst := image.NewGray(f.Bounds(src.Bounds()))
   440  		f.Draw(dst, src, nil)
   441  
   442  		if !checkBoundsAndPix(dst.Bounds(), d.dstb, dst.Pix, d.dstPix) {
   443  			t.Errorf("test [%s] failed: %#v, %#v", d.desc, dst.Bounds(), dst.Pix)
   444  		}
   445  	}
   446  
   447  	testDataNRGBA := []struct {
   448  		desc           string
   449  		ksize          int
   450  		disk           bool
   451  		srcb, dstb     image.Rectangle
   452  		srcPix, dstPix []uint8
   453  	}{
   454  		{
   455  			"maximum nrgba (3, true)",
   456  			3, true,
   457  			image.Rect(-1, -1, 4, 2),
   458  			image.Rect(0, 0, 5, 3),
   459  			[]uint8{
   460  				0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x66,
   461  				0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00,
   462  				0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xEE,
   463  			},
   464  			[]uint8{
   465  				0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x66,
   466  				0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xEE,
   467  				0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xEE, 0x00, 0x00, 0x00, 0xEE,
   468  			},
   469  		},
   470  	}
   471  
   472  	for _, d := range testDataNRGBA {
   473  		src := image.NewNRGBA(d.srcb)
   474  		src.Pix = d.srcPix
   475  
   476  		f := Maximum(d.ksize, d.disk)
   477  		dst := image.NewNRGBA(f.Bounds(src.Bounds()))
   478  		f.Draw(dst, src, nil)
   479  
   480  		if !checkBoundsAndPix(dst.Bounds(), d.dstb, dst.Pix, d.dstPix) {
   481  			t.Errorf("test [%s] failed: %#v, %#v", d.desc, dst.Bounds(), dst.Pix)
   482  		}
   483  	}
   484  }