]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.graph/tests/org/simantics/graph/tests/diff/TestDiff.java b/bundles/org.simantics.graph/tests/org/simantics/graph/tests/diff/TestDiff.java
new file mode 100644 (file)
index 0000000..f8c2a8e
--- /dev/null
@@ -0,0 +1,87 @@
+package org.simantics.graph.tests.diff;\r
+\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.util.Random;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.type.Datatype;\r
+import org.simantics.graph.diff.Diff;\r
+import org.simantics.graph.representation.External;\r
+import org.simantics.graph.representation.Identity;\r
+import org.simantics.graph.representation.Internal;\r
+import org.simantics.graph.representation.Optional;\r
+import org.simantics.graph.representation.TransferableGraph1;\r
+import org.simantics.graph.representation.Value;\r
+\r
+public class TestDiff {\r
+       \r
+       public static TransferableGraph1 load(String name) throws IOException {\r
+               InputStream stream = TestDiff.class.getResourceAsStream(name);\r
+               Bindings.getSerializerUnchecked(Datatype.class).skip(stream);\r
+               TransferableGraph1 result = (TransferableGraph1)TransferableGraph1.SERIALIZER.deserialize(stream);\r
+               stream.close();\r
+               return result;\r
+       }\r
+       \r
+       public static int[] randomPermutation(int size) {\r
+               Random rand = new Random();\r
+               int[] permutation = new int[size];\r
+               for(int i=0;i<size;++i)\r
+                       permutation[i] = i;\r
+               for(int i=size-1;i>0;--i) {\r
+                       int j = rand.nextInt(i+1);\r
+                       int temp = permutation[i];\r
+                       permutation[i] = permutation[j];\r
+                       permutation[j] = temp;\r
+               }\r
+               return permutation;\r
+       }\r
+       \r
+       public static void shuffle(TransferableGraph1 tg) {\r
+               int[] permutation = randomPermutation(tg.resourceCount);\r
+               \r
+               {\r
+                       int[] statements = tg.statements;\r
+                       for(int i=0;i<statements.length;++i) {\r
+                               int r = statements[i];\r
+                               if(r >= 0)\r
+                                       statements[i] = permutation[r];                         \r
+                       }\r
+               }\r
+               \r
+               for(Identity id : tg.identities) {\r
+                       id.resource = permutation[id.resource];\r
+                       if(id.definition instanceof External) {\r
+                               External def = (External)id.definition;\r
+                               def.parent = permutation[def.parent];\r
+                       }\r
+                       else if(id.definition instanceof Internal) {\r
+                               Internal def = (Internal)id.definition;\r
+                               def.parent = permutation[def.parent];\r
+                       }\r
+                       else if(id.definition instanceof Optional) {\r
+                               Optional def = (Optional)id.definition;\r
+                               def.parent = permutation[def.parent];\r
+                       }\r
+               }\r
+               \r
+               for(Value value : tg.values) {\r
+                       value.resource = permutation[value.resource];\r
+               }\r
+       }\r
+       \r
+       public static void main(String[] args) throws Exception {\r
+               TransferableGraph1 graphOld = load("layer0.tg");\r
+               TransferableGraph1 graphNew = load("layer0.tg");\r
+               shuffle(graphNew);\r
+               long begin = System.nanoTime();\r
+               Diff diff = new Diff(graphOld, graphNew);\r
+               /*TransferableGraphDelta1 result =*/ diff.diff();\r
+               long end = System.nanoTime();\r
+\r
+               System.out.println("Total time: " + (end - begin)*1e-6 + "ms");\r
+               //result.print();\r
+       }\r
+       \r
+}\r