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

     1  package solve_test
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/joshprzybyszewski/masyu/fetch"
     9  	"github.com/joshprzybyszewski/masyu/model"
    10  	"github.com/joshprzybyszewski/masyu/solve"
    11  )
    12  
    13  func TestSpecifics(t *testing.T) {
    14  	fetch.DisableHTTPCalls()
    15  	solve.SetTestTimeout()
    16  	// go decided that it should run tests in this directory.
    17  	os.Chdir(`..`)
    18  
    19  	testCases := []struct {
    20  		id   string
    21  		iter model.Iterator
    22  	}{{
    23  		iter: 0,
    24  		id:   `5,734,527`,
    25  	}, {
    26  		iter: 2,
    27  		id:   `150,618`,
    28  	}, {
    29  		iter: 1,
    30  		id:   `1,527,476`,
    31  	}, {
    32  		iter: 5,
    33  		id:   `193,319`,
    34  	}, {
    35  		iter: 3,
    36  		id:   `1,817,845`,
    37  	}, {
    38  		iter: 3,
    39  		id:   `5,995,199`,
    40  	}, {
    41  		iter: 6,
    42  		id:   `7,191,910`,
    43  	}, {
    44  		iter: 8,
    45  		id:   `5,573,288`,
    46  	}, {
    47  		iter: 9,
    48  		id:   `3,118,955`,
    49  	}}
    50  
    51  	for _, tc := range testCases {
    52  		tc := tc
    53  		t.Run(tc.iter.String()+` `+tc.id, func(t *testing.T) {
    54  			sr, err := fetch.ReadID(tc.iter, tc.id)
    55  			if err != nil || sr.Input == nil {
    56  				t.Logf("Error fetching input: %q", err)
    57  				t.Fail()
    58  			}
    59  
    60  			ns := sr.Input.ToNodes()
    61  			sol, err := solve.FromNodesWithTimeout(
    62  				tc.iter.GetSize(),
    63  				ns,
    64  				50*time.Second,
    65  			)
    66  			if err != nil {
    67  				t.Logf("Error fetching input: %q", err)
    68  				t.Fail()
    69  			}
    70  			if sol.ToAnswer() != sr.Answer {
    71  				t.Logf("Incorrect Answer\n")
    72  				t.Logf("Exp: %q\n", sr.Answer)
    73  				t.Logf("Act: %q\n", sol.ToAnswer())
    74  				t.Logf("Board:\n%s\n\n", sol.Pretty(ns))
    75  				t.Fail()
    76  			}
    77  		})
    78  	}
    79  }
    80  
    81  func TestAccuracy(t *testing.T) {
    82  	fetch.DisableHTTPCalls()
    83  	solve.SetTestTimeout()
    84  	// go decided that it should run tests in this directory.
    85  	os.Chdir(`..`)
    86  	max := model.MaxIterator
    87  
    88  	for iter := model.MinIterator; iter <= max; iter++ {
    89  		t.Run(iter.String(), func(t *testing.T) {
    90  			srs, err := fetch.ReadN(iter, 100)
    91  			if err != nil {
    92  				t.Logf("Error fetching input: %q", err)
    93  				t.Fail()
    94  			}
    95  			if len(srs) == 0 {
    96  				t.Skip()
    97  			}
    98  
    99  			for _, sr := range srs {
   100  				sr := sr
   101  				if sr.Answer == `` {
   102  					t.Logf("Unknown answer: %+v", sr)
   103  					t.Fail()
   104  				}
   105  				t.Run(sr.Input.ID, func(t *testing.T) {
   106  					ns := sr.Input.ToNodes()
   107  					sol, err := solve.FromNodesWithTimeout(
   108  						iter.GetSize(),
   109  						ns,
   110  						time.Duration(iter+1)*100*time.Millisecond,
   111  					)
   112  					if err != nil {
   113  						t.Logf("Error fetching input: %q", err)
   114  						t.Fail()
   115  					}
   116  					if sol.ToAnswer() != sr.Answer {
   117  						t.Logf("Incorrect Answer\n")
   118  						t.Logf("Exp: %q\n", sr.Answer)
   119  						t.Logf("Act: %q\n", sol.ToAnswer())
   120  						t.Logf("Board:\n%s\n\n", sol.Pretty(ns))
   121  						t.Fail()
   122  					}
   123  				})
   124  			}
   125  		})
   126  	}
   127  }
   128  
   129  func BenchmarkAll(b *testing.B) {
   130  	fetch.DisableHTTPCalls()
   131  	solve.SetTestTimeout()
   132  	// go decided that it should run benchmarks in this directory.
   133  	os.Chdir(`..`)
   134  
   135  	for iter := model.MinIterator; iter <= model.MaxIterator; iter++ {
   136  		b.Run(iter.String(), func(b *testing.B) {
   137  			srs, err := fetch.ReadN(iter, 10)
   138  			if err != nil {
   139  				b.Logf("Error fetching input: %q", err)
   140  				b.Fail()
   141  			} else if len(srs) == 0 {
   142  				b.Logf("No cached results")
   143  				b.Fail()
   144  			}
   145  
   146  			for _, sr := range srs {
   147  				sr := sr
   148  				if sr.Answer == `` {
   149  					b.Logf("Unknown answer: %+v", sr)
   150  					b.Fail()
   151  				}
   152  				b.Run("PuzzleID "+sr.Input.ID, func(b *testing.B) {
   153  					var sol model.Solution
   154  					for n := 0; n < b.N; n++ {
   155  						sol, err = solve.FromNodesWithTimeout(
   156  							iter.GetSize(),
   157  							sr.Input.ToNodes(),
   158  							time.Duration(iter+1)*100*time.Millisecond,
   159  						)
   160  						if err != nil {
   161  							b.Logf("got unexpected error: %q", err)
   162  							b.Fail()
   163  						}
   164  						if sol.ToAnswer() != sr.Answer {
   165  							b.Logf("expected answer %q, but got %q", sr.Answer, sol.ToAnswer())
   166  							b.Fail()
   167  						}
   168  					}
   169  				})
   170  			}
   171  		})
   172  	}
   173  }