/********************************************************************************
 * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/

package org.eclipse.mdm.businessobjects.control.navigation;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;

import java.util.List;

import org.eclipse.mdm.api.base.model.Channel;
import org.eclipse.mdm.api.base.model.ChannelGroup;
import org.eclipse.mdm.api.base.model.Environment;
import org.eclipse.mdm.api.base.model.Measurement;
import org.eclipse.mdm.api.base.model.TestStep;
import org.eclipse.mdm.businessobjects.control.NavigationActivity;
import org.junit.Before;
import org.junit.Test;

public class NavigatorActivityTest {

	private NavigationActivity navigationActivity;
	private String sourceName = "MDMENV_1";

	@Before
	public void setup() throws Exception {
		navigationActivity = new NavigationActivity(NavigationActivityMockHelper.createConnectorMock());
	}

	@Test
	public void testGetEnvironments() throws Exception {

		List<Environment> envList = navigationActivity.getEnvironments();

		assertNotNull("environment list should be not null", envList);
		assertThat(envList.size(), is(5));
	}

	@Test
	public void testGetTests() throws Exception {
		List<org.eclipse.mdm.api.base.model.Test> testList = navigationActivity.getTests(sourceName);

		assertNotNull("test list should be not null", testList);
		assertEquals("test list size should be " + NavigationActivityMockHelper.ITEM_COUNT,
				NavigationActivityMockHelper.ITEM_COUNT, testList.size());
	}

	@Test
	public void testGetTestSteps() throws Exception {
		List<org.eclipse.mdm.api.base.model.Test> testList = navigationActivity.getTests(sourceName);
		org.eclipse.mdm.api.base.model.Test test = testList.get(0);
		List<TestStep> testStepList = navigationActivity.getTestSteps(sourceName, test.getID());

		assertNotNull("teststep list should be not null", testStepList);
		assertEquals("teststep list size should be " + NavigationActivityMockHelper.ITEM_COUNT,
				NavigationActivityMockHelper.ITEM_COUNT, testStepList.size());
	}

	@Test
	public void testGetMeasurements() throws Exception {
		List<org.eclipse.mdm.api.base.model.Test> testList = navigationActivity.getTests(sourceName);
		org.eclipse.mdm.api.base.model.Test test = testList.get(0);
		List<TestStep> testStepList = navigationActivity.getTestSteps(sourceName, test.getID());
		TestStep testStep = testStepList.get(0);
		List<Measurement> measurementList = navigationActivity.getMeasurements(sourceName, testStep.getID());

		assertNotNull("measurement list should be not null", measurementList);
		assertEquals("measurement list size should be " + NavigationActivityMockHelper.ITEM_COUNT,
				NavigationActivityMockHelper.ITEM_COUNT, measurementList.size());

	}

	@Test
	public void testGetChannelGroups() throws Exception {
		List<org.eclipse.mdm.api.base.model.Test> testList = navigationActivity.getTests(sourceName);
		org.eclipse.mdm.api.base.model.Test test = testList.get(0);
		List<TestStep> testStepList = navigationActivity.getTestSteps(sourceName, test.getID());
		TestStep testStep = testStepList.get(0);
		List<Measurement> measurementList = navigationActivity.getMeasurements(sourceName, testStep.getID());
		Measurement measurement = measurementList.get(0);
		List<ChannelGroup> channelGroupList = navigationActivity.getChannelGroups(sourceName, measurement.getID());

		assertNotNull("channel group list should be not null", channelGroupList);
		assertEquals("channel group list size should be " + NavigationActivityMockHelper.ITEM_COUNT,
				NavigationActivityMockHelper.ITEM_COUNT, channelGroupList.size());
	}

	@Test
	public void testGetChannels() throws Exception {
		List<org.eclipse.mdm.api.base.model.Test> testList = navigationActivity.getTests(sourceName);
		org.eclipse.mdm.api.base.model.Test test = testList.get(0);
		List<TestStep> testStepList = navigationActivity.getTestSteps(sourceName, test.getID());
		TestStep testStep = testStepList.get(0);
		List<Measurement> measurementList = navigationActivity.getMeasurements(sourceName, testStep.getID());
		Measurement measurement = measurementList.get(0);
		List<ChannelGroup> channelGroupList = navigationActivity.getChannelGroups(sourceName, measurement.getID());
		ChannelGroup channelGroup = channelGroupList.get(0);
		List<Channel> channelList = navigationActivity.getChannels(sourceName, channelGroup.getID());

		assertNotNull("channel list should be not null", channelList);
		assertEquals("channel list size should be " + NavigationActivityMockHelper.ITEM_COUNT,
				NavigationActivityMockHelper.ITEM_COUNT, channelList.size());

	}

}
