import pytest
from cidades import SearchProblem, SearchTree, cidades_portugal

@pytest.fixture
def braga_faro():
    return SearchProblem(cidades_portugal,'Braga','Faro')

def test_exercicio1(braga_faro):
    t = SearchTree(braga_faro,'depth')

    assert t.search() == ['Braga', 'Porto', 'Agueda', 'Aveiro', 'Coimbra', 'Leiria', 'Castelo Branco', 'Santarem', 'Lisboa', 'Evora', 'Beja', 'Faro']

def test_exercicio2(braga_faro):
    t = SearchTree(braga_faro, 'depth')

    assert t.open_nodes[-1].depth == 0
    t.search()
    assert t.solution.depth == 11

def test_exercicio3(braga_faro):
    t = SearchTree(braga_faro, 'depth')

    t.search()

    assert t.length == 11

def test_exercicio4(braga_faro):
    t = SearchTree(braga_faro, 'depth')

    assert t.search(limit=9) == ['Braga', 'Porto', 'Agueda', 'Aveiro', 'Coimbra', 'Leiria', 'Santarem', 'Lisboa', 'Beja', 'Faro']

    assert t.length <= 9

def test_exercicio5(braga_faro):
    t = SearchTree(braga_faro, 'depth')

    assert t.search() == ['Braga', 'Porto', 'Agueda', 'Aveiro', 'Coimbra', 'Leiria', 'Castelo Branco', 'Santarem', 'Lisboa', 'Evora', 'Beja', 'Faro']
    assert t.terminals == 19
    assert t.non_terminals == 11

    t = SearchTree(braga_faro, 'depth')

    assert t.search(limit=9) == ['Braga', 'Porto', 'Agueda', 'Aveiro', 'Coimbra', 'Leiria', 'Santarem', 'Lisboa', 'Beja', 'Faro']
    assert t.terminals == 12
    assert t.non_terminals == 58 

def test_exercicio6(braga_faro):
    t = SearchTree(braga_faro, 'depth')

    assert t.search() == ['Braga', 'Porto', 'Agueda', 'Aveiro', 'Coimbra', 'Leiria', 'Castelo Branco', 'Santarem', 'Lisboa', 'Evora', 'Beja', 'Faro']
    assert round(t.avg_branching,2) == round((19+11-1)/11,2)
