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