...

Source file src/gonum.org/v1/plot/labelling_test.go

Documentation: gonum.org/v1/plot

     1  // Copyright ©2017 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package plot
     6  
     7  import (
     8  	"math"
     9  	"reflect"
    10  	"testing"
    11  )
    12  
    13  var talbotLinHanrahanTests = []struct {
    14  	dMin, dMax  float64
    15  	want        int
    16  	containment int
    17  
    18  	wantValues    []float64
    19  	wantStep      float64
    20  	wantMagnitude int
    21  }{
    22  	// Expected values confirmed against R reference implementation.
    23  	{
    24  		dMin:        -1.9846500878911073,
    25  		dMax:        0.4370974820125605,
    26  		want:        3,
    27  		containment: free,
    28  
    29  		wantValues:    []float64{-2, -1, 0},
    30  		wantStep:      1,
    31  		wantMagnitude: 0,
    32  	},
    33  	{
    34  		dMin:        -1.9846500878911073,
    35  		dMax:        0.4370974820125605,
    36  		want:        3,
    37  		containment: containData,
    38  
    39  		wantValues:    []float64{-2, -1, 0, 1},
    40  		wantStep:      1,
    41  		wantMagnitude: 0,
    42  	},
    43  	{
    44  		dMin:        -1.985e-15,
    45  		dMax:        0.4371e-15,
    46  		want:        3,
    47  		containment: free,
    48  
    49  		wantValues:    []float64{-1.985e-15, -7.739500000000001e-16, 4.3709999999999994e-16},
    50  		wantStep:      1.21105e-15,
    51  		wantMagnitude: -16,
    52  	},
    53  	{
    54  		dMin:        -1.985e-15,
    55  		dMax:        0.4371e-15,
    56  		want:        3,
    57  		containment: containData,
    58  
    59  		wantValues:    []float64{-1.985e-15, -7.739500000000001e-16, 4.3709999999999994e-16},
    60  		wantStep:      1.21105e-15,
    61  		wantMagnitude: -16,
    62  	},
    63  	{
    64  		dMin:        -1.985e15,
    65  		dMax:        0.4371e15,
    66  		want:        3,
    67  		containment: free,
    68  
    69  		wantValues:    []float64{-2e+15, -1e+15, 0},
    70  		wantStep:      1,
    71  		wantMagnitude: 15,
    72  	},
    73  	{
    74  		dMin:        -1.985e15,
    75  		dMax:        0.4371e15,
    76  		want:        3,
    77  		containment: containData,
    78  
    79  		wantValues:    []float64{-2e+15, -1e+15, 0, 1e+15},
    80  		wantStep:      1,
    81  		wantMagnitude: 15,
    82  	},
    83  	{
    84  		dMin:        dlamchP * 20,
    85  		dMax:        dlamchP * 50,
    86  		want:        3,
    87  		containment: free,
    88  
    89  		wantValues:    []float64{4.440892098500626e-15, 7.771561172376096e-15, 1.1102230246251565e-14},
    90  		wantStep:      3.3306690738754696e-15,
    91  		wantMagnitude: -15,
    92  	},
    93  	{
    94  		dMin:        dlamchP * 20,
    95  		dMax:        dlamchP * 50,
    96  		want:        3,
    97  		containment: containData,
    98  
    99  		wantValues:    []float64{4.440892098500626e-15, 7.771561172376096e-15, 1.1102230246251565e-14},
   100  		wantStep:      3.3306690738754696e-15,
   101  		wantMagnitude: -15,
   102  	},
   103  	{
   104  		dMin:        math.MaxFloat64 / 4,
   105  		dMax:        math.MaxFloat64 / 3,
   106  		want:        3,
   107  		containment: free,
   108  
   109  		wantValues:    []float64{4.4942328371557893e+307, 5.243271643348421e+307, 5.992310449541053e+307},
   110  		wantStep:      7.490388061926317e+306,
   111  		wantMagnitude: 307,
   112  	},
   113  	{
   114  		dMin:        math.MaxFloat64 / 4,
   115  		dMax:        math.MaxFloat64 / 3,
   116  		want:        3,
   117  		containment: containData,
   118  
   119  		wantValues:    []float64{4.4942328371557893e+307, 5.243271643348421e+307, 5.992310449541053e+307},
   120  		wantStep:      7.490388061926317e+306,
   121  		wantMagnitude: 307,
   122  	},
   123  	{
   124  		dMin:        0.00010,
   125  		dMax:        0.00015,
   126  		want:        3,
   127  		containment: free,
   128  
   129  		wantValues:    []float64{0.0001, 0.000125, 0.00015000000000000001},
   130  		wantStep:      2.5,
   131  		wantMagnitude: -5,
   132  	},
   133  	{
   134  		dMin:        0.00010,
   135  		dMax:        0.00015,
   136  		want:        3,
   137  		containment: containData,
   138  
   139  		wantValues:    []float64{0.0001, 0.000125, 0.00015000000000000001},
   140  		wantStep:      2.5,
   141  		wantMagnitude: -5,
   142  	},
   143  	{
   144  		dMin:        555.6545,
   145  		dMax:        21800.9875,
   146  		want:        3,
   147  		containment: free,
   148  
   149  		wantValues:    []float64{0, 10000, 20000},
   150  		wantStep:      1,
   151  		wantMagnitude: 4,
   152  	},
   153  	{
   154  		dMin:        555.6545,
   155  		dMax:        21800.9875,
   156  		want:        3,
   157  		containment: containData,
   158  
   159  		wantValues:    []float64{0, 12000, 24000},
   160  		wantStep:      12,
   161  		wantMagnitude: 3,
   162  	},
   163  	{
   164  		dMin:        555.6545,
   165  		dMax:        27800.9875,
   166  		want:        3,
   167  		containment: free,
   168  
   169  		wantValues:    []float64{0, 10000, 20000, 30000},
   170  		wantStep:      1,
   171  		wantMagnitude: 4,
   172  	},
   173  	{
   174  		dMin:        555.6545,
   175  		dMax:        27800.9875,
   176  		want:        3,
   177  		containment: containData,
   178  
   179  		wantValues:    []float64{0, 10000, 20000, 30000},
   180  		wantStep:      1,
   181  		wantMagnitude: 4,
   182  	},
   183  	{
   184  		dMin:        55.6545,
   185  		dMax:        1555.9875,
   186  		want:        3,
   187  		containment: free,
   188  
   189  		wantValues:    []float64{0, 500, 1000, 1500},
   190  		wantStep:      5,
   191  		wantMagnitude: 2,
   192  	},
   193  	{
   194  		dMin:        55.6545,
   195  		dMax:        1555.9875,
   196  		want:        3,
   197  		containment: containData,
   198  
   199  		wantValues:    []float64{0, 800, 1600},
   200  		wantStep:      8,
   201  		wantMagnitude: 2,
   202  	},
   203  	{
   204  		dMin:        3.096916 - 0.125,
   205  		dMax:        3.096916 + 0.125,
   206  		want:        3,
   207  		containment: free,
   208  
   209  		wantValues:    []float64{3, 3.1, 3.2},
   210  		wantStep:      1,
   211  		wantMagnitude: -1,
   212  	},
   213  	{
   214  		dMin:        3.096916 - 0.125,
   215  		dMax:        3.096916 + 0.125,
   216  		want:        3,
   217  		containment: containData,
   218  
   219  		wantValues:    []float64{2.9499999999999997, 3.0999999999999996, 3.2499999999999996},
   220  		wantStep:      15,
   221  		wantMagnitude: -2,
   222  	},
   223  	// The following fails in the reference implementation with a
   224  	// warning of "probable complete loss of accuracy in modulus".
   225  	{
   226  		dMin:        99.99999999999996,
   227  		dMax:        100,
   228  		want:        3,
   229  		containment: free,
   230  
   231  		wantValues:    []float64{99.99999999999996, 99.99999999999997, 100},
   232  		wantStep:      2,
   233  		wantMagnitude: -14,
   234  	},
   235  }
   236  
   237  func TestTalbotLinHanrahan(t *testing.T) {
   238  	for _, test := range talbotLinHanrahanTests {
   239  		values, step, _, magnitude := talbotLinHanrahan(test.dMin, test.dMax, test.want, test.containment, nil, nil, nil)
   240  		if !reflect.DeepEqual(values, test.wantValues) {
   241  			t.Errorf("unexpected values for dMin=%g, dMax=%g, want=%d, containment=%d:\ngot: %v\nwant:%v",
   242  				test.dMin, test.dMax, test.want, test.containment, values, test.wantValues)
   243  		}
   244  		if step != test.wantStep {
   245  			t.Errorf("unexpected step for dMin=%g, dMax=%g, want=%d, containment=%d: got:%v want:%v",
   246  				test.dMin, test.dMax, test.want, test.containment, step, test.wantStep)
   247  		}
   248  		if magnitude != test.wantMagnitude {
   249  			t.Errorf("unexpected magnitude for dMin=%g, dMax=%g, want=%d, containment=%d: got:%d want:%d",
   250  				test.dMin, test.dMax, test.want, test.containment, magnitude, test.wantMagnitude)
   251  		}
   252  		if test.containment == containData {
   253  			f := math.Pow10(-magnitude)
   254  			if test.containment == containData && (test.dMin*f < values[0]*f || values[len(values)-1]*f < test.dMax*f) {
   255  				t.Errorf("unexpected values for containment dMin=%g, dMax=%g, want=%d not containment:\ngot: %v\nwant:%v",
   256  					test.dMin, test.dMax, test.want, values, test.wantValues)
   257  			}
   258  		}
   259  	}
   260  }
   261  

View as plain text