def test_action_mask_tsu(): state = State(13, 6, 2, 1, tsu_rules=True) stack = [_, _, _, _, _, _, _, _] * state.field.offset stack += [ R, _, R, G, _, G, _, _, ] state.field = TallField.from_list(stack, num_layers=state.num_layers, tsu_rules=state.tsu_rules) state.render() mask = state.get_action_mask() print(mask) assert (len(mask) == 5 + 5 + 6 + 6) for i, (x, orientation) in enumerate(state.actions): if x in (1, 4): assert (mask[i]) elif orientation in (0, 2) and x in (0, 3): assert (mask[i]) else: assert (not mask[i])
def test_complex_resolve(): stack = [ R, G, _, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, Y, R, _, _, _, _, _, _, Y, R, _, _, _, _, _, _, Y, R, _, _, _, _, _, _, R, Y, _, _, _, _, _, _, R, Y, _, _, _, _, _, _, R, Y, _, _, _, _, _, _, Y, R, _, _, _, _, _, _, Y, R, _, _, _, _, _, _, Y, R, _, _, _, _, R, G, B, Y, _, _, _, _, R, R, G, B, _, _, _, _, G, G, B, B, _, _, _, _, ] field = TallField.from_list(stack) field.render() print() score, chain = field.resolve() field.render() stack = field.to_list() assert (stack == [ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, ]) assert (chain == 3) expected = 4 * 10 * (1) # Reds expected += 5 * 10 * (8 + 2) # Greens # Blues, yellows and reds num_cleared = 26 chain_power = 16 group_bonuses = 0 + 0 + 3 + 3 + 3 color_bonus = 6 expected += num_cleared * 10 * (chain_power + group_bonuses + color_bonus) assert (score == expected)
def test_resolve_plain(tsu_rules): stack = [ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, G, _, _, _, _, _, _, _, G, _, _, _, _, _, _, _, G, _, _, _, _, _, _, _, B, G, _, _, _, _, _, _, G, B, _, _, _, _, _, _, G, B, _, _, _, _, _, R, R, G, _, _, _, _, _, R, R, G, G, _, _, _, _, ] field = TallField.from_list(stack, tsu_rules=tsu_rules) field.render() print() score, chain = field.resolve() field.render() stack = field.to_list() assert (stack == [ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, B, _, _, _, _, _, _, B, B, _, _, _, _, _, ]) assert (chain == 2) assert (score == 940)
def test_clear_groups(tsu_rules): O = Y + 1 # noqa stack = [ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, O, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, G, _, _, _, _, _, R, _, G, _, _, _, _, _, R, _, G, O, O, _, Y, _, R, _, G, O, O, _, Y, Y, ] field = TallField.from_list(stack, tsu_rules=tsu_rules, has_garbage=True) field.render() score = field.clear_groups(5) print(score) field.render() stack = field.to_list() expected = [_] * 8 * 3 if tsu_rules: expected += [O, _, _, _, _, _, _, _] else: expected += [_] * 8 assert (score == 10 * (4 + 12) * (3 + 10 + 96)) assert (stack == expected + [ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, O, _, Y, _, _, _, _, _, O, _, Y, Y, ])
def test_mirror(): stack = [ R, R, _, _, _, _, _, _, G, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, _, G, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, G, ] field = TallField.from_list(stack) field.render() field.mirror() print() field.render() stack = field.to_list() assert (stack == [ _, _, _, _, _, _, R, R, _, _, _, _, _, _, _, G, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, G, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, G, _, _, _, _, _, _, _, ])
def test_encode(): stack = [ _, R, _, _, _, _, _, _, G, _, G, _, _, _, _, _, _, _, _, G, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, _, _, _, G, _, _, _, _, _, G, _, _, _, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, G, _, _, _, _, _, _, _, R, ] field = TallField.from_list(stack) field.render() encoded = field.encode() expected = [ [ [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], ], [ [0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0], ], ] assert (encoded == expected).all()
def test_gravity(): stack = [ R, R, _, _, _, _, _, _, G, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, _, G, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, ] field = TallField.from_list(stack) field.render() field.handle_gravity() print() field.render() stack = field.to_list() assert (stack == [ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, R, _, _, _, _, _, R, _, G, R, _, _, _, _, R, G, ])
def test_resolve_garbage(): O = G + 1 # noqa stack = [ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, O, _, _, _, _, _, _, O, R, _, _, _, _, _, _, O, R, _, _, _, _, _, _, O, R, _, _, _, _, _, _, O, R, _, _, _, _, _, _, O, R, _, _, _, _, _, _, O, R, _, _, _, _, _, _, O, R, _, _, _, _, _, _, O, R, _, _, _, _, _, O, O, R, _, _, _, _, _, O, O, R, _, _, _, _, _, O, O, G, O, _, _, _, _, O, O, G, O, O, ] field = TallField.from_list(stack, tsu_rules=True, has_garbage=True) field.render() print() score, chain = field.resolve() field.render() stack = field.to_list() assert (stack == [ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, O, _, _, _, _, _, _, _, O, _, O, _, _, _, _, _, O, O, G, O, _, _, _, _, O, O, G, O, O, ]) assert (chain == 1) assert (score == 700)
def test_resolve_ghost(): stack = [ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, P, _, _, _, _, _, _, _, P, _, _, _, _, _, _, _, P, _, _, _, _, _, _, _, P, _, _, _, _, _, _, _, B, _, _, _, _, _, _, _, B, _, _, _, _, _, _, _, B, _, _, _, _, _, _, _, B, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, Y, _, _, _, _, _, _, _, G, _, _, _, _, _, _, _, G, _, _, ] field = TallField.from_list(stack, tsu_rules=True) field.render() print() score, chain = field.resolve() field.render() stack = field.to_list() assert (stack == [ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, R, _, _, _, _, _, _, _, Y, _, _, _, _, _, _, _, G, _, _, _, _, _, _, _, G, _, _, ]) assert (chain == 2) assert (score == 360)
def test_garbage_tsu(): state = State(13, 6, 5, 1, tsu_rules=True, has_garbage=True) stack = [_, _, _, _, _, _, _, _] * state.field.offset stack += [ _, R, _, _, _, _, _, _, B, R, _, _, _, _, _, _, Y, B, _, _, _, _, _, _, G, B, _, _, _, _, _, _, G, R, _, _, _, _, _, _, Y, R, _, _, _, _, _, _, B, G, _, _, _, _, _, _, B, R, _, _, _, _, _, _, B, R, _, _, _, _, _, _, Y, B, _, _, _, _, _, _, G, B, _, _, _, _, _, _, G, R, _, _, _, _, _, _, Y, R, _, _, _, _, _, _, ] state.field = TallField.from_list(stack, num_layers=state.num_layers, tsu_rules=state.tsu_rules, has_garbage=state.has_garbage) state.render() state.add_garbage(39) state.render() state.field.resolve() assert (state.field.popcount == 51)
def test_has_moves_tsu(): state = State(13, 2, 4, 1, tsu_rules=True) stack = [_, _, _, _, _, _, _, _] * state.field.offset stack += [ _, R, _, _, _, _, _, _, B, R, _, _, _, _, _, _, Y, B, _, _, _, _, _, _, G, B, _, _, _, _, _, _, G, R, _, _, _, _, _, _, Y, R, _, _, _, _, _, _, B, G, _, _, _, _, _, _, B, R, _, _, _, _, _, _, B, R, _, _, _, _, _, _, Y, B, _, _, _, _, _, _, G, B, _, _, _, _, _, _, G, R, _, _, _, _, _, _, Y, R, _, _, _, _, _, _, ] state.field = TallField.from_list(stack, num_layers=state.num_layers, tsu_rules=state.tsu_rules) state.render() assert (state.get_children())
def test_resolve_large(): state = State(16, 7, 2, 1) state.deals[0] = (0, 0) stack = [ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, G, G, G, _, _, _, _, _, R, R, R, G, G, G, _, ] state.field = TallField.from_list(stack, num_layers=state.num_layers) state.render() reward = state.step(0, 1) assert (reward == 8500 + 760)