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
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
88 }
89
90 assertEquals(0, p.getExceptions().size());
91 }
92
93 }