Versions Compared

Key

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

...

Expand
title Del 4 – mobil-appen (15%)

Under ser du et utkast til en mobil-app for sykkelutleietjenesten, basert på FXML. Kartet til venstre viser hvor det er sykler, og én stasjon er valgt (og implisitt også en sykkel på stasjonen). Brukeren kan endre antatt tidspunkt for tilbakelevering ved å endre teksten i tekstfeltet eller bruke knappene til høyre for feltet. Den vesentlige (for denne oppgaven) FXML-koden er vist til høyre.

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="kont2019.bike.BikeRentalController">

   ...

   <TextField fx:id="fromInput"/>

   <TextField fx:id="toInput"/>

   ...

   <Button onAction="#plus1HourAction" text="+ 1 hour"/>

   <Button onAction="#minus1HourAction" text="- 1 hour"/>

   <Button onAction="#rentAction" text="Rent"/>

</VBox>


Oppgave 4a)

Gitt denne FXML-koden, hvilke kode-elementer (klasser, felt og metoder) må finnes i koden som implementerer oppførselen (logikken) til appen?

Expand
titleLF

Av FXML-koden kan en lese at det grafiske grensesnittet (appen) knyttes til BikeRental ved hjelp av klassen BikeRentalController. Dette er i tråd med navnekonvensjonene brukt i tidligere eksamener. Det refereres til to tekstfelt som en i koden kobler seg til med henholdsvis  @FXML private TextField fromInput og toInput. Likeledes må en lage tre metoder (@FXML private void plus1HourAction, minus1HourAction og rentAction) som kalles når knappene i grensesnittet trykkes inn.

Oppgave 4b)

I kodeskjelettet er ufullstendig kode for oppførselen til appen angitt (Kontroller-logikk). Fyll ut de manglende kodeelementene, som angitt i kommentarer eller markert med ???

Det er lov å anta at LocalDateTime-klassen har konstruktør og metode for konvertering fra og til String, samt metoder for å lage nye LocalDateTime-instanser et gitt antall sekunder før og etter.

Expand
titleLF

Her er det (foreløpig) lagt inn mer kode enn de ulike metodene som skulle implementeres i oppgaven.

Code Block
languagejava
public class BikeRentalController {

    private final BikeRental bikeRental;
    private final Person me;
    private final Bike bike;

    public BikeRentalController() {
        bikeRental = new BikeRental();
        final GeoLocation here = new GeoLocation(63, 10);
        bikeRental.addPlace(here);
        bike = new Bike();
        bikeRental.addBike(bike, here);
        me = new Person("Hallvard");
    }

    private final LocalTimeStringConverter localTimeStringConverter = new LocalTimeStringConverter();

    @FXML
    public void initialize() {
        setFromTime(LocalTime.now());
        setToTime(LocalTime.now().plus(1, ChronoUnit.HOURS));
        Platform.runLater(() -> toInput.requestFocus());
    }

    @FXML
    private TextField fromInput;

    @FXML
    private TextField toInput;

    /**
     * @return a LocalDataTime object corresponding to the from input field value
     */
    private LocalTime getFromTime() {
        return localTimeStringConverter.fromString(fromInput.getText());
    }
    /**
     * Updates the from input field value according to the LocalDateTime argument
     * @param time
     */
    private void setFromTime(final LocalTime time) {
        fromInput.setText(localTimeStringConverter.toString(time));
    }

    private LocalTime getToTime() {
        return localTimeStringConverter.fromString(toInput.getText());
    }
    private void setToTime(final LocalTime time) {
        toInput.setText(localTimeStringConverter.toString(time));
    }

    @FXML
    public void plus1HourAction() {
        setToTime(getToTime().plus(1, ChronoUnit.HOURS));
    }

    @FXML
    public void minus1HourAction() {
        setToTime(getToTime().minus(1, ChronoUnit.HOURS));
    }

    private LocalDateTime toLocalDateTime(final LocalTime time) {
        return LocalDateTime.now().withHour(time.getHour()).withMinute(time.getMinute());
    }

    @FXML
    public void rentAction() {
        bikeRental.rentBike(me, bike, toLocalDateTime(getFromTime()) , toLocalDateTime(getToTime()));
    }
}




Expand
titleDel 5 – Testing av BikeRental-klassen (15%)
Oppgave 5a)

Skriv kode som tester getRentedBikes i BikeRentalsom vist i skjelettet til venstre (og som ble løst i oppgave 1e).

Gjør nødvendige antakelser om metoder som brukes til konfigurasjon av BikeRental.


Expand
titleLF

Denne er foreløpig ikke testkjørt, da junit bestemte seg for å rote seg til. Vil bli sjekket og utvidet, men tanken er nå omtrent slik. Jeg har skrevet det som råtekst. (smile)

Code Block
languagejava
bikeRental = new BikeRental();
final GeoLocation here = new GeoLocation(63, 10);
bikeRental.addPlace(here);
bike = new Bike();
bikeRental.addBike(bike,here);
assertEquals(bikeRental.getRentedBikes().size(),0);
Person me = new Person("Børge");
LocalDateTime now = LocalDateTime.now();
bikeRental.rentBike(me, bike, now, now.plusHours(2));
assertEquals(bikeRental.getRentedBikes().get(0).getRenter().getName(),"Børge");
assertEquals(bikeRental.getRentedBikes().size(),1);



Oppgave 5b)

Forklar med tekst og/eller kode hvorfor det er mer komplisert å teste rentBike og returnBike enn å teste getRentedBikes. Hvilke aspekter ved disse metodene er det som gjør det mer komplisert?


Expand
titleLF

Kommer. Middag! Eller om Hallvard rekker det før meg.


...