예제 #1
0
 def conecta(self, nome_bd):
     '''
     Método que inicia uma conexão com o BD.
     
     Parâmetro:
     ----------
     nome_bd : str
         Nome do BD a ser conectado.
     '''
     
     self.bd = BD(nome_bd)
예제 #2
0
    def test_1_abre_fecha_conexao(self):
        '''
        1 - Abrir e fechar uma conexão com BD.

        Conecta com um banco de dados chamado teste.db,
        e depois encerra a conexão. Testa o construtor e os
        métodos "cria_tabela" e "encerra".
        '''
        try:
            with self.assertRaises(Exception):
                bd = BD(CAMINHO)
                bd.encerra()

        except AssertionError:
            pass

        self.deleta_BD()
예제 #3
0
    def test_3_add_placar_1(self):
        '''
        3 - Teste de adicionar placar 1.

        Ao adicionar um jogo com placar de 12 pontos numa tabela vazia,
        a primeira linha deve ser igual à variável "valores". Testa o método
        "adicionar_placar" validando seu último bloco de expressões condicionais.
        '''

        bd = BD(CAMINHO)
        bd.define_tabela("51")
        valores = (1, 12, 12, 12, 0, 0)
        bd.adiciona_placar(12, "primeiro jogo")
        itens = bd.printa_tabela()[0]
        bd.encerra()
        self.deleta_BD()

        self.assertEqual(itens[0], valores)
예제 #4
0
    def test_2_tabela_vazia(self):
        '''
        2 - Testar uma tabela vazia.

        Espera-se que uma tabela recém criada tenha seis colunas
        e nenhuma linha. Testa os métodos "printa_tabela" e
        "define_tabela".
        '''

        bd = BD(CAMINHO)
        bd.define_tabela("2020")
        self.assertEqual(bd.tabela, "temporada_2020")
        itens, colunas = bd.printa_tabela()
        bd.encerra()
        self.deleta_BD()

        self.assertEqual(itens, [])
        self.assertEqual(len(colunas), 6)
예제 #5
0
    def cli(self):
        '''
        Método que inicia a visão CLI.

        Cria uma instância da classe Cli enviando a lista de BDs encontrados no diretório.
        O usuário escolhe um BD e uma temporada para iniciar o programa.
        
        Em seguida inicia-se um laço que recebe instruções do usuário e executa ações no
        BD modelado pelo script banco.py
        '''
        def escolha_tabela():
            '''
            Função invocada para que se defina uma temporada.

            Caso haja mais de uma, a visão mostra ao usuário opções de escolha;
            Caso haja apenas uma, esta temporada é escolhida;
            Caso não haja nenhuma, é criada uma temporada com numeração do ano atual.
            '''

            tabelas = bd.verifica_tabelas()
            tabelas = [x[0] for x in tabelas]

            if len(tabelas) > 1:
                temporada = self.visao.escolhe_temporada(tabelas).replace(
                    "temporada_", "")

            elif len(tabelas) == 1:
                temporada = tabelas[0].replace("temporada_", "")

            else:
                temporada = datetime.now().year

            return temporada

        self.visao = Cli(self.bancos)
        nome_bd, temporada = self.visao.escolhe_banco()

        bd = BD(self.diretorio + nome_bd)

        if temporada == 0:
            temporada = escolha_tabela()

        bd.define_tabela(temporada)

        while True:
            escolha_menu, parametro = self.visao.menu(nome_bd, bd.tabela)
            if "Sair" in escolha_menu:
                bd.encerra()
                quit()

            elif "Consultar outras estatísticas" in escolha_menu:
                estats_1, estats_2, colunas_1, colunas_2 = bd.printa_tabela_2()
                self.visao.consultar_tabela(estats_1, colunas_1)
                self.visao.consultar_tabela(estats_2, colunas_2)

            elif "Alterar BD" in escolha_menu:
                self.busca_bds()
                self.bancos.remove(nome_bd)
                if len(self.bancos) < 1:
                    escolha = self.visao.opcoes_BD("abortar", escolha_menu)

                else:
                    escolha = self.visao.opcoes_BD(self.bancos, escolha_menu)

                if "Sair" not in escolha:
                    bd.encerra()
                    bd = BD(self.diretorio + escolha)
                    nome_bd = escolha

                    temporada = escolha_tabela()
                    bd.define_tabela(temporada)

            elif "Deletar BD" in escolha_menu:
                self.busca_bds()
                self.bancos.remove(nome_bd)

                if len(self.bancos) < 1:
                    escolha = self.visao.opcoes_BD("abortar", escolha_menu)

                else:
                    escolha = self.visao.opcoes_BD(self.bancos, escolha_menu)

                    if "Sair" not in escolha:
                        if os.path.isfile(self.diretorio + escolha):
                            os.remove(self.diretorio + escolha)

            elif "Deletar temporada" in escolha_menu:
                escolha = self.visao.deletar_temporada(bd.verifica_tabelas(),
                                                       parametro)
                if "Sair" not in escolha:
                    bd.deleta_tabela(escolha)

            elif "Alterar/Criar temporada" in escolha_menu:
                escolha, temporada = self.visao.alterar_temporada(
                    bd.verifica_tabelas(), bd.tabela)

                if "Criar nova temporada" in escolha:
                    bd.tabela = f"temporada_{temporada}"
                    bd.cria_tabela()

                elif "temporada_" in escolha:
                    bd.tabela = escolha

            elif "Consultar estatísticas" in escolha_menu:
                dados = bd.printa_tabela()
                self.visao.consultar_tabela(dados[0], dados[1])

            elif "Adicionar um jogo" in escolha_menu:
                itens_serie = bd.retorna_tabela("inteira")

                if len(itens_serie) > 0:
                    ultima_linha = bd.retorna_tabela("última linha")[0][2:]
                    placar_min, placar_max, quebra_min, quebra_max = ultima_linha

                    tipo = "normal"

                    if parametro < placar_min:
                        tipo = "novo mínimo"
                        quebra_min += 1
                        print(
                            "Um novo placar mínimo foi registrado na temporada!"
                        )

                    elif parametro > placar_max:
                        tipo = "novo máximo"
                        quebra_max += 1
                        print(
                            "Um novo placar máximo foi registrado na temporada!"
                        )

                    bd.adiciona_placar([
                        parametro, placar_min, placar_max, quebra_min,
                        quebra_max
                    ], tipo)

                else:
                    bd.adiciona_placar(parametro, "primeiro jogo")
