/*
* Copyright 2014 DataGenerator Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.finra.datagenerator.engine.scxml;
import org.apache.commons.scxml.io.SCXMLParser;
import org.apache.commons.scxml.model.CustomAction;
import org.apache.commons.scxml.model.ModelException;
import org.apache.commons.scxml.model.SCXML;
import org.finra.datagenerator.distributor.multithreaded.QueueResultsProcessing;
import org.finra.datagenerator.engine.scxml.tags.CustomTagExtension;
import org.finra.datagenerator.engine.scxml.tags.FileExtension;
import org.finra.datagenerator.engine.scxml.tags.RangeExtension;
import org.finra.datagenerator.engine.scxml.tags.SetAssignExtension;
import org.finra.datagenerator.engine.scxml.tags.SingleValueAssignExtension;
import org.junit.Assert;
import org.junit.Test;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Marshall Peters
* Date: 9/3/14
*/
public class SCXMLFrontierTest {
private List<CustomTagExtension> customTagExtensionList() {
List<CustomTagExtension> tagExtensionList = new LinkedList<>();
tagExtensionList.add(new SetAssignExtension());
tagExtensionList.add(new SingleValueAssignExtension());
tagExtensionList.add(new FileExtension());
tagExtensionList.add(new RangeExtension());
return tagExtensionList;
}
private List<CustomAction> customActionsFromTagExtensions(List<CustomTagExtension> tagExtensionList) {
List<CustomAction> customActions = new ArrayList<>();
for (CustomTagExtension tagExtension : tagExtensionList) {
if (!tagExtension.getTagName().equals("assign")) {
CustomAction action = new CustomAction(tagExtension.getTagNameSpace(), tagExtension.getTagName(),
tagExtension.getTagActionClass());
customActions.add(action);
}
}
return customActions;
}
/**
* Multiple variable assignments using set:{}
*/
@Test
public void testMultiVariableAssignment() {
SCXMLEngine e = new SCXMLEngine();
InputStream is = SCXMLEngineTest.class.getResourceAsStream("/bigtest.xml");
e.setModelByInputFileStream(is);
List<CustomTagExtension> tagExtensionList = customTagExtensionList();
try {
List<PossibleState> bfs = e.bfs(343);
PossibleState p = bfs.get(0);
try {
is = SCXMLEngineTest.class.getResourceAsStream("/bigtest.xml");
SCXML model = SCXMLParser.parse(new InputSource(is), null,
customActionsFromTagExtensions(tagExtensionList));
SCXMLFrontier frontier = new SCXMLFrontier(p, model, tagExtensionList);
Queue<Map<String, String>> queue = new LinkedList<>();
AtomicBoolean flag = new AtomicBoolean(false);
frontier.searchForScenarios(new QueueResultsProcessing(queue), flag);
Assert.assertEquals(queue.size(), 6);
} catch (IOException | SAXException ex) {
Assert.fail();
}
} catch (ModelException ex) {
Assert.fail();
}
}
/**
* Test the ability of the exit flag to stop the DFS in SCXMLFrontier
*/
@Test
public void testExitFlag() {
SCXMLEngine e = new SCXMLEngine();
InputStream is = SCXMLEngineTest.class.getResourceAsStream("/bigtest.xml");
e.setModelByInputFileStream(is);
List<CustomTagExtension> tagExtensionList = customTagExtensionList();
try {
List<PossibleState> bfs = e.bfs(1);
PossibleState p = bfs.get(0);
try {
is = SCXMLEngineTest.class.getResourceAsStream("/bigtest.xml");
SCXML model = SCXMLParser.parse(new InputSource(is), null,
customActionsFromTagExtensions(tagExtensionList));
SCXMLFrontier frontier = new SCXMLFrontier(p, model, tagExtensionList);
Queue<Map<String, String>> queue = new LinkedList<>();
AtomicBoolean flag = new AtomicBoolean(true);
frontier.searchForScenarios(new QueueResultsProcessing(queue), flag);
Assert.assertEquals(queue.isEmpty(), true);
} catch (IOException | SAXException ex) {
Assert.fail();
}
} catch (ModelException ex) {
Assert.fail();
}
}
}