1package pdfexport23import "testing"45func TestParseNonogramPrintData(t *testing.T) {6 save := []byte(`{"state":" .-\n.. ","row-hints":[[1],[2]],"col-hints":[[2],[1],[1]]}`)78 data, err := ParseNonogramPrintData(save)9 if err != nil {10 t.Fatal(err)11 }12 if data == nil {13 t.Fatal("expected nonogram print data")14 }15 if got, want := data.Width, 3; got != want {16 t.Fatalf("width = %d, want %d", got, want)17 }18 if got, want := data.Height, 2; got != want {19 t.Fatalf("height = %d, want %d", got, want)20 }21 if got, want := data.RowHints[0][0], 1; got != want {22 t.Fatalf("row hint[0][0] = %d, want %d", got, want)23 }24 if got, want := data.ColHints[0][0], 2; got != want {25 t.Fatalf("col hint[0][0] = %d, want %d", got, want)26 }27 if got, want := data.Grid[0][0], " "; got != want {28 t.Fatalf("grid[0][0] = %q, want %q", got, want)29 }30 if got, want := data.Grid[0][1], "."; got != want {31 t.Fatalf("grid[0][1] = %q, want %q", got, want)32 }33 if got, want := data.Grid[0][2], "-"; got != want {34 t.Fatalf("grid[0][2] = %q, want %q", got, want)35 }36}3738func TestParseNurikabePrintData(t *testing.T) {39 save := []byte(`{"width":3,"height":2,"clues":"1,0,2\n0,3,0","marks":"???\n???"}`)4041 data, err := ParseNurikabePrintData(save)42 if err != nil {43 t.Fatal(err)44 }45 if data == nil {46 t.Fatal("expected nurikabe print data")47 }48 if got, want := data.Width, 3; got != want {49 t.Fatalf("width = %d, want %d", got, want)50 }51 if got, want := data.Height, 2; got != want {52 t.Fatalf("height = %d, want %d", got, want)53 }54 if got, want := data.Clues[0][0], 1; got != want {55 t.Fatalf("row 0 col 0 = %d, want %d", got, want)56 }57 if got, want := data.Clues[0][2], 2; got != want {58 t.Fatalf("row 0 col 2 = %d, want %d", got, want)59 }60 if got, want := data.Clues[1][1], 3; got != want {61 t.Fatalf("row 1 col 1 = %d, want %d", got, want)62 }63}6465func TestParseHashiPrintData(t *testing.T) {66 save := []byte(`{"width":7,"height":7,"islands":[{"x":0,"y":0,"required":3},{"x":6,"y":6,"required":2},{"x":9,"y":9,"required":5}]}`)6768 data, err := ParseHashiPrintData(save)69 if err != nil {70 t.Fatal(err)71 }72 if data == nil {73 t.Fatal("expected hashi print data")74 }75 if got, want := data.Width, 7; got != want {76 t.Fatalf("width = %d, want %d", got, want)77 }78 if got, want := data.Height, 7; got != want {79 t.Fatalf("height = %d, want %d", got, want)80 }81 if got, want := len(data.Islands), 2; got != want {82 t.Fatalf("island count = %d, want %d", got, want)83 }84 if got, want := data.Islands[0].Required, 3; got != want {85 t.Fatalf("island[0].required = %d, want %d", got, want)86 }87}8889func TestParseShikakuPrintDataDuplicateClueCoordinatesUseLatest(t *testing.T) {90 save := []byte(`{"width":3,"height":3,"clues":[{"x":1,"y":1,"value":2},{"x":1,"y":1,"value":5},{"x":2,"y":0,"value":4}]}`)9192 data, err := ParseShikakuPrintData(save)93 if err != nil {94 t.Fatal(err)95 }96 if data == nil {97 t.Fatal("expected shikaku print data")98 }99 if got, want := data.Clues[1][1], 5; got != want {100 t.Fatalf("row 1 col 1 = %d, want %d", got, want)101 }102 if got, want := data.Clues[0][2], 4; got != want {103 t.Fatalf("row 0 col 2 = %d, want %d", got, want)104 }105}106107func TestParseHitoriPrintData(t *testing.T) {108 save := []byte(`{"size":4,"numbers":"1 2 10\n4 . .\n7\n"}`)109110 data, err := ParseHitoriPrintData(save)111 if err != nil {112 t.Fatal(err)113 }114 if data == nil {115 t.Fatal("expected hitori print data")116 }117 if got, want := data.Size, 4; got != want {118 t.Fatalf("size = %d, want %d", got, want)119 }120121 if got, want := data.Numbers[0][2], "10"; got != want {122 t.Fatalf("row 0 col 2 = %q, want %q", got, want)123 }124 if got, want := data.Numbers[1][1], ""; got != want {125 t.Fatalf("row 1 col 1 = %q, want empty", got)126 }127 if got, want := data.Numbers[2][0], "7"; got != want {128 t.Fatalf("row 2 col 0 = %q, want %q", got, want)129 }130 if got, want := data.Numbers[3][3], ""; got != want {131 t.Fatalf("row 3 col 3 = %q, want empty", got)132 }133}134135func TestParseHitoriPrintDataCompactRuneEncoding(t *testing.T) {136 save := []byte(`{"size":3,"numbers":"12:\n4..\n789"}`)137138 data, err := ParseHitoriPrintData(save)139 if err != nil {140 t.Fatal(err)141 }142 if data == nil {143 t.Fatal("expected hitori print data")144 }145146 if got, want := data.Numbers[0][2], "10"; got != want {147 t.Fatalf("row 0 col 2 = %q, want %q", got, want)148 }149 if got, want := data.Numbers[1][1], ""; got != want {150 t.Fatalf("row 1 col 1 = %q, want empty", got)151 }152}153154func TestParseTakuzuPrintData(t *testing.T) {155 save := []byte(`{"size":4,"state":"01..\n10..\n0011\n1111","provided":"#.\n.##\n####\n#"}`)156157 data, err := ParseTakuzuPrintData(save)158 if err != nil {159 t.Fatal(err)160 }161 if data == nil {162 t.Fatal("expected takuzu print data")163 }164 if got, want := data.Size, 4; got != want {165 t.Fatalf("size = %d, want %d", got, want)166 }167 if !data.GroupEveryTwo {168 t.Fatal("expected GroupEveryTwo to be true")169 }170171 if got, want := data.Givens[0][0], "0"; got != want {172 t.Fatalf("row 0 col 0 = %q, want %q", got, want)173 }174 if got, want := data.Givens[1][2], ""; got != want {175 t.Fatalf("row 1 col 2 = %q, want empty", got)176 }177 if got, want := data.Givens[2][3], "1"; got != want {178 t.Fatalf("row 2 col 3 = %q, want %q", got, want)179 }180 if got, want := data.Givens[3][1], ""; got != want {181 t.Fatalf("row 3 col 1 = %q, want empty", got)182 }183}184185func TestParseTakuzuPlusPrintData(t *testing.T) {186 save := []byte(`{"size":4,"state":"01..\n10..\n0011\n1111","provided":"#...\n.##.\n####\n#...","horizontal_relations":"=x.\n...\n..=\n...","vertical_relations":"x...\n.=..\n...x"}`)187188 data, err := ParseTakuzuPlusPrintData(save)189 if err != nil {190 t.Fatal(err)191 }192 if data == nil {193 t.Fatal("expected takuzu+ print data")194 }195 if got, want := data.HorizontalRelations[0][0], "="; got != want {196 t.Fatalf("horizontal relation[0][0] = %q, want %q", got, want)197 }198 if got, want := data.HorizontalRelations[0][1], "x"; got != want {199 t.Fatalf("horizontal relation[0][1] = %q, want %q", got, want)200 }201 if got, want := data.VerticalRelations[0][0], "x"; got != want {202 t.Fatalf("vertical relation[0][0] = %q, want %q", got, want)203 }204 if got, want := data.VerticalRelations[1][1], "="; got != want {205 t.Fatalf("vertical relation[1][1] = %q, want %q", got, want)206 }207 if got, want := data.Givens[1][1], "0"; got != want {208 t.Fatalf("given[1][1] = %q, want %q", got, want)209 }210}211212func TestParseSudokuRGBPrintData(t *testing.T) {213 save := []byte(`{"grid":"100000000\n000000000\n000000000\n000000000\n000000000\n000000000\n000000000\n000000000\n000000000","provided":[{"x":0,"y":0,"v":1},{"x":1,"y":0,"v":4},{"x":2,"y":0,"v":3}]}`)214215 data, err := ParseSudokuRGBPrintData(save)216 if err != nil {217 t.Fatal(err)218 }219 if data == nil {220 t.Fatal("expected sudoku rgb print data")221 }222 if got, want := data.Givens[0][0], 1; got != want {223 t.Fatalf("givens[0][0] = %d, want %d", got, want)224 }225 if got := data.Givens[0][1]; got != 0 {226 t.Fatalf("givens[0][1] = %d, want 0", got)227 }228 if got, want := data.Givens[0][2], 3; got != want {229 t.Fatalf("givens[0][2] = %d, want %d", got, want)230 }231}232233func TestParseFillominoPrintData(t *testing.T) {234 save := []byte(`{"width":3,"height":2,"state":"1 . 2\n. 3 .","provided":"#.#\n.#."}`)235236 data, err := ParseFillominoPrintData(save)237 if err != nil {238 t.Fatal(err)239 }240 if data == nil {241 t.Fatal("expected fillomino print data")242 }243 if got, want := data.Width, 3; got != want {244 t.Fatalf("width = %d, want %d", got, want)245 }246 if got, want := data.Height, 2; got != want {247 t.Fatalf("height = %d, want %d", got, want)248 }249 if got, want := data.Givens[0][0], 1; got != want {250 t.Fatalf("givens[0][0] = %d, want %d", got, want)251 }252 if got := data.Givens[0][1]; got != 0 {253 t.Fatalf("givens[0][1] = %d, want 0", got)254 }255 if got, want := data.Givens[1][1], 3; got != want {256 t.Fatalf("givens[1][1] = %d, want %d", got, want)257 }258}259260func TestParseRippleEffectPrintData(t *testing.T) {261 save := []byte(`{"width":3,"height":3,"givens":"1 . 1\n. 1 3\n3 . .","cages":[{"size":2,"cells":[{"x":0,"y":0},{"x":1,"y":0}]},{"size":1,"cells":[{"x":2,"y":0}]},{"size":3,"cells":[{"x":0,"y":1},{"x":0,"y":2},{"x":1,"y":2}]},{"size":3,"cells":[{"x":1,"y":1},{"x":2,"y":1},{"x":2,"y":2}]}]}`)262263 data, err := ParseRippleEffectPrintData(save)264 if err != nil {265 t.Fatal(err)266 }267 if data == nil {268 t.Fatal("expected ripple effect print data")269 }270 if got, want := data.Width, 3; got != want {271 t.Fatalf("width = %d, want %d", got, want)272 }273 if got, want := len(data.Cages), 4; got != want {274 t.Fatalf("cage count = %d, want %d", got, want)275 }276 if got, want := data.Givens[0][0], 1; got != want {277 t.Fatalf("givens[0][0] = %d, want %d", got, want)278 }279 if got := data.Givens[2][1]; got != 0 {280 t.Fatalf("givens[2][1] = %d, want 0", got)281 }282}