diff options
Diffstat (limited to 'core/src/test/java/coffee/liz/lambda')
| -rw-r--r-- | core/src/test/java/coffee/liz/lambda/format/ValueEmitterTest.java | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/core/src/test/java/coffee/liz/lambda/format/ValueEmitterTest.java b/core/src/test/java/coffee/liz/lambda/format/ValueEmitterTest.java index c1ab704..959f45d 100644 --- a/core/src/test/java/coffee/liz/lambda/format/ValueEmitterTest.java +++ b/core/src/test/java/coffee/liz/lambda/format/ValueEmitterTest.java @@ -12,7 +12,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; class ValueEmitterTest { @Test - void emitsFreeInBothSyntaxes() { + public void testEmitsFreeInBothSyntaxes() { final Value value = LambdaDriver.interpret(SourceCode.ofArrow("z")); final SourceCode arrow = ValueEmitter.emit(value, SourceCode.Syntax.ARROW); @@ -23,7 +23,7 @@ class ValueEmitterTest { } @Test - void emitsApplicationInBothSyntaxes() { + public void testEmitsApplicationInBothSyntaxes() { final Value value = LambdaDriver.interpret(SourceCode.ofArrow("f(x)")); final SourceCode arrow = ValueEmitter.emit(value, SourceCode.Syntax.ARROW); @@ -34,27 +34,41 @@ class ValueEmitterTest { } @Test - void emitsClosureWithCaptureMacros() { + public void testEmitsClosureWithCaptureMacros() { final Value value = LambdaDriver.interpret(SourceCode.ofArrow("(x -> y -> x)(z)")); final SourceCode emitted = ValueEmitter.emit(value, SourceCode.Syntax.ARROW); final String source = assertInstanceOf(SourceCode.Arrow.class, emitted).source(); - assertTrue(source.contains("let _cap")); - assertTrue(source.contains("y -> _cap")); + assertEquals(""" + let x = z; + + y -> x""", source); - // Validate emitted program is parsable and evaluates. final Value roundTrip = LambdaDriver.interpret(emitted); assertInstanceOf(Value.Closure.class, roundTrip); } @Test - void emitsHygienicCapturesWhenNamesShadow() { + public void testEmitsHygienicCapturesWhenNamesShadow() { final Value value = LambdaDriver.interpret(SourceCode.ofArrow("(x -> y -> x)(y)")); final SourceCode emitted = ValueEmitter.emit(value, SourceCode.Syntax.ARROW); final String source = assertInstanceOf(SourceCode.Arrow.class, emitted).source(); - assertTrue(source.contains("let _cap")); - assertTrue(source.contains("y -> _cap")); - assertFalse(source.contains("let y =")); + assertEquals(""" + let x = y; + + y -> x""", source); + } + + @Test + public void testPrunesUnusedEnvironmentCaptures() { + final Value value = LambdaDriver.interpret(SourceCode.ofArrow("(x -> w -> y -> x)(z)(q)")); + final SourceCode emitted = ValueEmitter.emit(value, SourceCode.Syntax.ARROW); + final String source = assertInstanceOf(SourceCode.Arrow.class, emitted).source(); + + assertEquals(""" + let x = z; + + y -> x""", source); } } |
