Skip to content
This repository has been archived by the owner on Jun 7, 2020. It is now read-only.

Definice testů

Josef Kolář edited this page Oct 23, 2017 · 5 revisions

Struktura testů

Testy jsou rozděleny do sekcí dle složkového rozdělení v hlavní složce testů - sekce oddělují jednotlivé obsahy a náročnosti testů:

tests
    ├── 001_basic
    └── 002_flow_controls

Každý test obsahuje následující data:

  • kód v jazyce IFJ17
  • název volitelně
  • popis volitelně
  • očekávaný návratový kód kompilátoru volitelně, výchozí 0
  • očekávaný návratový kód interpretu volitelně, výchozí 0
  • očekávaný standardní výstup z běhu volitelně, výchozí prázdný

Definice testů

Testové jednotky lze definovat dvěma způsoby.

Definice pomocí samostatných souborů

Jedná se o definici, při které jsou jednotlivé položky testovací jednotky uloženy jako soubory se shodným názvem:

tests/001_basic/
├── 01.code # kód ke zpracování
├── 01.cexitcode # očekávaný návratový kód kompilátoru
├── 01.iexitcode # očekávaný návratový kód interpretu
├── 01.stdin # standardní vstup předaný pro běh programu
├── 01.stdout # očekávaný standardní výstup běhu programu
|
└── 02_foo.code # další testová jednotka

Název testu je získán z názvu souboru, v tomto případě se jedná o 01, popis může být udán jako jednořádkový komentář na začátku souboru 01.code, resp. souboru definující test. Tento způsob slouží především pro složitější a komplexnější testy s předem očekávaným neprázdným výstupem.

Definice pomocí JSON

Každá testovací sekce může také obsahovat soubor s pevným názvem tests.json. Ten definuje testové jednotky velmi obdobným systémem, avšak agregovaně:

{
  "tests": [
    {
      "info": "empty scope",
      "code": "scope \n end scope",
      "stdout": ""
    },
    {
      "name": "syntax error",
      "code": "scope \n end scoppe",
      "stdin": "foobar",
      "compiler_exit_code": 2
    },
    {
      "info": "syntax error as scoppe",
      "code": "scope \n dim a as string \n dim a as integer \n end scope",
      "interpreter_exit_code": 3
    }
  ]
}

Z vlastností testů je opět povinný pouze code, tedy definice kódu pro zpracování - ten lze ovšem definovat i pomocí souboru s názvem <name>.code, dle klíče name v definici v JSON. Klíče info, name, compiler_exit_code, interpreter_exit_code, stdin a stdout opět nejsou povinné a jsou doplněný dle výchozích hodnot definovaných ve struktuře testů. Všechny hodnoty, kromě name, lze také definovat pomocí souborů, dle identické konvence jako v případě definice po souborech.

V případě, že existuje definice jak v JSON, tak v souboru, prioritu má definice v JSON.

Požadovaná rozšíření

V případě, že test požaduje zapnuté některé z rozšířeních, lze toto definovat přímo v definice testu, tedy například takto:

{
    "name": "07",
    "stdout": " 753",
    "extensions": ["IFTHEN"]
}

Případně lze také definovat testy požadované pro celou sekci:

{
  "tests": [...],
  "extensions": ["BOOLOP"]
}

K aktivování těchto testů je poté potřeba předat cestu k souboru rozsireni, dle dokumentace ke spouštěči.