예제 #6
0
    def test_4_add_placar_2(self):
        '''
        4 - Teste de adicionar placar 2.

        Ao adicionar um jogo com placar de 24 pontos numa tabela não vazia,
        a última linha deve ser igual à variável "valores". Testa os métodos
        "retorna_tabela" (usando parâmetro "última linha") e "adiciona_placar",
        validando o bloco "novo máximo" das expressões condicionais deste método.
        '''

        bd = BD(CAMINHO)
        bd.define_tabela("1234")
        valores = (2, 24, 12, 24, 0, 1)

        bd.adiciona_placar(12, "primeiro jogo")
        bd.adiciona_placar([24, 12, 24, 0, 1], "novo máximo")
        ultima_linha = bd.retorna_tabela("última linha")[0]
        bd.encerra()
        self.deleta_BD()

        self.assertEqual(ultima_linha, valores)
예제 #7
0
    def test_10_top_5_print(self):
        '''
        11 - Teste dos melhores e dos piores top 5.

        Ao popular uma temporada com sete jogos, espera-se que os melhores
        e os piores top 5 sejam iguais às variáveis "valor_top_5" e "valor_piores_top_5".
        Em seguida, verifica se as somas de ambos valores são iguais às variáveis
        "valor_soma_top_5" e "valor_soma_piores_top_5".

        Testa os métodos "top_5" e "top_5_piores" com os dois blocos condicionais de cada um.
        Também é testado o método "printa_tabela_2", cujos dois primeiros valores retornados
        devem ser iguais às variáveis "valor_estats_1" e "valor_estats_2", respectivamente.
        '''

        bd = BD(CAMINHO)
        bd.define_tabela("404")

        bd.adiciona_placar(5, "primeiro jogo")
        tmp = [
            [12, "novo máximo"],
            [7, "normal"],
            [16, "novo máximo"],
            [4, "novo mínimo"],
            [16, "normal"],
            [8, "normal"],
        ]

        for x in tmp:
            min_temp, max_temp, quebra_min, quebra_max = bd.retorna_tabela(
                "última linha")[0][2:]
            placar = x[0]
            if placar < min_temp:
                quebra_min += 1

            elif placar > max_temp:
                quebra_max += 1

            bd.adiciona_placar(
                [placar, min_temp, max_temp, quebra_min, quebra_max], x[1])

        valor_top_5 = [16, 16, 12, 8, 7]
        valor_piores_top_5 = [4, 5, 7, 8, 12]

        self.assertEqual(bd.top_5("lista"), valor_top_5)
        self.assertEqual(bd.top_5_piores("lista"), valor_piores_top_5)

        valor_soma_top_5 = sum(valor_top_5)
        valor_soma_piores_top_5 = sum(valor_piores_top_5)

        self.assertEqual(bd.top_5("soma"), valor_soma_top_5)
        self.assertEqual(bd.top_5_piores("soma"), valor_soma_piores_top_5)

        valor_estats_1 = [[
            bd.soma_placares(),
            bd.media_placares(),
            valor_soma_top_5,
            valor_soma_piores_top_5,
        ]]

        valor_estats_2 = [[valor_top_5[x], valor_piores_top_5[x]]
                          for x in range(len(valor_top_5))]

        resultado = bd.printa_tabela_2()

        self.assertEqual(resultado[0], valor_estats_1)
        self.assertEqual(resultado[1], valor_estats_2)

        bd.encerra()
        self.deleta_BD()
