package coffee.liz.rookery import coffee.liz.rookery.puzzle.NxnCube import coffee.liz.rookery.puzzle.Notation import kotlin.test.Test import kotlin.test.assertContentEquals import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertTrue class CubeTest { @Test fun basicIdentities() { for (n in 2..7) { assertTrue(NxnCube(n).apply("R R R R").isSolved) assertTrue(NxnCube(n).apply("R U R' U' R U R' U' R U R' U' R U R' U' R U R' U' R U R' U'").isSolved, "sexy^6 on $n") assertFalse(NxnCube(n).apply("R U").isSolved) } } @Test fun scrambleThenInverseSolves() { val scr = "3Rw2 Uw' F 3Fw D2 Lw' B2 x y' 2R 3Uw2 z M" val c = NxnCube(7).apply(scr) assertFalse(c.isSolved) c.apply(Notation.invert(scr)) assertTrue(c.isSolved) } @Test fun rMovesFrontToUp() { val c = NxnCube(3).apply("R") // U face right column now shows F's colour (index 2) assertEquals(listOf(0, 0, 2, 0, 0, 2, 0, 0, 2), c.face(NxnCube.Face.U).toList()) // F face right column shows D (3) assertEquals(listOf(2, 2, 3, 2, 2, 3, 2, 2, 3), c.face(NxnCube.Face.F).toList()) } @Test fun uMovesFrontToLeft() { val c = NxnCube(3).apply("U") assertEquals(listOf(5, 5, 5), c.face(NxnCube.Face.R).take(3)) // B comes to R assertEquals(listOf(2, 2, 2), c.face(NxnCube.Face.L).take(3)) // F goes to L } @Test fun wideEqualsFacePlusSlice() { val a = NxnCube(5).apply("Rw") val b = NxnCube(5).apply("R 2R") assertContentEquals(a.stickers, b.stickers) assertContentEquals(NxnCube(3).apply("x").stickers, NxnCube(3).apply("R M' L'").stickers) } @Test fun tPermIsOrderTwo() { val t = "R U R' U' R' F R2 U' R' U' R U R' F'" val c = NxnCube(3).apply(t) assertFalse(c.isSolved) assertTrue(c.apply(t).isSolved) } }