Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleDel 4 - Diverse (18 poeng)
Code Block
public class Meal {
    ...
    
    /**
     * Finds a Course satisfying the provided Predicate.
     * @param test
     * @return the first Course satisfying the provided Predicate, otherwise null.
     */
    public Course findCourse(Predicate<Course> test) {
        ... what should be done here? ...
    }
}

public interface Predicate<T> {
    /**
     * Evaluates this predicate on the given argument.
     * @param t the input argument
     * @return true if the input argument matches the predicate, otherwise false
     */
    boolean test(T t);
}

public class MealTest extends TestCase {

    private Course c1, c2;
    private Meal meal;

    @Override
    protected void setUp() throws Exception {
        ... what should be done here? ...
    }
    
    /**
     * Tests Meal's support for foreach loop (iteration)
     */
    public void testIteration() {
        ... test code ...
    }
    
    /**
     * Tests Meal's findCourse(Prediate) method
     */
    public void testFindCourse() {
        ... test code ...
    }
}
(5p) Oppgave a) Predicate-grensesnittet

Hva kalles et slikt grensesnitt som Predicate (se utgitt kode) og hvorfor?

Expand
titleLF

Dette er et såkalt funksjonelt grensesnitt, siden det har én metode som (er ment som å) oppfører seg som en matematisk funksjon.

(5p) Oppgave b) findCourse-metoden

Meal skal utvides med en metode for å finne det første Course-objekter objektet som tilfredsstiller gitte betingelser. For å gjør koden generell så gis betingelsen inn som argument i form av et Predicate-objekt (se utgitt kode). Fullfør findCourse-metoden (se utgitt kode).

Expand
titleLF

Vi må løpe gjennom course-lista og returnere det første Course-objektet som Predicate-objektet svarer true for.

Code Block
public Course findCourse(Predicate<Course> test) {
	for (Course course : courses) {
		if (test.test(course)) {
			return course; 
		}
	}
	return null;
}
(8p) Oppgave c) Testing av Meal

Den utgitte koden inneholder en JUnit-test for testing av Meal-klassen. To typer funksjonalitet skal testes, 1) metoden(e) for å støtte iterasjon vha. foreach-løkker og 2) findCourse-metoden. Fullfør koden. Hvis du ikke får til å skrive riktig kode for JUnit-rammeverket, så forklar med tekst og kode hvordan du ville gjort det.

Expand
titleLF

 setUp-metoden brukes for initialisering av objektene som brukes i testene.

Code Block
protected void setUp() throws Exception {
	c1 = new Course("c1", "c1");
	c2 = new Course("c2", "c2");
	meal = new Meal("test", "test", new Course[]{ c1, c2});
}

For å teste iterasjon med foreach-løkker, må vi bruke metoden som en slik løkke (implisitt) bruker, nemlig iterator()-metoden og Iterator-objektet som denne returnerer. Her brukes objektene som er rigget opp i setUp-metoden.

Code Block
 public void testIterator() {
 	Iterator<Course> it = meal.iterator();
 	assertTrue(it.hasNext());
 	assertEquals(c1, it.next());
 	assertTrue(it.hasNext());
 	assertEquals(c2, it.next());
 	assertFalse(it.hasNext());
 }

For å teste findCourse-metoden, så må en lage seg et Predicate-objekt og sjekke at findCourse-metoden returnerer det riktige objektet.

Code Block
public void testFindCourse() {
	assertEquals(c1, meal.findCourse(course -> course.name.equals("c1")));
}

Koden finnes på github, se del 4 av konten 2017