Skip to content
Snippets Groups Projects
Commit 7fe7579b authored by emilia's avatar emilia
Browse files

tehtävä1

parents
Branches master
No related tags found
No related merge requests found
target
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="Testaus-t-1" />
</profile>
</annotationProcessing>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_20" default="true" project-jdk-name="20" project-jdk-type="JavaSDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
\ No newline at end of file
# Yksikkötestaustehtävä
Tämän repositorion tehtävä liittyy yksikkötestaukseen. Ohjelmassa on Main-luokka ja main-metodi, jonka suorittamalla voit todeta, miten itse luotu ArrayList -luokka käyttäytyy. Voit kuitenkin melko nopeasti todeta, että se on rikki, kun katsot tulostetta.
Tehtävänä on suorittaa yksikkötestit ja korjata OmaArrayList niin, että testit menevät läpi ja mielellään niin, että lista tosiaan tekee sen mitä lupaa. Katso koko tehtävänanto ViLLEstä.
# Projektin tuominen
Huom! Jos tuot tämän projektin IntelliJ IDEAan, huomaa että tämä ei varsinaisesti ole valmis projekti: tästä puuttuu mm. idea-hakemisto. Kun siis "importtaat" projektin, valitse Rebuild Project.
Asiasta on kahta koulukuntaa:
* Kehitysympäristön työkaluihin liittyvät tiedostot ja hakemistot **_eivät_** kuulu repositorioon. Tällöin kuka vaan saa kehittää asioita miten tykkää, omilla asetuksillaan ja ympäristöillään.
* Vaihtoehtoisesti tiedostot voi tai pitää sisällyttää projektiin: Tällöin kaikilla on varmasti samat asetukset ja työkalut, esimerkiksi koodin muotoilu pysyy kaikilla samana, jos se on määritelty asetuksissa. Lisäksi jos itse kehittää omaa projektiaan monella eri koneella, voi vain helposti importata koko projektin valmiina.
pom.xml 0 → 100644
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>fi.utu.tko2116</groupId>
<artifactId>Testaus-t-1</artifactId>
<version>0.0.1</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package fi.utu.tko2116;
import fi.utu.tko2116.lista.OmaArrayList;
import java.sql.SQLOutput;
public class Main {
public static void main(String[] args) {
OmaArrayList o = new OmaArrayList();
System.out.println("Uuden listan koko:"+o.koko());
o.lisaa(7);
System.out.println("Koko lisäyksen jälkeen:"+o.koko());
System.out.println("Onko lisätty arvo listassa..");
if(o.sisaltaako(7)){
System.out.println("Arvo on listassa!");
}else{
System.out.println("Arvoa ei ole listassa!");
}
int x = o.poista(0);
System.out.println("luvun 888 indeksi:"+o.indeksi(888));
System.out.println();
System.out.println("Luodaan lista, johon mahtuu aluksi 5 arvoa ");
OmaArrayList o2 = new OmaArrayList(5);
o2.lisaa(1);
o2.lisaa(2);
o2.lisaa(3);
o2.lisaa(4);
o2.lisaa(5);
System.out.println(o2.koko());
System.out.println(o2);
o2.tyhjenna();
System.out.println(o2);
}
}
\ No newline at end of file
package fi.utu.tko2116.lista;
/**
* Tämä luokka on yksinkertainen versio ArrayLististä. Oikeasta ArrayLististä
* poiketen tähän voidaan tallentaa ainoastaan kokonaislukuja, eikä tästä löydy
* edes kaikkia tarvittavia samoja metodeja.
*
* Jos kloonasit tämän luokan kurssin tehtävärepositoriosta, tässä luokassa on
* valitettavasti VIRHEITÄ. Jos ajat esimerkiksi main-metodin luokasta Main,
* lista tuntuu tavallaan toimivan, mutta ei kuitenkaan aina.
*
* Tämän harjoituksen tarkoituksena on suorittaa yksikkötestit. Suorita
* yksikkötestit ohjeen mukaan. Ne kertovat, missä tilanteissa koodi
* epäonnistuu. Korjaa sen jälkeen koodia niin, että yksikkötestit menevät läpi.
*
* Älä missään nimessä muuta yksikkötestejä! Koodi täytyy saada toimimaan
* nimenomaan testien määräämillä ehdoilla.
*
* Kun olet saanut luokan korjattua, voit tutustua tämän avulla siihen, miten
* ArrayListin voisi toteuttaa. Kannattaa tutustua myöhemmin, esimerkiksi
* kurssin jälkeen mun oikean ArrayListin koodiin ja sen perintähierarkiaan. *
*
* @author vilho
*
*/
public class OmaArrayList {
private int[] sisalto;
private int koko;
/**
* Uusi tyhjä OmaArrayList
*/
public OmaArrayList() {
sisalto = new int[10];
koko = 0;
}
/**
* / Uusi tyhjä OmaArrayList jolla on tietty alkukapasiteetti. Alkukapasiteetti
* määrittää, kuinka monta arvoa taulukkoon mahtuu alkutilanteessa. Listan koko
* on tietenkin 0, eli lista on tyhjä, mutta jos aikoo lisätä 100 arvoa
* taulukkoon, kannattaa luoda lista jonka koko on 100 jolloin taulukkoa ei
* tarvitse kasvattaa kesken kaiken.
*
* @param alkuKapasiteetti
*/
public OmaArrayList(int alkuKapasiteetti) {
sisalto = new int[alkuKapasiteetti];
koko = 0;
}
/**
* Uusi OmaArrayList, jonka sisältönä haetaan kopioimalla toinen, jo olemassa
* oleva OmaArrayList. Parametrina tulevasta listasta haetaan arvot siinä
* järjestyksesä kuin ne ovat.
*
* @param toinen
*/
public OmaArrayList(OmaArrayList toinen) {
sisalto = new int[toinen.koko];
koko = 0;
for (int i = 0; i < toinen.koko; i++) {
lisaa(toinen.hae(i));
}
}
/**
* Lisää taulukollisen arvoja listaan yksi kerrallaan siinä järjestyksessä,
* jossa arvot ovat taulukossa..
*
* @param taulukko
*/
public void lisaaKaikki(int[] taulukko) {
for (int luku : taulukko) {
lisaa(luku);
}
}
/**
* Lisää taulukollisen arvoja listaan yksi kerrallaan siinä järjestyksessä,
* jossa arvot ovat taulukossa..
*
* @param oma toinen OmaArrayList josta arvot lisätään
*/
public void lisääKaikki(OmaArrayList oma) {
for (int i = 0; i < oma.koko; i++) {
lisaa(oma.hae(i));
}
}
/**
* Lisää luvun seuraavaan tyhjään indeksiin.
*
* @param luku joka lisätään.
*/
public void lisaa(int luku) {
varmistaKoko();
sisalto[koko] = luku;
koko++;
}
/**
* Tyhjentää listan kokonaan siten, ettei listassa ole enää yhtään arvoa ja että
* sen koko on 0.
*/
public void tyhjenna() {
sisalto = new int[10];
koko = 0;
}
/**
* Yksityinen metodi, joka varmistaa, että taulukossa on tarpeeksi tilaa
* lisäyksiä varten. Kun taulukkoon lisätään arvoja, se kasvaa aina 1.5
* kertaiseksi. Jos taulukon oletuskoko on 0, taulukko kasvaa joka tapauksessa
* vähintään yhdellä.
*
* Metodi varmistaa koon ja jos taulukko on täysi, taulukko kasvaa.
*/
private void varmistaKoko() {
if (koko == sisalto.length) {
int[] uusiTaulukko = new int[1 + (int) (koko * 1.5)];
for (int i = 0; i < sisalto.length; i++) {
uusiTaulukko[i] = sisalto[i];
}
sisalto = uusiTaulukko;
}
}
/**
* Yksityinen metodi, käytetään indeksin selvittämiseen ja virheiden
* heittmäiseen, jos pyydetty indeksi ei ole sellainen, joka taulukossa on.
*
* Tämä ei liity todellisen taulukon {@link OmaArrayList#sisalto} indeksiin.
* Vaikka kyseinen indeksi löytyisikin taulukosta, se ei välttämättä ole
* kelvollinen: taulukossa voisi olla vaikka 10 paikkaa, mutta näistä vasta 3 on
* käytetty listaan tallentamiseen. Indeksi 7 on tällöin virheellinen.
*
* @param indeksi jota kysytään.
*/
private void tarkistaIndeksi(int indeksi) {
if (indeksi >= koko || indeksi < 0) {
throw new ArrayIndexOutOfBoundsException("Listassa ei ole indeksiä " + indeksi + " (koko: " + koko + ")");
}
}
/**
* Hakee (get) arvon listasta.
*
* @param indeksi jossa oleva arvo otetaan
* @return arvo halutusta indeksistä.
*/
public int hae(int indeksi) {
tarkistaIndeksi(indeksi);
return sisalto[indeksi];
}
/**
* Asettaa arvon tiettyyn indeksiin.
*
* @param indeksi johon arvo asetetaan
* @param arvo joka asetetaan listaan.
*/
public void aseta(int indeksi, int arvo) {
tarkistaIndeksi(indeksi);
sisalto[indeksi] = arvo;
}
/**
* Palauttaa tiedon siitä, mikä on parametrina tulevan luvun indeksi.
*
* @param luku jonka indeksiä haetaan
* @return luvun indeksi listassa, tai -1 jos lukua ei löydy.
*/
public int indeksi(int luku) {
for (int i = 0; i < koko; i++) {
if (sisalto[i] == luku) {
return i;
}
}
return -1;
}
/**
* Palauttaa tiedon siitä, sisältääkö taulukko tietyn luvun
*
* @param luku jota taulukosta etsitään
* @return true jos arvo löytyy, false jos ei.
*/
public boolean sisaltaako(int luku) {
return indeksi(luku) >= 0;
}
/**
* Palauttaa tiedon siitä, miten suuri OmaArrayList on tällä hetkellä. Toisin
* sanoen, montako arvoa siihen on tallennettu.
*
* @return listan koko.
*/
public int koko() {
return koko;
}
/**
* Poistaa ja palauttaa arvon tietystä indeksistä.
*
* @param indeksi jossa oleva arvo poistetaan.
* @return poistettu arvo, joka palautetaan.
*/
public int poista(int indeksi) {
tarkistaIndeksi(indeksi);
int poistettava = sisalto[indeksi];
for (int i = indeksi; i < koko - 1; i++) {
sisalto[i] = sisalto[i + 1];
}
sisalto[koko - 1] = 0;
koko--;
return poistettava;
}
/**
* Uudelleentoteutus toString -metodille.
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < koko; i++) {
sb.append(sisalto[i]);
if (i != koko - 1) {
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
}
}
import fi.utu.tko2116.lista.OmaArrayList;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class TestArrayListAlustus {
@Test
public void testaaArrayListOnTyhjäAluksi() {
OmaArrayList oma = new OmaArrayList();
assertEquals(0,oma.koko());
}
@Test
public void testaaAlkuKapasiteettiEiVaikutaKokoon() {
OmaArrayList oma = new OmaArrayList(10);
assertEquals(0,oma.koko());
}
@Test
public void testaaKopionKokoOnSamaKuinAlkuperaisella() {
OmaArrayList oma = new OmaArrayList();
oma.lisaa(5);
oma.lisaa(7);
OmaArrayList kopio = new OmaArrayList(oma);
assertEquals(oma.koko(),kopio.koko());
}
}
import fi.utu.tko2116.lista.OmaArrayList;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class TestArrayListHaku {
@Test
public void testaaListaSisältääLisätynArvon() {
int arvo = 9;
OmaArrayList oma = new OmaArrayList();
oma.lisaa(arvo);
assertEquals(true,oma.sisaltaako(arvo));
}
@Test
public void testaaOlematonArvonIndeksiOnMiinusYksi() {
int arvo = 9;
int eilöydy = arvo-1;
OmaArrayList oma = new OmaArrayList();
oma.lisaa(arvo);
assertEquals(-1,oma.indeksi(eilöydy));
}
}
import fi.utu.tko2116.lista.OmaArrayList;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
public class TestArrayListLisaysJaPoisto {
@Test
public void testaaTyhjaanListaanLisattyKasvattaaKokoa() {
OmaArrayList oma = new OmaArrayList();
oma.lisaa(5);
assertEquals(1,oma.koko());
}
@Test
public void testaaLisattyArvoOnSamaKuinHaettuArvo() {
int arvo = 9;
OmaArrayList oma = new OmaArrayList();
oma.lisaa(arvo);
assertEquals(arvo,oma.hae(0));
}
@Test
public void testaaArvonLisaaminenKasvattaaKokoa() {
int arvo = 9;
OmaArrayList oma = new OmaArrayList();
oma.lisaa(arvo);
assertEquals(1,oma.koko());
}
@Test
public void testaaArvonPoistaminenPienentaaKokoa() {
int arvo = 9;
OmaArrayList oma = new OmaArrayList();
oma.lisaa(arvo);
oma.poista(0);
assertEquals(0,oma.koko());
}
@Test
public void testaaPoistettuArvoPalautuuListasta() {
int arvo = 9;
OmaArrayList oma = new OmaArrayList();
oma.lisaa(arvo);
int poistettu = oma.poista(0);
assertEquals(arvo,poistettu);
}
@Test
public void testaaTyhjennyksenJalkeenKokoOnNolla() {
int arvo = 9;
OmaArrayList oma = new OmaArrayList();
oma.lisaa(arvo);
oma.lisaa(arvo);
oma.lisaa(arvo);
oma.lisaa(arvo);
oma.tyhjenna();
assertEquals(0,oma.koko());
}
}
import fi.utu.tko2116.lista.OmaArrayList;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;
/**
* Huom! Tässä testiluokassa ei ole virheitä, mutta voit huviksesi tutustua syntaksiin.
*
* Jos halutaan, että jokin metodi epäonnistuu, ei sen pitäisi heittää poikkeus, voidaan suoritettava koodi antaa
* lambdalausekkeena assertThrows -metodille, suorittaa koodin ja varmistaa että poikkeus lentää varmasti.
*
*/
public class TestaaMuitaJuttujaHienommallaSyntaksilla {
@Test
public void testaaKiellettyIndeksiHeittääPoikkeuksen() {
OmaArrayList oma = new OmaArrayList();
assertThrows(ArrayIndexOutOfBoundsException.class, () -> oma.hae(-1));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment