/*******************************************************************************
 * Copyright (c) 2015 Intecs.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     Nicholas Pacini
 *******************************************************************************/
package org.polarsys.chess.contracts.verificationService.test.runtime.tests;

import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.Stereotype;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.polarsys.chess.chessmlprofile.Core.CHESS;
import org.polarsys.chess.chessmlprofile.Core.CHESSViews.AnalysisView;
import org.polarsys.chess.chessmlprofile.Core.CHESSViews.ComponentView;
import org.polarsys.chess.chessmlprofile.Core.CHESSViews.DependabilityAnalysisView;
import org.polarsys.chess.chessmlprofile.Core.CHESSViews.DeploymentView;
import org.polarsys.chess.chessmlprofile.Core.CHESSViews.PSMView;
import org.polarsys.chess.chessmlprofile.Core.CHESSViews.RTAnalysisView;
import org.polarsys.chess.chessmlprofile.Core.CHESSViews.RequirementView;
import org.polarsys.chess.chessmlprofile.Core.CHESSViews.SystemView;
import org.polarsys.chess.contracts.profile.chesscontract.util.EntityUtil;
import org.polarsys.chess.core.profiles.CHESSProfileManager;

public class TestCreateViews {
	
	private Model model;
	EntityUtil entityUtil = EntityUtil.getInstance();
	
	@Before
	public void loadModel(){
		model = entityUtil.loadModel("CHESSTestModels", "TestCreateViewsModel.uml");
	}

	@Test
	public void testcreateViews() {
		
		CHESSProfileManager.createViews(model);
		
		//check that the CHESS stereotype properties are set
		Stereotype chessStereotype = model.getAppliedStereotype("CHESS::Core::CHESS");
		CHESS chess = (CHESS) model.getStereotypeApplication(chessStereotype);
		
		AnalysisView analysisView = chess.getAnalysisView();
		ComponentView componentView = chess.getComponentView();
		DeploymentView deploymentView = chess.getDeploymentView();
		PSMView psmView = chess.getPsmView();
		RequirementView requirementView = chess.getRequirementView();
		SystemView systemView = chess.getSystemView();
		
		Assert.assertNotNull(analysisView);
		Assert.assertNotNull(componentView);
		Assert.assertNotNull(deploymentView);
		Assert.assertNotNull(psmView);
		Assert.assertNotNull(requirementView);
		Assert.assertNotNull(systemView);
		
		DependabilityAnalysisView depView = analysisView.getDepanalysisview();
		RTAnalysisView rtView = analysisView.getRtanalysisview();
		Assert.assertNotNull(depView);
		Assert.assertNotNull(rtView);
		
		//check that the views exists as packages and that they are owned by the model
		Package analysisViewPkg = analysisView.getBase_Package();
		Package componentViewPkg = componentView.getBase_Package();
		Package deploymentViewPkg = deploymentView.getBase_Package();
		Package psmViewPkg = psmView.getBase_Package();
		Package requirementViewPkg = requirementView.getBase_Package();
		Package systemViewPkg = systemView.getBase_Package();
		Package depViewPkg = depView.getBase_Package();
		Package rtViewPkg =  rtView.getBase_Package();
		Assert.assertNotNull(model.getNestedPackage(analysisViewPkg.getName()));
		Assert.assertNotNull(model.getNestedPackage(componentViewPkg.getName()));
		Assert.assertNotNull(model.getNestedPackage(deploymentViewPkg.getName()));
		Assert.assertNotNull(model.getNestedPackage(psmViewPkg.getName()));
		Assert.assertNotNull(model.getNestedPackage(requirementViewPkg.getName()));
		Assert.assertNotNull(model.getNestedPackage(systemViewPkg.getName()));
		Assert.assertNotNull(analysisViewPkg.getNestedPackage(depViewPkg.getName()));
		Assert.assertNotNull(analysisViewPkg.getNestedPackage(rtViewPkg.getName()));
		
		//check that each view package has the right profiles applied on it
		Assert.assertNotNull(componentViewPkg.getAppliedProfile("CHESS::ComponentModel"));
		Assert.assertNotNull(componentViewPkg.getAppliedProfile("CHESS::Predictability::RTComponentModel"));
		Assert.assertNotNull(componentViewPkg.getAppliedProfile("CHESS::Dependability::StateBased::StateBasedComponents"));
		Assert.assertNotNull(componentViewPkg.getAppliedProfile("CHESS::Dependability::StateBased::FaultTolerance"));
		Assert.assertNotNull(componentViewPkg.getAppliedProfile("CHESS::Dependability::StateBased::MaintenanceMonitoring"));
		Assert.assertNotNull(componentViewPkg.getAppliedProfile("CHESS::Dependability::FailurePropagation"));
		Assert.assertNotNull(componentViewPkg.getAppliedProfile("CHESS::Dependability::ThreatsPropagation"));
		Assert.assertNotNull(componentViewPkg.getAppliedProfile("CHESS::Dependability::DependableComponent"));
		Assert.assertNotNull(componentViewPkg.getAppliedProfile("CHESS::Dependability::MitigationMeans"));
		
		Assert.assertNotNull(deploymentViewPkg.getAppliedProfile("CHESS::Predictability::DeploymentConfiguration::HardwareBaseline"));
		Assert.assertNotNull(deploymentViewPkg.getAppliedProfile("CHESS::Predictability::RTComponentModel"));
		Assert.assertNotNull(deploymentViewPkg.getAppliedProfile("CHESS::Dependability::StateBased::StateBasedComponents"));
		Assert.assertNotNull(deploymentViewPkg.getAppliedProfile("CHESS::Dependability::StateBased::FaultTolerance"));
		Assert.assertNotNull(deploymentViewPkg.getAppliedProfile("CHESS::Dependability::StateBased::MaintenanceMonitoring"));
		Assert.assertNotNull(deploymentViewPkg.getAppliedProfile("CHESS::Dependability::FailurePropagation"));
		Assert.assertNotNull(deploymentViewPkg.getAppliedProfile("CHESS::Dependability::ThreatsPropagation"));
		Assert.assertNotNull(deploymentViewPkg.getAppliedProfile("CHESS::Dependability::DependableComponent"));
		//Assert.assertNotNull(deploymentViewPkg.getAppliedProfile("CHESS::Dependability::FMEA"));
		
		//Assert.assertNotNull(psmViewPkg.getAppliedProfile("CHESS::Predictability::DeploymentConfiguration::DeploymentConfAnalysis"));
		//Assert.assertNotNull(psmViewPkg.getAppliedProfile("CHESS::Predictability::TimingAnalysis"));
		
		Assert.assertNotNull(systemViewPkg.getAppliedProfile("CHESS::Dependability::StateBased::StateBasedComponents"));
		Assert.assertNotNull(systemViewPkg.getAppliedProfile("CHESS::Dependability::StateBased::FaultTolerance"));
		Assert.assertNotNull(systemViewPkg.getAppliedProfile("CHESS::Dependability::StateBased::MaintenanceMonitoring"));
		Assert.assertNotNull(systemViewPkg.getAppliedProfile("CHESS::Dependability::FailurePropagation"));
		Assert.assertNotNull(systemViewPkg.getAppliedProfile("CHESS::Dependability::ThreatsPropagation"));
		Assert.assertNotNull(systemViewPkg.getAppliedProfile("CHESS::Dependability::DependableComponent"));
		Assert.assertNotNull(systemViewPkg.getAppliedProfile("CHESS::Dependability::MitigationMeans"));
		Assert.assertNotNull(systemViewPkg.getAppliedProfile("CHESS::SystemModel::STS"));
		
		Assert.assertNotNull(depViewPkg.getAppliedProfile("CHESS::Dependability::StateBased::StateBasedAnalysis"));
		Assert.assertNotNull(depViewPkg.getAppliedProfile("CHESS::Dependability::FailurePropagation"));
		//Assert.assertNotNull(depViewPkg.getAppliedProfile("CHESS::Dependability::FMEA"));
	}
}
