001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.service.test;
016    
017    import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun;
018    import com.liferay.portal.kernel.test.util.GroupTestUtil;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    import com.liferay.portal.model.Group;
021    import com.liferay.portal.model.TreeModel;
022    
023    import java.util.ArrayList;
024    import java.util.List;
025    
026    import org.junit.After;
027    import org.junit.Assert;
028    import org.junit.Before;
029    import org.junit.Test;
030    
031    /**
032     * @author Shinn Lok
033     */
034    public abstract class BaseLocalServiceTreeTestCase {
035    
036            @Before
037            public void setUp() throws Exception {
038                    group = GroupTestUtil.addGroup();
039    
040                    createTree();
041            }
042    
043            @After
044            public void tearDown() throws Exception {
045                    for (int i = _treeModels.size() - 1; i >= 0; i--) {
046                            deleteTreeModel(_treeModels.get(i));
047                    }
048            }
049    
050            @Test
051            public void testRebuildTree() throws Exception {
052                    rebuildTree();
053    
054                    for (TreeModel treeModel : _treeModels) {
055                            long primaryKey = GetterUtil.getLong(treeModel.getPrimaryKeyObj());
056    
057                            treeModel = getTreeModel(primaryKey);
058    
059                            Assert.assertEquals(
060                                    treeModel.buildTreePath(), treeModel.getTreePath());
061                    }
062            }
063    
064            protected abstract TreeModel addTreeModel(TreeModel parentTreeModel)
065                    throws Exception;
066    
067            protected void createTree() throws Exception {
068    
069                    /**
070                     * Tree 1
071                     *
072                     * /A--->/A--->/A
073                     *  |     |--->/B
074                     *  |     |--->/C
075                     *  |     |--->/D
076                     *  |
077                     *  |--->/B--->/A
078                     *  |     |--->/B
079                     *  |     |--->/C
080                     *  |
081                     *  |--->/C--->/A
082                     *        |--->/B
083                     */
084    
085                    TreeModel treeModelA = addTreeModel(null);
086    
087                    _treeModels.add(treeModelA);
088    
089                    TreeModel treeModelAA = addTreeModel(treeModelA);
090    
091                    _treeModels.add(treeModelAA);
092    
093                    TreeModel treeModelAAA = addTreeModel(treeModelAA);
094    
095                    _treeModels.add(treeModelAAA);
096    
097                    TreeModel treeModelAAB = addTreeModel(treeModelAA);
098    
099                    _treeModels.add(treeModelAAB);
100    
101                    TreeModel treeModelAAC = addTreeModel(treeModelAA);
102    
103                    _treeModels.add(treeModelAAC);
104    
105                    TreeModel treeModelAAD = addTreeModel(treeModelAA);
106    
107                    _treeModels.add(treeModelAAD);
108    
109                    TreeModel treeModelAB = addTreeModel(treeModelA);
110    
111                    _treeModels.add(treeModelAB);
112    
113                    TreeModel treeModelABA = addTreeModel(treeModelAB);
114    
115                    _treeModels.add(treeModelABA);
116    
117                    TreeModel treeModelABB = addTreeModel(treeModelAB);
118    
119                    _treeModels.add(treeModelABB);
120    
121                    TreeModel treeModelABC = addTreeModel(treeModelAB);
122    
123                    _treeModels.add(treeModelABC);
124    
125                    TreeModel treeModelAC = addTreeModel(treeModelA);
126    
127                    _treeModels.add(treeModelAC);
128    
129                    TreeModel treeModelACA = addTreeModel(treeModelAC);
130    
131                    _treeModels.add(treeModelACA);
132    
133                    TreeModel treeModelACB = addTreeModel(treeModelAC);
134    
135                    _treeModels.add(treeModelACB);
136    
137                    /**
138                     * Tree 2
139                     *
140                     * /B--->/A--->/A
141                     *  |     |--->/B
142                     *  |
143                     *  |--->/B--->/A
144                     *  |     |--->/B
145                     *  |     |--->/C
146                     *  |
147                     *  |--->/C--->/A
148                     *        |--->/B
149                     *        |--->/C
150                     *        |--->/D
151                     */
152    
153                    TreeModel treeModelB = addTreeModel(null);
154    
155                    _treeModels.add(treeModelB);
156    
157                    TreeModel treeModelBA = addTreeModel(treeModelB);
158    
159                    _treeModels.add(treeModelBA);
160    
161                    TreeModel treeModelBAA = addTreeModel(treeModelBA);
162    
163                    _treeModels.add(treeModelBAA);
164    
165                    TreeModel treeModelBAB = addTreeModel(treeModelBA);
166    
167                    _treeModels.add(treeModelBAB);
168    
169                    TreeModel treeModelBB = addTreeModel(treeModelB);
170    
171                    _treeModels.add(treeModelBB);
172    
173                    TreeModel treeModelBBA = addTreeModel(treeModelBB);
174    
175                    _treeModels.add(treeModelBBA);
176    
177                    TreeModel treeModelBBB = addTreeModel(treeModelBB);
178    
179                    _treeModels.add(treeModelBBB);
180    
181                    TreeModel treeModelBBC = addTreeModel(treeModelBB);
182    
183                    _treeModels.add(treeModelBBC);
184    
185                    TreeModel treeModelBC = addTreeModel(treeModelB);
186    
187                    _treeModels.add(treeModelBC);
188    
189                    TreeModel treeModelBCA = addTreeModel(treeModelBC);
190    
191                    _treeModels.add(treeModelBCA);
192    
193                    TreeModel treeModelBCB = addTreeModel(treeModelBC);
194    
195                    _treeModels.add(treeModelBCB);
196    
197                    TreeModel treeModelBCC = addTreeModel(treeModelBC);
198    
199                    _treeModels.add(treeModelBCC);
200    
201                    TreeModel treeModelBCD = addTreeModel(treeModelBC);
202    
203                    _treeModels.add(treeModelBCD);
204            }
205    
206            protected abstract void deleteTreeModel(TreeModel treeModel)
207                    throws Exception;
208    
209            protected abstract TreeModel getTreeModel(long primaryKey) throws Exception;
210    
211            protected abstract void rebuildTree() throws Exception;
212    
213            @DeleteAfterTestRun
214            protected Group group;
215    
216            private final List<TreeModel> _treeModels = new ArrayList<>();
217    
218    }