001 /* 002 * Copyright (C) Christian Schulte, 2005-206 003 * All rights reserved. 004 * 005 * Redistribution and use in source and binary forms, with or without 006 * modification, are permitted provided that the following conditions 007 * are met: 008 * 009 * o Redistributions of source code must retain the above copyright 010 * notice, this list of conditions and the following disclaimer. 011 * 012 * o Redistributions in binary form must reproduce the above copyright 013 * notice, this list of conditions and the following disclaimer in 014 * the documentation and/or other materials provided with the 015 * distribution. 016 * 017 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 018 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 019 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 020 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, 021 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 022 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 023 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 024 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 025 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 026 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 027 * 028 * $JOMC: ToolsModelValidatorTest.java 4200 2012-01-25 09:46:13Z schulte2005 $ 029 * 030 */ 031 package org.jomc.tools.modlet.test; 032 033 import java.util.List; 034 import javax.xml.bind.util.JAXBSource; 035 import org.jomc.model.Dependencies; 036 import org.jomc.model.Dependency; 037 import org.jomc.model.Implementation; 038 import org.jomc.model.Implementations; 039 import org.jomc.model.Message; 040 import org.jomc.model.Messages; 041 import org.jomc.model.ModelObject; 042 import org.jomc.model.Module; 043 import org.jomc.model.Modules; 044 import org.jomc.model.Specification; 045 import org.jomc.model.Specifications; 046 import org.jomc.model.Text; 047 import org.jomc.model.Texts; 048 import org.jomc.model.modlet.ModelHelper; 049 import org.jomc.modlet.Model; 050 import org.jomc.modlet.ModelContext; 051 import org.jomc.modlet.ModelContextFactory; 052 import org.jomc.modlet.ModelValidationReport; 053 import org.jomc.tools.model.SourceFileType; 054 import org.jomc.tools.model.SourceFilesType; 055 import org.jomc.tools.model.SourceSectionType; 056 import org.jomc.tools.model.SourceSectionsType; 057 import org.jomc.tools.modlet.ToolsModelValidator; 058 import org.junit.Test; 059 import static org.junit.Assert.assertNotNull; 060 import static org.junit.Assert.assertTrue; 061 import static org.junit.Assert.fail; 062 063 /** 064 * Test cases for class {@code org.jomc.tools.modlet.ToolsModelValidator}. 065 * 066 * @author <a href="mailto:schulte2005@users.sourceforge.net">Christian Schulte</a> 1.0 067 * @version $JOMC: ToolsModelValidatorTest.java 4200 2012-01-25 09:46:13Z schulte2005 $ 068 */ 069 public class ToolsModelValidatorTest 070 { 071 072 /** The {@code ToolsModelValidator} instance tests are performed with. */ 073 private ToolsModelValidator toolsModelValidator; 074 075 /** Creates a new {@code ToolsModelValidatorTest} instance. */ 076 public ToolsModelValidatorTest() 077 { 078 super(); 079 } 080 081 /** 082 * Gets the {@code ToolsModelValidator} instance tests are performed with. 083 * 084 * @return The {@code ToolsModelValidator} instance tests are performed with. 085 * 086 * @see #newModelValidator() 087 */ 088 public ToolsModelValidator getModelValidator() 089 { 090 if ( this.toolsModelValidator == null ) 091 { 092 this.toolsModelValidator = this.newModelValidator(); 093 } 094 095 return this.toolsModelValidator; 096 } 097 098 /** 099 * Create a new {@code ToolsModelValidator} instance to test. 100 * 101 * @return A new {@code ToolsModelValidator} instance to test. 102 * 103 * @see #getModelValidator() 104 */ 105 protected ToolsModelValidator newModelValidator() 106 { 107 return new ToolsModelValidator(); 108 } 109 110 @Test 111 public final void testValidateModel() throws Exception 112 { 113 final ModelContext modelContext = ModelContextFactory.newInstance().newModelContext(); 114 115 try 116 { 117 this.getModelValidator().validateModel( modelContext, null ); 118 fail( "Expected NullPointerException not thrown." ); 119 } 120 catch ( final NullPointerException e ) 121 { 122 assertNotNull( e.getMessage() ); 123 System.out.println( e.toString() ); 124 } 125 126 try 127 { 128 this.getModelValidator().validateModel( null, new Model() ); 129 fail( "Expected NullPointerException not thrown." ); 130 } 131 catch ( final NullPointerException e ) 132 { 133 assertNotNull( e.getMessage() ); 134 System.out.println( e.toString() ); 135 } 136 137 ModelValidationReport report = this.getModelValidator().validateModel( modelContext, new Model() ); 138 assertNotNull( report ); 139 assertTrue( report.isModelValid() ); 140 141 final Model model = new Model(); 142 model.setIdentifier( ModelObject.MODEL_PUBLIC_ID ); 143 144 final SourceFileType sourceFile1 = new SourceFileType(); 145 sourceFile1.setIdentifier( this.getClass().getSimpleName() + " 1" ); 146 147 final SourceFileType sourceFile2 = new SourceFileType(); 148 sourceFile2.setIdentifier( this.getClass().getSimpleName() + " 2" ); 149 150 final SourceFilesType sourceFiles1 = new SourceFilesType(); 151 sourceFiles1.getSourceFile().add( sourceFile1 ); 152 sourceFiles1.getSourceFile().add( sourceFile2 ); 153 154 final SourceFilesType sourceFiles2 = new SourceFilesType(); 155 sourceFiles2.getSourceFile().add( sourceFile1 ); 156 sourceFiles2.getSourceFile().add( sourceFile2 ); 157 158 final SourceSectionType sourceSection1 = new SourceSectionType(); 159 sourceSection1.setName( this.getClass().getSimpleName() + " 1" ); 160 161 final SourceSectionType sourceSection2 = new SourceSectionType(); 162 sourceSection2.setName( this.getClass().getSimpleName() + " 2" ); 163 164 final SourceSectionsType sourceSections1 = new SourceSectionsType(); 165 sourceSections1.getSourceSection().add( sourceSection1 ); 166 sourceSections1.getSourceSection().add( sourceSection2 ); 167 168 final SourceSectionsType sourceSections2 = new SourceSectionsType(); 169 sourceSections2.getSourceSection().add( sourceSection1 ); 170 sourceSections2.getSourceSection().add( sourceSection2 ); 171 172 model.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile1 ) ); 173 model.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile2 ) ); 174 model.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles1 ) ); 175 model.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles2 ) ); 176 model.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( new SourceFilesType() ) ); 177 model.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection1 ) ); 178 model.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection2 ) ); 179 model.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections1 ) ); 180 model.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections2 ) ); 181 model.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( new SourceSectionsType() ) ); 182 183 final Modules modules = new Modules(); 184 ModelHelper.setModules( model, modules ); 185 186 final Module module = new Module(); 187 modules.getModule().add( module ); 188 module.setSpecifications( new Specifications() ); 189 module.setImplementations( new Implementations() ); 190 module.setName( this.getClass().getSimpleName() ); 191 192 module.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile1 ) ); 193 module.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile2 ) ); 194 module.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles1 ) ); 195 module.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles2 ) ); 196 module.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( new SourceFilesType() ) ); 197 module.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection1 ) ); 198 module.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection2 ) ); 199 module.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections1 ) ); 200 module.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections2 ) ); 201 module.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( new SourceSectionsType() ) ); 202 module.setMessages( new Messages() ); 203 204 final Specification specification = new Specification(); 205 specification.setIdentifier( this.getClass().getSimpleName() ); 206 specification.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile1 ) ); 207 specification.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile2 ) ); 208 specification.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles1 ) ); 209 specification.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles2 ) ); 210 specification.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( new SourceFilesType() ) ); 211 specification.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection1 ) ); 212 specification.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection2 ) ); 213 specification.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections1 ) ); 214 specification.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections2 ) ); 215 specification.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( 216 new SourceSectionsType() ) ); 217 218 final Implementation implementation = new Implementation(); 219 implementation.setIdentifier( this.getClass().getSimpleName() ); 220 implementation.setName( this.getClass().getSimpleName() ); 221 implementation.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile1 ) ); 222 implementation.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile2 ) ); 223 implementation.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles1 ) ); 224 implementation.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles2 ) ); 225 implementation.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( new SourceFilesType() ) ); 226 implementation.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection1 ) ); 227 implementation.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection2 ) ); 228 implementation.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections1 ) ); 229 implementation.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections2 ) ); 230 implementation.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( 231 new SourceSectionsType() ) ); 232 233 implementation.setDependencies( new Dependencies() ); 234 implementation.setMessages( new Messages() ); 235 236 final Dependency dependency = new Dependency(); 237 dependency.setName( this.getClass().getSimpleName() ); 238 dependency.setIdentifier( this.getClass().getSimpleName() ); 239 dependency.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile1 ) ); 240 dependency.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile2 ) ); 241 dependency.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles1 ) ); 242 dependency.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles2 ) ); 243 dependency.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( new SourceFilesType() ) ); 244 dependency.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection1 ) ); 245 dependency.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection2 ) ); 246 dependency.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections1 ) ); 247 dependency.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections2 ) ); 248 dependency.getAny().add( 249 new org.jomc.tools.model.ObjectFactory().createSourceSections( new SourceSectionsType() ) ); 250 251 final Message message = new Message(); 252 message.setName( this.getClass().getSimpleName() ); 253 message.setTemplate( new Texts() ); 254 message.getTemplate().setDefaultLanguage( "en" ); 255 256 final Text text = new Text(); 257 text.setLanguage( "en" ); 258 message.getTemplate().getText().add( text ); 259 260 message.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile1 ) ); 261 message.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile2 ) ); 262 message.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles1 ) ); 263 message.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( sourceFiles2 ) ); 264 message.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFiles( new SourceFilesType() ) ); 265 message.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection1 ) ); 266 message.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSection( sourceSection2 ) ); 267 message.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections1 ) ); 268 message.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( sourceSections2 ) ); 269 message.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceSections( new SourceSectionsType() ) ); 270 271 implementation.getDependencies().getDependency().add( dependency ); 272 implementation.getMessages().getMessage().add( message ); 273 274 module.getImplementations().getImplementation().add( implementation ); 275 module.getMessages().getMessage().add( message ); 276 module.getSpecifications().getSpecification().add( specification ); 277 278 final Specification deprecatedSpecification = new Specification(); 279 deprecatedSpecification.setIdentifier( this.getClass().getSimpleName() + " 2" ); 280 deprecatedSpecification.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile1 ) ); 281 282 final Implementation deprecatedImplementation = new Implementation(); 283 deprecatedImplementation.setIdentifier( this.getClass().getSimpleName() + " 2" ); 284 deprecatedImplementation.setName( this.getClass().getSimpleName() ); 285 deprecatedImplementation.getAny().add( new org.jomc.tools.model.ObjectFactory().createSourceFile( sourceFile1 ) ); 286 287 module.getSpecifications().getSpecification().add( deprecatedSpecification ); 288 module.getImplementations().getImplementation().add( deprecatedImplementation ); 289 290 final JAXBSource jaxbSource = new JAXBSource( modelContext.createMarshaller( 291 ModelObject.MODEL_PUBLIC_ID ), new org.jomc.modlet.ObjectFactory().createModel( model ) ); 292 293 report = modelContext.validateModel( ModelObject.MODEL_PUBLIC_ID, jaxbSource ); 294 assertValidModel( report ); 295 296 report = this.getModelValidator().validateModel( modelContext, model ); 297 assertInvalidModel( report ); 298 assertModelValidationReportDetail( report, "MODEL_SOURCE_FILE_CONSTRAINT", 6 ); 299 assertModelValidationReportDetail( report, "MODEL_SOURCE_FILES_CONSTRAINT", 1 ); 300 assertModelValidationReportDetail( report, "MODEL_SOURCE_SECTION_CONSTRAINT", 6 ); 301 assertModelValidationReportDetail( report, "MODEL_SOURCE_SECTIONS_CONSTRAINT", 1 ); 302 assertModelValidationReportDetail( report, "MODULE_SOURCE_FILE_CONSTRAINT", 6 ); 303 assertModelValidationReportDetail( report, "MODULE_SOURCE_FILES_CONSTRAINT", 1 ); 304 assertModelValidationReportDetail( report, "MODULE_SOURCE_SECTION_CONSTRAINT", 6 ); 305 assertModelValidationReportDetail( report, "MODULE_SOURCE_SECTIONS_CONSTRAINT", 1 ); 306 assertModelValidationReportDetail( report, "IMPLEMENTATION_SOURCE_FILE_MULTIPLICITY_CONSTRAINT", 1 ); 307 assertModelValidationReportDetail( report, "IMPLEMENTATION_SOURCE_FILES_MULTIPLICITY_CONSTRAINT", 1 ); 308 assertModelValidationReportDetail( report, "IMPLEMENTATION_SOURCE_SECTION_CONSTRAINT", 6 ); 309 assertModelValidationReportDetail( report, "IMPLEMENTATION_SOURCE_SECTIONS_CONSTRAINT", 1 ); 310 assertModelValidationReportDetail( report, "IMPLEMENTATION_SOURCE_FILE_INFORMATION", 1 ); 311 assertModelValidationReportDetail( report, "IMPLEMENTATION_DEPENDENCY_SOURCE_FILE_CONSTRAINT", 6 ); 312 assertModelValidationReportDetail( report, "IMPLEMENTATION_DEPENDENCY_SOURCE_FILES_CONSTRAINT", 1 ); 313 assertModelValidationReportDetail( report, "IMPLEMENTATION_DEPENDENCY_SOURCE_SECTION_CONSTRAINT", 6 ); 314 assertModelValidationReportDetail( report, "IMPLEMENTATION_DEPENDENCY_SOURCE_SECTIONS_CONSTRAINT", 1 ); 315 assertModelValidationReportDetail( report, "IMPLEMENTATION_MESSAGE_SOURCE_FILE_CONSTRAINT", 6 ); 316 assertModelValidationReportDetail( report, "IMPLEMENTATION_MESSAGE_SOURCE_FILES_CONSTRAINT", 1 ); 317 assertModelValidationReportDetail( report, "IMPLEMENTATION_MESSAGE_SOURCE_SECTION_CONSTRAINT", 6 ); 318 assertModelValidationReportDetail( report, "IMPLEMENTATION_MESSAGE_SOURCE_SECTIONS_CONSTRAINT", 1 ); 319 assertModelValidationReportDetail( report, "SPECIFICATION_SOURCE_FILE_MULTIPLICITY_CONSTRAINT", 1 ); 320 assertModelValidationReportDetail( report, "SPECIFICATION_SOURCE_FILES_MULTIPLICITY_CONSTRAINT", 1 ); 321 assertModelValidationReportDetail( report, "SPECIFICATION_SOURCE_SECTION_CONSTRAINT", 6 ); 322 assertModelValidationReportDetail( report, "SPECIFICATION_SOURCE_SECTIONS_CONSTRAINT", 1 ); 323 assertModelValidationReportDetail( report, "SPECIFICATION_SOURCE_FILE_INFORMATION", 1 ); 324 } 325 326 private static void assertValidModel( final ModelValidationReport report ) 327 { 328 assertNotNull( report ); 329 330 if ( !report.isModelValid() ) 331 { 332 System.out.println( ">>>Unexpected invalid model:" ); 333 logModelValidationReport( report ); 334 fail( report.toString() ); 335 } 336 else 337 { 338 System.out.println( ">>>Valid model:" ); 339 logModelValidationReport( report ); 340 } 341 } 342 343 private static void assertInvalidModel( final ModelValidationReport report ) 344 { 345 assertNotNull( report ); 346 347 if ( report.isModelValid() ) 348 { 349 System.out.println( ">>>Unexpected valid model:" ); 350 logModelValidationReport( report ); 351 fail( report.toString() ); 352 } 353 else 354 { 355 System.out.println( ">>>Invalid model:" ); 356 logModelValidationReport( report ); 357 } 358 } 359 360 private static void assertModelValidationReportDetail( final ModelValidationReport report, final String identifier, 361 final Number count ) 362 { 363 final List<ModelValidationReport.Detail> details = report.getDetails( identifier ); 364 365 if ( details.size() != count ) 366 { 367 System.out.println( ">>>Unexpected number of '" + identifier + "' details. Expected " + count + " - found " 368 + details.size() + "." ); 369 370 logModelValidationReport( report ); 371 fail( report.toString() ); 372 } 373 } 374 375 private static void logModelValidationReport( final ModelValidationReport report ) 376 { 377 for ( ModelValidationReport.Detail d : report.getDetails() ) 378 { 379 System.out.println( "\t" + d ); 380 } 381 } 382 383 }