]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.graph/tests/org/simantics/graph/tests/diff/TestDiff.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.graph / tests / org / simantics / graph / tests / diff / TestDiff.java
1 package org.simantics.graph.tests.diff;\r
2 \r
3 import java.io.IOException;\r
4 import java.io.InputStream;\r
5 import java.util.Random;\r
6 \r
7 import org.simantics.databoard.Bindings;\r
8 import org.simantics.databoard.type.Datatype;\r
9 import org.simantics.graph.diff.Diff;\r
10 import org.simantics.graph.representation.External;\r
11 import org.simantics.graph.representation.Identity;\r
12 import org.simantics.graph.representation.Internal;\r
13 import org.simantics.graph.representation.Optional;\r
14 import org.simantics.graph.representation.TransferableGraph1;\r
15 import org.simantics.graph.representation.Value;\r
16 \r
17 public class TestDiff {\r
18         \r
19         public static TransferableGraph1 load(String name) throws IOException {\r
20                 InputStream stream = TestDiff.class.getResourceAsStream(name);\r
21                 Bindings.getSerializerUnchecked(Datatype.class).skip(stream);\r
22                 TransferableGraph1 result = (TransferableGraph1)TransferableGraph1.SERIALIZER.deserialize(stream);\r
23                 stream.close();\r
24                 return result;\r
25         }\r
26         \r
27         public static int[] randomPermutation(int size) {\r
28                 Random rand = new Random();\r
29                 int[] permutation = new int[size];\r
30                 for(int i=0;i<size;++i)\r
31                         permutation[i] = i;\r
32                 for(int i=size-1;i>0;--i) {\r
33                         int j = rand.nextInt(i+1);\r
34                         int temp = permutation[i];\r
35                         permutation[i] = permutation[j];\r
36                         permutation[j] = temp;\r
37                 }\r
38                 return permutation;\r
39         }\r
40         \r
41         public static void shuffle(TransferableGraph1 tg) {\r
42                 int[] permutation = randomPermutation(tg.resourceCount);\r
43                 \r
44                 {\r
45                         int[] statements = tg.statements;\r
46                         for(int i=0;i<statements.length;++i) {\r
47                                 int r = statements[i];\r
48                                 if(r >= 0)\r
49                                         statements[i] = permutation[r];                         \r
50                         }\r
51                 }\r
52                 \r
53                 for(Identity id : tg.identities) {\r
54                         id.resource = permutation[id.resource];\r
55                         if(id.definition instanceof External) {\r
56                                 External def = (External)id.definition;\r
57                                 def.parent = permutation[def.parent];\r
58                         }\r
59                         else if(id.definition instanceof Internal) {\r
60                                 Internal def = (Internal)id.definition;\r
61                                 def.parent = permutation[def.parent];\r
62                         }\r
63                         else if(id.definition instanceof Optional) {\r
64                                 Optional def = (Optional)id.definition;\r
65                                 def.parent = permutation[def.parent];\r
66                         }\r
67                 }\r
68                 \r
69                 for(Value value : tg.values) {\r
70                         value.resource = permutation[value.resource];\r
71                 }\r
72         }\r
73         \r
74         public static void main(String[] args) throws Exception {\r
75                 TransferableGraph1 graphOld = load("layer0.tg");\r
76                 TransferableGraph1 graphNew = load("layer0.tg");\r
77                 shuffle(graphNew);\r
78                 long begin = System.nanoTime();\r
79                 Diff diff = new Diff(graphOld, graphNew);\r
80                 /*TransferableGraphDelta1 result =*/ diff.diff();\r
81                 long end = System.nanoTime();\r
82 \r
83                 System.out.println("Total time: " + (end - begin)*1e-6 + "ms");\r
84                 //result.print();\r
85         }\r
86         \r
87 }\r