From a4c1cdbe9ad8f81fd1c1a21d5c6b6424987608e9 Mon Sep 17 00:00:00 2001 From: vigusmao Date: Thu, 13 May 2021 20:02:52 -0300 Subject: [PATCH] Album --- Album/.idea/vcs.xml | 6 ++ Album/Album.iml | 21 ++++++ Album/src/Album.java | 78 +++++++++++++++++++++++ Album/src/AlbumTest.java | 127 +++++++++++++++++++++++++++++++++++++ Album/src/Figurinha.java | 25 ++++++++ Album/src/Pacotinho.java | 23 +++++++ Album/src/Repositorio.java | 21 ++++++ 7 files changed, 301 insertions(+) create mode 100644 Album/.idea/vcs.xml create mode 100644 Album/Album.iml create mode 100644 Album/src/Album.java create mode 100644 Album/src/AlbumTest.java create mode 100644 Album/src/Figurinha.java create mode 100644 Album/src/Pacotinho.java create mode 100644 Album/src/Repositorio.java diff --git a/Album/.idea/vcs.xml b/Album/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/Album/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Album/Album.iml b/Album/Album.iml new file mode 100644 index 0000000..bb6b39c --- /dev/null +++ b/Album/Album.iml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Album/src/Album.java b/Album/src/Album.java new file mode 100644 index 0000000..7f7fc52 --- /dev/null +++ b/Album/src/Album.java @@ -0,0 +1,78 @@ +import java.util.ArrayList; +import java.util.List; + +public class Album { + + public static final int PERCENTUAL_MINIMO_PARA_AUTO_COMPLETAR = 90; + + private final Repositorio repositorio; + private final int quantItensPorPacotinho; + + private List figurinhasColadas; // direct addressing + + public Album(Repositorio repositorio, int quantItensPorPacotinho) { + this.repositorio = repositorio; + this.quantItensPorPacotinho = quantItensPorPacotinho; + + int tamanhoFisicoDaLista = getTamanho() + 1; + this.figurinhasColadas = new ArrayList<>(); + // inicializa as posições com nulls, para poder acessá-las diretamente + for (int i = 0; i < tamanhoFisicoDaLista; i++) { + this.figurinhasColadas.add(null); + } + } + + public void receberNovoPacotinho(Pacotinho pacotinho) { + Figurinha[] figurinhasDoPacotinho = pacotinho.getFigurinhas(); + if (figurinhasDoPacotinho.length != this.quantItensPorPacotinho) { + return; // melhor ainda: lançaria uma checked exception + } + + + } + + public Figurinha getItemColado(int posicao) { + return null; // ToDo IMPLEMENT ME!!! + } + + public boolean possuiItemColado(int posicao) { + return false; // ToDo IMPLEMENT ME!!! + } + + public boolean possuiItemRepetido(int posicao) { + return false; // ToDo IMPLEMENT ME!!! + } + + public int getTamanho() { + return this.repositorio.getTotalFigurinhas(); + } + + public int getQuantItensColados() { + return 0; // ToDo IMPLEMENT ME!!! + } + + public int getQuantItensFaltantes() { + return getTamanho() - getQuantItensColados(); + } + + public void autoCompletar() { + // ToDo IMPLEMENT ME!!! + } + +// public static void main(String[] args) { +// ArrayList meuArrayList = new ArrayList<>(200); +// +// // inicializa as posi'c~oes com nulls, para poder acess-las diretamente +// for (int i = 0; i < 200; i++) { +// meuArrayList.add(null); +// } +// +//// System.out.println(meuArrayList.get(3)); +// +// meuArrayList.add(3, 300000); // insert com shift right +// +// for (int numero : meuArrayList) { +// System.out.println(numero); +// } +// } +} diff --git a/Album/src/AlbumTest.java b/Album/src/AlbumTest.java new file mode 100644 index 0000000..a8e653d --- /dev/null +++ b/Album/src/AlbumTest.java @@ -0,0 +1,127 @@ +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class AlbumTest { + + private Album albumFigurinhas; + private Repositorio repositorioFigurinhas; + + private static final int TAMANHO_DO_ALBUM = 200; + private static final int ITENS_POR_PACOTE = 3; + + @Before // roda antes de cada teste + public void setUp() { + this.repositorioFigurinhas = new Repositorio("album_copa2014", TAMANHO_DO_ALBUM); + this.albumFigurinhas = new Album(repositorioFigurinhas, ITENS_POR_PACOTE); + } + + private void popularAlbum(int[] posicoesDesejadas) { + Pacotinho pacote = new Pacotinho(this.repositorioFigurinhas, posicoesDesejadas); + this.albumFigurinhas.receberNovoPacotinho(pacote); + } + + @Test + public void testarPossuiFigurinhaParaFigurinhasExistentes() { + popularAlbum(new int[] {1, 2, 3}); + + for (int i = 1; i <= 3; i++) { + assertTrue("Figurinhas já inseridas devem ser encontradas", + this.albumFigurinhas.possuiItemColado(i)); + } + } + + @Test + public void testarPossuiFigurinhaParaFigurinhasAusentes() { + popularAlbum(new int[] {1, 2, 3}); + + assertFalse("Não devemos encontrar no álbum figurinhas nunca inseridas", + this.albumFigurinhas.possuiItemColado(4)); + assertFalse("Não devemos encontrar figurinhas de posições não-positivas", + this.albumFigurinhas.possuiItemColado(-390)); + assertFalse("Não devemos encontrar figurinhas maiores do que o tamanho", + this.albumFigurinhas.possuiItemColado(TAMANHO_DO_ALBUM + 1)); + } + + @Test + public void testarPossuiRepetidaParaFigurinhaRepetida() { + popularAlbum(new int[] {1, 2, 3}); + assertFalse(this.albumFigurinhas.possuiItemRepetido(2)); // sanity check + + popularAlbum(new int[] {2, 8, 9}); + assertTrue(this.albumFigurinhas.possuiItemRepetido(2)); + } + + @Test + public void testarGetTamanhoAlbum() { + assertEquals(TAMANHO_DO_ALBUM, this.albumFigurinhas.getTamanho()); + } + + @Test + public void testarGetContFigurinhas() { + popularAlbum(new int[] {1, 2, 3}); + assertEquals(3, this.albumFigurinhas.getQuantItensColados()); + + // vou agora abrir outro pacotinho com as mesmas figurinhas + // e verificar que o álbum terá ainda 3 figurinhas + + popularAlbum(new int[] {1, 2, 3}); + assertEquals(3, this.albumFigurinhas.getQuantItensColados()); + } + + @Test + public void testarGetQuantasFaltam() { + popularAlbum(new int[] {1, 2, 3}); + assertEquals(TAMANHO_DO_ALBUM - 3, + this.albumFigurinhas.getQuantItensFaltantes()); + } + + @Test + public void testarAutoCompletar() { + albumFigurinhas.autoCompletar(); + assertEquals("Não deve ser possível auto-completar um álbum que esteja vazio", + TAMANHO_DO_ALBUM, albumFigurinhas.getQuantItensFaltantes()); + + // agora vamos adicionar pacotinhos aleatórios até o álbum ficar quase cheio + + int minimoFigurinhasColadasParaAutoCompletar = + (int) (TAMANHO_DO_ALBUM * Album.PERCENTUAL_MINIMO_PARA_AUTO_COMPLETAR / 100f); + + while (albumFigurinhas.getQuantItensColados() < minimoFigurinhasColadasParaAutoCompletar) { + Pacotinho novoPacotinho = new Pacotinho( + this.repositorioFigurinhas, ITENS_POR_PACOTE); // aleatório + albumFigurinhas.receberNovoPacotinho(novoPacotinho); + } + + // sanity check + assertTrue(albumFigurinhas.getQuantItensFaltantes() > 0); + + albumFigurinhas.autoCompletar(); + + assertEquals("O álbum deve estar completo após uma chamada válida ao auto-completar", + 0, albumFigurinhas.getQuantItensFaltantes()); // álbum completo! + } + + @Test + public void testarGetItemColado() { + popularAlbum(new int[] {1, 2, 3}); + Figurinha figurinha = albumFigurinhas.getItemColado(2); + + assertNotNull(figurinha); + + assertEquals(2, figurinha.getPosicao()); + + assertNull(albumFigurinhas.getItemColado(4)); + } + + @Test + public void testarRejeicaoPacotinhosDeTamanhoErrado() { + popularAlbum(new int[] {1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8}); + + assertEquals("Pacotes de tamanho distinto do informado na construção " + + "do álbum devem ser rejeitados", + 0, albumFigurinhas.getQuantItensColados()); + } + +} \ No newline at end of file diff --git a/Album/src/Figurinha.java b/Album/src/Figurinha.java new file mode 100644 index 0000000..a97ca20 --- /dev/null +++ b/Album/src/Figurinha.java @@ -0,0 +1,25 @@ +import java.awt.*; + +public class Figurinha { + + private final Image imagem; + private final int posicao; + + public Figurinha(int posicao, String urlDaImagem) { + this.imagem = obterImagem(urlDaImagem); + this.posicao = posicao; + } + + private Image obterImagem(String url) { + // ToDo baixaria da Internet... + return null; + } + + public Image getImagem() { + return imagem; + } + + public int getPosicao() { + return posicao; + } +} diff --git a/Album/src/Pacotinho.java b/Album/src/Pacotinho.java new file mode 100644 index 0000000..1211655 --- /dev/null +++ b/Album/src/Pacotinho.java @@ -0,0 +1,23 @@ +public class Pacotinho { + + + + public Pacotinho(Repositorio repo, int[] posicoesDesejadas) { + // ToDo IMPLEMENT ME!!! + } + + /** + * Produz um pacotinho com quantFigurinhas sorteadas aleatoriamente + * dentre aqueles presentes no repositório informado. + * + * @param repo o repositório desejado + * @param quantFigurinhas a quantidade de figurinhas a constar no pacotinho + */ + public Pacotinho(Repositorio repo, int quantFigurinhas) { + // ToDo IMPLEMENT ME!!! + } + + public Figurinha[] getFigurinhas() { + return null; // ToDo IMPLEMENT ME!!! + } +} diff --git a/Album/src/Repositorio.java b/Album/src/Repositorio.java new file mode 100644 index 0000000..f1a4a4e --- /dev/null +++ b/Album/src/Repositorio.java @@ -0,0 +1,21 @@ +import java.util.ArrayList; +import java.util.List; + +public class Repositorio { + + private static final String PREFIXO_URL_IMAGENS = "http://www.nossoalbum.com.br/imagens/"; + + private List todasAsFigurinhas; + + public Repositorio(String sufixoUrlImagens, int quantFigurinhas) { + todasAsFigurinhas = new ArrayList<>(quantFigurinhas); + for (int i = 1; i <= quantFigurinhas; i++) { + Figurinha fig = new Figurinha(i, PREFIXO_URL_IMAGENS + sufixoUrlImagens); + todasAsFigurinhas.add(fig); + } + } + + public int getTotalFigurinhas() { + return this.todasAsFigurinhas.size(); + } +}