PC03-L01 · riadené riešenie

Platné a hodnotné položky

Overíte všetky položky a zároveň vyhľadáte aspoň jednu hodnotnú položku.

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

Viete kombinovať all() a exists() nad rovnakým zoznamom s rozdielnymi podmienkami.

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

Každá položka musí mať kladné množstvo a nezápornú cenu. Aspoň jedna položka musí mať vypočítanú hodnotu 500 alebo viac.

Presné požiadavky

  1. Overte množstvo a cenu každej položky.
  2. Hodnotu vypočítajte ako množstvo krát cena.
  3. Nájdite aspoň jednu vypočítanú hodnotu aspoň 500.

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: Prvé makro kontroluje kvalitu každého záznamu; druhé hľadá aspoň jednu vypočítanú hodnotu.

Tip: všetky testy spustíte aj klávesmi Ctrl/⌘ + Enter.
Platné položky s vysokou hodnotouZatiaľ nespustený
Očakávané: true · bool
Zobraziť vstup JSON
{
  "items": [
    {
      "quantity": 2,
      "price": 40
    },
    {
      "quantity": 5,
      "price": 120
    }
  ]
}
Bez hodnotnej položkyZatiaľ nespustený
Očakávané: false · bool
Zobraziť vstup JSON
{
  "items": [
    {
      "quantity": 2,
      "price": 40
    },
    {
      "quantity": 3,
      "price": 100
    }
  ]
}
Neplatné množstvoZatiaľ nespustený
Očakávané: false · bool
Zobraziť vstup JSON
{
  "items": [
    {
      "quantity": 0,
      "price": 600
    }
  ]
}
Záporná cenaZatiaľ nespustený
Očakávané: false · bool
Zobraziť vstup JSON
{
  "items": [
    {
      "quantity": 2,
      "price": -1
    },
    {
      "quantity": 1,
      "price": 600
    }
  ]
}
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
items.all(item, item.quantity > 0.0 && item.price >= 0.0) && items.exists(item, item.quantity * item.price >= 500.0)

Prečo riešenie funguje

  1. all() použije dve validačné kontroly na každú položku.
  2. Podmienka používa &&, pretože obe vlastnosti položky sú povinné.
  3. exists() vykoná násobenie pre otázku vysokej hodnoty.
  4. Pravdivé musia byť výsledky oboch makier.

Čo dokazujú testovacie prípady

  • Platné položky s vysokou hodnotou: očakáva sa true (bool).
  • Bez hodnotnej položky: očakáva sa false (bool).
  • Neplatné množstvo: očakáva sa false (bool).
  • Záporná cena: očakáva sa false (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 kombinovať all() a exists() nad rovnakým zoznamom s rozdielnymi podmienkami.

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.