/** * Copyright 2014-2017 Linagora, Université Joseph Fourier, Floralis * * The present code is developed in the scope of the joint LINAGORA - * Université Joseph Fourier - Floralis research program and is designated * as a "Result" pursuant to the terms and conditions of the LINAGORA * - Université Joseph Fourier - Floralis research program. Each copyright * holder of Results enumerated here above fully & independently holds complete * ownership of the complete Intellectual Property rights applicable to the whole * of said Results, and may freely exploit it in any manner which does not infringe * the moral rights of the other copyright holders. * * 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 net.roboconf.core.dsl; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.junit.Assert; import org.junit.Test; import net.roboconf.core.ErrorCode; import net.roboconf.core.dsl.parsing.AbstractBlock; import net.roboconf.core.dsl.parsing.BlockInstanceOf; import net.roboconf.core.dsl.parsing.FileDefinition; import net.roboconf.core.internal.tests.TestUtils; import net.roboconf.core.utils.Utils; /** * @author Vincent Zurczak - Linagora */ public class ParsingModelIoTest { private static final String PATH = "/configurations/valid"; @Test public void testFileTypes() throws Exception { Map<String,Integer> fileNameToFileType = new LinkedHashMap<> (); fileNameToFileType.put( "commented-import-1.graph", FileDefinition.AGGREGATOR ); fileNameToFileType.put( "only-import-1.graph", FileDefinition.AGGREGATOR ); fileNameToFileType.put( "commented-import-3.graph", FileDefinition.AGGREGATOR ); fileNameToFileType.put( "only-component-3.graph", FileDefinition.GRAPH ); fileNameToFileType.put( "only-component-4.graph", FileDefinition.GRAPH ); fileNameToFileType.put( "real-lamp-all-in-one.graph", FileDefinition.GRAPH ); fileNameToFileType.put( "real-lamp-all-in-one-flex.graph", FileDefinition.GRAPH ); fileNameToFileType.put( "real-lamp-components.graph", FileDefinition.GRAPH ); fileNameToFileType.put( "commented-component-2.graph", FileDefinition.GRAPH ); fileNameToFileType.put( "instance-single.instances", FileDefinition.INSTANCE ); fileNameToFileType.put( "instance-multiple.instances", FileDefinition.INSTANCE ); fileNameToFileType.put( "instance-imbricated-3.instances", FileDefinition.INSTANCE ); for( Map.Entry<String,Integer> entry : fileNameToFileType.entrySet()) { File f = TestUtils.findTestFile( PATH + "/" + entry.getKey()); FileDefinition rel = ParsingModelIo.readConfigurationFile( f, false ); Assert.assertEquals( "Invalid file type for " + entry.getKey(), entry.getValue().intValue(), rel.getFileType()); Assert.assertEquals( entry.getKey(), 0, rel.getParsingErrors().size()); } } @Test public void testInvalidFileType() throws Exception { File f = TestUtils.findTestFile( "/configurations/invalid/mix.txt" ); FileDefinition def = ParsingModelIo.readConfigurationFile( f, true ); Assert.assertEquals( 1, def.getParsingErrors().size()); Assert.assertEquals( ErrorCode.P_INVALID_FILE_TYPE, def.getParsingErrors().iterator().next().getErrorCode()); } @Test public void testComplexInstances() throws Exception { File f = TestUtils.findTestFile( "/configurations/valid/complex-instances.instances" ); FileDefinition def = ParsingModelIo.readConfigurationFile( f, true ); Assert.assertEquals( 0, def.getParsingErrors().size()); List<AbstractBlock> toProcess = new ArrayList<> (); toProcess.addAll( def.getBlocks()); List<BlockInstanceOf> instances = new ArrayList<> (); while( ! toProcess.isEmpty()) { AbstractBlock currentBlock = toProcess.remove( 0 ); if( currentBlock.getInstructionType() == AbstractBlock.INSTANCEOF ) { BlockInstanceOf blockInstanceOf = (BlockInstanceOf) currentBlock; instances.add( blockInstanceOf ); toProcess.addAll( blockInstanceOf.getInnerBlocks()); } } // Keep a list instead of a count, so that we can read the // list content at debug time. Assert.assertEquals( 8, instances.size()); } @Test public void testLoadingAndWritingOfValidFile() throws Exception { List<File> validFiles = TestUtils.findTestFiles( PATH ); for( File f : validFiles ) { if( ! "instance-with-space-after.instances".equals( f.getName()) && ! "component-with-complex-variables-values.graph".equals( f.getName())) testLoadingAndWritingOfValidFile( f ); } } @Test( expected = IOException.class ) public void saveRelatrionFileRequiresTargetFile() throws Exception { FileDefinition def = new FileDefinition((File) null ); ParsingModelIo.saveRelationsFile( def, true, "\n " ); } /** * @param f */ private static void testLoadingAndWritingOfValidFile( File f ) throws Exception { // Preserving comments FileDefinition rel = ParsingModelIo.readConfigurationFile( f, false ); Assert.assertTrue( f.getName() + ": parsing errors were found.", rel.getParsingErrors().isEmpty()); String fileContent = Utils.readFileContent( f ); fileContent = fileContent.replaceAll( "\r?\n", System.getProperty( "line.separator" )); String s = ParsingModelIo.writeConfigurationFile( rel, true, null ); Assert.assertEquals( f.getName() + ": serialized model is different from the source.", fileContent, s ); // The same, but without writing comments s = ParsingModelIo.writeConfigurationFile( rel, false, null ); Assert.assertFalse( f.getName() + ": serialized model should not contain a comment delimiter.", s.contains( ParsingConstants.COMMENT_DELIMITER )); // Ignore comments at parsing time rel = ParsingModelIo.readConfigurationFile( f, true ); Assert.assertTrue( f.getName() + ": parsing errors were found.", rel.getParsingErrors().isEmpty()); s = ParsingModelIo.writeConfigurationFile( rel, true, null ); Assert.assertFalse( f.getName() + ": serialized model should not contain a comment delimiter.", s.contains( ParsingConstants.COMMENT_DELIMITER )); s = ParsingModelIo.writeConfigurationFile( rel, false, null ); Assert.assertFalse( f.getName() + ": serialized model should not contain a comment delimiter.", s.contains( ParsingConstants.COMMENT_DELIMITER )); } /** * To use for debug. * @param args */ public static void main( String[] args ) { try { File f = TestUtils.findTestFile( PATH + "/commented-import-2.graph" ); testLoadingAndWritingOfValidFile( f ); } catch( Exception e ) { e.printStackTrace(); } } }