1 package org.simantics.scl.compiler.tests.unit;
\r
3 import java.lang.reflect.Constructor;
\r
4 import java.lang.reflect.Field;
\r
5 import java.lang.reflect.Method;
\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
26 public class TestCHRCodeGenerator {
\r
28 public void testCodeGenerator() throws Throwable {
\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
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
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
52 CHRCodeGenerator.generateStore(moduleBuilder, ruleset);
\r
54 MutableClassLoader classLoader = environment.getMutableClassLoader();
\r
55 classLoader.addClasses(moduleBuilder.getClasses());
\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
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
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
84 removeMethod.invoke(fact2, store);
\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
91 addMethod.invoke(fact2, store);
\r
92 removeMethod.invoke(fact1, store);
\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
99 removeMethod.invoke(fact2, store);
\r
101 Object f1 = getMethod.invoke(store, 1);
\r
102 Assert.assertEquals(null, f1);
\r
104 } catch(Throwable e) {
\r
105 e.printStackTrace();
\r