/* * Copyright (c) 2004-2011 Marco Maccaferri and others. * 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: * Marco Maccaferri - initial API and implementation */ package org.eclipsetrader.core.internal.repositories; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import junit.framework.TestCase; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipsetrader.core.feed.FeedIdentifier; import org.eclipsetrader.core.feed.History; import org.eclipsetrader.core.feed.IHistory; import org.eclipsetrader.core.feed.IOHLC; import org.eclipsetrader.core.instruments.ISecurity; import org.eclipsetrader.core.instruments.Security; import org.eclipsetrader.core.repositories.IPropertyConstants; import org.eclipsetrader.core.repositories.IRepository; import org.eclipsetrader.core.repositories.IRepositoryRunnable; import org.eclipsetrader.core.repositories.IStore; import org.eclipsetrader.core.repositories.IStoreProperties; import org.eclipsetrader.core.repositories.RepositoryResourceDelta; import org.eclipsetrader.core.views.IWatchListColumn; import org.eclipsetrader.core.views.IWatchListElement; import org.eclipsetrader.core.views.WatchList; import org.eclipsetrader.core.views.WatchListElement; public class RepositoryServiceTest extends TestCase { private Map<String, RepositoryMock> repositories; public class RepositoryServiceMock extends RepositoryService { public RepositoryServiceMock() { } /* (non-Javadoc) * @see org.eclipsetrader.core.internal.repositories.RepositoryService#getRepository(java.lang.String) */ @Override public IRepository getRepository(String scheme) { return repositories.get(scheme); } } public class RepositoryMock implements IRepository { private String scheme; public List<StoreMock> stores; public RepositoryMock(String scheme) { this.scheme = scheme; this.stores = new ArrayList<StoreMock>(); } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IRepository#getSchema() */ @Override public String getSchema() { return scheme; } /* (non-Javadoc) * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) */ @Override @SuppressWarnings("unchecked") public Object getAdapter(Class adapter) { return null; } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IRepository#canDelete() */ @Override public boolean canDelete() { return true; } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IRepository#canWrite() */ @Override public boolean canWrite() { return true; } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IRepository#createObject() */ @Override public IStore createObject() { try { StoreMock store = new StoreMock(this, new URI(scheme, "object", String.valueOf(stores.size() + 1))); stores.add(store); return store; } catch (URISyntaxException e) { throw new RuntimeException(e); } } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IRepository#fetchObjects(org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStore[] fetchObjects(IProgressMonitor monitor) { return null; } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IRepository#getObject(java.net.URI) */ @Override public IStore getObject(URI uri) { return null; } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IRepository#runInRepository(org.eclipsetrader.core.repositories.IRepositoryRunnable, org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStatus runInRepository(IRepositoryRunnable runnable, IProgressMonitor monitor) { try { runnable.run(monitor); } catch (Exception e) { e.printStackTrace(); } return Status.OK_STATUS; } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IRepository#runInRepository(org.eclipsetrader.core.repositories.IRepositoryRunnable, org.eclipse.core.runtime.jobs.ISchedulingRule, org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStatus runInRepository(IRepositoryRunnable runnable, ISchedulingRule rule, IProgressMonitor monitor) { try { runnable.run(monitor); } catch (Exception e) { e.printStackTrace(); } return Status.OK_STATUS; } } public class StoreMock implements IStore { private URI uri; private RepositoryMock repository; private IStoreProperties properties; public StoreMock(RepositoryMock repository, URI uri) { this.repository = repository; this.uri = uri; } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IStore#delete(org.eclipse.core.runtime.IProgressMonitor) */ @Override public void delete(IProgressMonitor monitor) throws CoreException { repository.stores.remove(this); } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IStore#fetchProperties(org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStoreProperties fetchProperties(IProgressMonitor monitor) { return properties; } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IStore#fetchChilds(org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStore[] fetchChilds(IProgressMonitor monitor) { List<IStore> l = new ArrayList<IStore>(); String type = (String) properties.getProperty(IPropertyConstants.OBJECT_TYPE); if (ISecurity.class.getName().equals(type)) { for (StoreMock store : repository.stores) { IStoreProperties storeProperties = store.fetchProperties(monitor); if (IHistory.class.getName().equals(storeProperties.getProperty(IPropertyConstants.OBJECT_TYPE))) { Security security = (Security) storeProperties.getProperty(IPropertyConstants.SECURITY); if (security.getStore().toURI().equals(toURI())) { l.add(store); } } } } return l.toArray(new IStore[l.size()]); } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IStore#createChild() */ @Override public IStore createChild() { return null; } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IStore#getRepository() */ @Override public IRepository getRepository() { return repository; } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IStore#putProperties(org.eclipsetrader.core.repositories.IStoreProperties, org.eclipse.core.runtime.IProgressMonitor) */ @Override public void putProperties(IStoreProperties properties, IProgressMonitor monitor) { this.properties = properties; } /* (non-Javadoc) * @see org.eclipsetrader.core.repositories.IStore#toURI() */ @Override public URI toURI() { return uri; } } /* (non-Javadoc) * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { repositories = new HashMap<String, RepositoryMock>(); repositories.put("local", new RepositoryMock("local")); repositories.put("remote", new RepositoryMock("remote")); } public void testSaveSecurity() throws Exception { Security security = new Security("Security", new FeedIdentifier("ID", null)); RepositoryService service = new RepositoryServiceMock(); service.saveAdaptable(new ISecurity[] { security }); assertEquals(1, repositories.get("local").stores.size()); assertEquals(0, repositories.get("remote").stores.size()); assertSame(repositories.get("local").stores.get(0), security.getStore()); } public void testMoveSecurity() throws Exception { Security security = new Security("Security", new FeedIdentifier("ID", null)); RepositoryService service = new RepositoryServiceMock(); service.saveAdaptable(new ISecurity[] { security }); assertEquals(1, repositories.get("local").stores.size()); assertEquals(0, repositories.get("remote").stores.size()); service.moveAdaptable(new ISecurity[] { security }, repositories.get("remote")); assertEquals(0, repositories.get("local").stores.size()); assertEquals(1, repositories.get("remote").stores.size()); assertSame(repositories.get("remote").stores.get(0), security.getStore()); } public void testDeleteSecurity() throws Exception { Security security = new Security("Security", new FeedIdentifier("ID", null)); RepositoryService service = new RepositoryServiceMock(); service.saveAdaptable(new ISecurity[] { security }); assertEquals(1, repositories.get("local").stores.size()); service.deleteAdaptable(new ISecurity[] { security }); assertEquals(0, repositories.get("local").stores.size()); assertNull(security.getStore()); } public void testSaveSecurityAndAddToCollection() throws Exception { Security security = new Security("Security", new FeedIdentifier("ID", null)); RepositoryService service = new RepositoryServiceMock(); assertEquals(0, service.getSecurities().length); service.saveAdaptable(new ISecurity[] { security }); assertEquals(1, service.getSecurities().length); assertSame(security, service.getSecurities()[0]); } public void testDeleteSecurityAndRemoveFromCollection() throws Exception { Security security = new Security("Security", new FeedIdentifier("ID", null)); RepositoryService service = new RepositoryServiceMock(); service.saveAdaptable(new ISecurity[] { security }); assertEquals(1, service.getSecurities().length); service.deleteAdaptable(new ISecurity[] { security }); assertEquals(0, service.getSecurities().length); } public void testMoveSecurityChangesURI() throws Exception { Security security = new Security("Security", new FeedIdentifier("ID", null)); RepositoryService service = new RepositoryServiceMock(); service.saveAdaptable(new ISecurity[] { security }); assertEquals(new URI("local", "object", "1"), security.getStore().toURI()); service.moveAdaptable(new ISecurity[] { security }, repositories.get("remote")); assertEquals(new URI("remote", "object", "1"), security.getStore().toURI()); } public void testSaveSecurityEvent() throws Exception { final Security security = new Security("Security", new FeedIdentifier("ID", null)); final RepositoryService service = new RepositoryServiceMock(); service.runInService(new IRepositoryRunnable() { @Override public IStatus run(IProgressMonitor monitor) throws Exception { service.saveAdaptable(new ISecurity[] { security }); return Status.OK_STATUS; } }, null); RepositoryResourceDelta[] deltas = service.getDeltas(); assertEquals(1, deltas.length); assertSame(security, deltas[0].getResource()); assertSame(repositories.get("local"), deltas[0].getMovedTo()); } public void testMoveSecurityEvent() throws Exception { final Security security = new Security("Security", new FeedIdentifier("ID", null)); final RepositoryService service = new RepositoryServiceMock(); service.saveAdaptable(new ISecurity[] { security }); service.runInService(new IRepositoryRunnable() { @Override public IStatus run(IProgressMonitor monitor) throws Exception { service.moveAdaptable(new ISecurity[] { security }, repositories.get("remote")); return Status.OK_STATUS; } }, null); RepositoryResourceDelta[] deltas = service.getDeltas(); assertEquals(1, deltas.length); assertSame(security, deltas[0].getResource()); assertSame(repositories.get("local"), deltas[0].getMovedFrom()); assertSame(repositories.get("remote"), deltas[0].getMovedTo()); } public void testDeleteSecurityEvent() throws Exception { final Security security = new Security("Security", new FeedIdentifier("ID", null)); final RepositoryService service = new RepositoryServiceMock(); service.saveAdaptable(new ISecurity[] { security }); service.runInService(new IRepositoryRunnable() { @Override public IStatus run(IProgressMonitor monitor) throws Exception { service.deleteAdaptable(new ISecurity[] { security }); return Status.OK_STATUS; } }, null); RepositoryResourceDelta[] deltas = service.getDeltas(); assertEquals(1, deltas.length); assertSame(security, deltas[0].getResource()); assertSame(repositories.get("local"), deltas[0].getMovedFrom()); assertNull(deltas[0].getMovedTo()); } public void testDeleteSecurityRemovesFromWatchList() throws Exception { Security security = new Security("Security", new FeedIdentifier("ID", null)); WatchList list = new WatchList("List", new IWatchListColumn[0]); list.setItems(new IWatchListElement[] { new WatchListElement(security) }); RepositoryService service = new RepositoryServiceMock(); service.saveAdaptable(new IAdaptable[] { security, list }); assertEquals(2, repositories.get("local").stores.size()); service.deleteAdaptable(new IAdaptable[] { security }); assertEquals(1, repositories.get("local").stores.size()); assertEquals(0, list.getItemCount()); } public void testMoveSecurityWithHistory() throws Exception { Security security = new Security("Security", new FeedIdentifier("ID", null)); History history = new History(security, new IOHLC[0]); RepositoryService service = new RepositoryServiceMock(); service.saveAdaptable(new IAdaptable[] { security, history }); service.moveAdaptable(new IAdaptable[] { security }, repositories.get("remote")); assertEquals(0, repositories.get("local").stores.size()); assertEquals(2, repositories.get("remote").stores.size()); } public void testGetHistoryForSecurity() throws Exception { Security security = new Security("Security", new FeedIdentifier("ID", null)); History history = new History(security, new IOHLC[0]); RepositoryService service = new RepositoryServiceMock(); service.saveAdaptable(new IAdaptable[] { security, history }); assertNotNull(service.getHistoryFor(security)); } }