[workspace model] provide implementation of FacetManager which stores data in workspa...
[idea/community.git] / java / idea-ui / testSrc / com / intellij / facet / FacetTestCase.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 package com.intellij.facet;
3
4 import com.intellij.facet.mock.MockFacet;
5 import com.intellij.facet.mock.MockFacetConfiguration;
6 import com.intellij.facet.mock.MockSubFacetType;
7 import com.intellij.openapi.application.WriteAction;
8 import com.intellij.openapi.application.ex.PathManagerEx;
9 import com.intellij.openapi.module.Module;
10 import com.intellij.openapi.roots.ProjectModelExternalSource;
11 import com.intellij.testFramework.JavaPsiTestCase;
12 import org.jetbrains.annotations.NotNull;
13 import org.jetbrains.annotations.Nullable;
14
15 /**
16  * @author nik
17  */
18 public abstract class FacetTestCase extends JavaPsiTestCase {
19   @Override
20   protected void tearDown() throws Exception {
21     try {
22       removeAllFacets();
23     }
24     catch (Throwable e) {
25       addSuppressedException(e);
26     }
27     finally {
28       super.tearDown();
29     }
30   }
31
32   protected void removeAllFacets() {
33     final FacetManager manager = getFacetManager();
34     final ModifiableFacetModel model = manager.createModifiableModel();
35     for (Facet facet : manager.getAllFacets()) {
36       model.removeFacet(facet);
37     }
38     commit(model);
39   }
40
41   protected FacetManager getFacetManager() {
42     return FacetManager.getInstance(myModule);
43   }
44
45   protected void commit(final ModifiableFacetModel model) {
46     WriteAction.runAndWait(() -> model.commit());
47     ((FacetManagerBase) getFacetManager()).checkConsistency();
48   }
49
50   protected MockFacet createFacet() {
51     return createFacet("facet");
52   }
53
54   protected MockFacet createFacet(final String name) {
55     return new MockFacet(myModule, name);
56   }
57
58   protected Facet<MockFacetConfiguration> createSubFacet(MockFacet parent, final String name) {
59     return new Facet<>(MockSubFacetType.getInstance(), myModule, name, new MockFacetConfiguration(), parent);
60   }
61
62   protected void removeFacet(final Facet facet) {
63     final ModifiableFacetModel model = getFacetManager().createModifiableModel();
64     model.removeFacet(facet);
65     commit(model);
66   }
67
68   protected MockFacet addFacet() {
69     return addFacet("name");
70   }
71
72   protected MockFacet addFacet(String name) {
73     return addFacet(createFacet(name));
74   }
75
76   protected MockFacet addFacet(final MockFacet facet) {
77     return addFacet(facet, null);
78   }
79
80   protected MockFacet addFacet(final MockFacet facet, @Nullable ProjectModelExternalSource externalSource) {
81     ModifiableFacetModel model = getFacetManager().createModifiableModel();
82     model.addFacet(facet, externalSource);
83     commit(model);
84     return facet;
85   }
86
87   protected Facet<MockFacetConfiguration> addSubFacet(MockFacet parent, final String name) {
88     return addSubFacet(parent, name, null);
89   }
90
91   protected Facet<MockFacetConfiguration> addSubFacet(MockFacet parent, final String name, @Nullable ProjectModelExternalSource externalSource) {
92     ModifiableFacetModel model = getFacetManager().createModifiableModel();
93     final Facet<MockFacetConfiguration> facet = createSubFacet(parent, name);
94     model.addFacet(facet, externalSource);
95     commit(model);
96     return facet;
97   }
98
99   protected void renameFacet(final Facet facet, final String newName) {
100     final FacetManager manager = getFacetManager();
101     final ModifiableFacetModel model = manager.createModifiableModel();
102     model.rename(facet, newName);
103     commit(model);
104   }
105
106   @NotNull
107   @Override
108   protected Module loadModule(@NotNull String relativePath) {
109     return super.loadModule(PathManagerEx.getTestDataPath() + "/" + relativePath);
110   }
111 }