예제 #8
0
    def test_9_soma_media_placares(self):
        '''
        9 - Calcular soma e média dos placares.

        Ao popular uma temporada com sete jogos, espera-se que a soma e a média
        dos placares sejam iguais às variáveis "valor_soma" e "valor_média",
        respectivamente. Testa os métodos "soma_placares" e "media_placares".
        '''

        bd = BD(CAMINHO)
        bd.define_tabela("1497")

        bd.adiciona_placar(5, "primeiro jogo")
        tmp = [
            [12, "novo máximo"],
            [7, "normal"],
            [16, "novo máximo"],
            [4, "novo mínimo"],
            [16, "normal"],
            [8, "normal"],
        ]

        for x in tmp:
            min_temp, max_temp, quebra_min, quebra_max = bd.retorna_tabela(
                "última linha")[0][2:]
            placar = x[0]
            if placar < min_temp:
                quebra_min += 1

            elif placar > max_temp:
                quebra_max += 1

            bd.adiciona_placar(
                [placar, min_temp, max_temp, quebra_min, quebra_max], x[1])

        valor_soma = 5 + sum([x[0] for x in tmp])
        valor_media = valor_soma / (len(tmp) + 1)

        self.assertEqual(bd.soma_placares(), valor_soma)
        self.assertEqual(bd.media_placares(), valor_media)

        bd.encerra()
        self.deleta_BD()
예제 #9
0
    def test_8_define_deleta_tabelas(self):
        '''
        8 - Definir e deletar tabelas.

        Ao adicionar as respectivas temporadas no BD, espera-se que a lista
        das temporadas seja igual à variável "valores". Em seguida, verifica-se
        a igualdade de ambas perante a remoção de uma temporada. Testa os métodos
        "define_tabela" e "deleta_tabela".
        '''

        bd = BD(CAMINHO)
        bd.define_tabela("2020")
        bd.define_tabela("2021")
        bd.define_tabela("2022")

        valores = ["temporada_2020", "temporada_2021", "temporada_2022"]

        self.assertEqual([x[0] for x in bd.verifica_tabelas()], valores)

        valores.remove("temporada_2021")
        bd.deleta_tabela("temporada_2021")

        self.assertEqual([x[0] for x in bd.verifica_tabelas()], valores)

        bd.encerra()
        self.deleta_BD()
