Neprogramátor/Kouzelné lektvary: spustitelné soubory a testy

Kouzelný lektvar vytvoří pro čaroděje kouzelná hůlka z dopisu, který pro kouzelnou hůlku čaroděj napsal. Dokumentace kouzelného jazyka Racket popisuje, jak vytvořit spustitelné soubory, tedy kouzelné lektvary, které stačí spustit, tedy vypít, aby se vykonaly čarodějem sepsané kouzelné věty. Spustitelné soubory lze samozřejmě vytvořit i ve vývojovém prostředí DrRacket.

Čarodějové se při psaní dopisů mohou splést. Vlastně se pletou dost často, a to i když se snaží sebevíce. Otázkou tedy není, jestli kouzelný dopis obsahuje chyby, protože odpověď je "ano". Ta správná, důležitá otázka zní -- jak snadno se chyby najdou a hlavně jak rychle se dají opravit. S hledáním a opravováním chyb pomáhá testování. Dokumentace kouzelného jazyka Racket popisuje, jak takové testování zařídit v kouzelném dopise.

Je větší 20 nebo číslo?

editovat

Problém, pro jehož řešení napsaném v kouzelném jazyce vytvoří kouzelná hůlka kouzelný lektvar, tedy spustitelný soubor, může být:

Podstatné jméno (číslo) 20 je pojmenované jako dvacet a nové kouzelné sloveso větší-než pracuje s jedním podstatným jménem (parametrem) číslo: jestli je číslo větší než dvacet, kouzelné sloveso větší-než vrátí nové podstatné jméno (text) "Větší je číslo.", kde číslo v textu je nahrazené konkrétní aktuální hodnotou; jinak vrátí "Větší je 20.".

Řešením takového problému zapsaném kouzelným jazykem v dopisu pro kouzelnou hůlku může být třeba:

; Je větší 20 nebo číslo?
(define dvacet 20)
(define (větší-než číslo)
  (if (> číslo dvacet)
    (string-append "Větší je " (number->string číslo) ".")
    (string-append "Větší je " (number->string dvacet) ".")))
(větší-než 11)
(větší-než 27)

Výsledek vykonání dopisu je potom:

"Větší je 20."
"Větší je 27."

Z minulé kapitoly lze proto s výhodou použít postup řešení:

$ git log
commit c25ad0493e6d4d51d789da51055014def4ae7bb1 (HEAD -> master)
Author: Jméno Čaroděje <email@carodeje.xyz>
Date:   Sun Jan 21 00:19:39 2024 +0100

    Přidej řešení "Je větší 20 nebo číslo?"

commit 8af19a8bafa550e7f8f49770e3d230a114b26d6c
Author: Jméno Čaroděje <email@carodeje.xyz>
Date:   Sat Jan 20 23:47:27 2024 +0100

    Přidej licenci a readme

Je tedy potřeba:

git add LICENSE README
git commit -m"Přidej licenci a readme"
git add vetsi-nez.rkt
git commit -m"Přidej řešení 'Je větší 20 nebo číslo?'"

A dohoda je, že v názvech souborů a adresářů se diakritika nepoužívá.

Vytvoření spustitelného souboru

editovat

Spustitelný soubor se v DrRacket vytvoří kliknutím na Racket v menu a potom na Create Executable..., čímž se otevře dialogové okno, kde stačí ponechat výchozí nastavení a kliknout na Create.

V repozitáři vetsi-nez se kromě souborů LICENSE, README a vetsi-nez.rkt objeví i soubor vetsi-nez. Ten lze potom spustit z příkazové řádky:

$ ./vetsi-nez
"Větší je 20."
"Větší je 27."

Testy v kouzelném dopisu

editovat

Na začátku kouzelného dopisu je potřeba kouzelnou hůlku upozornit na to, že dopis kromě kouzelných vět obsahuje i speciální kouzelné věty, které slouží výhradně čarodějům k testování jejich kouzelný vět. To čaroděj udělá kouzelnou větou

(module+ test (require rackunit))

kterou přidá do repozitáře:

git add vetsi-nez.rkt
git commit -m"Přidej do kódu rackunit"

Když chce potom čaroděj otestovat, že výsledek vykonání kouzelné věty odpovídá tomu, co očekává, použije kouzelné sloveso check-equal?:

(module+ test
  (check-equal? (větší-než 11)
                "Větší je 20."))
git add vetsi-nez.rkt
git commit -m"Přidej test, který projde"

Výsledek vykonání kouzelného dopisu se nezmění:

"Větší je 20."
"Větší je 27."

Vývojové prostředí DrRacket po vykonání dopisu pro kouzelnou hůlku s testem bez chyby.

 
Když je vykonání testu v dopisu pro kouzelnou hůlku úspěšné, kouzelná hůlka čaroděje neruší.

Jak ale čaroděj pozná, když udělá chybu? Když čaroděj otestuje kouzelnou větu, která neplatí:

(module+ test
  (check-equal? (větší-než 27)
                "Větší je 20."))
git add vetsi-nez.rkt
git commit -m"Přidej test, který selže"

kouzelná hůlka jej upozorní:

"Větší je 20."
"Větší je 27."

. FAILURE name: check-equal? location: vetsi-nez.rkt:15:2 actual: "Větší je 27." expected: "Větší je 20."

Vývojové prostředí DrRacket po vykonání dopisu pro kouzelnou hůlku, který obsahuje test s chybou.

 
Když test v dopisu pro kouzelnou hůlku selže, kouzelná hůlka na problém čaroděje upozorní.

Vlastně je od kouzelné hůlky hezké, že čaroděje obtěžuje jen tehdy, když je to nezbytně nutné.

Repozitář s testy

editovat

Repozitář s testy lze prozkoumat pomocí git:

$ git clone https://codeberg.org/Neprogramator/tested-greater-than.git
◄ Neprogramátor/Čarodějnické řemeslo: zdrojové kódy a repozitář Kouzelné lektvary: spustitelné soubory a testy