diff options
| author | Arnaud Bailly <arnaud.bailly@iohk.io> | 2025-01-25 10:45:41 +0100 |
|---|---|---|
| committer | Arnaud Bailly <arnaud.bailly@iohk.io> | 2025-01-25 10:45:41 +0100 |
| commit | 7752d73216578d5961751b5d0535088d384b4aa6 (patch) | |
| tree | 786e46fe1276e93ade0a48398cd4c9ac13081707 /lambda-calcul/java/lcgoji/src/test | |
| parent | d6f68e919db51d366c8ca3c1509bea12aa81d692 (diff) | |
| download | lambda-nantes-7752d73216578d5961751b5d0535088d384b4aa6.tar.gz | |
Move λ-calcul workshop code to subdirectory
Diffstat (limited to 'lambda-calcul/java/lcgoji/src/test')
| -rw-r--r-- | lambda-calcul/java/lcgoji/src/test/java/org/lambdanantes/lcgoji/LCEvaluatorTest.java | 74 | ||||
| -rw-r--r-- | lambda-calcul/java/lcgoji/src/test/java/org/lambdanantes/lcgoji/ast/TermTest.java | 38 |
2 files changed, 112 insertions, 0 deletions
diff --git a/lambda-calcul/java/lcgoji/src/test/java/org/lambdanantes/lcgoji/LCEvaluatorTest.java b/lambda-calcul/java/lcgoji/src/test/java/org/lambdanantes/lcgoji/LCEvaluatorTest.java new file mode 100644 index 0000000..ec2f027 --- /dev/null +++ b/lambda-calcul/java/lcgoji/src/test/java/org/lambdanantes/lcgoji/LCEvaluatorTest.java @@ -0,0 +1,74 @@ +package org.lambdanantes.lcgoji; + +import org.junit.Test; +import org.lambdanantes.lcgoji.ast.Term; +import org.lambdanantes.lcgoji.ast.Var; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.lambdanantes.lcgoji.LCEvaluator.evaluate; +import static org.lambdanantes.lcgoji.ast.Abs.IDENTITY; +import static org.lambdanantes.lcgoji.ast.Abs.λ; +import static org.lambdanantes.lcgoji.ast.App.apply; +import static org.lambdanantes.lcgoji.ast.Var.var; + +public class LCEvaluatorTest { + + Var x = var("x"); + Var y = var("y"); + Var z = var("z"); + + @Test + public void l_evaluation_d_une_variable_rend_la_meme_variable() { + // evaluate(x) == x + assertEvalTo(x, x); + } + + @Test + public void l_evaluation_d_une_abstraction_rend_la_meme_abstraction() { + // evaluate(λx.x) == λx.x + assertEvalTo(IDENTITY, IDENTITY); + } + + @Test + public void l_evaluation_de_l_application_de_deux_vars_rend_la_meme_application() { + // evaluate(x y) == x y + assertEvalTo(apply(x, y), apply(x, y)); + } + + @Test + public void l_evaluation_de_l_application_de_l_identite_sur_un_argument_rend_l_argument() { + // evaluate((λx.x) y) == y + assertEvalTo(apply(IDENTITY, y), y); + } + + @Test + public void l_evaluation_de_l_application_d_une_abstraction_substitue_son_argument() { + // evaluate((λx.x x) y ) == y y + assertEvalTo(apply(λ("x", apply(x, x)), y), apply(y, y)); + } + + @Test + public void l_evaluation_de_l_application_d_une_abstraction_d_abstraction_substitue_recursivement_son_argument() { + // evaluate((λx.λy.x) z) == λy.z + assertEvalTo(apply(λ("x", λ("y", x)), z), λ("y", z)); + } + + @Test + public void l_evaluation_de_l_application_d_une_abstraction_ne_substitue_pas_ses_variables_libres() { + // evaluate((λx.y) z) == y + assertEvalTo(apply(λ("x", y), z), y); + } + + @Test + public void l_evaluation_de_l_application_d_une_abstraction_d_abstraction_ne_substitue_pas_les_variables_redefinies() { + // evaluate((λx.λx.x) z) == λx.x + assertEvalTo(apply(λ("x", λ("x", x)), z), λ("x", x)); + } + + ///// + + private static void assertEvalTo(Term termToEvaluate, Term result) { + assertThat(evaluate(termToEvaluate), is(result)); + } +} diff --git a/lambda-calcul/java/lcgoji/src/test/java/org/lambdanantes/lcgoji/ast/TermTest.java b/lambda-calcul/java/lcgoji/src/test/java/org/lambdanantes/lcgoji/ast/TermTest.java new file mode 100644 index 0000000..f11ca77 --- /dev/null +++ b/lambda-calcul/java/lcgoji/src/test/java/org/lambdanantes/lcgoji/ast/TermTest.java @@ -0,0 +1,38 @@ +package org.lambdanantes.lcgoji.ast; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; +import static org.lambdanantes.lcgoji.ast.Abs.λ; +import static org.lambdanantes.lcgoji.ast.App.apply; +import static org.lambdanantes.lcgoji.ast.Var.var; + +public class TermTest { + + @Test + public void les_equals_des_termes_sont_corrects() { + // x == x + assertThat(var("x"), is(var("x"))); + // x != y + assertThat(var("x"), is(not(var("y")))); + // λx.x == λx.x + assertThat(λ("x", var("x")), is(λ("x", var("x")))); + // λx.x != λy.x + assertThat(λ("x", var("x")), is(not(λ("y", var("x"))))); + // x y == x y + assertThat(apply(var("x"), var("y")), is(apply(var("x"), var("y")))); + // x x != x y + assertThat(apply(var("x"), var("x")), is(not(apply(var("x"), var("y"))))); + } + + @Test + public void les_toString_des_termes_utilisent_la_notation_consacree() { + assertThat(var("x").toString(), is("x")); + assertThat(λ("x", var("x")).toString(), is("λx.x")); + assertThat(apply(λ("x", var("x")), var("x")).toString(), is("(λx.x) x")); + assertThat(apply(λ("x", λ("x", var("x"))), var("y")).toString(), is("(λx.λx.x) y")); + } + +}
\ No newline at end of file |
