112 lines
4.9 KiB
Java
112 lines
4.9 KiB
Java
package puzzle;
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
import puzzle.Masker.Clues;
|
|
import puzzle.SwedishGenerator.Rng;
|
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
import static precomp.Const9x8.OFF_0_0;
|
|
import static precomp.Const9x8.OFF_1_1;
|
|
import static precomp.Const9x8.OFF_1_2;
|
|
import static precomp.Const9x8.OFF_2_0;
|
|
import static precomp.Const9x8.OFF_2_1;
|
|
import static precomp.Const9x8.OFF_2_2;
|
|
import static precomp.Const9x8.OFF_3_1;
|
|
import static precomp.Const9x8.OFF_7_7;
|
|
import static puzzle.SwedishGenerator.STACK_SIZE;
|
|
|
|
public class ConnectivityTest {
|
|
|
|
@Test
|
|
void testConnectivityPenalty() {
|
|
Rng rng = new Rng(42);
|
|
Masker masker = new Masker(rng, new int[STACK_SIZE], Clues.createEmpty());
|
|
|
|
// 1. Maak een masker met één component van clues (bijv. 2 clues die elkaar kruisen)
|
|
Clues singleComp = Clues.createEmpty();
|
|
// Clue 1: (0,0) Right. Slot: (0,1), (0,2), (0,3)
|
|
// Clue 2: (1,2) Up. Slot: (0,2)
|
|
// Ze zijn NIET 8-naburig, maar wel verbonden via slot op (0,2)
|
|
singleComp.setClueLo(1L << OFF_0_0, (byte) 1);
|
|
singleComp.setClueLo(1L << OFF_2_2, (byte) 2); // Up van (2,2) naar (1,2), (0,2)
|
|
|
|
long fitnessSingle = masker.maskFitness(singleComp, 2);
|
|
|
|
// 2. Maak een masker met twee eilandjes van clues
|
|
Clues twoIslands = Clues.createEmpty();
|
|
twoIslands.setClueLo(1L << OFF_0_0, (byte) 1);
|
|
twoIslands.setClueLo(OFF_7_7 < 64 ? 1L << OFF_7_7 : 0, (byte) 1);
|
|
// Voor de zekerheid checken we of offset(7,7) in lo of hi zit
|
|
int off77 = OFF_7_7;
|
|
if (off77 < 64) twoIslands.setClueLo(1L << off77, (byte) 1);
|
|
else twoIslands.setClueHi(1L << (off77 - 64), (byte) 1);
|
|
|
|
long fitnessIslands = masker.maskFitness(twoIslands, 2);
|
|
|
|
System.out.println("[DEBUG_LOG] Fitness single component: " + fitnessSingle);
|
|
System.out.println("[DEBUG_LOG] Fitness two islands: " + fitnessIslands);
|
|
|
|
assertTrue(fitnessIslands > fitnessSingle + 10000, "Islands should have much higher penalty");
|
|
}
|
|
|
|
@Test
|
|
void testPhysicalAdjacency() {
|
|
Rng rng = new Rng(42);
|
|
Masker masker = new Masker(rng, new int[STACK_SIZE], Clues.createEmpty());
|
|
|
|
Clues clues = Clues.createEmpty();
|
|
// Twee clues naast elkaar, maar slots kruisen niet.
|
|
// Clue 1: (1,1) Right. Slot (1,2), (1,3), (1,4)
|
|
// Clue 2: (2,1) Right. Slot (2,2), (2,3), (2,4)
|
|
clues.setClueLo(1L << OFF_1_1, (byte) 1);
|
|
clues.setClueLo(1L << OFF_2_1, (byte) 1);
|
|
|
|
long fitness = masker.maskFitness(clues, 2);
|
|
// Als 8-naburigheid NIET MEER meetelt, moet de penalty hoog zijn.
|
|
System.out.println("[DEBUG_LOG] Fitness physically adjacent: " + fitness);
|
|
assertTrue(fitness > 20000, "Should have island penalty even if physically adjacent");
|
|
Clues clues2 = Clues.createEmpty();
|
|
// Twee clues naast elkaar, maar slots kruisen niet.
|
|
// Clue 1: (1,1) Right. Slot (1,2), (1,3), (1,4)
|
|
// Clue 2: (2,1) Right. Slot (2,2), (2,3), (2,4)
|
|
clues2.setClueLo(1L << OFF_1_1, (byte) 1);
|
|
clues2.setClueLo(1L << OFF_3_1, (byte) 1);
|
|
long fitness2 = new Masker(rng, new int[STACK_SIZE], Clues.createEmpty()).maskFitness(clues2, 2);
|
|
// Als 8-naburigheid NIET MEER meetelt, moet de penalty hoog zijn.
|
|
System.out.println("[DEBUG_LOG] Fitness physically adjacent: " + fitness2);
|
|
assertTrue(fitness2 > 20000, "Should have island penalty even if physically adjacent");
|
|
|
|
}
|
|
|
|
@Test
|
|
void testCornerClueConnectivity() {
|
|
Rng rng = new Rng(42);
|
|
Masker masker = new Masker(rng, new int[STACK_SIZE], Clues.createEmpty());
|
|
|
|
Clues clues = Clues.createEmpty();
|
|
// Clue A: (2,0) Right. Slot: (2,1), (2,2), (2,3), ...
|
|
// Clue B: (1,2) Corner Down. Word starts at (1,3) en gaat omlaag: (1,3), (2,3), (3,3)...
|
|
// Ze kruisen op (2,3).
|
|
clues.setClueLo(1L << OFF_2_0, (byte) 1); // Right
|
|
clues.setClueLo(1L << OFF_1_2, (byte) 4); // Corner Down
|
|
|
|
long fitness = masker.maskFitness(clues, 2);
|
|
System.out.println("[DEBUG_LOG] Fitness corner clue connected: " + fitness);
|
|
|
|
// Als ze verbonden zijn, is de penalty voor eilandjes 0.
|
|
// We vergelijken met een island scenario (2 clues die elkaar NIET raken)
|
|
Clues island = Clues.createEmpty();
|
|
int offA = OFF_2_0;
|
|
if (offA < 64) island.setClueLo(1L << offA, (byte) 1);
|
|
else island.setClueHi(1L << (offA - 64), (byte) 1);
|
|
|
|
int offB = OFF_7_7;
|
|
if (offB < 64) island.setClueLo(1L << offB, (byte) 1);
|
|
else island.setClueHi(1L << (offB - 64), (byte) 1);
|
|
|
|
long fitnessIsland = masker.maskFitness(island, 2);
|
|
System.out.println("[DEBUG_LOG] Fitness island: " + fitnessIsland);
|
|
|
|
assertTrue(fitnessIsland > fitness + 20000, "Island should add significant penalty compared to connected corner clue");
|
|
}
|
|
}
|