113 lines
3.8 KiB
Kotlin
113 lines
3.8 KiB
Kotlin
package domain
|
|
|
|
import ch.tutteli.atrium.api.fluent.en_GB.toEqual
|
|
import ch.tutteli.atrium.api.verbs.expect
|
|
import kotlin.test.Test
|
|
|
|
class NeighbourClueTest : ClueTest() {
|
|
|
|
@Test
|
|
fun `ensure actual neighbours are valid`() {
|
|
val grid = createGrid()
|
|
for (ia in 0 until size) {
|
|
for (ib in 0 until size) {
|
|
for (j in 1 until size) {
|
|
val a = grid[ia][j - 1]
|
|
val b = grid[ib][j]
|
|
|
|
expect(NeighbourClue(a.solution, b.solution).isRuleViolated(grid))
|
|
.toEqual(false)
|
|
expect(NeighbourClue(b.solution, a.solution).isRuleViolated(grid))
|
|
.toEqual(false)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun `ensure non-neighbours are invalid`() {
|
|
val grid = createGrid()
|
|
for (ia in 0 until size) {
|
|
for (ib in 0 until size) {
|
|
for (ja in 0 until size) {
|
|
for (jb in 0 until size) {
|
|
if (ja == jb + 1 || ja == jb - 1) {
|
|
continue
|
|
}
|
|
val a = grid[ia][ja]
|
|
val b = grid[ib][jb]
|
|
|
|
expect(NeighbourClue(a.solution, b.solution).isRuleViolated(grid))
|
|
.toEqual(true)
|
|
expect(NeighbourClue(b.solution, a.solution).isRuleViolated(grid))
|
|
.toEqual(true)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun `ensure grid with one neighbour not set is considered valid if a neighbour is in the options`() {
|
|
val grid = createGrid()
|
|
for (ia in 0 until size) {
|
|
for (ib in 0 until size) {
|
|
for (j in 1 until size) {
|
|
val a = grid[ia][j - 1]
|
|
val b = grid[ib][j]
|
|
|
|
a.selection = null
|
|
a.options.add(a.solution)
|
|
b.selection = b.solution
|
|
b.options.clear()
|
|
|
|
expect(NeighbourClue(a.solution, b.solution).isRuleViolated(grid))
|
|
.toEqual(false)
|
|
expect(NeighbourClue(b.solution, a.solution).isRuleViolated(grid))
|
|
.toEqual(false)
|
|
|
|
a.selection = a.solution
|
|
a.options.clear()
|
|
b.selection = null
|
|
b.options.add(b.solution)
|
|
|
|
expect(NeighbourClue(a.solution, b.solution).isRuleViolated(grid))
|
|
.toEqual(false)
|
|
expect(NeighbourClue(b.solution, a.solution).isRuleViolated(grid))
|
|
.toEqual(false)
|
|
|
|
if (j < size-1) {
|
|
val notA = grid[ia][j + 1]
|
|
|
|
a.selection = null
|
|
a.options.clear()
|
|
notA.options.add(a.solution)
|
|
b.selection = b.solution
|
|
b.options.clear()
|
|
|
|
expect(NeighbourClue(a.solution, b.solution).isRuleViolated(grid))
|
|
.toEqual(false)
|
|
expect(NeighbourClue(b.solution, a.solution).isRuleViolated(grid))
|
|
.toEqual(false)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun `ensure grid with a and c more than one cell between is not considered valid`() {
|
|
val grid = createGrid { null }
|
|
val a = grid[2][1]
|
|
val b = grid[0][2]
|
|
|
|
a.selection = a.solution
|
|
grid[0][3].selection = b.solution
|
|
|
|
expect(NeighbourClue(a.solution, b.solution).isRuleViolated(grid))
|
|
.toEqual(true)
|
|
expect(NeighbourClue(b.solution, a.solution).isRuleViolated(grid))
|
|
.toEqual(true)
|
|
}
|
|
|
|
} |