예제 #10
0
    def test_7_add_placar_5(self):
        '''
        7 - Teste de adicionar placar 5.

        Adiciona 11 jogos com um, dois e três dígitos, quebrando duas vezes o recorde mínimo
        e quatro vezes o recorde máximo. Ao final, espera-se que a tabela seja igual à variável "valores".
        '''

        bd = BD(CAMINHO)
        bd.define_tabela("8219")
        valores = [
            (1, 5, 5, 5, 0, 0),
            (2, 12, 5, 12, 0, 1),
            (3, 7, 5, 12, 0, 1),
            (4, 16, 5, 16, 0, 2),
            (5, 4, 4, 16, 1, 2),
            (6, 16, 4, 16, 1, 2),
            (7, 8, 4, 16, 1, 2),
            (8, 21, 4, 21, 1, 3),
            (9, 17, 4, 21, 1, 3),
            (10, 1, 1, 21, 2, 3),
            (11, 386, 1, 386, 2, 4),
        ]

        bd.adiciona_placar(5, "primeiro jogo")
        tmp = [
            [12, "novo máximo"],
            [7, "normal"],
            [16, "novo máximo"],
            [4, "novo mínimo"],
            [16, "normal"],
            [8, "normal"],
            [21, "novo máximo"],
            [17, "normal"],
            [1, "novo mínimo"],
            [386, "novo máximo"],
        ]

        for x in tmp:
            min_temp, max_temp, quebra_min, quebra_max = bd.retorna_tabela(
                "última linha")[0][2:]
            placar = x[0]
            if placar < min_temp:
                quebra_min += 1

            elif placar > max_temp:
                quebra_max += 1

            bd.adiciona_placar(
                [placar, min_temp, max_temp, quebra_min, quebra_max], x[1])

        self.assertEqual(bd.retorna_tabela("inteira"), valores)

        bd.encerra()
        self.deleta_BD()
예제 #11
0
    def test_6_add_placar_4(self):
        '''
        6 - Teste de adicionar placar 4.

        Teste para adicionar placares com três digitos: 123 e 999.
        '''

        bd = BD(CAMINHO)
        bd.define_tabela("3")
        bd.adiciona_placar(123, "primeiro jogo")

        min_temp, max_temp, quebra_min, quebra_max = bd.retorna_tabela(
            "última linha")[0][2:]

        placar = 999
        valores = (2, placar, 123, placar, 0, 1)

        bd.adiciona_placar(
            [placar, min_temp, placar, quebra_min, quebra_max + 1],
            "novo máximo")
        self.assertEqual(bd.retorna_tabela("última linha")[0], valores)

        bd.encerra()
        self.deleta_BD()
예제 #12
0
    def test_5_add_placar_3(self):
        '''
        5 - Teste de adicionar placar 3.

        Ao adicionar três jogos com placares 30, 11 e 18, espera-se que
        a tabela inteira seja igual à variável "valores". Testa os métodos
        "retorna_tabela" (usando parâmetro "inteira") e "adiciona_placar",
        validando os blocos "novo mínimo" e "normal" das suas expressões
        condicionais.
        '''

        bd = BD(CAMINHO)
        bd.define_tabela("10000")
        valores = [
            (1, 30, 30, 30, 0, 0),
            (2, 11, 11, 30, 1, 0),
            (3, 18, 11, 30, 1, 0),
        ]

        bd.adiciona_placar(30, "primeiro jogo")
        bd.adiciona_placar([11, 11, 30, 1, 0], "novo mínimo")
        bd.adiciona_placar([18, 11, 30, 1, 0], "normal")

        self.assertEqual(bd.retorna_tabela("inteira"), valores)

        bd.encerra()
        self.deleta_BD()
