obliczenie dni jakie upłynęły od daty [stream]

0

Wtiam serdecznie
Kolejny stack w mojej nauce i pytanie do doświadczonych kolegów:
Celem zadania jest "obliczenie średniej liczby dni, jaka upłynęła od zlecenia wykonania zadania do dnia bieżącego w liście zadań"

Utworzone zostały klasy User, Task, taskList i Board zwracające odpowiednio użytkownika (Konstruktor: final String username, final String realName) zadania ( final String title, final String description, final User assignedUser, final User creator final LocalDate created, final LocalDate deadline), listy zadań (String name), i dashboard (String name).
W test suite utworzony zbiór danych testowych prepareTestData (dane podane przez instruktorów) na którym mamy pracować.

Kod jaki stworzyłem wygląda następująco:
...
@Test
void testAddTaskListAverageWorkingOnTask(){
//Given
Board project = prepareTestData();
Period period = new Period();

           //When
            List<TaskList> inProgessTasks = new ArrayList<>();
            inProgessTasks.add(new TaskList("In progress"));
            double averageDaysPassedSinceTaskCreation = project.getTaskLists().stream()
                    .flatMap(tl -> tl.getTasks().stream())
                    .map(Task::getCreated)
                    .Task.period.between(LocalDate.now(), created)
                    .average().getAsDouble();

            //Then
            assertEquals(2.5, averageDaysPassedSinceTaskCreation);
        }
    ...

I niestety podejście z period w takiej postaci się nie sprawdziło.

Pocieszam się tym, że to 3 poprzednie przypadki testowe udało mi się ogarnąć - ale ten mnie pokonał XD.
Jakieś rady

0

periodem tego chyba nie ogarniesz, spróbuj w ten sposób może:

LocalDate localDateStartDate = LocalDate.of(2016, 06, 10);
LocalDate localDateEndDate = LocalDate.of(2016,06,23);
long days = ChronoUnit.DAYS.between(localDateStartDate, localDateEndDate);

więcej tu:
https://stackoverrun.com/pl/q/8484800

0

Przy testach w JUnit i double trzeba brać pod uwagę prezycję.

0

Pierwsze danie:
Zrób przypadek dla jednego taska i policz średnią
Zrób przypadek dla dwóch tasków i policz średnią
Zrób przypadek dla braku tasków i policz średnią

Na drugie danie:
https://www.baeldung.com/hamcrest-number-matchers
https://www.baeldung.com/parameterized-tests-junit-5

Zrób zadanie klasycznie, bez .stream(), napisz testy.
Zrób wersję o jaką pytasz, testy już masz.

Metodą "na bootcampa" (W test suite utworzony zbiór danych testowych prepareTestData (dane podane przez instruktorów) na którym mamy pracować.) daleko nie zajdziesz.

PS
Na podstawie prostego przykładu zbuduj sobie swoje zadanie.
Domyśliłem się, bo danych nie ma, że masz policzyć średnią dla wszystkich Users.
Wtedy dla wszystkich do wzięcia opóźnienie, zsumowanie opóźnień, podzielenie podzielenie przez liczbę wszystkich tasków.

Istotna uwaga
Średnia średnich 'częściowych' != średniej całości

np
a) 1, 1, 1, 2, 2; średnia = 1,4
b) 1, 1, 1; średnia = 1
c) 2, 2; średnia = 3

średnia 1 i 3 = 2
2 != 1,4

Dlatego wałkowane jest flatMap, bo nie można zrobić suma średnich / liczba średnich żeby otrzymać średnią wszystkich tasków

package pl.bv.p69;

import java.time.LocalDate;

public class Task {

    private final LocalDate submitted;

    public Task(LocalDate submitted) {

        this.submitted = submitted;
    }

    public LocalDate getSubmitted() {

        return submitted;
    }
}
package pl.bv.p69;

import java.time.LocalDate;
import java.time.Month;
import java.util.List;

public abstract class Boss {

    public static List<Task> getTaskList() {

        return List.of(
                new Task(LocalDate.of(2020, Month.OCTOBER, 20)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 21)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 22)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 23)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 24)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 25)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 26)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 27)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 28)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 29)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 30)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 31))
        );
    }
}
package pl.bv.p69;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.List;

public abstract class Clerk {

    public static double getAverageDelay() {

        final List<Task> taskList = Boss.getTaskList();

        int total = 0;
        for (Task task : taskList) {
            final LocalDate submitted = task.getSubmitted();
            final LocalDate today = LocalDate.now();
            total += ChronoUnit.DAYS.between(submitted, today);
        }

        return (double) total / taskList.size();
    }

    public static double calculateAverageDelay() {

        return Boss.getTaskList()
                .stream()
                .map(Task::getSubmitted)
                .mapToLong(Clerk::betweenDays)
                .average()
                .orElse(0.0);
    }

    private static long betweenDays(LocalDate submitted) {

        return ChronoUnit.DAYS.between(submitted, LocalDate.now());
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0