[workspace model] provide implementation of FacetManager which stores data in workspa...
[idea/community.git] / java / idea-ui / testSrc / com / intellij / facet / FacetManagerTest.java
1 // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2
3 package com.intellij.facet;
4
5 import com.intellij.configurationStore.XmlSerializer;
6 import com.intellij.facet.mock.MockFacet;
7 import com.intellij.facet.mock.MockFacetType;
8 import com.intellij.facet.mock.MockSubFacetType;
9 import org.jdom.Element;
10 import org.jetbrains.annotations.NotNull;
11 import org.jetbrains.annotations.Nullable;
12 import org.jetbrains.jps.model.serialization.facet.FacetManagerState;
13 import org.junit.Assume;
14
15
16 /**
17  * @author nik
18  */
19 public class FacetManagerTest extends FacetTestCase {
20   public void testAddDeleteFacet() {
21     final FacetManager manager = getFacetManager();
22     assertEquals(0, manager.getAllFacets().length);
23     assertEquals(0, manager.getFacetsByType(MockFacetType.ID).size());
24     assertNull(manager.getFacetByType(MockFacetType.ID));
25
26     ModifiableFacetModel model = manager.createModifiableModel();
27     final MockFacet facet = createFacet();
28     model.addFacet(facet);
29     assertTrue(model.isNewFacet(facet));
30
31     assertEquals(0, manager.getAllFacets().length);
32     assertSame(facet, assertOneElement(model.getAllFacets()));
33     assertSame(facet, assertOneElement(model.getFacetsByType(MockFacetType.ID)));
34     assertFalse(facet.isInitialized());
35
36     commit(model);
37     assertTrue(facet.isInitialized());
38     assertSame(facet, assertOneElement(manager.getAllFacets()));
39     assertSame(facet, assertOneElement(manager.getFacetsByType(MockFacetType.ID)));
40
41     model = manager.createModifiableModel();
42     assertFalse(model.isNewFacet(facet));
43     model.removeFacet(facet);
44     assertFalse(facet.isDisposed());
45     assertFalse(model.isNewFacet(facet));
46     commit(model);
47     assertEquals(0, manager.getAllFacets().length);
48     assertEquals(0, manager.getFacetsByType(MockFacetType.ID).size());
49     assertTrue(facet.isDisposed());
50   }
51
52   public void testAddSubFacet() {
53     final MockFacet mockFacet = addFacet();
54     assertNull(getFacetManager().getFacetByType(mockFacet, MockSubFacetType.ID));
55     assertNull(getFacetManager().getFacetByType(mockFacet, MockFacetType.ID));
56
57     final Facet subFacet = addSubFacet(mockFacet, "sub");
58     assertSame(subFacet, getFacetManager().getFacetByType(mockFacet, MockSubFacetType.ID));
59     assertNull(getFacetManager().getFacetByType(mockFacet, MockFacetType.ID));
60   }
61
62   public void testRenameNewFacet() {
63     final FacetManager manager = getFacetManager();
64     final ModifiableFacetModel model = manager.createModifiableModel();
65     final MockFacet facet = createFacet();
66     model.addFacet(facet);
67     model.rename(facet, "newName");
68     commit(model);
69
70     assertEquals("newName", assertOneElement(manager.getAllFacets()).getName());
71   }
72
73   public void testRenameExistingFacet() {
74     final MockFacet mockFacet = addFacet("facet");
75
76     assertEquals("facet", mockFacet.getName());
77     renameFacet(mockFacet, "newName");
78     assertEquals("newName", mockFacet.getName());
79   }
80
81   public void testListeners() {
82     final FacetManager manager = getFacetManager();
83     final MyFacetManagerListener listener = new MyFacetManagerListener();
84     myModule.getMessageBus().connect(/*getTestRootDisposable()*/).subscribe(FacetManager.FACETS_TOPIC, listener);
85
86     ModifiableFacetModel model = manager.createModifiableModel();
87     final MockFacet facet = new MockFacet(myModule, "1");
88     model.addFacet(facet);
89     assertEquals("", listener.getEvents());
90     commit(model);
91     assertEquals("before added[1]\nadded[1]\n", listener.getEvents());
92
93     model = manager.createModifiableModel();
94     model.rename(facet, "3");
95     assertEquals("", listener.getEvents());
96     commit(model);
97     assertEquals("before renamed[1]\nrenamed[3]\n", listener.getEvents());
98
99     model = manager.createModifiableModel();
100     model.removeFacet(facet);
101     commit(model);
102     assertEquals("before removed[3]\nremoved[3]\n", listener.getEvents());
103
104     model = manager.createModifiableModel();
105     final MockFacet facet2 = new MockFacet(myModule, "2");
106     model.addFacet(facet2);
107     model.removeFacet(facet2);
108     commit(model);
109     assertTrue(listener.getEvents().isEmpty());
110   }
111
112   @Nullable
113   private Element write() {
114     FacetManagerState state = ((FacetManagerImpl)getFacetManager()).getState();
115     return XmlSerializer.serialize(state);
116   }
117
118   private void read(@Nullable Element element) {
119     ((FacetManagerImpl)getFacetManager()).loadState(element == null ? new FacetManagerState() : XmlSerializer.deserialize(element, FacetManagerState.class));
120   }
121
122   public void testExternalization() {
123     FacetManager manager = getFacetManager();
124     Assume.assumeTrue("Not applicable to workspace model", manager instanceof FacetManagerImpl);
125     assertNull(write());
126
127     addFacet();
128
129     writeAndRead();
130
131     final Facet facet = assertOneElement(manager.getAllFacets());
132     assertSame(MockFacetType.getInstance(), facet.getType());
133
134     addSubFacet((MockFacet)facet, "subfacet");
135
136     writeAndRead();
137
138     final Facet[] facets = manager.getSortedFacets();
139     assertEquals(2, facets.length);
140     assertSame(MockFacetType.getInstance(), facets[0].getType());
141     assertSame(MockSubFacetType.getInstance(), facets[1].getType());
142     assertSame(facets[0], facets[1].getUnderlyingFacet());
143
144     addFacet("facet3");
145     writeAndRead();
146     assertEquals(3, manager.getAllFacets().length);
147     assertOneElement(manager.getFacetsByType(MockSubFacetType.ID));
148   }
149
150   private void writeAndRead() {
151     read(write());
152   }
153
154   public void testGetSortedFacets() {
155     final MockFacet facet = addFacet();
156     assertOrderedEquals(getFacetManager().getSortedFacets(), facet);
157     final Facet subFacet = addSubFacet(facet, "subfacet");
158     assertOrderedEquals(getFacetManager().getSortedFacets(), facet, subFacet);
159   }
160
161   private static class MyFacetManagerListener implements FacetManagerListener {
162     private final StringBuilder myEvents = new StringBuilder();
163
164     @Override
165     public void beforeFacetAdded(@NotNull Facet facet) {
166       myEvents.append("before added[").append(facet.getName()).append("]\n");
167     }
168
169     @Override
170     public void beforeFacetRemoved(@NotNull Facet facet) {
171       myEvents.append("before removed[").append(facet.getName()).append("]\n");
172     }
173
174     @Override
175     public void beforeFacetRenamed(@NotNull final Facet facet) {
176       myEvents.append("before renamed[").append(facet.getName()).append("]\n");
177     }
178
179     @Override
180     public void facetRenamed(@NotNull final Facet facet, @NotNull final String oldName) {
181       myEvents.append("renamed[").append(facet.getName()).append("]\n");
182     }
183
184     @Override
185     public void facetConfigurationChanged(@NotNull final Facet facet) {
186       myEvents.append("changed[").append(facet.getName()).append("]\n");
187     }
188
189     @Override
190     public void facetAdded(@NotNull Facet facet) {
191       myEvents.append("added[").append(facet.getName()).append("]\n");
192     }
193
194     @Override
195     public void facetRemoved(@NotNull Facet facet) {
196       myEvents.append("removed[").append(facet.getName()).append("]\n");
197     }
198
199     public String getEvents() {
200       final String s = myEvents.toString();
201       myEvents.setLength(0);
202       return s;
203     }
204   }
205 }