/** * Copyright (c) 2016 committers of YAKINDU 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: * @author René Beckmann (beckmann@itemis.de) * */ package org.yakindu.sct.model.sexec.transformation.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.junit.Before; import org.junit.Test; import org.yakindu.sct.model.sexec.ExecutionFlow; import org.yakindu.sct.model.sexec.ExecutionState; import org.yakindu.sct.model.sexec.naming.TreeNamingService; import org.yakindu.sct.model.sexec.transformation.FlowOptimizer; import org.yakindu.sct.model.sgraph.Statechart; import org.yakindu.sct.test.models.SCTUnitTestModels; import com.google.inject.Inject; public class TreeNamingServiceTest extends ModelSequencerTest { @Inject protected SCTUnitTestModels testModels; @Inject FlowOptimizer optimizer; @Inject protected TreeNamingService statechartNamingService; @Inject protected TreeNamingService executionflowNamingService; private List<Statechart> statecharts; @Before public void setupNamingService() { statecharts = Collections.emptyList(); try { statecharts = testModels.loadAllStatecharts(); } catch (Exception e) { fail(e.getMessage()); } optimizer.inlineReactions(false); optimizer.inlineExitActions(false); optimizer.inlineEntryActions(true); optimizer.inlineEnterSequences(true); optimizer.inlineExitSequences(true); optimizer.inlineChoices(true); optimizer.inlineEntries(true); optimizer.inlineEnterRegion(true); optimizer.inlineExitRegion(true); // TODO: Why does PerformanceTest doesn't work? Statechart statecharttoRemove = null; for (Statechart sct : statecharts) { if (sct.getName().equals("PerformanceTest")) { statecharttoRemove = sct; } } statecharts.remove(statecharttoRemove); } @Test public void testDefaultNamingServiceState_NoDoubles() { for (Statechart statechart : statecharts) { // Transform statechart ExecutionFlow flow = sequencer.transform(statechart); flow = optimizer.transform(flow); List<String> names = new ArrayList<String>(); executionflowNamingService.setMaxLength(15); executionflowNamingService.setSeparator('_'); // Initialize naming services for statechart and ExecutionFlow executionflowNamingService.initializeNamingService(flow); for (ExecutionState state : flow.getStates()) { String name = executionflowNamingService.getShortName(state); assertEquals(names.contains(name), false); names.add(name); } } } @Test public void nameLengthTest31() { nameLengthTest(31); } @Test public void nameLengthTest20() { nameLengthTest(20); } @Test public void nameLengthTest15() { nameLengthTest(15); } @Test public void nameLengthTest10() { nameLengthTest(10); } @Test public void nameLengthTest8() { nameLengthTest(8); } @Test public void optimizerCombinationsTest() { Statechart toTest = null; for (Statechart statechart : statecharts) { if (statechart.getName().equals("DeepEntry")) { toTest = statechart; } } assertEquals(true, toTest != null); ExecutionFlow flow = sequencer.transform(toTest); executionflowNamingService.setMaxLength(0); executionflowNamingService.setSeparator('_'); for (int i = 0; i < (1 << 9); i++) { optimizer.inlineReactions((i & (1)) != 0); optimizer.inlineExitActions((i & (1 << 1)) != 0); optimizer.inlineEntryActions((i & (1 << 2)) != 0); optimizer.inlineEnterSequences((i & (1 << 3)) != 0); optimizer.inlineExitSequences((i & (1 << 4)) != 0); optimizer.inlineChoices((i & (1 << 5)) != 0); optimizer.inlineEntries((i & (1 << 6)) != 0); optimizer.inlineEnterRegion((i & (1 << 7)) != 0); optimizer.inlineExitRegion((i & (1 << 8)) != 0); ExecutionFlow optimizedflow = optimizer.transform(flow); List<String> names = new ArrayList<String>(); executionflowNamingService.initializeNamingService(optimizedflow); for (ExecutionState state : flow.getStates()) { String name = executionflowNamingService.getShortName(state); assertEquals(names.contains(name), false); names.add(name); } } } @Test public void statechartTest1() { Statechart toTest = getNamingServiceStatechart(); List<String> names = new ArrayList<String>(); List<String> expectedNames = new ArrayList<String>( Arrays.asList("main_region_StateA", "main_region_StateB", "second_region_StateA", "third_region_StateA", "second_region_StateA_AnotherRegion_StateA", "second_region_StateA_AnotherRegion_StateB", "third_region_StateA_AnotherRegion_StateA", "third_region_StateA_AnotherRegion_StateB")); ExecutionFlow flow = optimizer.transform(sequencer.transform(toTest)); executionflowNamingService.setMaxLength(0); executionflowNamingService.setSeparator('_'); executionflowNamingService.initializeNamingService(flow); statechartNamingService.setMaxLength(0); statechartNamingService.setSeparator('_'); statechartNamingService.initializeNamingService(toTest); for (ExecutionState state : flow.getStates()) { String name = executionflowNamingService.getShortName(state); assertEquals(names.contains(name), false); assertEquals(name, statechartNamingService.getShortName(state)); names.add(name); } stringListsEqual(expectedNames, names); } @Test public void statechartTest2() { Statechart toTest = getNamingServiceStatechart(); List<String> names = new ArrayList<String>(); // these names are shorter than 15 characters because there are more // elements containing these names, e.g. state actions List<String> expectedNames = new ArrayList<String>(Arrays.asList("mgn_SA", "mgn_StteB", "s_S", "t_S", "t_S_AR_SA", "t_S_AR_StB", "s_S_AR_SA", "s_S_AR_StB")); ExecutionFlow flow = optimizer.transform(sequencer.transform(toTest)); executionflowNamingService.setMaxLength(15); executionflowNamingService.setSeparator('_'); executionflowNamingService.initializeNamingService(flow); for (ExecutionState state : flow.getStates()) { String name = executionflowNamingService.getShortName(state); assertEquals(names.contains(name), false); names.add(name); } stringListsEqual(expectedNames, names); } private Statechart getNamingServiceStatechart() { Statechart toTest = null; for (Statechart statechart : statecharts) { if (statechart.getName().equals("namingTest")) { toTest = statechart; } } assertEquals(true, toTest != null); return toTest; } private void nameLengthTest(int maxLength) { int num_statecharts = statecharts.size(); long cumulated_time = 0L; for (Statechart statechart : statecharts) { // Transform statechart ExecutionFlow flow = sequencer.transform(statechart); flow = optimizer.transform(flow); List<String> names = new ArrayList<String>(); executionflowNamingService.setMaxLength(maxLength); executionflowNamingService.setSeparator('_'); long t0 = System.currentTimeMillis(); executionflowNamingService.initializeNamingService(flow); cumulated_time += System.currentTimeMillis() - t0; for (ExecutionState state : flow.getStates()) { String name = executionflowNamingService.getShortName(state); assertEquals(names.contains(name), false); assertEquals(true, name.length() <= maxLength); names.add(name); } } } private void stringListsEqual(List<String> onelist, List<String> otherlist) { java.util.Collections.sort(onelist, Collator.getInstance()); java.util.Collections.sort(otherlist, Collator.getInstance()); assertEquals(onelist, otherlist); } }