PC05-L03 · samostatné riešenie

Všetky udalosti pred termínom

Skombinujete neprázdny zoznam s časovou podmienkou pre každú udalosť.

Praktický CEL4 testovacie prípadyZdokumentované
Čo si precvičím?

Viete vložiť konverziu času do all() a vedome určiť význam prázdnej kolekcie.

Ako sa riešenie overí?

Jeden výraz musí vrátiť očakávaný výsledok pre všetky štyri vstupy JSON.

Kedy som hotový?

Keď prejdú všetky testy a viete vysvetliť každú podmienku vo výraze.

Slovná úloha

Zoznam udalostí je platný iba vtedy, keď nie je prázdny a každá udalosť nastane v spoločnom termíne alebo skôr.

Presné požiadavky

  1. Prázdny zoznam explicitne odmietnite.
  2. Čas každej udalosti spracujte vo vnútri makra.
  3. Povoľte udalosť presne v termíne.
  4. Odmietnite zoznam, ak je niektorá udalosť neskoro.

Požadovaný výsledok

Napíšte jeden výraz CEL. Musí vrátiť očakávanú hodnotu aj typ pre všetky štyri pripravené vstupy JSON. Vstupy nemeňte tak, aby prešiel neúplný výraz.

Odporúčaný postup

  1. Každú očíslovanú požiadavku preložte na jednu malú logickú podmienku.
  2. Spustite počiatočný výraz a zistite, ktoré prípady neprešli.
  3. Pridávajte vždy jednu podmienku a znova spustite celú testovaciu sadu.
  4. Úlohu označte za dokončenú až vtedy, keď viete vysvetliť každý operátor a každú hranicu.

Vyriešte úlohu · testovacia sada v prehliadači

Napíšte jeden výraz, ktorý prejde všetkými prípadmi

Upravte výraz CEL a potom ho spustite nad všetkými pripravenými vstupmi JSON. Riešenie je hotové až vtedy, keď prejdú všetky prípady.

4 testovacie prípady

Pomôcka: Samotné all() je pri prázdnom zozname true; zadanie však vyžaduje aspoň jednu udalosť.

Tip: všetky testy spustíte aj klávesmi Ctrl/⌘ + Enter.
Všetky včasZatiaľ nespustený
Očakávané: true · bool
Zobraziť vstup JSON
{
  "events": [
    {
      "at": "2026-07-23T09:00:00Z"
    },
    {
      "at": "2026-07-23T10:00:00Z"
    }
  ],
  "deadline": "2026-07-23T10:00:00Z"
}
Jedna neskoroZatiaľ nespustený
Očakávané: false · bool
Zobraziť vstup JSON
{
  "events": [
    {
      "at": "2026-07-23T09:00:00Z"
    },
    {
      "at": "2026-07-23T10:00:01Z"
    }
  ],
  "deadline": "2026-07-23T10:00:00Z"
}
Prázdny zoznamZatiaľ nespustený
Očakávané: false · bool
Zobraziť vstup JSON
{
  "events": [],
  "deadline": "2026-07-23T10:00:00Z"
}
Jedna presne v termíneZatiaľ nespustený
Očakávané: true · bool
Zobraziť vstup JSON
{
  "events": [
    {
      "at": "2026-07-23T10:00:00Z"
    }
  ],
  "deadline": "2026-07-23T10:00:00Z"
}
Výsledok testov

Zatiaľ nespustený

Rovnaký výraz sa spustí nad každým prípadom. Testovacie údaje sú pevné, takže nemožno vynechať hranice ani chybové situácie.

Vysvetlené riešenie

Zobraziť celý výraz
events.size() > 0 && events.all(event, timestamp(event.at) <= timestamp(deadline))

Prečo riešenie funguje

  1. size() > 0 zmení prirodzene pravdivý výsledok all() pri prázdnom zozname.
  2. all() postupne vytvorí väzbu event pre každú položku.
  3. Obe strany každého porovnania sú časové pečiatky.
  4. Jedna nepravdivá podmienka spôsobí nepravdivý výsledok celého all().

Čo dokazujú testovacie prípady

  • Všetky včas: očakáva sa true (bool).
  • Jedna neskoro: očakáva sa false (bool).
  • Prázdny zoznam: očakáva sa false (bool).
  • Jedna presne v termíne: očakáva sa true (bool).

Prípady sú zámerne rozdielne. Riešenie, ktoré prejde iba prvým prípadom, ešte nezapracovalo celé pravidlo.

Častá chyba

Výraz neprispôsobujte iba prvému úspešnému vstupu. Požiadavka je zapracovaná až vtedy, keď kladný, záporný aj hraničný prípad vytvoria určený výsledok.

Kontrolná otázka

Viete ukázať presnú časť riešenia, ktorá spôsobí zlyhanie každého nepravdivého testu? Ak dve rozdielne zlyhania závisia od rovnakej podmienky, vysvetlite prečo.

Hlavná myšlienka

Viete vložiť konverziu času do all() a vedome určiť význam prázdnej kolekcie.

Zdroje

  • CEL-DEV — oficiálny prehľad CEL.
  • CEL-LANG — oficiálna definícia jazyka CEL pre operátory, typy, makrá, prítomnosť, reťazce a časové hodnoty použité v tejto úlohe.