/**
* 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.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import net.roboconf.core.ErrorCode;
import net.roboconf.core.dsl.converters.FromGraphDefinition;
import net.roboconf.core.dsl.parsing.AbstractBlock;
import net.roboconf.core.dsl.parsing.BlockBlank;
import net.roboconf.core.dsl.parsing.BlockComment;
import net.roboconf.core.dsl.parsing.BlockComponent;
import net.roboconf.core.dsl.parsing.BlockFacet;
import net.roboconf.core.dsl.parsing.BlockImport;
import net.roboconf.core.dsl.parsing.BlockInstanceOf;
import net.roboconf.core.dsl.parsing.BlockProperty;
import net.roboconf.core.dsl.parsing.FileDefinition;
import net.roboconf.core.internal.tests.TestUtils;
import net.roboconf.core.model.ParsingError;
/**
* @author Vincent Zurczak - Linagora
*/
public class ParsingModelValidatorTest {
@Test
public void testUknown() {
FileDefinition file = new FileDefinition( new File( "some-file" ));
AbstractBlock block = new AbstractBlock( file ) {
@Override
public int getInstructionType() {
return 501;
}
};
Collection<ParsingError> errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_BLOCK_TYPE, errors.iterator().next().getErrorCode());
}
@Test
public void testImport() {
FileDefinition file = new FileDefinition( new File( "some-file" ));
BlockImport block = new BlockImport( file );
block.setUri( "another-file.txt" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setUri( "http://server/another-file.txt" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setUri( "" );
Collection<ParsingError> errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_IMPORT_LOCATION, errors.iterator().next().getErrorCode());
}
@Test
public void testBlank() {
FileDefinition file = new FileDefinition( new File( "some-file" ));
BlockBlank block = new BlockBlank( file, "" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block = new BlockBlank( file, "\t\n" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block = new BlockBlank( file, "\t \n \n " );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block = new BlockBlank( file, "\nInvalid blank line\n" );
Collection<ParsingError> errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_MALFORMED_BLANK, errors.iterator().next().getErrorCode());
}
@Test
public void testComment() {
FileDefinition file = new FileDefinition( new File( "some-file" ));
BlockComment block = new BlockComment( file, "# some comment" );
Assert.assertEquals( 0, ParsingModelValidator.validate((AbstractBlock) block ).size());
block = new BlockComment( file, "##### some comment" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block = new BlockComment( file, "# comment 1\n#comment 2\n# Comment number blabla" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block = new BlockComment( file, "# Comment 1\nOops, I forgot the sharp symbol\n# Another comment" );
Collection<ParsingError> errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_MALFORMED_COMMENT, errors.iterator().next().getErrorCode());
}
@Test
public void testProperty() {
FileDefinition file = new FileDefinition( new File( "some-file" ));
BlockProperty block = new BlockProperty( file );
// Installer
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_INSTALLER, "" );
Collection<ParsingError> errors = ParsingModelValidator.validate((AbstractBlock) block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_PROPERTY_VALUE, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_INSTALLER, "installerName" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_INSTALLER, "installer-name" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_INSTALLER, "installer.name" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_INSTALLER, "installer#name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_INSTALLER_NAME, errors.iterator().next().getErrorCode());
// Children
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_PROPERTY_VALUE, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "facet1" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "facet1, facet2" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "facet1 , facet2" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "facet1 , facet2, facet3453_, facet-, facet." );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "-facet" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_CHILD_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, ".facet" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_CHILD_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "facet#" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_CHILD_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "facet;" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_CHILD_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "facet with spaces" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_CHILD_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "facet with tabs" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_CHILD_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "facet-with-minus-symbols" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_CHILDREN, "facet_with_underscores" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
// Component Facets
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_PROPERTY_VALUE, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "facet1" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "_facet1" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "facet1, facet2" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "facet1 , facet2" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "facet1 , facet2, facet3453_, facet-, facet." );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "-facet" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, ".facet" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "54_facet" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "facet#" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "facet;" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "facet with spaces" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "facet with special ch@r@cters" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_FACETS, "facet1, , facet2" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_REFERENCED_NAME, errors.iterator().next().getErrorCode());
// Extended Facets
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_PROPERTY_VALUE, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "facet1" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "_facet1" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "facet1, facet2" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "facet1 , facet2" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "facet1 , facet2, facet3453_, facet-, facet." );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "-facet" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, ".facet" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "54_facet" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "facet#" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "facet;" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "facet with spaces" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "facet with tabs and speci@l" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXTENDS, "facet1,,facet2" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_REFERENCED_NAME, errors.iterator().next().getErrorCode());
// Exported variables
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_PROPERTY_VALUE, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var1" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "_var1" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var1,var2" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var1 , var2" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var1=value1, var2" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var1 = value1 , var2" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var1, var2 = value2" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var1, var2 = value2 , var3" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var1, var2 = \"value2\" , var3" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "random[port] var1 , var2 = \"value2\" , var3" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "-var1" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_EXPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, ".var1" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_EXPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "2var1" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_EXPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var#" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_EXPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var;" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_EXPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var1, var2;" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_EXPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var1; var2;" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_EXPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var2, , var1" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_VARIABLE_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var2, var1 = \"value1" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_EXPORT_COMPLEX_VALUE, errors.iterator().next().getErrorCode());
Assert.assertEquals( "Variable name: var1", errors.iterator().next().getDetails());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var2, var1 =value1\"" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_EXPORT_COMPLEX_VALUE, errors.iterator().next().getErrorCode());
Assert.assertEquals( "Variable name: var1", errors.iterator().next().getDetails());
block.setNameAndValue( ParsingConstants.PROPERTY_GRAPH_EXPORTS, "var#, var2;" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 2, errors.size());
for( ParsingError parsingError : errors )
Assert.assertEquals( ErrorCode.PM_INVALID_EXPORTED_VAR_NAME, parsingError.getErrorCode());
// Imported variables
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_PROPERTY_VALUE, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "c.var1" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "_c.var1" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "_c._var1" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "c.var1, c2.var" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "c.var1 , c2.var" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "var1" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INCOMPLETE_IMPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "var." );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INCOMPLETE_IMPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "c.var, var1" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INCOMPLETE_IMPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "var, var1" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 2, errors.size());
for( ParsingError parsingError : errors )
Assert.assertEquals( ErrorCode.PM_INCOMPLETE_IMPORTED_VAR_NAME, parsingError.getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "var#" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_IMPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "-var" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_IMPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, ".var" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_IMPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "c.var, var;" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_IMPORTED_VAR_NAME, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, "-var, var!" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 2, errors.size());
for( ParsingError parsingError : errors )
Assert.assertEquals( ErrorCode.PM_INVALID_IMPORTED_VAR_NAME, parsingError.getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_COMPONENT_IMPORTS, ", comp.var1" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_VARIABLE_NAME, errors.iterator().next().getErrorCode());
// Count property
block.setNameAndValue( ParsingConstants.PROPERTY_INSTANCE_COUNT, "" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_PROPERTY_VALUE, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_INSTANCE_COUNT, "a" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_INSTANCE_COUNT, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_INSTANCE_COUNT, "woo" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_INSTANCE_COUNT, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_INSTANCE_COUNT, "-5" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_INSTANCE_COUNT, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_INSTANCE_COUNT, "2.3" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_INSTANCE_COUNT, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_INSTANCE_COUNT, "1" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_USELESS_INSTANCE_COUNT, errors.iterator().next().getErrorCode());
block.setNameAndValue( ParsingConstants.PROPERTY_INSTANCE_COUNT, "3" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
// Instance channel
block.setNameAndValue( ParsingConstants.PROPERTY_INSTANCE_CHANNELS, "whatever, there is no validation yet" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
// Invalid property
block.setNameAndValue( "An Invalid Property", "" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_PROPERTY_VALUE, errors.iterator().next().getErrorCode());
block.setNameAndValue( "An Invalid Property", "some value" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_UNKNOWN_PROPERTY_NAME, errors.iterator().next().getErrorCode());
}
@Test
public void testFacet() {
FileDefinition file = new FileDefinition( new File( "some-file" ));
BlockFacet block = new BlockFacet( file );
block.setName( "facet" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setName( "Facet" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setName( "_facet" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setName( "facet#" );
Collection<ParsingError> errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( "facet name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( "facet n@me" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( ".facet" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( "facet." );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_DOT_IS_NOT_ALLOWED, errors.iterator().next().getErrorCode());
block.setName( "facet.name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_DOT_IS_NOT_ALLOWED, errors.iterator().next().getErrorCode());
block.setName( "" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_FACET_NAME, errors.iterator().next().getErrorCode());
block.setName( "facet-name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
block.setName( "facet_name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
block.setName( "name" );
block.getInnerBlocks().add( new BlockProperty( file, "whatever", "whatever" ));
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_PROPERTY_NOT_APPLIABLE, errors.iterator().next().getErrorCode());
}
@Test
public void testComponent() {
FileDefinition file = new FileDefinition( new File( "some-file" ));
BlockComponent block = new BlockComponent( file );
block.setName( "component" );
Collection<ParsingError> errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
block.setName( "_component" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setName( "component#" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( "component name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( "component n*me" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( ".component" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( "component." );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_DOT_IS_NOT_ALLOWED, errors.iterator().next().getErrorCode());
block.setName( "component.name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_DOT_IS_NOT_ALLOWED, errors.iterator().next().getErrorCode());
block.setName( "" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_COMPONENT_NAME, errors.iterator().next().getErrorCode());
block.setName( "component-name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
block.setName( "component_name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
block.setName( "name" );
block.getInnerBlocks().add( new BlockProperty( file, ParsingConstants.PROPERTY_GRAPH_EXTENDS, "facet1" ));
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
block.getInnerBlocks().add( new BlockProperty( file, "whatever", "whatever" ));
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_PROPERTY_NOT_APPLIABLE, errors.iterator().next().getErrorCode());
}
@Test
public void testInstanceOf() {
FileDefinition file = new FileDefinition( new File( "some-file" ));
BlockInstanceOf block = new BlockInstanceOf( file );
block.setName( "component" );
Collection<ParsingError> errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_MISSING_INSTANCE_NAME, errors.iterator().next().getErrorCode());
block.getInnerBlocks().add( new BlockProperty( file, ParsingConstants.PROPERTY_INSTANCE_NAME, "Any name" ));
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
block.getInnerBlocks().clear();
block.getInnerBlocks().add( new BlockProperty( file, ParsingConstants.PROPERTY_INSTANCE_NAME, "Any name?" ));
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_INSTANCE_NAME, errors.iterator().next().getErrorCode());
block.getInnerBlocks().clear();
block.getInnerBlocks().add( new BlockProperty( file, ParsingConstants.PROPERTY_INSTANCE_NAME, "AnyName" ));
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setName( "_component" );
Assert.assertEquals( 0, ParsingModelValidator.validate( block ).size());
block.setName( "component#" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( "component name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( "component n@me" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( ".component" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_NAME, errors.iterator().next().getErrorCode());
block.setName( "component." );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_DOT_IS_NOT_ALLOWED, errors.iterator().next().getErrorCode());
block.setName( "component.name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_DOT_IS_NOT_ALLOWED, errors.iterator().next().getErrorCode());
block.setName( "" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_EMPTY_COMPONENT_NAME, errors.iterator().next().getErrorCode());
block.setName( "component-name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
block.setName( "component_name" );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
block.setName( "name" );
block.getInnerBlocks().add( new BlockProperty( file, ParsingConstants.PROPERTY_GRAPH_EXTENDS, "anyPropertyToOverride" ));
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 0, errors.size());
AbstractBlock childBlock = new BlockProperty( file, ParsingConstants.PROPERTY_GRAPH_EXTENDS, "anyPropertyToOverride" );
block.getInnerBlocks().add( childBlock );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 1, errors.size());
Assert.assertEquals( ErrorCode.PM_DUPLICATE_PROPERTY, errors.iterator().next().getErrorCode());
block.getInnerBlocks().remove( childBlock );
childBlock = new BlockProperty( file, ParsingConstants.PROPERTY_GRAPH_EXTENDS, "anyPropertyToOverride" ) {
@Override
public int getInstructionType() {
return 502;
}
};
block.getInnerBlocks().add( childBlock );
errors = ParsingModelValidator.validate( block );
Assert.assertEquals( 2, errors.size());
Iterator<ParsingError> iterator = errors.iterator();
Assert.assertEquals( ErrorCode.PM_INVALID_BLOCK_TYPE, iterator.next().getErrorCode());
Assert.assertEquals( ErrorCode.PM_INVALID_INSTANCE_ELEMENT, iterator.next().getErrorCode());
}
@Test
public void testExternalIsAKeywordForImports_file() throws Exception {
File f = TestUtils.findTestFile( "/configurations/invalid/external-is-keyword-for-imports.graph" );
FromGraphDefinition fromDef = new FromGraphDefinition( f.getParentFile());
fromDef.buildGraphs( f );
List<ParsingError> errors = new ArrayList<>( fromDef.getErrors());
Assert.assertEquals( 2, errors.size());
Assert.assertEquals( ErrorCode.PM_INVALID_EXPORTED_VAR_NAME, errors.get( 0 ).getErrorCode());
Assert.assertEquals( 4, errors.get( 0 ).getLine());
Assert.assertEquals( ErrorCode.PM_EXTERNAL_IS_KEYWORD_FOR_IMPORTS, errors.get( 1 ).getErrorCode());
Assert.assertEquals( 4, errors.get( 1 ).getLine());
}
}