]> gerrit.simantics Code Review - simantics/platform.git/blob - tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/unit/TestCHRCodeGenerator.java
Merge "Re-enabled Acorn transaction cancellation support for testing"
[simantics/platform.git] / tests / org.simantics.scl.compiler.tests / src / org / simantics / scl / compiler / tests / unit / TestCHRCodeGenerator.java
1 package org.simantics.scl.compiler.tests.unit;\r
2 \r
3 import java.lang.reflect.Constructor;\r
4 import java.lang.reflect.Field;\r
5 import java.lang.reflect.Method;\r
6 \r
7 import org.junit.Assert;\r
8 import org.junit.Test;\r
9 import org.simantics.scl.compiler.compilation.CompilationContext;\r
10 import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;\r
11 import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;\r
12 import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint.IndexInfo;\r
13 import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;\r
14 import org.simantics.scl.compiler.errors.Locations;\r
15 import org.simantics.scl.compiler.internal.codegen.chr.CHRCodeGenerator;\r
16 import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;\r
17 import org.simantics.scl.compiler.internal.codegen.utils.JavaNamingPolicy;\r
18 import org.simantics.scl.compiler.internal.codegen.utils.ModuleBuilder;\r
19 import org.simantics.scl.compiler.module.repository.ModuleRepository;\r
20 import org.simantics.scl.compiler.runtime.MutableClassLoader;\r
21 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;\r
22 import org.simantics.scl.compiler.tests.InitialRepository;\r
23 import org.simantics.scl.compiler.types.Type;\r
24 import org.simantics.scl.compiler.types.Types;\r
25 \r
26 public class TestCHRCodeGenerator {\r
27     @Test\r
28     public void testCodeGenerator() throws Throwable {\r
29         try {\r
30             ModuleRepository repository = InitialRepository.getInitialRepository();\r
31             RuntimeEnvironment environment = repository.createRuntimeEnvironment(EnvironmentSpecification.of("StandardLibrary", "", "Builtin", ""), getClass().getClassLoader());\r
32             JavaNamingPolicy policy = new JavaNamingPolicy("Expression");\r
33             JavaTypeTranslator jtt = new JavaTypeTranslator(environment.getEnvironment());\r
34             CompilationContext compilationContext = new CompilationContext();\r
35             compilationContext.environment = environment.getEnvironment();\r
36             compilationContext.javaTypeTranslator = jtt;\r
37             compilationContext.namingPolicy = policy;\r
38             ModuleBuilder moduleBuilder = new ModuleBuilder(policy, jtt);\r
39             \r
40             CHRRuleset ruleset = new CHRRuleset(); \r
41             CHRConstraint exampleFact = new CHRConstraint(Locations.NO_LOCATION, "ExampleFact", new Type[] { Types.INTEGER, Types.INTEGER });\r
42             ruleset.constraints.add(exampleFact);\r
43     \r
44             System.out.println("==============================================================================================");\r
45             ruleset.initializeCodeGeneration(compilationContext);\r
46             exampleFact.indices.put(0, new IndexInfo(0, "ff", null, null));\r
47             exampleFact.indices.put(1, new IndexInfo(1, "bf", null, null));\r
48             exampleFact.indices.put(2, new IndexInfo(2, "fb", null, null));\r
49             exampleFact.indices.put(3, new IndexInfo(3, "bb", null, null));\r
50             exampleFact.setMayBeRemoved();\r
51 \r
52             CHRCodeGenerator.generateStore(moduleBuilder, ruleset);\r
53             \r
54             MutableClassLoader classLoader = environment.getMutableClassLoader();\r
55             classLoader.addClasses(moduleBuilder.getClasses());\r
56             \r
57             String storeClassName = ruleset.storeClassName.replace('/', '.');\r
58             Class<?> storeClass = classLoader.loadClass(storeClassName);\r
59             Class<?> factClass = classLoader.loadClass(storeClassName+"$ExampleFact");\r
60             Constructor<?> factConstructor = factClass.getConstructor(int.class, int.class, int.class);\r
61             Method addMethod = factClass.getMethod("add", storeClass);\r
62             Method removeMethod = factClass.getMethod("remove", storeClass);\r
63             Method getMethod = storeClass.getMethod("ExampleFact$bf", int.class);\r
64             Field nextField = factClass.getField("bfNext");\r
65             \r
66             Object store = storeClass.newInstance();\r
67             Object fact1 = factConstructor.newInstance(0, 1,2);\r
68             Object fact2 = factConstructor.newInstance(0, 1,3);\r
69             Object fact3 = factConstructor.newInstance(0, 2,4);\r
70             Object fact4 = factConstructor.newInstance(0, 1,4);\r
71             addMethod.invoke(fact1, store);\r
72             addMethod.invoke(fact4, store);\r
73             addMethod.invoke(fact2, store);\r
74             addMethod.invoke(fact3, store);\r
75             removeMethod.invoke(fact4, store);\r
76             {\r
77                 Object f1 = getMethod.invoke(store, 1);\r
78                 Assert.assertEquals(fact2, f1);\r
79                 Object f2 = nextField.get(f1);\r
80                 Assert.assertEquals(fact1, f2);\r
81                 Object f3 = nextField.get(f2);\r
82                 Assert.assertEquals(null, f3);\r
83             }\r
84             removeMethod.invoke(fact2, store);\r
85             {\r
86                 Object f1 = getMethod.invoke(store, 1);\r
87                 Assert.assertEquals(fact1, f1);\r
88                 Object f2 = nextField.get(f1);\r
89                 Assert.assertEquals(null, f2);\r
90             }\r
91             addMethod.invoke(fact2, store);\r
92             removeMethod.invoke(fact1, store);\r
93             {\r
94                 Object f1 = getMethod.invoke(store, 1);\r
95                 Assert.assertEquals(fact2, f1);\r
96                 Object f2 = nextField.get(f1);\r
97                 Assert.assertEquals(null, f2);\r
98             }\r
99             removeMethod.invoke(fact2, store);\r
100             {\r
101                 Object f1 = getMethod.invoke(store, 1);\r
102                 Assert.assertEquals(null, f1);\r
103             }\r
104         } catch(Throwable e) {\r
105             e.printStackTrace();\r
106             throw e;\r
107         }\r
108     }\r
109         \r
110 }\r