gonum.org/v1/gonum@v0.14.0/graph/path/internal/testgraphs/limited_test.go (about)

     1  // Copyright ©2015 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 testgraphs
     6  
     7  import (
     8  	"math"
     9  	"reflect"
    10  	"testing"
    11  
    12  	"gonum.org/v1/gonum/graph"
    13  	"gonum.org/v1/gonum/graph/simple"
    14  )
    15  
    16  type changes struct {
    17  	n graph.Node
    18  
    19  	new, old []simple.WeightedEdge
    20  }
    21  
    22  var limitedVisionTests = []struct {
    23  	g        *Grid
    24  	radius   float64
    25  	diag     bool
    26  	remember bool
    27  
    28  	path []graph.Node
    29  
    30  	want []changes
    31  }{
    32  	{
    33  		g: NewGridFrom(
    34  			"*..*",
    35  			"**.*",
    36  			"**.*",
    37  			"**.*",
    38  		),
    39  		radius:   1,
    40  		diag:     false,
    41  		remember: false,
    42  		path:     []graph.Node{node(1), node(2), node(6), node(10), node(14)},
    43  
    44  		want: []changes{
    45  			{
    46  				n: node(1),
    47  				new: []simple.WeightedEdge{
    48  					{F: simple.Node(0), T: simple.Node(1), W: math.Inf(1)},
    49  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
    50  					{F: simple.Node(1), T: simple.Node(2), W: 1},
    51  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
    52  					{F: simple.Node(2), T: simple.Node(1), W: 1},
    53  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
    54  				},
    55  				old: nil,
    56  			},
    57  			{
    58  				n: node(2),
    59  				new: []simple.WeightedEdge{
    60  					{F: simple.Node(1), T: simple.Node(2), W: 1},
    61  					{F: simple.Node(2), T: simple.Node(1), W: 1},
    62  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
    63  					{F: simple.Node(2), T: simple.Node(6), W: 1},
    64  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
    65  					{F: simple.Node(6), T: simple.Node(2), W: 1},
    66  				},
    67  				old: nil,
    68  			},
    69  			{
    70  				n: node(6),
    71  				new: []simple.WeightedEdge{
    72  					{F: simple.Node(2), T: simple.Node(6), W: 1},
    73  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
    74  					{F: simple.Node(6), T: simple.Node(2), W: 1},
    75  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
    76  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
    77  					{F: simple.Node(6), T: simple.Node(10), W: 1},
    78  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
    79  					{F: simple.Node(10), T: simple.Node(6), W: 1},
    80  				},
    81  				old: nil,
    82  			},
    83  			{
    84  				n: node(10),
    85  				new: []simple.WeightedEdge{
    86  					{F: simple.Node(6), T: simple.Node(10), W: 1},
    87  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
    88  					{F: simple.Node(10), T: simple.Node(6), W: 1},
    89  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
    90  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
    91  					{F: simple.Node(10), T: simple.Node(14), W: 1},
    92  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
    93  					{F: simple.Node(14), T: simple.Node(10), W: 1},
    94  				},
    95  				old: nil,
    96  			},
    97  			{
    98  				n: node(14),
    99  				new: []simple.WeightedEdge{
   100  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   101  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
   102  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   103  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
   104  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
   105  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
   106  				},
   107  				old: nil,
   108  			},
   109  		},
   110  	},
   111  	{
   112  		g: NewGridFrom(
   113  			"*..*",
   114  			"**.*",
   115  			"**.*",
   116  			"**.*",
   117  		),
   118  		radius:   1.5,
   119  		diag:     false,
   120  		remember: false,
   121  		path:     []graph.Node{node(1), node(2), node(6), node(10), node(14)},
   122  
   123  		want: []changes{
   124  			{
   125  				n: node(1),
   126  				new: []simple.WeightedEdge{
   127  					{F: simple.Node(0), T: simple.Node(1), W: math.Inf(1)},
   128  					{F: simple.Node(0), T: simple.Node(4), W: math.Inf(1)},
   129  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   130  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   131  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   132  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   133  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   134  					{F: simple.Node(4), T: simple.Node(0), W: math.Inf(1)},
   135  					{F: simple.Node(4), T: simple.Node(5), W: math.Inf(1)},
   136  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   137  					{F: simple.Node(5), T: simple.Node(4), W: math.Inf(1)},
   138  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   139  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   140  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   141  				},
   142  				old: nil,
   143  			},
   144  			{
   145  				n: node(2),
   146  				new: []simple.WeightedEdge{
   147  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   148  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   149  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   150  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   151  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   152  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
   153  					{F: simple.Node(3), T: simple.Node(7), W: math.Inf(1)},
   154  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   155  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   156  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   157  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   158  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   159  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
   160  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   161  				},
   162  				old: nil,
   163  			},
   164  			{
   165  				n: node(6),
   166  				new: []simple.WeightedEdge{
   167  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   168  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   169  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   170  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   171  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   172  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
   173  					{F: simple.Node(3), T: simple.Node(7), W: math.Inf(1)},
   174  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   175  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   176  					{F: simple.Node(5), T: simple.Node(9), W: math.Inf(1)},
   177  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   178  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   179  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   180  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   181  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
   182  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   183  					{F: simple.Node(7), T: simple.Node(11), W: math.Inf(1)},
   184  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
   185  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   186  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   187  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   188  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   189  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
   190  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   191  				},
   192  				old: nil,
   193  			},
   194  			{
   195  				n: node(10),
   196  				new: []simple.WeightedEdge{
   197  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   198  					{F: simple.Node(5), T: simple.Node(9), W: math.Inf(1)},
   199  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   200  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   201  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   202  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   203  					{F: simple.Node(7), T: simple.Node(11), W: math.Inf(1)},
   204  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
   205  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   206  					{F: simple.Node(9), T: simple.Node(13), W: math.Inf(1)},
   207  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   208  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   209  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   210  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   211  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
   212  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   213  					{F: simple.Node(11), T: simple.Node(15), W: math.Inf(1)},
   214  					{F: simple.Node(13), T: simple.Node(9), W: math.Inf(1)},
   215  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
   216  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   217  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
   218  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
   219  					{F: simple.Node(15), T: simple.Node(11), W: math.Inf(1)},
   220  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
   221  				},
   222  				old: nil,
   223  			},
   224  			{
   225  				n: node(14),
   226  				new: []simple.WeightedEdge{
   227  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   228  					{F: simple.Node(9), T: simple.Node(13), W: math.Inf(1)},
   229  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   230  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   231  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   232  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   233  					{F: simple.Node(11), T: simple.Node(15), W: math.Inf(1)},
   234  					{F: simple.Node(13), T: simple.Node(9), W: math.Inf(1)},
   235  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
   236  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   237  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
   238  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
   239  					{F: simple.Node(15), T: simple.Node(11), W: math.Inf(1)},
   240  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
   241  				},
   242  				old: nil,
   243  			},
   244  		},
   245  	},
   246  	{
   247  		g: NewGridFrom(
   248  			"*..*",
   249  			"**.*",
   250  			"**.*",
   251  			"**.*",
   252  		),
   253  		radius:   1,
   254  		diag:     false,
   255  		remember: true,
   256  		path:     []graph.Node{node(1), node(2), node(6), node(10), node(14)},
   257  
   258  		want: []changes{
   259  			{
   260  				n: node(1),
   261  				new: []simple.WeightedEdge{
   262  					{F: simple.Node(0), T: simple.Node(1), W: math.Inf(1)},
   263  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   264  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   265  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   266  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   267  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   268  				},
   269  				old: nil,
   270  			},
   271  			{
   272  				n: node(2),
   273  				new: []simple.WeightedEdge{
   274  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   275  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   276  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
   277  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   278  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   279  				},
   280  				old: []simple.WeightedEdge{
   281  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   282  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   283  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   284  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   285  				},
   286  			},
   287  			{
   288  				n: node(6),
   289  				new: []simple.WeightedEdge{
   290  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   291  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   292  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
   293  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   294  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   295  				},
   296  				old: []simple.WeightedEdge{
   297  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   298  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   299  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   300  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   301  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   302  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   303  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   304  				},
   305  			},
   306  			{
   307  				n: node(10),
   308  				new: []simple.WeightedEdge{
   309  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
   310  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   311  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   312  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   313  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   314  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
   315  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   316  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   317  				},
   318  				old: []simple.WeightedEdge{
   319  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   320  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   321  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   322  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   323  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   324  				},
   325  			},
   326  			{
   327  				n: node(14),
   328  				new: []simple.WeightedEdge{
   329  					{F: simple.Node(13), T: simple.Node(9), W: math.Inf(1)},
   330  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
   331  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
   332  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
   333  					{F: simple.Node(15), T: simple.Node(11), W: math.Inf(1)},
   334  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
   335  				},
   336  				old: []simple.WeightedEdge{
   337  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   338  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   339  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   340  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   341  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   342  				},
   343  			},
   344  		},
   345  	},
   346  	{
   347  		g: NewGridFrom(
   348  			"*..*",
   349  			"**.*",
   350  			"**.*",
   351  			"**.*",
   352  		),
   353  		radius:   1.5,
   354  		diag:     false,
   355  		remember: true,
   356  		path:     []graph.Node{node(1), node(2), node(6), node(10), node(14)},
   357  
   358  		want: []changes{
   359  			{
   360  				n: node(1),
   361  				new: []simple.WeightedEdge{
   362  					{F: simple.Node(0), T: simple.Node(1), W: math.Inf(1)},
   363  					{F: simple.Node(0), T: simple.Node(4), W: math.Inf(1)},
   364  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   365  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   366  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   367  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   368  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   369  					{F: simple.Node(4), T: simple.Node(0), W: math.Inf(1)},
   370  					{F: simple.Node(4), T: simple.Node(5), W: math.Inf(1)},
   371  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   372  					{F: simple.Node(5), T: simple.Node(4), W: math.Inf(1)},
   373  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   374  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   375  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   376  				},
   377  				old: nil,
   378  			},
   379  			{
   380  				n: node(2),
   381  				new: []simple.WeightedEdge{
   382  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   383  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
   384  					{F: simple.Node(3), T: simple.Node(7), W: math.Inf(1)},
   385  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   386  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
   387  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   388  				},
   389  				old: []simple.WeightedEdge{
   390  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   391  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   392  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   393  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   394  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   395  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   396  					{F: simple.Node(5), T: simple.Node(4), W: math.Inf(1)},
   397  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   398  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   399  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   400  				},
   401  			},
   402  			{
   403  				n: node(6),
   404  				new: []simple.WeightedEdge{
   405  					{F: simple.Node(5), T: simple.Node(9), W: math.Inf(1)},
   406  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   407  					{F: simple.Node(7), T: simple.Node(11), W: math.Inf(1)},
   408  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
   409  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   410  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   411  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   412  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   413  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
   414  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   415  				},
   416  				old: []simple.WeightedEdge{
   417  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   418  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   419  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   420  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   421  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   422  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   423  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
   424  					{F: simple.Node(3), T: simple.Node(7), W: math.Inf(1)},
   425  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   426  					{F: simple.Node(5), T: simple.Node(4), W: math.Inf(1)},
   427  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   428  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   429  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   430  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   431  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
   432  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   433  				},
   434  			},
   435  			{
   436  				n: node(10),
   437  				new: []simple.WeightedEdge{
   438  					{F: simple.Node(9), T: simple.Node(13), W: math.Inf(1)},
   439  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   440  					{F: simple.Node(11), T: simple.Node(15), W: math.Inf(1)},
   441  					{F: simple.Node(13), T: simple.Node(9), W: math.Inf(1)},
   442  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
   443  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   444  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
   445  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
   446  					{F: simple.Node(15), T: simple.Node(11), W: math.Inf(1)},
   447  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
   448  				},
   449  				old: []simple.WeightedEdge{
   450  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   451  					{F: simple.Node(5), T: simple.Node(4), W: math.Inf(1)},
   452  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   453  					{F: simple.Node(5), T: simple.Node(9), W: math.Inf(1)},
   454  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   455  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   456  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   457  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   458  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
   459  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   460  					{F: simple.Node(7), T: simple.Node(11), W: math.Inf(1)},
   461  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
   462  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   463  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   464  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   465  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   466  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
   467  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   468  				},
   469  			},
   470  			{
   471  				n:   node(14),
   472  				new: nil,
   473  				old: []simple.WeightedEdge{
   474  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
   475  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   476  					{F: simple.Node(9), T: simple.Node(13), W: math.Inf(1)},
   477  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   478  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   479  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   480  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   481  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
   482  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   483  					{F: simple.Node(11), T: simple.Node(15), W: math.Inf(1)},
   484  					{F: simple.Node(13), T: simple.Node(9), W: math.Inf(1)},
   485  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
   486  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   487  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
   488  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
   489  					{F: simple.Node(15), T: simple.Node(11), W: math.Inf(1)},
   490  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
   491  				},
   492  			},
   493  		},
   494  	},
   495  	{
   496  		g: NewGridFrom(
   497  			"*..*",
   498  			"**.*",
   499  			"**.*",
   500  			"**.*",
   501  		),
   502  		radius:   1,
   503  		diag:     true,
   504  		remember: false,
   505  		path:     []graph.Node{node(1), node(2), node(6), node(10), node(14)},
   506  
   507  		want: []changes{
   508  			{
   509  				n: node(1),
   510  				new: []simple.WeightedEdge{
   511  					{F: simple.Node(0), T: simple.Node(1), W: math.Inf(1)},
   512  					{F: simple.Node(0), T: simple.Node(5), W: math.Inf(1)},
   513  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   514  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   515  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   516  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   517  					{F: simple.Node(2), T: simple.Node(5), W: math.Inf(1)},
   518  					{F: simple.Node(5), T: simple.Node(0), W: math.Inf(1)},
   519  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   520  					{F: simple.Node(5), T: simple.Node(2), W: math.Inf(1)},
   521  				},
   522  				old: nil,
   523  			},
   524  			{
   525  				n: node(2),
   526  				new: []simple.WeightedEdge{
   527  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   528  					{F: simple.Node(1), T: simple.Node(6), W: math.Sqrt2},
   529  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   530  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   531  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   532  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
   533  					{F: simple.Node(3), T: simple.Node(6), W: math.Inf(1)},
   534  					{F: simple.Node(6), T: simple.Node(1), W: math.Sqrt2},
   535  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   536  					{F: simple.Node(6), T: simple.Node(3), W: math.Inf(1)},
   537  				},
   538  				old: nil,
   539  			},
   540  			{
   541  				n: node(6),
   542  				new: []simple.WeightedEdge{
   543  					{F: simple.Node(2), T: simple.Node(5), W: math.Inf(1)},
   544  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   545  					{F: simple.Node(2), T: simple.Node(7), W: math.Inf(1)},
   546  					{F: simple.Node(5), T: simple.Node(2), W: math.Inf(1)},
   547  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   548  					{F: simple.Node(5), T: simple.Node(10), W: math.Inf(1)},
   549  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   550  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   551  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   552  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   553  					{F: simple.Node(7), T: simple.Node(2), W: math.Inf(1)},
   554  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   555  					{F: simple.Node(7), T: simple.Node(10), W: math.Inf(1)},
   556  					{F: simple.Node(10), T: simple.Node(5), W: math.Inf(1)},
   557  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   558  					{F: simple.Node(10), T: simple.Node(7), W: math.Inf(1)},
   559  				},
   560  				old: nil,
   561  			},
   562  			{
   563  				n: node(10),
   564  				new: []simple.WeightedEdge{
   565  					{F: simple.Node(6), T: simple.Node(9), W: math.Inf(1)},
   566  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   567  					{F: simple.Node(6), T: simple.Node(11), W: math.Inf(1)},
   568  					{F: simple.Node(9), T: simple.Node(6), W: math.Inf(1)},
   569  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   570  					{F: simple.Node(9), T: simple.Node(14), W: math.Inf(1)},
   571  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   572  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   573  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   574  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   575  					{F: simple.Node(11), T: simple.Node(6), W: math.Inf(1)},
   576  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   577  					{F: simple.Node(11), T: simple.Node(14), W: math.Inf(1)},
   578  					{F: simple.Node(14), T: simple.Node(9), W: math.Inf(1)},
   579  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   580  					{F: simple.Node(14), T: simple.Node(11), W: math.Inf(1)},
   581  				},
   582  				old: nil,
   583  			},
   584  			{
   585  				n: node(14),
   586  				new: []simple.WeightedEdge{
   587  					{F: simple.Node(10), T: simple.Node(13), W: math.Inf(1)},
   588  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   589  					{F: simple.Node(10), T: simple.Node(15), W: math.Inf(1)},
   590  					{F: simple.Node(13), T: simple.Node(10), W: math.Inf(1)},
   591  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
   592  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   593  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
   594  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
   595  					{F: simple.Node(15), T: simple.Node(10), W: math.Inf(1)},
   596  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
   597  				},
   598  				old: nil,
   599  			},
   600  		},
   601  	},
   602  	{
   603  		g: NewGridFrom(
   604  			"*..*",
   605  			"**.*",
   606  			"**.*",
   607  			"**.*",
   608  		),
   609  		radius:   1.5,
   610  		diag:     true,
   611  		remember: false,
   612  		path:     []graph.Node{node(1), node(2), node(6), node(10), node(14)},
   613  
   614  		want: []changes{
   615  			{
   616  				n: node(1),
   617  				new: []simple.WeightedEdge{
   618  					{F: simple.Node(0), T: simple.Node(1), W: math.Inf(1)},
   619  					{F: simple.Node(0), T: simple.Node(4), W: math.Inf(1)},
   620  					{F: simple.Node(0), T: simple.Node(5), W: math.Inf(1)},
   621  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   622  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   623  					{F: simple.Node(1), T: simple.Node(4), W: math.Inf(1)},
   624  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   625  					{F: simple.Node(1), T: simple.Node(6), W: math.Sqrt2},
   626  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   627  					{F: simple.Node(2), T: simple.Node(5), W: math.Inf(1)},
   628  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   629  					{F: simple.Node(4), T: simple.Node(0), W: math.Inf(1)},
   630  					{F: simple.Node(4), T: simple.Node(1), W: math.Inf(1)},
   631  					{F: simple.Node(4), T: simple.Node(5), W: math.Inf(1)},
   632  					{F: simple.Node(5), T: simple.Node(0), W: math.Inf(1)},
   633  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   634  					{F: simple.Node(5), T: simple.Node(2), W: math.Inf(1)},
   635  					{F: simple.Node(5), T: simple.Node(4), W: math.Inf(1)},
   636  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   637  					{F: simple.Node(6), T: simple.Node(1), W: math.Sqrt2},
   638  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   639  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   640  				},
   641  				old: nil,
   642  			},
   643  			{
   644  				n: node(2),
   645  				new: []simple.WeightedEdge{
   646  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   647  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   648  					{F: simple.Node(1), T: simple.Node(6), W: math.Sqrt2},
   649  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   650  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   651  					{F: simple.Node(2), T: simple.Node(5), W: math.Inf(1)},
   652  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   653  					{F: simple.Node(2), T: simple.Node(7), W: math.Inf(1)},
   654  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
   655  					{F: simple.Node(3), T: simple.Node(6), W: math.Inf(1)},
   656  					{F: simple.Node(3), T: simple.Node(7), W: math.Inf(1)},
   657  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   658  					{F: simple.Node(5), T: simple.Node(2), W: math.Inf(1)},
   659  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   660  					{F: simple.Node(6), T: simple.Node(1), W: math.Sqrt2},
   661  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   662  					{F: simple.Node(6), T: simple.Node(3), W: math.Inf(1)},
   663  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   664  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   665  					{F: simple.Node(7), T: simple.Node(2), W: math.Inf(1)},
   666  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
   667  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   668  				},
   669  				old: nil,
   670  			},
   671  			{
   672  				n: node(6),
   673  				new: []simple.WeightedEdge{
   674  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   675  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   676  					{F: simple.Node(1), T: simple.Node(6), W: math.Sqrt2},
   677  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   678  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   679  					{F: simple.Node(2), T: simple.Node(5), W: math.Inf(1)},
   680  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   681  					{F: simple.Node(2), T: simple.Node(7), W: math.Inf(1)},
   682  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
   683  					{F: simple.Node(3), T: simple.Node(6), W: math.Inf(1)},
   684  					{F: simple.Node(3), T: simple.Node(7), W: math.Inf(1)},
   685  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   686  					{F: simple.Node(5), T: simple.Node(2), W: math.Inf(1)},
   687  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   688  					{F: simple.Node(5), T: simple.Node(9), W: math.Inf(1)},
   689  					{F: simple.Node(5), T: simple.Node(10), W: math.Inf(1)},
   690  					{F: simple.Node(6), T: simple.Node(1), W: math.Sqrt2},
   691  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   692  					{F: simple.Node(6), T: simple.Node(3), W: math.Inf(1)},
   693  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   694  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   695  					{F: simple.Node(6), T: simple.Node(9), W: math.Inf(1)},
   696  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   697  					{F: simple.Node(6), T: simple.Node(11), W: math.Inf(1)},
   698  					{F: simple.Node(7), T: simple.Node(2), W: math.Inf(1)},
   699  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
   700  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   701  					{F: simple.Node(7), T: simple.Node(10), W: math.Inf(1)},
   702  					{F: simple.Node(7), T: simple.Node(11), W: math.Inf(1)},
   703  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
   704  					{F: simple.Node(9), T: simple.Node(6), W: math.Inf(1)},
   705  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   706  					{F: simple.Node(10), T: simple.Node(5), W: math.Inf(1)},
   707  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   708  					{F: simple.Node(10), T: simple.Node(7), W: math.Inf(1)},
   709  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   710  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   711  					{F: simple.Node(11), T: simple.Node(6), W: math.Inf(1)},
   712  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
   713  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   714  				},
   715  				old: nil,
   716  			},
   717  			{
   718  				n: node(10),
   719  				new: []simple.WeightedEdge{
   720  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   721  					{F: simple.Node(5), T: simple.Node(9), W: math.Inf(1)},
   722  					{F: simple.Node(5), T: simple.Node(10), W: math.Inf(1)},
   723  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   724  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   725  					{F: simple.Node(6), T: simple.Node(9), W: math.Inf(1)},
   726  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   727  					{F: simple.Node(6), T: simple.Node(11), W: math.Inf(1)},
   728  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   729  					{F: simple.Node(7), T: simple.Node(10), W: math.Inf(1)},
   730  					{F: simple.Node(7), T: simple.Node(11), W: math.Inf(1)},
   731  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
   732  					{F: simple.Node(9), T: simple.Node(6), W: math.Inf(1)},
   733  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   734  					{F: simple.Node(9), T: simple.Node(13), W: math.Inf(1)},
   735  					{F: simple.Node(9), T: simple.Node(14), W: math.Inf(1)},
   736  					{F: simple.Node(10), T: simple.Node(5), W: math.Inf(1)},
   737  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   738  					{F: simple.Node(10), T: simple.Node(7), W: math.Inf(1)},
   739  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   740  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   741  					{F: simple.Node(10), T: simple.Node(13), W: math.Inf(1)},
   742  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   743  					{F: simple.Node(10), T: simple.Node(15), W: math.Inf(1)},
   744  					{F: simple.Node(11), T: simple.Node(6), W: math.Inf(1)},
   745  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
   746  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   747  					{F: simple.Node(11), T: simple.Node(14), W: math.Inf(1)},
   748  					{F: simple.Node(11), T: simple.Node(15), W: math.Inf(1)},
   749  					{F: simple.Node(13), T: simple.Node(9), W: math.Inf(1)},
   750  					{F: simple.Node(13), T: simple.Node(10), W: math.Inf(1)},
   751  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
   752  					{F: simple.Node(14), T: simple.Node(9), W: math.Inf(1)},
   753  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   754  					{F: simple.Node(14), T: simple.Node(11), W: math.Inf(1)},
   755  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
   756  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
   757  					{F: simple.Node(15), T: simple.Node(10), W: math.Inf(1)},
   758  					{F: simple.Node(15), T: simple.Node(11), W: math.Inf(1)},
   759  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
   760  				},
   761  				old: nil,
   762  			},
   763  			{
   764  				n: node(14),
   765  				new: []simple.WeightedEdge{
   766  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   767  					{F: simple.Node(9), T: simple.Node(13), W: math.Inf(1)},
   768  					{F: simple.Node(9), T: simple.Node(14), W: math.Inf(1)},
   769  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   770  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   771  					{F: simple.Node(10), T: simple.Node(13), W: math.Inf(1)},
   772  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   773  					{F: simple.Node(10), T: simple.Node(15), W: math.Inf(1)},
   774  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   775  					{F: simple.Node(11), T: simple.Node(14), W: math.Inf(1)},
   776  					{F: simple.Node(11), T: simple.Node(15), W: math.Inf(1)},
   777  					{F: simple.Node(13), T: simple.Node(9), W: math.Inf(1)},
   778  					{F: simple.Node(13), T: simple.Node(10), W: math.Inf(1)},
   779  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
   780  					{F: simple.Node(14), T: simple.Node(9), W: math.Inf(1)},
   781  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   782  					{F: simple.Node(14), T: simple.Node(11), W: math.Inf(1)},
   783  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
   784  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
   785  					{F: simple.Node(15), T: simple.Node(10), W: math.Inf(1)},
   786  					{F: simple.Node(15), T: simple.Node(11), W: math.Inf(1)},
   787  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
   788  				},
   789  				old: nil,
   790  			},
   791  		},
   792  	},
   793  	{
   794  		g: NewGridFrom(
   795  			"*..*",
   796  			"**.*",
   797  			"**.*",
   798  			"**.*",
   799  		),
   800  		radius:   1,
   801  		diag:     true,
   802  		remember: true,
   803  		path:     []graph.Node{node(1), node(2), node(6), node(10), node(14)},
   804  
   805  		want: []changes{
   806  			{
   807  				n: node(1),
   808  				new: []simple.WeightedEdge{
   809  					{F: simple.Node(0), T: simple.Node(1), W: math.Inf(1)},
   810  					{F: simple.Node(0), T: simple.Node(5), W: math.Inf(1)},
   811  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   812  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   813  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   814  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   815  					{F: simple.Node(2), T: simple.Node(5), W: math.Inf(1)},
   816  					{F: simple.Node(5), T: simple.Node(0), W: math.Inf(1)},
   817  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   818  					{F: simple.Node(5), T: simple.Node(2), W: math.Inf(1)},
   819  				},
   820  				old: nil,
   821  			},
   822  			{
   823  				n: node(2),
   824  				new: []simple.WeightedEdge{
   825  					{F: simple.Node(1), T: simple.Node(6), W: math.Sqrt2},
   826  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   827  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   828  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
   829  					{F: simple.Node(3), T: simple.Node(6), W: math.Inf(1)},
   830  					{F: simple.Node(6), T: simple.Node(1), W: math.Sqrt2},
   831  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   832  					{F: simple.Node(6), T: simple.Node(3), W: math.Inf(1)},
   833  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   834  				},
   835  				old: []simple.WeightedEdge{
   836  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   837  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   838  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   839  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   840  					{F: simple.Node(2), T: simple.Node(5), W: math.Inf(1)},
   841  				},
   842  			},
   843  			{
   844  				n: node(6),
   845  				new: []simple.WeightedEdge{
   846  					{F: simple.Node(2), T: simple.Node(7), W: math.Inf(1)},
   847  					{F: simple.Node(5), T: simple.Node(10), W: math.Inf(1)},
   848  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   849  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   850  					{F: simple.Node(7), T: simple.Node(2), W: math.Inf(1)},
   851  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
   852  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   853  					{F: simple.Node(7), T: simple.Node(10), W: math.Inf(1)},
   854  					{F: simple.Node(10), T: simple.Node(5), W: math.Inf(1)},
   855  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   856  					{F: simple.Node(10), T: simple.Node(7), W: math.Inf(1)},
   857  				},
   858  				old: []simple.WeightedEdge{
   859  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   860  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   861  					{F: simple.Node(2), T: simple.Node(5), W: math.Inf(1)},
   862  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   863  					{F: simple.Node(5), T: simple.Node(0), W: math.Inf(1)},
   864  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   865  					{F: simple.Node(5), T: simple.Node(2), W: math.Inf(1)},
   866  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   867  					{F: simple.Node(6), T: simple.Node(1), W: math.Sqrt2},
   868  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   869  					{F: simple.Node(6), T: simple.Node(3), W: math.Inf(1)},
   870  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   871  				},
   872  			},
   873  			{
   874  				n: node(10),
   875  				new: []simple.WeightedEdge{
   876  					{F: simple.Node(6), T: simple.Node(9), W: math.Inf(1)},
   877  					{F: simple.Node(6), T: simple.Node(11), W: math.Inf(1)},
   878  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
   879  					{F: simple.Node(9), T: simple.Node(6), W: math.Inf(1)},
   880  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
   881  					{F: simple.Node(9), T: simple.Node(14), W: math.Inf(1)},
   882  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   883  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   884  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   885  					{F: simple.Node(11), T: simple.Node(6), W: math.Inf(1)},
   886  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
   887  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
   888  					{F: simple.Node(11), T: simple.Node(14), W: math.Inf(1)},
   889  					{F: simple.Node(14), T: simple.Node(9), W: math.Inf(1)},
   890  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   891  					{F: simple.Node(14), T: simple.Node(11), W: math.Inf(1)},
   892  				},
   893  				old: []simple.WeightedEdge{
   894  					{F: simple.Node(6), T: simple.Node(1), W: math.Sqrt2},
   895  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   896  					{F: simple.Node(6), T: simple.Node(3), W: math.Inf(1)},
   897  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   898  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   899  					{F: simple.Node(6), T: simple.Node(10), W: 1},
   900  					{F: simple.Node(10), T: simple.Node(5), W: math.Inf(1)},
   901  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   902  					{F: simple.Node(10), T: simple.Node(7), W: math.Inf(1)},
   903  				},
   904  			},
   905  			{
   906  				n: node(14),
   907  				new: []simple.WeightedEdge{
   908  					{F: simple.Node(10), T: simple.Node(13), W: math.Inf(1)},
   909  					{F: simple.Node(10), T: simple.Node(15), W: math.Inf(1)},
   910  					{F: simple.Node(13), T: simple.Node(9), W: math.Inf(1)},
   911  					{F: simple.Node(13), T: simple.Node(10), W: math.Inf(1)},
   912  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
   913  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
   914  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
   915  					{F: simple.Node(15), T: simple.Node(10), W: math.Inf(1)},
   916  					{F: simple.Node(15), T: simple.Node(11), W: math.Inf(1)},
   917  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
   918  				},
   919  				old: []simple.WeightedEdge{
   920  					{F: simple.Node(10), T: simple.Node(5), W: math.Inf(1)},
   921  					{F: simple.Node(10), T: simple.Node(6), W: 1},
   922  					{F: simple.Node(10), T: simple.Node(7), W: math.Inf(1)},
   923  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
   924  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
   925  					{F: simple.Node(10), T: simple.Node(14), W: 1},
   926  					{F: simple.Node(14), T: simple.Node(9), W: math.Inf(1)},
   927  					{F: simple.Node(14), T: simple.Node(10), W: 1},
   928  					{F: simple.Node(14), T: simple.Node(11), W: math.Inf(1)},
   929  				},
   930  			},
   931  		},
   932  	},
   933  	{
   934  		g: NewGridFrom(
   935  			"*..*",
   936  			"**.*",
   937  			"**.*",
   938  			"**.*",
   939  		),
   940  		radius:   1.5,
   941  		diag:     true,
   942  		remember: true,
   943  		path:     []graph.Node{node(1), node(2), node(6), node(10), node(14)},
   944  
   945  		want: []changes{
   946  			{
   947  				n: node(1),
   948  				new: []simple.WeightedEdge{
   949  					{F: simple.Node(0), T: simple.Node(1), W: math.Inf(1)},
   950  					{F: simple.Node(0), T: simple.Node(4), W: math.Inf(1)},
   951  					{F: simple.Node(0), T: simple.Node(5), W: math.Inf(1)},
   952  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   953  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   954  					{F: simple.Node(1), T: simple.Node(4), W: math.Inf(1)},
   955  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   956  					{F: simple.Node(1), T: simple.Node(6), W: math.Sqrt2},
   957  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   958  					{F: simple.Node(2), T: simple.Node(5), W: math.Inf(1)},
   959  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   960  					{F: simple.Node(4), T: simple.Node(0), W: math.Inf(1)},
   961  					{F: simple.Node(4), T: simple.Node(1), W: math.Inf(1)},
   962  					{F: simple.Node(4), T: simple.Node(5), W: math.Inf(1)},
   963  					{F: simple.Node(5), T: simple.Node(0), W: math.Inf(1)},
   964  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   965  					{F: simple.Node(5), T: simple.Node(2), W: math.Inf(1)},
   966  					{F: simple.Node(5), T: simple.Node(4), W: math.Inf(1)},
   967  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
   968  					{F: simple.Node(6), T: simple.Node(1), W: math.Sqrt2},
   969  					{F: simple.Node(6), T: simple.Node(2), W: 1},
   970  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
   971  				},
   972  				old: nil,
   973  			},
   974  			{
   975  				n: node(2),
   976  				new: []simple.WeightedEdge{
   977  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
   978  					{F: simple.Node(2), T: simple.Node(7), W: math.Inf(1)},
   979  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
   980  					{F: simple.Node(3), T: simple.Node(6), W: math.Inf(1)},
   981  					{F: simple.Node(3), T: simple.Node(7), W: math.Inf(1)},
   982  					{F: simple.Node(6), T: simple.Node(3), W: math.Inf(1)},
   983  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
   984  					{F: simple.Node(7), T: simple.Node(2), W: math.Inf(1)},
   985  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
   986  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
   987  				},
   988  				old: []simple.WeightedEdge{
   989  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
   990  					{F: simple.Node(1), T: simple.Node(2), W: 1},
   991  					{F: simple.Node(1), T: simple.Node(4), W: math.Inf(1)},
   992  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
   993  					{F: simple.Node(1), T: simple.Node(6), W: math.Sqrt2},
   994  					{F: simple.Node(2), T: simple.Node(1), W: 1},
   995  					{F: simple.Node(2), T: simple.Node(5), W: math.Inf(1)},
   996  					{F: simple.Node(2), T: simple.Node(6), W: 1},
   997  					{F: simple.Node(5), T: simple.Node(0), W: math.Inf(1)},
   998  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
   999  					{F: simple.Node(5), T: simple.Node(2), W: math.Inf(1)},
  1000  					{F: simple.Node(5), T: simple.Node(4), W: math.Inf(1)},
  1001  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
  1002  					{F: simple.Node(6), T: simple.Node(1), W: math.Sqrt2},
  1003  					{F: simple.Node(6), T: simple.Node(2), W: 1},
  1004  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
  1005  				},
  1006  			},
  1007  			{
  1008  				n: node(6),
  1009  				new: []simple.WeightedEdge{
  1010  					{F: simple.Node(5), T: simple.Node(9), W: math.Inf(1)},
  1011  					{F: simple.Node(5), T: simple.Node(10), W: math.Inf(1)},
  1012  					{F: simple.Node(6), T: simple.Node(9), W: math.Inf(1)},
  1013  					{F: simple.Node(6), T: simple.Node(10), W: 1},
  1014  					{F: simple.Node(6), T: simple.Node(11), W: math.Inf(1)},
  1015  					{F: simple.Node(7), T: simple.Node(10), W: math.Inf(1)},
  1016  					{F: simple.Node(7), T: simple.Node(11), W: math.Inf(1)},
  1017  					{F: simple.Node(9), T: simple.Node(4), W: math.Inf(1)},
  1018  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
  1019  					{F: simple.Node(9), T: simple.Node(6), W: math.Inf(1)},
  1020  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
  1021  					{F: simple.Node(10), T: simple.Node(5), W: math.Inf(1)},
  1022  					{F: simple.Node(10), T: simple.Node(6), W: 1},
  1023  					{F: simple.Node(10), T: simple.Node(7), W: math.Inf(1)},
  1024  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
  1025  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
  1026  					{F: simple.Node(11), T: simple.Node(6), W: math.Inf(1)},
  1027  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
  1028  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
  1029  				},
  1030  				old: []simple.WeightedEdge{
  1031  					{F: simple.Node(1), T: simple.Node(0), W: math.Inf(1)},
  1032  					{F: simple.Node(1), T: simple.Node(2), W: 1},
  1033  					{F: simple.Node(1), T: simple.Node(4), W: math.Inf(1)},
  1034  					{F: simple.Node(1), T: simple.Node(5), W: math.Inf(1)},
  1035  					{F: simple.Node(1), T: simple.Node(6), W: math.Sqrt2},
  1036  					{F: simple.Node(2), T: simple.Node(1), W: 1},
  1037  					{F: simple.Node(2), T: simple.Node(3), W: math.Inf(1)},
  1038  					{F: simple.Node(2), T: simple.Node(5), W: math.Inf(1)},
  1039  					{F: simple.Node(2), T: simple.Node(6), W: 1},
  1040  					{F: simple.Node(2), T: simple.Node(7), W: math.Inf(1)},
  1041  					{F: simple.Node(3), T: simple.Node(2), W: math.Inf(1)},
  1042  					{F: simple.Node(3), T: simple.Node(6), W: math.Inf(1)},
  1043  					{F: simple.Node(3), T: simple.Node(7), W: math.Inf(1)},
  1044  					{F: simple.Node(5), T: simple.Node(0), W: math.Inf(1)},
  1045  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
  1046  					{F: simple.Node(5), T: simple.Node(2), W: math.Inf(1)},
  1047  					{F: simple.Node(5), T: simple.Node(4), W: math.Inf(1)},
  1048  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
  1049  					{F: simple.Node(6), T: simple.Node(1), W: math.Sqrt2},
  1050  					{F: simple.Node(6), T: simple.Node(2), W: 1},
  1051  					{F: simple.Node(6), T: simple.Node(3), W: math.Inf(1)},
  1052  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
  1053  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
  1054  					{F: simple.Node(7), T: simple.Node(2), W: math.Inf(1)},
  1055  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
  1056  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
  1057  				},
  1058  			},
  1059  			{
  1060  				n: node(10),
  1061  				new: []simple.WeightedEdge{
  1062  					{F: simple.Node(9), T: simple.Node(13), W: math.Inf(1)},
  1063  					{F: simple.Node(9), T: simple.Node(14), W: math.Inf(1)},
  1064  					{F: simple.Node(10), T: simple.Node(13), W: math.Inf(1)},
  1065  					{F: simple.Node(10), T: simple.Node(14), W: 1},
  1066  					{F: simple.Node(10), T: simple.Node(15), W: math.Inf(1)},
  1067  					{F: simple.Node(11), T: simple.Node(14), W: math.Inf(1)},
  1068  					{F: simple.Node(11), T: simple.Node(15), W: math.Inf(1)},
  1069  					{F: simple.Node(13), T: simple.Node(9), W: math.Inf(1)},
  1070  					{F: simple.Node(13), T: simple.Node(10), W: math.Inf(1)},
  1071  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
  1072  					{F: simple.Node(14), T: simple.Node(9), W: math.Inf(1)},
  1073  					{F: simple.Node(14), T: simple.Node(10), W: 1},
  1074  					{F: simple.Node(14), T: simple.Node(11), W: math.Inf(1)},
  1075  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
  1076  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
  1077  					{F: simple.Node(15), T: simple.Node(10), W: math.Inf(1)},
  1078  					{F: simple.Node(15), T: simple.Node(11), W: math.Inf(1)},
  1079  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
  1080  				},
  1081  				old: []simple.WeightedEdge{
  1082  					{F: simple.Node(5), T: simple.Node(0), W: math.Inf(1)},
  1083  					{F: simple.Node(5), T: simple.Node(1), W: math.Inf(1)},
  1084  					{F: simple.Node(5), T: simple.Node(2), W: math.Inf(1)},
  1085  					{F: simple.Node(5), T: simple.Node(4), W: math.Inf(1)},
  1086  					{F: simple.Node(5), T: simple.Node(6), W: math.Inf(1)},
  1087  					{F: simple.Node(5), T: simple.Node(9), W: math.Inf(1)},
  1088  					{F: simple.Node(5), T: simple.Node(10), W: math.Inf(1)},
  1089  					{F: simple.Node(6), T: simple.Node(1), W: math.Sqrt2},
  1090  					{F: simple.Node(6), T: simple.Node(2), W: 1},
  1091  					{F: simple.Node(6), T: simple.Node(3), W: math.Inf(1)},
  1092  					{F: simple.Node(6), T: simple.Node(5), W: math.Inf(1)},
  1093  					{F: simple.Node(6), T: simple.Node(7), W: math.Inf(1)},
  1094  					{F: simple.Node(6), T: simple.Node(9), W: math.Inf(1)},
  1095  					{F: simple.Node(6), T: simple.Node(10), W: 1},
  1096  					{F: simple.Node(6), T: simple.Node(11), W: math.Inf(1)},
  1097  					{F: simple.Node(7), T: simple.Node(2), W: math.Inf(1)},
  1098  					{F: simple.Node(7), T: simple.Node(3), W: math.Inf(1)},
  1099  					{F: simple.Node(7), T: simple.Node(6), W: math.Inf(1)},
  1100  					{F: simple.Node(7), T: simple.Node(10), W: math.Inf(1)},
  1101  					{F: simple.Node(7), T: simple.Node(11), W: math.Inf(1)},
  1102  					{F: simple.Node(9), T: simple.Node(4), W: math.Inf(1)},
  1103  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
  1104  					{F: simple.Node(9), T: simple.Node(6), W: math.Inf(1)},
  1105  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
  1106  					{F: simple.Node(10), T: simple.Node(5), W: math.Inf(1)},
  1107  					{F: simple.Node(10), T: simple.Node(6), W: 1},
  1108  					{F: simple.Node(10), T: simple.Node(7), W: math.Inf(1)},
  1109  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
  1110  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
  1111  					{F: simple.Node(11), T: simple.Node(6), W: math.Inf(1)},
  1112  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
  1113  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
  1114  				},
  1115  			},
  1116  			{
  1117  				n:   node(14),
  1118  				new: nil,
  1119  				old: []simple.WeightedEdge{
  1120  					{F: simple.Node(9), T: simple.Node(4), W: math.Inf(1)},
  1121  					{F: simple.Node(9), T: simple.Node(5), W: math.Inf(1)},
  1122  					{F: simple.Node(9), T: simple.Node(6), W: math.Inf(1)},
  1123  					{F: simple.Node(9), T: simple.Node(10), W: math.Inf(1)},
  1124  					{F: simple.Node(9), T: simple.Node(13), W: math.Inf(1)},
  1125  					{F: simple.Node(9), T: simple.Node(14), W: math.Inf(1)},
  1126  					{F: simple.Node(10), T: simple.Node(5), W: math.Inf(1)},
  1127  					{F: simple.Node(10), T: simple.Node(6), W: 1},
  1128  					{F: simple.Node(10), T: simple.Node(7), W: math.Inf(1)},
  1129  					{F: simple.Node(10), T: simple.Node(9), W: math.Inf(1)},
  1130  					{F: simple.Node(10), T: simple.Node(11), W: math.Inf(1)},
  1131  					{F: simple.Node(10), T: simple.Node(13), W: math.Inf(1)},
  1132  					{F: simple.Node(10), T: simple.Node(14), W: 1},
  1133  					{F: simple.Node(10), T: simple.Node(15), W: math.Inf(1)},
  1134  					{F: simple.Node(11), T: simple.Node(6), W: math.Inf(1)},
  1135  					{F: simple.Node(11), T: simple.Node(7), W: math.Inf(1)},
  1136  					{F: simple.Node(11), T: simple.Node(10), W: math.Inf(1)},
  1137  					{F: simple.Node(11), T: simple.Node(14), W: math.Inf(1)},
  1138  					{F: simple.Node(11), T: simple.Node(15), W: math.Inf(1)},
  1139  					{F: simple.Node(13), T: simple.Node(9), W: math.Inf(1)},
  1140  					{F: simple.Node(13), T: simple.Node(10), W: math.Inf(1)},
  1141  					{F: simple.Node(13), T: simple.Node(14), W: math.Inf(1)},
  1142  					{F: simple.Node(14), T: simple.Node(9), W: math.Inf(1)},
  1143  					{F: simple.Node(14), T: simple.Node(10), W: 1},
  1144  					{F: simple.Node(14), T: simple.Node(11), W: math.Inf(1)},
  1145  					{F: simple.Node(14), T: simple.Node(13), W: math.Inf(1)},
  1146  					{F: simple.Node(14), T: simple.Node(15), W: math.Inf(1)},
  1147  					{F: simple.Node(15), T: simple.Node(10), W: math.Inf(1)},
  1148  					{F: simple.Node(15), T: simple.Node(11), W: math.Inf(1)},
  1149  					{F: simple.Node(15), T: simple.Node(14), W: math.Inf(1)},
  1150  				},
  1151  			},
  1152  		},
  1153  	},
  1154  }
  1155  
  1156  func TestLimitedVisionGrid(t *testing.T) {
  1157  	t.Parallel()
  1158  	for i, test := range limitedVisionTests {
  1159  		l := &LimitedVisionGrid{
  1160  			Grid:         test.g,
  1161  			VisionRadius: test.radius,
  1162  			Location:     test.path[0],
  1163  		}
  1164  		if test.remember {
  1165  			l.Known = make(map[int64]bool)
  1166  		}
  1167  		l.Grid.AllowDiagonal = test.diag
  1168  
  1169  		x, y := l.XY(test.path[0].ID())
  1170  		nodes := graph.NodesOf(l.Nodes())
  1171  		for _, u := range nodes {
  1172  			uid := u.ID()
  1173  			ux, uy := l.XY(uid)
  1174  			uNear := math.Hypot(x-ux, y-uy) <= test.radius
  1175  			for _, v := range nodes {
  1176  				vid := v.ID()
  1177  				vx, vy := l.XY(vid)
  1178  				vNear := math.Hypot(x-vx, y-vy) <= test.radius
  1179  				if u.ID() == v.ID() && l.HasEdgeBetween(uid, vid) {
  1180  					t.Errorf("unexpected self edge: %v -- %v", u, v)
  1181  				}
  1182  				if !uNear && !vNear && !l.HasEdgeBetween(uid, vid) && couldConnectIn(l, uid, vid) {
  1183  					t.Errorf("unexpected pessimism: no hope in distant edge between %v and %v for test %d",
  1184  						u, v, i)
  1185  				}
  1186  				if (uNear && vNear) && l.HasEdgeBetween(uid, vid) != l.Grid.HasEdgeBetween(uid, vid) {
  1187  					t.Errorf("unrealistic optimism: disagreement about edge between %v and %v for test %d: got:%t want:%t",
  1188  						u, v, i, l.HasEdgeBetween(uid, vid), l.Grid.HasEdgeBetween(uid, vid))
  1189  				}
  1190  			}
  1191  		}
  1192  
  1193  		var got []changes
  1194  		for _, n := range test.path {
  1195  			new, old := l.MoveTo(n)
  1196  			got = append(got, changes{n: n, new: asConcreteEdges(new, l), old: asConcreteEdges(old, l)})
  1197  		}
  1198  		if !reflect.DeepEqual(got, test.want) {
  1199  			t.Errorf("unexpected walk for test %d:\ngot: %+v\nwant:%+v", i, got, test.want)
  1200  		}
  1201  	}
  1202  }
  1203  
  1204  func asConcreteEdges(changes []graph.Edge, in graph.Weighted) []simple.WeightedEdge {
  1205  	if changes == nil {
  1206  		return nil
  1207  	}
  1208  	we := make([]simple.WeightedEdge, len(changes))
  1209  	for i, e := range changes {
  1210  		we[i].F = e.From()
  1211  		we[i].T = e.To()
  1212  		w, ok := in.Weight(e.From().ID(), e.To().ID())
  1213  		if !ok && !math.IsInf(w, 1) {
  1214  			panic("unexpected invalid finite weight")
  1215  		}
  1216  		we[i].W = w
  1217  	}
  1218  	return we
  1219  }
  1220  
  1221  func couldConnectIn(l *LimitedVisionGrid, uid, vid int64) bool {
  1222  	if uid == vid {
  1223  		return false
  1224  	}
  1225  
  1226  	ur, uc := l.RowCol(uid)
  1227  	vr, vc := l.RowCol(vid)
  1228  	if abs(ur-vr) > 1 || abs(uc-vc) > 1 {
  1229  		return false
  1230  	}
  1231  	if (ur != vr || uc != vc) && !l.Grid.AllowDiagonal {
  1232  		return false
  1233  	}
  1234  
  1235  	if !l.Known[uid] && !l.Known[vid] {
  1236  		return true
  1237  	}
  1238  	if l.Known[uid] && !l.Grid.HasOpen(uid) {
  1239  		return false
  1240  	}
  1241  	if l.Known[vid] && !l.Grid.HasOpen(vid) {
  1242  		return false
  1243  	}
  1244  
  1245  	return true
  1246  }