cs50p/test_project.py

70 lines
2.0 KiB
Python

import pytest
from project import get_coin_to_flip, get_parameters, get_parity, is_power_of_two, solve
def main():
test_get_coin_to_flip()
test_get_parameters()
test_get_parity()
test_is_power_of_two()
test_solve()
def test_get_coin_to_flip():
for i in (4, 8, 16):
initial_state, key_position, _ = get_parameters(board_side=i)
c = get_coin_to_flip(initial_state=initial_state, key_position=key_position)
assert 0 <= c < i**2
final_state = solve(initial_state, c)
assert get_parity(final_state) == key_position
def test_get_parameters():
for i in (4, 8, 16):
initial_state, key_position, coin_to_flip = get_parameters(board_side=i)
assert len(initial_state) == i ** 2
assert 0 <= key_position <= 2**i - 1
assert 0 <= coin_to_flip <= 2**i - 1
for i in range(3, 5, 7):
with pytest.raises(ValueError):
get_parameters(board_side=i)
def test_get_parity():
assert get_parity('0100') == 1
assert get_parity('0010') == 2
assert get_parity('0' * 64) == 0
assert get_parity('1' * 64) == 0
assert get_parity('0000'
'0010'
'0000'
'0000') == 6
assert get_parity('00111011'
'00001001'
'10010101'
'11011011'
'01001110'
'01110000'
'10001101'
'11101001') == 17
def test_is_power_of_two():
assert not is_power_of_two(0)
for i in range(1, 13):
assert is_power_of_two(2**i)
assert not is_power_of_two(2 ** i + 3)
def test_solve():
for i in (4, 8, 16):
initial_state, _, coin_to_flip = get_parameters(board_side=i)
final_state = solve(initial_state=initial_state, coin_to_flip=coin_to_flip)
for j, (c0, c1) in enumerate(zip(initial_state, final_state)):
assert j == coin_to_flip or c0 == c1
if __name__ == '__main__':
main()