예제 #13
0
class ControladorGui:    
    '''
    Classe que atua como controlador do programa quando se utiliza interface gráfica.
    '''
    
    def __init__(self):
        '''
        A classe inicializa o método "busca_bds" para que se tenha uma lista de BDs.
        '''
        
        self.busca_bds()


    def busca_bds(self):
        '''
        Método que faz uma busca pelos bancos de dados no diretório do programa
        '''
        
        self.diretorio = os.path.dirname(__file__) + "\\BD\\"        
        self.bancos = [file for file in os.listdir(self.diretorio) if file.endswith(".db")]


    def conecta(self, nome_bd):
        '''
        Método que inicia uma conexão com o BD.
        
        Parâmetro:
        ----------
        nome_bd : str
            Nome do BD a ser conectado.
        '''
        
        self.bd = BD(nome_bd)
        

    def encerra(self):
        '''
        Método que encerra uma conexão com o BD.
        '''
        
        self.bd.encerra()
        

    def altera_cria_bd(self, param):
        '''
        Método que altera ou cria um BD.

        Primeiro encerra a atual conexão e então cria uma nova com base nos
        parâmetros recebidos. Em seguida, define qual tabela será usada no
        BD.

        Retorna para interface gráfica informações para que possam ser definidas
        as variáveis globais relativas aos nomes do BD e da temporada em uso
        no script gui.py.
        
        Parâmetro:
        ----------
        param : list
            Lista que contem o nome do banco e a numeração da temporada.
        '''
        
        self.encerra()            
        self.conecta(f".\\BD\\{param[0]}")
        
        if param[1] != None:            
            self.tabela("escolhe", param[1])
            return param[1]

        else:
            try:
                self.tabela("escolhe", self.tabela("consulta")[0])
                return self.tabela("consulta")[0]

            except:
                self.tabela("escolhe", str(datetime.now().year))
                return str(datetime.now().year)               
            

    def tabela(self, tipo, param = ""):
        '''
        Método que consulta as tabelas do BD ou define uma.

        Se o tipo escolhido for "consulta", retorna uma lista das temporadas
        existentes no BD.

        Parâmetros:
        ----------
        tipo : str
            Qual tipo de ação o método deve executar.
            
        param : str (opcional)
            Parâmetro relativo a numeração da temporada.
        '''
        
        if tipo == "consulta":
            return [x[0].replace("temporada_", "") for x in self.bd.verifica_tabelas()]

        if tipo == "escolhe":
            self.bd.define_tabela(param)
            

    def retorna_dados(self):
        '''
        Método para retornar dados da tabela ativa no BD.

        Retorna:
        uma lista com a tabela inteira;
        duas listas, uma com os cinco melhores e outra com os
        cinco piores placares registrados;
        a soma dos placares registrados.
        '''
        
        return self.bd.retorna_tabela("inteira"), self.bd.top_5("lista"), self.bd.top_5_piores("lista"), self.bd.soma_placares()


    def altera_cria_temp(self, etapa, param = ""):
        '''
        Método que fornece informações ou executa ações na tabela ativa no BD.

        O método pode retornar à interface GUI uma lista com as tabelas ativas bem
        como o nome da atual tabela em uso.
        
        Parâmetros:
        ----------
        etapa : str
            Indica ao método qual tipo de ação a executar.

        param : str (opcional)
            Parâmetro relativo a numeração da temporada.
        '''
        
        if etapa == "inicial":
            tabelas = self.bd.verifica_tabelas()
            tabelas = [x[0] for x in tabelas] 
            tabelas.remove(self.bd.tabela)

            return tabelas, self.bd.tabela

        if etapa == "criação":            
            self.bd.tabela = f"temporada_{param}"
            self.bd.cria_tabela()

        if etapa == "alterar":    
            self.bd.tabela = param
            

    def deletar(self, etapa, param = ""):
        '''
        Método que possibilita deletar um BD ou uma temporada.
        
        Parâmetros:
        ----------
        etapa : str
            Indica ao método qual tipo de ação a executar.

        param : str (opcional)
            Parâmetro relativo a numeração da temporada.
        '''

        if etapa == "deletar temporada":
            self.bd.deleta_tabela(param)

            
        if etapa == "deletar BD":            
            if os.path.isfile(self.diretorio + param):
                os.remove(self.diretorio + param)
            

    def add_placar(self, placar):
        '''
        Método que envia da interface gráfica ao BD o placar a ser adicionado.

        Efetua verificações se o novo placar quebra os recordes mínimos ou máximos
        da temporada.

        Retorna à interface o tipo de inserção na tabela:
        se gerou um novo placar máximo;
        se gerou um novo placar mínimo;
        se não gerou nenhuma quebra de recorde;
        se foi o primeiro jogo da tabela.
        
        Parâmetro:
        ----------
        placar : int
            Qual o placar a ser adicionado na tabela.
        '''
        
        tipo = "normal"

        if len(self.bd.retorna_tabela("inteira")) > 0:                 
            ultima_linha = self.bd.retorna_tabela("última linha")[0][2:]
            placar_min, placar_max, quebra_min, quebra_max = ultima_linha            

            if placar < placar_min:
                tipo = "novo mínimo"
                quebra_min += 1
                
            elif placar > placar_max:
                tipo = "novo máximo"
                quebra_max += 1

            self.bd.adiciona_placar([placar, placar_min, placar_max, quebra_min, quebra_max], tipo)

        else:          
            self.bd.adiciona_placar(placar, "primeiro jogo")

        return tipo