ExercismでLeanの演習をテストする方法を学びます
テストを実行するには、Lean 4がインストールされていることを確認してください。
演習のディレクトリで、次を実行します:
lake test
演習の解答は、Leanのモジュールです。
モジュールの名前は、テストスイートの先頭にある*import文*で定義されます:
import LeanTest
import ExerciseName
open LeanTest
def exerciseNameTests : TestSuite :=
(TestSuite.empty "ExerciseName")
|>.addTest "first test" (do
return assertEqual someVal (ExerciseName.someFun someArg1 someArg2))
...
def main : IO UInt32 := do
runTestSuitesWithExitCode [exerciseNameTests]
この例では、テストファイルは2行目でExerciseNameというモジュールをインポートしています。
テストfirst testは、ExerciseName.someFunという関数を、引数someArg1とsomeArg2で呼び出します。
someFunの前にあるこのExerciseNameは、同じ名前のモジュール、つまりExerciseNameで定義された名前空間です。
つまり、次のようなExerciseName.leanという名前のファイルを作成する必要があります:
namespace ExerciseName
def someFun (someArg1 : Type1) (someArg2 : Type2) : ReturnType :=
...
end ExerciseName
テストは通常、いくつかの引数を持つ1つ以上の関数を呼び出すことに注意してください。 それらはすべて、解答のモジュール内で、モジュールと同じ名前の名前空間の中に定義されている必要があります。
各引数と、各関数の戻り値には、それぞれ型があります。
これはLeanの基本型(たとえばNat、List Int、Option String)のいずれかであることもあれば、ユーザー定義型であることもあります。
テストモジュールと同じフォルダーに、正しい名前のファイルがすでに用意されています。 このファイルには、ほとんどの初期情報を含むスタブがあり、解答の出発点として使えます。
このスタブはあくまで学習を始めるためのものだということだけ、覚えておいてください。 必要だと思ったら、遠慮なく完全に書き換えてください。
Lakeを使うLeanプロジェクトは、いつでも標準ライブラリStdをインポートできます。Stdには、追加のデータ構造やI/O、システムAPI、その他の基本的なユーティリティが含まれています。
このインポートは、ファイルの先頭に書きます:
import Std
def someMap : Std.HashMap Int Nat := ...
この例では、型HashMapは、それが定義されている名前空間であるStdで修飾されています。
標準ライブラリのすべてのリソースは、同じ名前空間Stdにあります。
モジュールを開くことで、そのデータ構造と関数をすべて、この名前空間の修飾なしで使えるようにすることもできます:
import Std
open Std
def someSet : TreeSet String := ...
外部パッケージはそのままでは使えず、lakefile.tomlに依存関係として追加する必要があります。
ローカルで作業している間は、好きなパッケージを自由に使えます。
ただし、オンラインのテストランナーが使えるのは、標準ライブラリStdだけです。