File size: 1,465 Bytes
839391d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
"""Fast dependency-free checks for cube transition and solver correctness."""

# The Space supplies Gradio; load only the dependency-free cube core for local checks.
namespace = {}
source = open("app.py", encoding="utf-8").read().split("\nwith gr.Blocks", 1)[0]
# The cube mechanics live before tensor/model definitions and need no Space packages.
source = source.split("\ndef state_tensor", 1)[0]
for statement in ("import spaces  # Must precede torch: ZeroGPU patches CUDA placement at import time.\n", "import torch\n", "from torch import nn\n", "import torch.nn.functional as F\n", "import gradio as gr\n"):
    source = source.replace(statement, "")
exec(source, namespace)

INVERSE = namespace["INVERSE"]
MOVES = namespace["MOVES"]
SOLVED = namespace["SOLVED"]
apply_moves = namespace["apply_moves"]
random_scramble = namespace["random_scramble"]


def test_turn_order_and_inverse() -> None:
    for move in MOVES:
        assert apply_moves(SOLVED, [move] * 4) == SOLVED
        assert apply_moves(SOLVED, [move, INVERSE[move]]) == SOLVED


def test_reverse_scramble_returns_to_solved() -> None:
    scramble = random_scramble(6, __import__("random").Random(31))
    state = apply_moves(SOLVED, scramble)
    solution = [INVERSE[move] for move in reversed(scramble)]
    assert apply_moves(state, solution) == SOLVED


if __name__ == "__main__":
    test_turn_order_and_inverse()
    test_reverse_scramble_returns_to_solved()
    print("cube checks passed")