Statistics
| Revision:

gvsig-projects-pool / org.gvsig.online / trunk / org.gvsig.online / org.gvsig.online.lib / org.gvsig.online.lib.impl / src / test / java / org / gvsig / tools / patch / PatchGeneratorTest01.java @ 9512

History | View | Annotate | Download (12.3 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright (c) 2007-2024 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.tools.patch;
24

    
25
import java.util.ArrayList;
26
import java.util.List;
27
import java.util.Objects;
28
import junit.framework.TestCase;
29
import org.apache.commons.lang3.tuple.ImmutablePair;
30
import org.apache.commons.lang3.tuple.Pair;
31
import org.gvsig.tools.task.SimpleTaskStatus;
32
import org.gvsig.tools.util.ListBuilder;
33

    
34
/**
35
 *
36
 * @author fdiaz
37
 */
38
public class PatchGeneratorTest01 extends TestCase {
39

    
40
    public static int OP_INSERT = 1;
41
    public static int OP_DELETE = 2;
42
    public static int OP_MODIFY = 3;
43
    public static int OP_CONFLICT = 4;
44

    
45
    public static class TestItem {
46

    
47
        private final int id;
48
        private final String content;
49
        private final int revision;
50

    
51
        public TestItem(int id, String content, int revision) {
52
            this.id = id;
53
            this.content = content;
54
            this.revision = revision;
55
        }
56

    
57
        public int getId() {
58
            return id;
59
        }
60

    
61
        public String getContent() {
62
            return content;
63
        }
64

    
65
        public int getRevision() {
66
            return revision;
67
        }
68

    
69
        @Override
70
        public boolean equals(Object obj) {
71
            if(!(obj instanceof TestItem)){
72
                return false;
73
            }
74
            TestItem other = (TestItem)obj;
75
            if(other.hashCode() != this.hashCode()) {
76
                return false;
77
            }
78
//            if(id != other.getId()){
79
//                return false;
80
//            }
81
//            if(!StringUtils.equals(content, other.getContent())){
82
//                return false;
83
//            }
84
//            if(revision != other.getRevision()){
85
//                return false;
86
//            }
87
            return true;
88
        }
89

    
90
        @Override
91
        public int hashCode() {
92
            int hash = 3;
93
            hash = 13 * hash + this.id;
94
            hash = 13 * hash + Objects.hashCode(this.content);
95
            hash = 13 * hash + this.revision;
96
            return hash;
97
        }
98
        
99
        
100

    
101
    }
102

    
103
    public static class TestPatchHandler implements PatchGeneratorImpl.PatchHandler<TestItem> {
104

    
105
        private final List<TestItem> localChanges;
106
        private final List<Pair<Integer,TestItem>> remoteChanges;
107

    
108
        public TestPatchHandler(List<TestItem> localChanges) {
109
            this.localChanges = localChanges;
110
            this.remoteChanges = new ArrayList<>();
111
        }
112

    
113
        @Override
114
        public int compareId(TestItem r, TestItem l) {
115
            return Integer.compare(r.getId(), l.getId());
116
        }
117

    
118
        @Override
119
        public boolean isNew(TestItem l) {
120
            return l.getId() < 0;
121
        }
122

    
123
        @Override
124
        public boolean isLocalChange(TestItem l) {
125
            return localChanges.contains(l);
126
        }
127

    
128
        @Override
129
        public boolean isRemoteChange(TestItem r, TestItem l) {
130
            return r.getRevision() != l.getRevision();
131
        }
132

    
133
        @Override
134
        public void addRemoteChangeDelete(TestItem r, boolean conflict) {
135
            if(conflict){
136
                this.remoteChanges.add(new ImmutablePair<>(OP_CONFLICT, r));
137
            } else {
138
                this.remoteChanges.add(new ImmutablePair<>(OP_DELETE, r));
139
            }
140
        }
141

    
142
        @Override
143
        public void addRemoteChangeModify(TestItem r, boolean conflict) {
144
            //FIXME: Ver que pasa con el conflicto
145
            if(conflict){
146
                this.remoteChanges.add(new ImmutablePair<>(OP_CONFLICT, r));
147
            } else {
148
                this.remoteChanges.add(new ImmutablePair<>(OP_MODIFY, r));
149
            }
150
        }
151

    
152
        @Override
153
        public void addRemoteChangeInsert(TestItem r) {
154
            this.remoteChanges.add(new ImmutablePair<>(OP_INSERT, r));
155
        }
156
        
157
        public List<Pair<Integer,TestItem>> getRemoteChanges() {
158
            return this.remoteChanges;
159
        }
160

    
161
    }
162

    
163
    public PatchGeneratorTest01(String testName) {
164
        super(testName);
165
    }
166

    
167
    public void test01RemoteDelete() {
168
        List<TestItem> localChanges = ListBuilder.create(
169
        );
170
        
171
        TestPatchHandler handler = new TestPatchHandler(localChanges);
172
        PatchGenerator patch = PatchGenerator.create(handler);
173

    
174
        List<TestItem> remote = ListBuilder.create(
175
            new TestItem(1, "A", 1),
176
            new TestItem(3, "C", 1),
177
            new TestItem(4, "D", 1)
178
        );
179
        List<TestItem> local = ListBuilder.create(
180
            new TestItem(1, "A", 1),
181
            new TestItem(2, "B", 1),
182
            new TestItem(3, "C", 1),
183
            new TestItem(4, "D", 1)
184
        );
185

    
186
        patch.generate(remote.iterator(), local.iterator(), SimpleTaskStatus.FAKE_STATUS);
187
        List<Pair<Integer, TestItem>> remoteChanges = handler.getRemoteChanges();
188
        
189
        assertEquals(1, remoteChanges.size());
190
        assertEquals(OP_DELETE, remoteChanges.get(0).getLeft().intValue());
191
        assertEquals(2, remoteChanges.get(0).getRight().id);
192
       
193
    }
194

    
195
    public void test02LocalDelete() {
196
        List<TestItem> localChanges = ListBuilder.create(
197
        );
198
        
199
        TestPatchHandler handler = new TestPatchHandler(localChanges);
200
        PatchGenerator patch = PatchGenerator.create(handler);
201

    
202
        List<TestItem> remote = ListBuilder.create(
203
            new TestItem(1, "A", 1),
204
            new TestItem(2, "B", 1),
205
            new TestItem(3, "C", 1),
206
            new TestItem(4, "D", 1)
207
        );
208
        List<TestItem> local = ListBuilder.create(
209
            new TestItem(1, "A", 1),
210
            new TestItem(3, "C", 1),
211
            new TestItem(4, "D", 1)
212
        );
213

    
214
        patch.generate(remote.iterator(), local.iterator(), SimpleTaskStatus.FAKE_STATUS);
215
        List<Pair<Integer, TestItem>> remoteChanges = handler.getRemoteChanges();
216
        
217
        assertEquals(0, remoteChanges.size());
218
       
219
    }
220

    
221
    public void test03LocalNew() {
222
        List<TestItem> localChanges = ListBuilder.create(
223
            new TestItem(-1, "E", 1)
224
        );
225
        
226
        TestPatchHandler handler = new TestPatchHandler(localChanges);
227
        PatchGenerator patch = PatchGenerator.create(handler);
228

    
229
        List<TestItem> remote = ListBuilder.create(
230
            new TestItem(1, "A", 1),
231
            new TestItem(2, "B", 1),
232
            new TestItem(3, "C", 1),
233
            new TestItem(4, "D", 1)
234
        );
235
        List<TestItem> local = ListBuilder.create(
236
            new TestItem(1, "A", 1),
237
            new TestItem(3, "C", 1),
238
            new TestItem(4, "D", 1)
239
        );
240

    
241
        patch.generate(remote.iterator(), local.iterator(), SimpleTaskStatus.FAKE_STATUS);
242
        List<Pair<Integer, TestItem>> remoteChanges = handler.getRemoteChanges();
243
        
244
        assertEquals(0, remoteChanges.size());
245
       
246
    }
247

    
248
    public void test04RemoteModify() {
249
        List<TestItem> localChanges = ListBuilder.create(
250
            new TestItem(-1, "E", 1)
251
        );
252
        
253
        TestPatchHandler handler = new TestPatchHandler(localChanges);
254
        PatchGenerator patch = PatchGenerator.create(handler);
255

    
256
        List<TestItem> remote = ListBuilder.create(
257
            new TestItem(1, "A", 1),
258
            new TestItem(2, "B2", 2),
259
            new TestItem(3, "C", 1),
260
            new TestItem(4, "D", 1)
261
        );
262
        List<TestItem> local = ListBuilder.create(
263
            new TestItem(1, "A", 1),
264
            new TestItem(2, "B", 1),
265
            new TestItem(3, "C", 1),
266
            new TestItem(4, "D", 1)
267
        );
268

    
269
        patch.generate(remote.iterator(), local.iterator(), SimpleTaskStatus.FAKE_STATUS);
270
        List<Pair<Integer, TestItem>> remoteChanges = handler.getRemoteChanges();
271
        
272
        assertEquals(1, remoteChanges.size());
273
        assertEquals(OP_MODIFY, remoteChanges.get(0).getLeft().intValue());
274
        assertEquals(2, remoteChanges.get(0).getRight().id);
275
       
276
    }
277

    
278
    public void test05Conflict() {
279
        List<TestItem> localChanges = ListBuilder.create(
280
            new TestItem(-1, "E", 1),
281
            new TestItem(2, "B3", 1)
282
        );
283
        
284
        TestPatchHandler handler = new TestPatchHandler(localChanges);
285
        PatchGenerator patch = PatchGenerator.create(handler);
286

    
287
        List<TestItem> remote = ListBuilder.create(
288
            new TestItem(1, "A", 1),
289
            new TestItem(2, "B2", 2),
290
            new TestItem(3, "C", 1),
291
            new TestItem(4, "D", 1)
292
        );
293
        List<TestItem> local = ListBuilder.create(
294
            new TestItem(1, "A", 1),
295
            new TestItem(2, "B3", 1),
296
            new TestItem(3, "C", 1),
297
            new TestItem(4, "D", 1)
298
        );
299

    
300
        patch.generate(remote.iterator(), local.iterator(), SimpleTaskStatus.FAKE_STATUS);
301
        List<Pair<Integer, TestItem>> remoteChanges = handler.getRemoteChanges();
302
        
303
        assertEquals(1, remoteChanges.size());
304
        assertEquals(OP_CONFLICT, remoteChanges.get(0).getLeft().intValue());
305
        assertEquals(2, remoteChanges.get(0).getRight().id);
306
       
307
    }
308

    
309
    public void test06RemoteNew() {
310
        List<TestItem> localChanges = ListBuilder.create(
311
            new TestItem(-1, "E", 1)
312
        );
313
        
314
        TestPatchHandler handler = new TestPatchHandler(localChanges);
315
        PatchGenerator patch = PatchGenerator.create(handler);
316

    
317
        List<TestItem> remote = ListBuilder.create(
318
            new TestItem(1, "A", 1),
319
            new TestItem(2, "B", 1),
320
            new TestItem(3, "C", 1),
321
            new TestItem(4, "D", 1),
322
            new TestItem(5, "E", 1)
323
        );
324
        List<TestItem> local = ListBuilder.create(
325
            new TestItem(1, "A", 1),
326
            new TestItem(2, "B", 1),
327
            new TestItem(3, "C", 1),
328
            new TestItem(4, "D", 1)
329
        );
330

    
331
        patch.generate(remote.iterator(), local.iterator(), SimpleTaskStatus.FAKE_STATUS);
332
        List<Pair<Integer, TestItem>> remoteChanges = handler.getRemoteChanges();
333
        
334
        assertEquals(1, remoteChanges.size());
335
        assertEquals(OP_INSERT, remoteChanges.get(0).getLeft().intValue());
336
        assertEquals(5, remoteChanges.get(0).getRight().id);
337
       
338
    }
339

    
340
    public void test07All() {
341
        List<TestItem> localChanges = ListBuilder.create(
342
            new TestItem(-1, "E", 1),
343
            new TestItem(4, "DD", 1)
344
        );
345
        
346
        TestPatchHandler handler = new TestPatchHandler(localChanges);
347
        PatchGenerator patch = PatchGenerator.create(handler);
348

    
349
        List<TestItem> remote = ListBuilder.create(
350
            new TestItem(2, "B", 1),
351
            new TestItem(3, "C2", 2),
352
            new TestItem(4, "D2", 2),
353
            new TestItem(5, "E", 1)
354
        );
355
        List<TestItem> local = ListBuilder.create(
356
            new TestItem(1, "A", 1),
357
            new TestItem(3, "C", 1),
358
            new TestItem(4, "DD", 1)
359
        );
360

    
361
        patch.generate(remote.iterator(), local.iterator(), SimpleTaskStatus.FAKE_STATUS);
362
        List<Pair<Integer, TestItem>> remoteChanges = handler.getRemoteChanges();
363
        
364
        assertEquals(4, remoteChanges.size());
365
        
366
        assertEquals(OP_DELETE, remoteChanges.get(0).getLeft().intValue());
367
        assertEquals(1, remoteChanges.get(0).getRight().id);
368
       
369
        assertEquals(OP_MODIFY, remoteChanges.get(1).getLeft().intValue());
370
        assertEquals(3, remoteChanges.get(1).getRight().id);
371

    
372
        assertEquals(OP_CONFLICT, remoteChanges.get(2).getLeft().intValue());
373
        assertEquals(4, remoteChanges.get(2).getRight().id);
374
       
375
        assertEquals(OP_INSERT, remoteChanges.get(3).getLeft().intValue());
376
        assertEquals(5, remoteChanges.get(3).getRight().id);
377
       
378
    }
379

    
380
}