View Javadoc
1   package de.fhdw.wtf.parser.testWithScanner;
2   
3   import static org.junit.Assert.assertEquals;
4   
5   import java.io.IOException;
6   
7   import de.fhdw.wtf.common.ast.Model;
8   import de.fhdw.wtf.common.exception.parser.NoValidTokenStreamException;
9   import de.fhdw.wtf.common.stream.FilteredTokenStream;
10  import de.fhdw.wtf.common.stream.ScannerInputStream;
11  import de.fhdw.wtf.dsl.scanner.test.VerboseTokenStream;
12  import de.fhdw.wtf.parser.Parser;
13  import de.fhdw.wtf.testutil.TestUtil;
14  
15  @SuppressWarnings("javadoc")
16  public class TestPartslist {
17  	
18  	private static final String pathToTestFileDir = "src/test/java/de/fhdw/wtf/parser/test/files/";
19  	private static final String modelSuffix = "model";
20  	
21  	// TODO Testfall darf nicht auf ToString basieren! Bug #677
22  	
23  	private static final String expected =
24  			"Model: \n"
25  					+ "core:group=[ \n"
26  					+ "core>server:class={ \n"
27  					+ "components:Component*; \n"
28  					+ "manager:PartsListManager; \n"
29  					+ "clearComponents:[()->{}]; \n"
30  					+ "findComponent:[(name:String)->{}]; \n"
31  					+ "createComponent:[(name:String,price:Integer,componentType:String)->{exceptionGroup>DoubleDefinitionException}]; \n"
32  					+ "addComponent:[(product:Product,newComp:Component,amount:Integer)->{exceptionGroup>CycleException}]; \n"
33  					+ "changePrice:[(component:Component,newPrice:Integer)->{}]; \n"
34  					+ "getMaterialList:[(component:Component)->util>ListMaterial]; \n"
35  					+ "getOverallPrice:[(component:Component)->Integer]; \n"
36  					+ "count:[(component:Component)->Integer]; \n"
37  					+ "}; \n"
38  					+ "core>PartsListManager:class={ \n"
39  					+ "createComponent:[(name:String,price:Integer,componentType:String)->{exceptionGroup>DoubleDefinitionException}]; \n"
40  					+ "addComponent:[(product:Product,newComp:Component,amount:Integer)->{exceptionGroup>CycleException}]; \n"
41  					+ "changePrice:[(component:Component,newPrice:Integer)->{}]; \n"
42  					+ "getMaterialList:[(component:Component)->util>ListMaterial]; \n"
43  					+ "getOverallPrice:[(component:Component)->Integer]; \n"
44  					+ "count:[(component:Component)->Integer]; \n" + "}; \n" + "core>Component:class={ \n"
45  					+ "name:String prior; \n" + "price:Integer prior; \n" + "state:state>State prior; \n"
46  					+ "fetchMaterialList:[()->util>ListMaterial] abstract; \n"
47  					+ "fetchOverallPrice:[()->Integer] abstract; \n" + "changePrice:[(newPrice:Integer)->{}]; \n"
48  					+ "update:[(e:event>AbstractEvent)->{}] abstract; \n"
49  					+ "notifyObservingProducts:[(e:event>AbstractEvent)->{}] abstract; \n"
50  					+ "contains:[(component:Component)->{util>UserTrue,util>UserFalse}] abstract; \n"
51  					+ "getComponentInfo:[()->(name:String,price:Integer)]; \n" + "} abstract; \n"
52  					+ "core>Material:class=Component + { \n" + "}; \n" + "core>Product:class=Component + { \n"
53  					+ "parts:QPart*; \n"
54  					+ "addComponent:[(newComponent:Component,amount:Integer)->{exceptionGroup>CycleException}]; \n"
55  					+ "}; \n" + "core>QPart:class={ \n" + "amount:Integer prior; \n" + "component:Component prior; \n"
56  					+ "}; \n" + "core>util:group=[ \n" + "core>util>ListMaterial:class={ \n" + "entries:QMaterial*; \n"
57  					+ "addML:[(other:ListMaterial)->ListMaterial]; \n"
58  					+ "mulScalar:[(factor:Integer)->ListMaterial]; \n" + "}; \n" + "core>util>QMaterial:class={ \n"
59  					+ "amount:Integer; \n" + "material:Material; \n" + "}; \n" + "core>util>UserTrue:class={ \n"
60  					+ "}; \n" + "core>util>UserFalse:class={ \n" + "}; \n" + "]; \n" + "core>event:group=[ \n"
61  					+ "core>event>AbstractEvent:class={ \n" + "} abstract; \n"
62  					+ "core>event>StructureEvent:class=AbstractEvent + { \n" + "}; \n"
63  					+ "core>event>PriceEvent:class=AbstractEvent + { \n" + "}; \n" + "]; \n" + "core>state:group=[ \n"
64  					+ "core>state>State:class={ \n" + "} abstract; \n" + "core>state>NotCached:class=State + { \n"
65  					+ "}; \n" + "core>state>PriceCached:class=State + { \n" + "price:Integer prior; \n" + "}; \n"
66  					+ "core>state>StateAbstract:class=State + { \n" + "materials:ListMaterial prior; \n"
67  					+ "} abstract; \n" + "core>state>MaterialCached:class=StateAbstract + { \n" + "}; \n"
68  					+ "core>state>MaterialPriceCached:class=StateAbstract + { \n" + "price:Integer prior; \n" + "}; \n"
69  					+ "]; \n" + "core>exceptionGroup:group=[ \n"
70  					+ "core>exceptionGroup>DoubleDefinitionException:exception={ \n" + "}; \n"
71  					+ "core>exceptionGroup>CycleException:exception={ \n" + "}; \n" + "]; \n" + "]; \n";
72  	
73  	public void modelPartslist() throws IOException {
74  		final ScannerInputStream inputFile =
75  				TestUtil.readFileToScannerStream(pathToTestFileDir + "partslist" + "." + modelSuffix);
76  		final FilteredTokenStream output = FilteredTokenStream.create();
77  		final VerboseTokenStream v = new VerboseTokenStream(output);
78  		final de.fhdw.wtf.dsl.scanner.modelScanner.ModelDslScanner scanner =
79  				de.fhdw.wtf.dsl.scanner.modelScanner.ModelDslScanner.create();
80  		scanner.scan(inputFile, v);
81  		final Parser p = Parser.create(output);
82  		
83  		try {
84  			final Model actual = p.parse();
85  			assertEquals(expected, actual.toString());
86  		} catch (final NoValidTokenStreamException e) {
87  			// Nothing
88  		}
89  		
90  		assertEquals(0, p.getExceptions().size());
91  	}
92  	
93  }