aboutsummaryrefslogtreecommitdiff
path: root/core/src/test/java/coffee/liz/lambda/format
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2026-02-21 12:29:54 -0800
committerElizabeth Hunt <me@liz.coffee>2026-02-21 12:29:54 -0800
commit170f5c496054c9c5c2df9b8a1c5c8df7643ea004 (patch)
tree1ed217130939a04234761d54ba2ec607866f51ad /core/src/test/java/coffee/liz/lambda/format
parentd6a294e14604aecd9046cbc19dc1837ca694fbb0 (diff)
downloadthe-abstraction-engine-java-main.tar.gz
the-abstraction-engine-java-main.zip
Diffstat (limited to 'core/src/test/java/coffee/liz/lambda/format')
-rw-r--r--core/src/test/java/coffee/liz/lambda/format/ValueEmitterTest.java34
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);
}
}