package puzzle; import lombok.val; import org.junit.jupiter.api.Test; import puzzle.Export.Clued; import puzzle.Export.Gridded; import puzzle.Export.Placed; import puzzle.Export.PuzzleResult; import puzzle.Export.Rewards; import puzzle.SwedishGenerator.FillResult; import puzzle.SwedishGenerator.Rng; import java.io.IOException; import java.nio.file.Paths; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static puzzle.SwedishGenerator.C; import static puzzle.SwedishGenerator.Clues; import static puzzle.SwedishGenerator.FillStats; import static puzzle.SwedishGenerator.R; import static puzzle.SwedishGenerator.STACK_SIZE; import static puzzle.SwedishGenerator.Slot; import static puzzle.SwedishGenerator.placeWord; import static puzzle.SwedishGeneratorTest.OFF_0_1; import static puzzle.SwedishGeneratorTest.OFF_0_2; import static puzzle.SwedishGeneratorTest.OFF_0_3; import static puzzle.SwedishGeneratorTest.OFF_0_4; import static puzzle.SwedishGeneratorTest.OFF_0_5; import static puzzle.SwedishGeneratorTest.TEST; public class ExportFormatTest { static final byte CLUE_DOWN = 0; static final byte CLUE_RIGHT = 1; static final byte CLUE_UP = 2; static final byte CLUE_LEFT = 3; @Test void testExportFormatFromFilled() { var swe = new SwedishGenerator(new Rng(0), new int[STACK_SIZE], Clues.createEmpty()); val clues = Clues.createEmpty(); // Place a RIGHT clue at (0,0) clues.setClue(0, CLUE_RIGHT); // This creates a slot starting at (0,1) // Terminate the slot at (0,5) with another digit to avoid it extending to MAX_WORD_LENGTH clues.setClue(OFF_0_5, CLUE_LEFT); var grid = new Gridded(clues.toGrid()); var clueMap = new long[300]; // key = (cellIndex << 2) | (direction) var key = Slot.packSlotKey(0, CLUE_RIGHT); var lo = (1L << OFF_0_1) | (1L << OFF_0_2) | (1L << OFF_0_3) | (1L << OFF_0_4); clueMap[key] = TEST; assertTrue(placeWord(grid.grid(), key, lo, 0L, TEST)); var fillResult = new FillResult(true, grid, clueMap, new FillStats(0, 0, 0, 0)); var puzzleResult = new PuzzleResult(new Clued(clues), fillResult); var rewards = new Rewards(10, 5, 1); var exported = puzzleResult.exportFormatFromFilled(2, rewards); assertNotNull(exported); assertEquals(2, exported.difficulty()); assertEquals(rewards, exported.rewards()); // Check words assertEquals(1, exported.words().length); var w = exported.words()[0]; assertEquals("TEST", w.word()); assertEquals(Placed.HORIZONTAL, w.direction()); // The bounding box should include (0,0) for the arrow and (0,1)-(0,4) for the word. // minR=0, maxR=0, minC=0, maxC=4 // startRow = 0 - minR = 0 // startCol = 1 - minC = 1 assertEquals(0, w.startRow()); assertEquals(1, w.startCol()); assertEquals(0, w.arrowRow()); assertEquals(0, w.arrowCol()); // Check gridv2 // It should be 1 row, containing "2TEST" -> but letters are mapped, digits are not explicitly in letterAt. // Wait, look at exportFormatFromFilled logic: // row.append(letterAt.getOrDefault(pack(r, c), '#')); // letterAt only contains letters from placed words. // arrow cells are NOT in letterAt unless they are also part of a word (unlikely). // So (0,0) should be '#' assertEquals(1, exported.grid().length); assertEquals("#TEST", exported.grid()[0]); } @Test void testExportFormatEmpty() { var grid = SwedishGeneratorTest.createEmpty(); val clues = Clues.createEmpty(); var fillResult = new FillResult(true, new Gridded(grid), new long[300], new FillStats(0, 0, 0, 0)); var puzzleResult = new PuzzleResult(new Clued(clues), fillResult); var exported = puzzleResult.exportFormatFromFilled(1, new Rewards(0, 0, 0)); assertNotNull(exported); assertEquals(0, exported.words().length); // Should return full grid with '#' assertEquals(R, exported.grid().length); for (var row : exported.grid()) { assertEquals(C, row.length()); assertTrue(row.matches("#+")); } } @Test void testIndex() { var csv = Paths.get("nl_score_hints_v3.csv"); var idx = Paths.get("nl_score_hints_v3.idx"); try (var svc = new CsvIndexService(csv, idx)) { System.out.println(svc.getLine(1319)); } catch (IOException e) { throw new RuntimeException(e); } } }