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()
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()
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()
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)
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)
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()
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)
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()
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")
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()
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