1 import jdk.incubator.code.*;
 2 import jdk.incubator.code.dialect.core.CoreOp;
 3 import jdk.incubator.code.dialect.core.FunctionType;
 4 import jdk.incubator.code.dialect.java.JavaType;
 5 import org.junit.jupiter.api.Assertions;
 6 import org.junit.jupiter.api.Test;
 7 
 8 import java.lang.reflect.Method;
 9 import java.util.ArrayList;
10 import java.util.List;
11 import java.util.function.IntUnaryOperator;
12 
13 /*
14  * @test
15  * @modules jdk.incubator.code
16  * @run junit TestSealOp
17  */
18 public class TestSealOp {
19 
20     @CodeReflection
21     static List<Integer> f(int i) {
22         return new ArrayList<>(i);
23     }
24 
25     @Test
26     void test0() throws NoSuchMethodException {
27         Method m = this.getClass().getDeclaredMethod("f", int.class);
28         CoreOp.FuncOp f = Op.ofMethod(m).get();
29         assertOpIsCopiedWhenAddedToBlock(f);
30     }
31 
32     @Test
33     void test1() {
34         Quotable q = (IntUnaryOperator & Quotable) i -> i / 2;
35         Quoted quoted = Op.ofQuotable(q).get();
36         CoreOp.QuotedOp quotedOp = (CoreOp.QuotedOp) quoted.op().ancestorBody().ancestorOp();
37         CoreOp.FuncOp funcOp = (CoreOp.FuncOp) quotedOp.ancestorBody().ancestorOp();
38         assertOpIsCopiedWhenAddedToBlock(funcOp);
39     }
40 
41     @Test
42     void test2() {
43         CoreOp.ConstantOp constant = CoreOp.constant(JavaType.INT, 7);
44         constant.seal();
45         assertOpIsCopiedWhenAddedToBlock(constant);
46     }
47 
48     @Test
49     void test3() {
50         CoreOp.FuncOp funcOp = CoreOp.func("f", FunctionType.FUNCTION_TYPE_VOID).body(b -> {
51             b.op(CoreOp.return_());
52         });
53         funcOp.seal();
54         funcOp.seal();
55     }
56 
57     @Test
58     void test4() {
59         Quoted q = (int a, int b) -> {
60             return a + b;
61         };
62         CoreOp.QuotedOp quotedOp = (CoreOp.QuotedOp) q.op().ancestorBody().ancestorOp();
63         CoreOp.FuncOp funcOp = (CoreOp.FuncOp) quotedOp.ancestorBody().ancestorOp();
64         Assertions.assertTrue(funcOp.isSealed());
65         assertOpIsCopiedWhenAddedToBlock(funcOp);
66     }
67 
68     @Test
69     void test5() { // freezing an already bound op should throw
70         Body.Builder body = Body.Builder.of(null, FunctionType.FUNCTION_TYPE_VOID);
71         Op.Result r = body.entryBlock().op(CoreOp.constant(JavaType.DOUBLE, 1d));
72         Assertions.assertThrows(IllegalStateException.class, () -> r.op().seal());
73     }
74 
75     @Test
76     void test6() {
77         CoreOp.ConstantOp cop = CoreOp.constant(JavaType.LONG, 1L);
78         cop.setLocation(Location.NO_LOCATION);
79         cop.seal();
80         Assertions.assertThrows(IllegalStateException.class, () -> cop.setLocation(Location.NO_LOCATION));
81     }
82 
83     void assertOpIsCopiedWhenAddedToBlock(Op op) {
84         Body.Builder body = Body.Builder.of(null, FunctionType.FUNCTION_TYPE_VOID);
85         body.entryBlock().op(op);
86         body.entryBlock().op(CoreOp.return_());
87         CoreOp.FuncOp funcOp = CoreOp.func("t", body);
88         boolean b = funcOp.body().entryBlock().ops().stream().allMatch(o -> o != op);
89         Assertions.assertTrue(b);
90     }
91 }