github.com/joshprzybyszewski/masyu@v0.0.0-20230508015604-f31a025f6e7e/solve/crossings_test.go (about)

     1  package solve
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/joshprzybyszewski/masyu/model"
     7  	"github.com/stretchr/testify/assert"
     8  )
     9  
    10  func TestCrossings(t *testing.T) {
    11  	// This is puzz 3,368,748
    12  	s := newState(
    13  		model.Size(8),
    14  		puzz8x8_3368748_Nodes,
    15  	)
    16  
    17  	expString := `0 X 1 X 2 X 3 X 4 X 5 X 6 X 7 X 8 X 9 X 
    18  X   X   X   X   X   X   X   X   X   X   
    19  1 X * - *   *   *   B   *   * - * X     
    20  X   |                           |   X   
    21  2 X W X *   *   *   *   W   * X W X     
    22  X   |                           |   X   
    23  3 X *   *   *   *   *   *   *   * X     
    24  X                                   X   
    25  4 X *   W   W   *   W   *   *   * X     
    26  X                           |   |   X   
    27  5 X *   *   *   *   W   * X * X * X     
    28  X                       X   |   |   X   
    29  6 X *   *   W   *   * - * - B X * X     
    30  X                       X   X   |   X   
    31  7 X *   *   W   *   *   * X * X * X     
    32  X   |   X                   X   |   X   
    33  8 X * - W - *   *   *   * - * - B X     
    34  X   X   X   X   X   X   X   X   X   X   
    35  9 X   X   X   X   X   X   X   X   X   X 
    36  X                                   X   
    37  `
    38  
    39  	assert.Equal(t, expString, s.String())
    40  
    41  	assert.Equal(t, model.Dimension(2), s.crossings.cols[1])
    42  	assert.Equal(t, model.Dimension(1), s.crossings.colsAvoid[1])
    43  
    44  	assert.Equal(t, model.Dimension(1), s.crossings.cols[2])
    45  	assert.Equal(t, model.Dimension(0), s.crossings.colsAvoid[2])
    46  
    47  	assert.Equal(t, model.Dimension(1), s.crossings.cols[5])
    48  	assert.Equal(t, model.Dimension(0), s.crossings.colsAvoid[5])
    49  
    50  	assert.Equal(t, model.Dimension(2), s.crossings.cols[6])
    51  	assert.Equal(t, model.Dimension(2), s.crossings.colsAvoid[6])
    52  
    53  	assert.Equal(t, model.Dimension(2), s.crossings.cols[7])
    54  	assert.Equal(t, model.Dimension(4), s.crossings.colsAvoid[7])
    55  
    56  	_ = checkEntireRuleset(&s)
    57  	ss := settle(&s)
    58  	assert.Equal(t, validUnsolved, ss)
    59  
    60  	assert.Equal(t, model.Dimension(2), s.crossings.cols[1])
    61  	assert.Equal(t, model.Dimension(1), s.crossings.colsAvoid[1])
    62  
    63  	assert.Equal(t, model.Dimension(1), s.crossings.cols[2])
    64  	assert.Equal(t, model.Dimension(0), s.crossings.colsAvoid[2])
    65  
    66  	assert.Equal(t, model.Dimension(1), s.crossings.cols[5])
    67  	assert.Equal(t, model.Dimension(0), s.crossings.colsAvoid[5])
    68  
    69  	assert.Equal(t, model.Dimension(2), s.crossings.cols[6])
    70  	assert.Equal(t, model.Dimension(2), s.crossings.colsAvoid[6])
    71  
    72  	assert.Equal(t, model.Dimension(2), s.crossings.cols[7])
    73  	assert.Equal(t, model.Dimension(4), s.crossings.colsAvoid[7])
    74  
    75  	pf := newPermutationsFactory()
    76  	pf.populate(&s)
    77  
    78  	assert.Equal(t, uint16(2), pf.numVals)
    79  
    80  	beforeAll := s
    81  	for i := uint16(0); i < pf.numVals; i++ {
    82  		pf.vals[i](&s)
    83  		t.Logf("Permutation %d:\n%s\n\n", i, &s)
    84  		if i < pf.numVals-1 {
    85  			assert.Equal(t, model.Dimension(4), s.crossings.cols[7], "for permutation %d", i)
    86  			assert.Equal(t, model.Dimension(4), s.crossings.colsAvoid[7], "for permutation %d", i)
    87  		} else {
    88  			assert.Equal(t, model.Dimension(2), s.crossings.cols[7], "for permutation %d", i)
    89  			assert.Equal(t, model.Dimension(6), s.crossings.colsAvoid[7], "for permutation %d", i)
    90  		}
    91  		_ = checkEntireRuleset(&s)
    92  		ss := settle(&s)
    93  		if i < pf.numVals-1 {
    94  			assert.Equal(t, model.Dimension(4), s.crossings.cols[7], "for permutation %d", i)
    95  			assert.Equal(t, model.Dimension(4), s.crossings.colsAvoid[7], "for permutation %d", i)
    96  		} else {
    97  			assert.Equal(t, model.Dimension(2), s.crossings.cols[7], "for permutation %d", i)
    98  			assert.Equal(t, model.Dimension(6), s.crossings.colsAvoid[7], "for permutation %d", i)
    99  		}
   100  		t.Logf("Permutation %d Settled:\n%s\n\n", i, &s)
   101  		assert.Equal(t, validUnsolved, ss, "for permutation %d", i)
   102  		s = beforeAll
   103  	}
   104  
   105  	t.Logf("Original:\n%s\n\n", &s)
   106  	assert.Equal(t, expString, s.String())
   107  }
   108  
   109  var (
   110  	puzz8x8_3368748_Nodes = []model.Node{{
   111  		Coord: model.Coord{
   112  			Row: 0,
   113  			Col: 4,
   114  		},
   115  		IsBlack: true,
   116  	}, {
   117  		Coord: model.Coord{
   118  			Row: 1,
   119  			Col: 0,
   120  		},
   121  		IsBlack: false,
   122  	}, {
   123  		Coord: model.Coord{
   124  			Row: 1,
   125  			Col: 5,
   126  		},
   127  		IsBlack: false,
   128  	}, {
   129  		Coord: model.Coord{
   130  			Row: 1,
   131  			Col: 7,
   132  		},
   133  		IsBlack: false,
   134  	}, {
   135  		Coord: model.Coord{
   136  			Row: 3,
   137  			Col: 1,
   138  		},
   139  		IsBlack: false,
   140  	}, {
   141  		Coord: model.Coord{
   142  			Row: 3,
   143  			Col: 2,
   144  		},
   145  		IsBlack: false,
   146  	}, {
   147  		Coord: model.Coord{
   148  			Row: 3,
   149  			Col: 4,
   150  		},
   151  		IsBlack: false,
   152  	}, {
   153  		Coord: model.Coord{
   154  			Row: 4,
   155  			Col: 4,
   156  		},
   157  		IsBlack: false,
   158  	}, {
   159  		Coord: model.Coord{
   160  			Row: 5,
   161  			Col: 2,
   162  		},
   163  		IsBlack: false,
   164  	}, {
   165  		Coord: model.Coord{
   166  			Row: 5,
   167  			Col: 6,
   168  		},
   169  		IsBlack: true,
   170  	}, {
   171  		Coord: model.Coord{
   172  			Row: 6,
   173  			Col: 2,
   174  		},
   175  		IsBlack: false,
   176  	}, {
   177  		Coord: model.Coord{
   178  			Row: 7,
   179  			Col: 1,
   180  		},
   181  		IsBlack: false,
   182  	}, {
   183  		Coord: model.Coord{
   184  			Row: 7,
   185  			Col: 7,
   186  		},
   187  		IsBlack: true,
   188  	}}
   189  )