"""
Problem 61: Cyclical figurate numbers
https://projecteuler.net/problem=61

Triangle, square, pentagonal, hexagonal, heptagonal, and octagonal numbers
are all figurate (polygonal) numbers and are generated by the following formulae:

Triangle	 	P3,n=n(n+1)/2	 	1, 3, 6, 10, 15, ...
Square	 	    P4,n=n2	 	        1, 4, 9, 16, 25, ...
Pentagonal	 	P5,n=n(3n−1)/2	 	1, 5, 12, 22, 35, ...
Hexagonal	 	P6,n=n(2n−1)	 	1, 6, 15, 28, 45, ...
Heptagonal	 	P7,n=n(5n−3)/2	 	1, 7, 18, 34, 55, ...
Octagonal	 	P8,n=n(3n−2)	 	1, 8, 21, 40, 65, ...
The ordered set of three 4-digit numbers: 8128, 2882, 8281, has three interesting properties.

1. The set is cyclic, in that the last two digits of each number is the first two digits
of the next number (including the last number with the first).
2. Each polygonal type: triangle (P3,127=8128), square (P4,91=8281), and pentagonal (P5,44=2882),
is represented by a different number in the set.
3. This is the only set of 4-digit numbers with this property.

Find the sum of the only ordered set of six cyclic 4-digit numbers for which each polygonal type:
triangle, square, pentagonal, hexagonal, heptagonal, and octagonal, is represented
by a different number in the set.
"""

import pytest


@pytest.mark.parametrize('test_input_number,expected_result', [
    (42, '4'),
    (1337, '13'),
    (1234, '12'),
])
def test_get_number_prefix(test_input_number, expected_result):
    # arrange
    from src.p061_cyclical_figurate_numbers import get_number_prefix

    # act
    actual_result = get_number_prefix(test_input_number)

    # assert
    assert actual_result == expected_result


@pytest.mark.parametrize('test_input_number,expected_result', [
    (42, '2'),
    (1337, '37'),
    (1234, '34'),
])
def test_get_number_suffix(test_input_number, expected_result):
    # arrange
    from src.p061_cyclical_figurate_numbers import get_number_suffix

    # act
    actual_result = get_number_suffix(test_input_number)

    # assert
    assert actual_result == expected_result


def test_get_special_number_prefix_map():
    # arrange
    from src.p061_cyclical_figurate_numbers import get_special_number_prefix_map
    from src.common.special_numbers import get_square_number

    # act
    actual_result = get_special_number_prefix_map(get_square_number, 2)

    # assert
    expected_result = {
        '1': [(4, 16)],
        '2': [(5, 25)],
        '3': [(6, 36)],
        '4': [(7, 49)],
        '6': [(8, 64)],
        '8': [(9, 81)],
    }
    assert actual_result == expected_result


def test_get_cyclical_figurate_numbers():
    # arrange
    from src.p061_cyclical_figurate_numbers import get_cyclical_figurate_numbers

    # act
    actual_result = get_cyclical_figurate_numbers({3, 4, 5}, 4)

    # assert
    assert len(actual_result) == 3
    expected_result = [
        (3, 127, 8128),
        (5, 44, 2882),
        (4, 91, 8281),
    ]
    assert expected_result in actual_result
