1   package org.andromda.core.mappings;
2   
3   import junit.framework.TestCase;
4   import org.andromda.core.mapping.Mapping;
5   import org.andromda.core.mapping.Mappings;
6   import org.andromda.core.mapping.MappingsException;
7   
8   import java.net.URL;
9   import java.util.Collection;
10  import java.util.Iterator;
11  
12  
13  /***
14   * Tests {@link org.andromda.core.mapping.Mappings)
15   *
16   * @author Chad Brandon
17   * @author Wouter Zoons
18   */
19  public class MappingsTest
20      extends TestCase
21  {
22      /***
23       * Constructor for MappingsTest.
24       *
25       * @param name the name for this test case
26       */
27      public MappingsTest(String name)
28      {
29          super(name);
30      }
31  
32      private static final String TO_1 = "base64Binary";
33      private static final String FROM_1 = "datatype.Blob";
34      private static final String FROM_2 = "datatype.byte[]";
35      private static final String FROM_3 = "datatype.Byte[]";
36      private static final String FROM_4 = "datatype.Clob";
37      private static final String TO_2 = "java.lang.String";
38      private static final String FROM_5 = "datatype.String";
39      private static final String NOT_MAPPED_1 = "datatype.byte";
40      private static final String NOT_MAPPED_2 = "datatype.String[]";
41      private static final String TO_3 = "Class<? extends ToType>";
42      private static final String FROM_6 = "Class<? extends FromType>";
43  
44      public void testGetTo()
45      {
46          Mappings mappings1 = new Mappings();
47          Mapping mapping1 = new Mapping();
48          mapping1.setTo(TO_1);
49          mapping1.addFrom(FROM_1);
50          mapping1.addFrom(FROM_2);
51          mapping1.addFrom(FROM_3);
52          mapping1.addFrom(FROM_4);
53          mappings1.addMapping(mapping1);
54  
55          // make sure the to == from when passing in a mappings1 that don't exist
56          assertNotNull(mappings1.getTo(NOT_MAPPED_1));
57          assertEquals(
58              NOT_MAPPED_1,
59              mappings1.getTo(NOT_MAPPED_1));
60          assertEquals(
61              mappings1.getTo(NOT_MAPPED_2),
62              mappings1.getTo(NOT_MAPPED_2));
63  
64          // make sure we can retrieve the to using a from array.
65          assertNotNull(mappings1.getTo(FROM_1));
66          assertEquals(
67              TO_1,
68              mappings1.getTo(FROM_1));
69  
70          // make sure we can retrieve the to using a from non array.
71          assertEquals(
72              TO_1,
73              mappings1.getTo(FROM_4));
74  
75          Mappings mappings2 = new Mappings();
76          Mapping mapping2 = new Mapping();
77          mapping2.setTo(TO_2);
78          mapping2.addFrom(FROM_5);
79          mappings2.addMapping(mapping2);
80          assertEquals(
81              TO_2,
82              mappings2.getTo(FROM_5));
83  
84          Mappings mappings3 = new Mappings();
85          Mapping mapping3 = new Mapping();
86          mapping3.setTo(TO_3);
87          mapping3.addFrom(FROM_6);
88          mappings3.addMapping(mapping3);
89          // make sure whitespace isn't deleted, only trimmed (Java generics would fail compilation otherwise for example)
90          assertEquals(
91              TO_3,
92              mappings3.getTo(FROM_6));
93      }
94  
95      public void testMappingsInheritance()
96      {
97          final URL testMappingsParentUri = MappingsTest.class.getResource("TestMappingsParent.xml");
98          assertNotNull(testMappingsParentUri);
99          final Mappings testMappingsParent = Mappings.getInstance(testMappingsParentUri);
100         assertNotNull(testMappingsParent);
101         final Collection mappings1 = testMappingsParent.getMappings();
102         assertEquals(
103             3,
104             mappings1.size());
105         final Iterator mappings1Iterator = mappings1.iterator();
106         Mapping mapping1 = (Mapping)mappings1Iterator.next();
107         assertEquals(
108             "datatype::typeOne",
109             mapping1.getFroms().iterator().next());
110         assertEquals(
111             "Type_One",
112             mapping1.getTo());
113         Mapping mapping2 = (Mapping)mappings1Iterator.next();
114         assertEquals(
115             "datatype::typeTwo",
116             mapping2.getFroms().iterator().next());
117         assertEquals(
118             "Type_Two",
119             mapping2.getTo());
120         Mapping mapping3 = (Mapping)mappings1Iterator.next();
121         assertEquals(
122             "datatype::typeThree",
123             mapping3.getFroms().iterator().next());
124         assertEquals(
125             "Type_Three",
126             mapping3.getTo());
127 
128         final URL testMappingsUri = MappingsTest.class.getResource("TestMappings.xml");
129         assertNotNull(testMappingsUri);
130         Mappings testMappings = Mappings.getInstance(testMappingsUri);
131         assertNotNull(testMappings);
132         final Collection mappings2 = testMappings.getMappings();
133         assertEquals(
134             4,
135             mappings2.size());
136         final Iterator mappings2Iterator = mappings2.iterator();
137         mapping1 = (Mapping)mappings2Iterator.next();
138         assertEquals(
139             "datatype::typeOne",
140             mapping1.getFroms().iterator().next());
141         assertEquals(
142             "Type_One",
143             mapping1.getTo());
144         mapping2 = (Mapping)mappings2Iterator.next();
145         assertEquals(
146             "datatype::typeTwo",
147             mapping2.getFroms().iterator().next());
148         assertEquals(
149             "Overridden",
150             mapping2.getTo());
151         mapping3 = (Mapping)mappings2Iterator.next();
152         assertEquals(
153             "datatype::typeThree",
154             mapping3.getFroms().iterator().next());
155         assertEquals(
156             "Type_Three",
157             mapping3.getTo());
158         Mapping mapping4 = (Mapping)mappings2Iterator.next();
159         assertEquals(
160             "datatype::typeFour",
161             mapping4.getFroms().iterator().next());
162         assertEquals(
163             "Type_Four",
164             mapping4.getTo());
165     }
166 
167     public void testEmptyMappings()
168     {
169         final URL testEmptyMappingsUri = MappingsTest.class.getResource("TestMappingsEmpty.xml");
170         assertNotNull(testEmptyMappingsUri);
171 
172         final Mappings mappings = Mappings.getInstance(testEmptyMappingsUri);
173         assertNotNull(mappings);
174 
175         final Collection mappingCollection = mappings.getMappings();
176         assertEquals(0, mappingCollection.size());
177     }
178 
179     public void testTransitivelyExtendingLogicalMappings()
180     {
181         // the order has been mixed up on purpose
182         Mappings.addLogicalMappings(MappingsTest.class.getResource("TestMappingsExtendsLevelA.xml"));
183         Mappings.addLogicalMappings(MappingsTest.class.getResource("TestMappingsExtendsLevelD.xml"));
184         Mappings.addLogicalMappings(MappingsTest.class.getResource("TestMappingsExtendsLevelC.xml"));
185         Mappings.addLogicalMappings(MappingsTest.class.getResource("TestMappingsExtendsLevelB.xml"));
186 
187         Mappings.initializeLogicalMappings();
188 
189         final Mappings mappings = Mappings.getInstance("TestMappingsExtendsLevelD");
190         assertNotNull(mappings);
191 
192         final Mapping aaa = mappings.getMapping("datatype::aaa");
193         assertNotNull(aaa);
194         assertEquals("AAA", aaa.getTo());
195 
196         final Mapping bbb = mappings.getMapping("datatype::bbb");
197         assertNotNull(bbb);
198         assertEquals("BBB", bbb.getTo());
199 
200         final Mapping ccc = mappings.getMapping("datatype::ccc");
201         assertNotNull(ccc);
202         assertEquals("CCC", ccc.getTo());
203 
204         final Mapping ddd = mappings.getMapping("datatype::ddd");
205         assertNotNull(ddd);
206         assertEquals("DDD", ddd.getTo());
207     }
208 
209     public void testCyclicInheritanceLogicalMappingsException()
210     {
211         Mappings.addLogicalMappings(MappingsTest.class.getResource("TestMappingsCyclicA.xml"));
212         Mappings.addLogicalMappings(MappingsTest.class.getResource("TestMappingsCyclicB.xml"));
213 
214         try
215         {
216             Mappings.initializeLogicalMappings();
217             fail("Expected exception");
218         }
219         catch (MappingsException mappingsException)
220         {
221             final String message = mappingsException.getMessage();
222             assertTrue(message.startsWith("Logical mappings cannot be initialized due to invalid inheritance"));
223             assertTrue(message.indexOf("TestMappingsCyclicA") != -1);
224             assertTrue(message.indexOf("TestMappingsCyclicB") != -1);
225         }
226         finally
227         {
228             // clear out the cached entries so that the other tests won't fail because if the invalid
229             // ones we have entered here
230             Mappings.clearLogicalMappings();
231         }
232     }
233 }