You are given a 4-digit lock starting at "0000". In one move, you may pick a single position and rotate it +1 or −1 with wrap-around (0→9 on −1, 9→0 on + 1). Given a target combination and a list of forbidden combinations (you cannot enter these states), return the minimum number of moves required to reach the target from "0000", or −1 if it is impossible. Implement an efficient solution and write unit tests covering: target equals "0000"; forbidden includes "0000"; unreachable targets; duplicate entries in the forbidden list; and large forbidden sets.