/*******************************************************************************
 * Copyright (c) 2009, 2010 Nokia 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:
 * Nokia - Initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.debug.edc.system.tests;

import java.util.List;

import org.eclipse.cdt.debug.edc.internal.ui.views.SystemDMContainer;
import org.eclipse.cdt.debug.edc.internal.ui.views.SystemRefreshOptionsDialog;
import org.eclipse.cdt.debug.edc.internal.ui.views.SystemVMContainer;
import org.eclipse.cdt.debug.edc.internal.ui.views.SystemViewInput;
import org.eclipse.cdt.debug.edc.system.tests.K9SystemView.K9ViewModel;
import org.eclipse.cdt.debug.edc.tests.TestUtils;
import org.eclipse.cdt.internal.ui.util.StringMatcher;
import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.PlatformUI;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

@SuppressWarnings("restriction")
public class K9SystemViewTest {

	K9SystemView k9View;
	
	@Before
	public void setUp() throws Exception {
		k9View = (K9SystemView) TestUtils.showView(K9SystemView.VIEW_ID);
	}

	@Test
	public void testCreatePartControl() {
		List<TreeModelViewer> k9Viewers = k9View.getViewers();
		List<SystemVMContainer> rootContainers = k9View.getViewModel().getRootContainers();
		for (int i = 0; i < rootContainers.size(); i++) {
			Assert.assertTrue(k9Viewers.get(i).getInput() instanceof SystemViewInput);
			Assert.assertEquals(rootContainers.get(i), ((SystemViewInput)k9Viewers.get(i).getInput()).getContainer());
		}
	}

	@Test
	public void testRefresh() throws InterruptedException {
		SystemDMContainer oldDogs = k9View.getAllDogs();
		k9View.getRefreshJob().schedule();
		k9View.getRefreshJob().join();
		Assert.assertNotSame(oldDogs, k9View.getAllDogs());
	}

	@Test
	public void testGetOverviewVMContainer() {
		 Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getOverviewVMContainer());
	}

	@Test
	public void testGetBreedsVMContainer() {
		 Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getBreedsVMContainer());
	}

	@Test
	public void testGetDogsVMContainer() {
		 Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getDogsVMContainer());
	}

	@Test
	public void testGetToysVMContainer() {
		 Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getToysVMContainer());
	}
	
	@Test
	public void testGetPresentationContext() {
		 Assert.assertNotNull(k9View.getPresentationContext());
	}

	@Test
	public void testSetRefreshInterval() {
		int interval = k9View.getRefreshInterval();
		k9View.setRefreshInterval(8000);
		Assert.assertEquals(8000, k9View.getRefreshInterval());
		k9View.setRefreshInterval(interval);
	}

	@Test
	public void testGetRefreshInterval() {
		Assert.assertEquals(5000, k9View.getRefreshInterval());
	}

	@Test
	public void testGetRefreshjob() {
		 Assert.assertNotNull(k9View.getRefreshJob());
	}

	@Test
	public void testGetFilterMatcher() {
		StringMatcher matcher = k9View.getFilterMatcher();
		Assert.assertTrue(matcher.match("Indy"));
	}

	@Test
	public void testCreateRefreshAction() {
		IActionBars bars = k9View.getViewSite().getActionBars();
		Assert.assertNotNull(bars.getToolBarManager().find("SYSTEM_REFRESH"));
	}

	@Test
	public void testContributeToActionBars() {
		IActionBars bars = k9View.getViewSite().getActionBars();
		Assert.assertNotNull(bars.getMenuManager().find("SYSTEM_REFRESH"));
	}
	
	@Test
	public void testOptions() {
		PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
			public void run() {
				SystemRefreshOptionsDialog dialog = new SystemRefreshOptionsDialog(null);
				dialog.setAutoRefresh(k9View.shouldAutoRefresh());
				dialog.setRefreshInterval(k9View.getRefreshInterval() / 1000);
				dialog.getRefreshInterval();
				dialog.isAutoRefresh();
				dialog.setBlockOnOpen(false);
				dialog.open();
				dialog.close();
			}
		});		
	}

}
