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 }