X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=tests%2Forg.simantics.db.tests%2Fsrc%2Forg%2Fsimantics%2Fdb%2Ftests%2Fapi%2Fstory%2Fmisc%2FSyntheticModellingTest.java;fp=tests%2Forg.simantics.db.tests%2Fsrc%2Forg%2Fsimantics%2Fdb%2Ftests%2Fapi%2Fstory%2Fmisc%2FSyntheticModellingTest.java;h=02ab4a1fd7513fe1ead9c6017114999703f58fe6;hb=67fd62f9c742337ec80eef658192db198a0efaac;hp=0000000000000000000000000000000000000000;hpb=cde82ba81327d5515fdca362f7f4c70f5103ae80;p=simantics%2Fplatform.git diff --git a/tests/org.simantics.db.tests/src/org/simantics/db/tests/api/story/misc/SyntheticModellingTest.java b/tests/org.simantics.db.tests/src/org/simantics/db/tests/api/story/misc/SyntheticModellingTest.java new file mode 100644 index 000000000..02ab4a1fd --- /dev/null +++ b/tests/org.simantics.db.tests/src/org/simantics/db/tests/api/story/misc/SyntheticModellingTest.java @@ -0,0 +1,279 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.db.tests.api.story.misc; + +import gnu.trove.set.hash.THashSet; + +import java.util.ArrayList; +import java.util.Random; + +import org.junit.Test; +import org.simantics.db.Resource; +import org.simantics.db.Session; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.testing.annotation.Fails; +import org.simantics.db.testing.base.ExistingDatabaseTest; +import org.simantics.db.tests.common.Configuration; +import org.simantics.layer0.Layer0; +import org.simantics.project.ontology.ProjectResource; + +public class SyntheticModellingTest extends ExistingDatabaseTest { + + static int LOOP_COUNT = Configuration.get().modellingLoopCount; + static int OP_COUNT = Configuration.get().modellingOpCount; + Session session; + Resource root; + Layer0 b; + + Resource Component; + Resource Composite; + Resource IsDefinedBy; + Resource Connection; + Resource IsConnected; + Resource IsConnectedTo; + Resource IsConnectedFrom; + + int componentTypeCount = 0; + int componentCount = 0; + int connectionCount = 0; + + static class Component { + Resource resource; + ComponentType type; + } + + static class ComponentType { + Resource resource; + Resource composite; + ArrayList components = new ArrayList(); + ArrayList connections = new ArrayList(); + } + + ArrayList componentTypes = new ArrayList(); + + Random random = new Random(0x12345679); + +// @Override +// protected void setUp() throws Exception { +// SessionFactory factory = new SessionFactory(Configuration.get().host, Configuration.get().port); +// session = factory.create(); +// } +// +// @Override +// protected void tearDown() throws Exception { +// LifecycleSupport support = session.getService(LifecycleSupport.class); +// support.close(); +// } + + class SetUp extends WriteRequest { + + @Override + public void perform(WriteGraph g) throws DatabaseException { + + b = Layer0.getInstance(g); + + ProjectResource PROJ = ProjectResource.getInstance(g); + + root = g.newResource(); + g.claim(root, b.InstanceOf, PROJ.Project); + + Component = g.getResource("http://www.simantics.org/Structural-1.0/Component"); + Composite = g.getResource("http://www.simantics.org/Structural-1.0/Composite"); + IsDefinedBy = g.getResource("http://www.simantics.org/Structural-1.0/IsDefinedBy"); + Connection = g.getResource("http://www.simantics.org/Structural-1.0/Connection"); + IsConnected = g.getResource("http://www.simantics.org/Structural-1.0/IsConnected"); + IsConnectedTo = g.getResource("http://www.simantics.org/Structural-1.0/IsConnectedTo"); + IsConnectedFrom = g.getResource("http://www.simantics.org/Structural-1.0/IsConnectedFrom"); + + } + + } + + class NewComponentType extends WriteRequest { + + @Override + public void perform(WriteGraph g) throws DatabaseException { + ComponentType componentType = new ComponentType(); + + componentType.resource = g.newResource(); + g.claim(componentType.resource, b.Inherits, Component); + g.claim(root, b.ConsistsOf, componentType.resource); + g.claimLiteral(componentType.resource, b.HasName, "ComponentType" + componentType.resource.getResourceId()); + + componentType.composite = g.newResource(); + g.claim(componentType.composite, b.Inherits, Composite); + g.claim(componentType.resource, IsDefinedBy, componentType.composite); + + componentTypes.add(componentType); + + ++componentTypeCount; + } + + } + + class NewComponent extends WriteRequest { + + @Override + public void perform(WriteGraph g) throws DatabaseException { + ComponentType componentType = componentTypes.get(random.nextInt(componentTypes.size())); + ComponentType containerType = componentTypes.get(random.nextInt(componentTypes.size())); + + Component component = new Component(); + + component.resource = g.newResource(); + g.claim(component.resource, b.InstanceOf, componentType.resource); + g.claim(containerType.composite, b.ConsistsOf, component.resource); + + g.claimLiteral(component.resource, b.HasName, "Component" + componentType.resource.getResourceId()); + + containerType.components.add(component); + + ++componentCount; + } + + } + + class RemoveComponent extends WriteRequest { + + @Override + public void perform(WriteGraph g) throws DatabaseException { + ComponentType containerType = componentTypes.get(random.nextInt(componentTypes.size())); + if(containerType.components.isEmpty()) + return; + int cid = random.nextInt(containerType.components.size()); + Component component = containerType.components.get(cid); + THashSet removed = new THashSet(); + for(Resource c : g.getObjects(component.resource, IsConnected)) + if(removed.add(c)) { + g.deny(c); + int id = containerType.connections.indexOf(c); + int last = containerType.connections.size()-1; + if(id < last) + containerType.connections.set(id, containerType.connections.remove(last)); + else + containerType.connections.remove(last); + --connectionCount; + } + g.deny(component.resource); + { + int last = containerType.components.size() - 1; + if(cid < last) + containerType.components.set(cid, containerType.components.remove(last)); + else + containerType.components.remove(last); + } + + --componentCount; + } + + } + + class NewConnection extends WriteRequest { + + @Override + public void perform(WriteGraph g) throws DatabaseException { + ComponentType containerType = componentTypes.get(random.nextInt(componentTypes.size())); + if(containerType.components.isEmpty()) + return; + + Component c1 = containerType.components.get(random.nextInt(containerType.components.size())); + Component c2 = containerType.components.get(random.nextInt(containerType.components.size())); + + Resource connection = g.newResource(); + g.claim(connection, b.InstanceOf, Connection); + g.claim(c1.resource, IsConnectedTo, connection); + g.claim(c2.resource, IsConnectedFrom, connection); + + containerType.connections.add(connection); + + ++connectionCount; + } + + } + + class RemoveConnection extends WriteRequest { + + @Override + public void perform(WriteGraph g) throws DatabaseException { + ComponentType containerType = componentTypes.get(random.nextInt(componentTypes.size())); + if(containerType.connections.isEmpty()) + return; + + int id = random.nextInt(containerType.connections.size()); + g.deny(containerType.connections.get(id)); + int last = containerType.connections.size()-1; + if(id < last) + containerType.connections.set(id, containerType.connections.remove(last)); + else + containerType.connections.remove(last); + + --connectionCount; + } + + } + + @Fails + @Test public void test() { + try { + session = getSession(); + session.syncRequest(new SetUp()); + for(int i=0;i<100;++i) + session.syncRequest(new NewComponentType()); + for(int i=0;i 1000) + session.syncRequest(new RemoveComponent()); + else + session.syncRequest(new NewComponent()); + break; + case 3: + session.syncRequest(new NewConnection()); + break; + case 4: + session.syncRequest(new RemoveConnection()); + break; + case 5: + case 6: + case 7: + if(connectionCount > 1000) + session.syncRequest(new RemoveConnection()); + else + session.syncRequest(new NewConnection()); + break; + } + long endTime = System.nanoTime(); + System.out.println((endTime - startTime) * 1e-9 + "s / 1000 operations"); + System.out.println( + componentTypeCount + " user components, " + + componentCount + " components, " + + connectionCount + " connections" + ); + } + } catch (DatabaseException e) { + if (DEBUG) + e.printStackTrace(); + fail("Test failed with: " + e.getMessage()); + } + } + +}