NodeListTest.java revision 1f771236726dc416bc8c519fd6977eb90cf8ab3e
1package com.github.javaparser.ast;
2
3import com.github.javaparser.JavaParser;
4import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
5import com.github.javaparser.ast.body.FieldDeclaration;
6import com.github.javaparser.ast.body.VariableDeclaratorId;
7import com.github.javaparser.ast.observing.AstObserver;
8import com.github.javaparser.ast.observing.ObservableProperty;
9import com.github.javaparser.ast.type.PrimitiveType;
10import org.junit.Test;
11
12import java.util.*;
13
14import static org.junit.Assert.assertEquals;
15
16public class NodeListTest {
17
18    private AstObserver createObserver(List<String> changes) {
19        return new AstObserver() {
20            @Override
21            public void propertyChange(Node observedNode, ObservableProperty property, Object oldValue, Object newValue) {
22                changes.add(String.format("change of property %s for %s: from '%s' to '%s'", property, observedNode, oldValue, newValue ));
23            }
24
25            @Override
26            public void parentChange(Node observedNode, Node previousParent, Node newParent) {
27                changes.add(String.format("setting parent for %s: was %s, now is %s", observedNode, previousParent, newParent));
28            }
29
30            @Override
31            public void listChange(NodeList observedNode, ListChangeType type, int index, Node nodeAddedOrRemoved) {
32                changes.add(String.format("'%s' %s in list at %d", nodeAddedOrRemoved, type, index));
33            }
34        };
35    }
36
37    private FieldDeclaration createIntField(String name) {
38        return new FieldDeclaration(EnumSet.noneOf(Modifier.class), PrimitiveType.INT_TYPE, name);
39    }
40
41    @Test
42    public void addAllWithoutIndex() {
43        List<String> changes = new LinkedList<>();
44        String code = "class A { void foo(int p) { }}";
45        CompilationUnit cu = JavaParser.parse(code);
46        ClassOrInterfaceDeclaration cd = cu.getClassByName("A");
47        cd.getMembers().register(createObserver(changes));
48
49        cd.getMembers().addAll(Arrays.asList(createIntField("a"), createIntField("b"), createIntField("c")));
50        assertEquals(Arrays.asList("'int a;' ADDITION in list at 1",
51                "'int b;' ADDITION in list at 2",
52                "'int c;' ADDITION in list at 3"), changes);
53    }
54
55    @Test
56    public void addAllWithIndex() {
57        List<String> changes = new LinkedList<>();
58        String code = "class A { void foo(int p) { }}";
59        CompilationUnit cu = JavaParser.parse(code);
60        ClassOrInterfaceDeclaration cd = cu.getClassByName("A");
61        cd.getMembers().register(createObserver(changes));
62
63        cd.getMembers().addAll(0, Arrays.asList(createIntField("a"), createIntField("b"), createIntField("c")));
64        assertEquals(Arrays.asList("'int a;' ADDITION in list at 0",
65                "'int b;' ADDITION in list at 1",
66                "'int c;' ADDITION in list at 2"), changes);
67    }
68
69    @Test
70    public void clear() {
71        List<String> changes = new LinkedList<>();
72        String code = "class A { int a; int b; int c; }";
73        CompilationUnit cu = JavaParser.parse(code);
74        ClassOrInterfaceDeclaration cd = cu.getClassByName("A");
75        cd.getMembers().register(createObserver(changes));
76
77        cd.getMembers().clear();
78        assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0",
79                "'int b;' REMOVAL in list at 0",
80                "'int c;' REMOVAL in list at 0"), changes);
81    }
82
83    @Test
84    public void set() {
85        List<String> changes = new LinkedList<>();
86        String code = "class A { int a; int b; int c; }";
87        CompilationUnit cu = JavaParser.parse(code);
88        ClassOrInterfaceDeclaration cd = cu.getClassByName("A");
89        cd.getMembers().register(createObserver(changes));
90
91        cd.getMembers().set(1, createIntField("d"));
92        assertEquals(Arrays.asList("'int b;' REMOVAL in list at 1",
93                "'int d;' ADDITION in list at 1"), changes);
94    }
95
96    @Test
97    public void removeNode() {
98        List<String> changes = new LinkedList<>();
99        String code = "class A { int a; int b; int c; int d; int e; }";
100        CompilationUnit cu = JavaParser.parse(code);
101        ClassOrInterfaceDeclaration cd = cu.getClassByName("A");
102        cd.getMembers().register(createObserver(changes));
103
104        cd.getMembers().remove(cd.getFieldByName("c"));
105        assertEquals(Arrays.asList("'int c;' REMOVAL in list at 2"), changes);
106    }
107
108    @Test
109    public void removeObject() {
110        List<String> changes = new LinkedList<>();
111        String code = "class A { int a; int b; int c; int d; int e; }";
112        CompilationUnit cu = JavaParser.parse(code);
113        ClassOrInterfaceDeclaration cd = cu.getClassByName("A");
114        cd.getMembers().register(createObserver(changes));
115
116        cd.getMembers().remove("hi");
117        assertEquals(Arrays.asList(), changes);
118    }
119
120    @Test
121    public void removeAll() {
122        List<String> changes = new LinkedList<>();
123        String code = "class A { int a; int b; int c; int d; int e; }";
124        CompilationUnit cu = JavaParser.parse(code);
125        ClassOrInterfaceDeclaration cd = cu.getClassByName("A");
126        cd.getMembers().register(createObserver(changes));
127
128        cd.getMembers().removeAll(Arrays.asList(cd.getFieldByName("b"), "foo", cd.getFieldByName("d")));
129        assertEquals(Arrays.asList("'int b;' REMOVAL in list at 1",
130                "'int d;' REMOVAL in list at 2"), changes);
131    }
132
133    @Test
134    public void retainAll() {
135        List<String> changes = new LinkedList<>();
136        String code = "class A { int a; int b; int c; int d; int e; }";
137        CompilationUnit cu = JavaParser.parse(code);
138        ClassOrInterfaceDeclaration cd = cu.getClassByName("A");
139        cd.getMembers().register(createObserver(changes));
140
141        cd.getMembers().retainAll(Arrays.asList(cd.getFieldByName("b"), "foo", cd.getFieldByName("d")));
142        assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0",
143                "'int c;' REMOVAL in list at 1",
144                "'int e;' REMOVAL in list at 2"), changes);
145    }
146
147    @Test
148    public void replaceAll() {
149        List<String> changes = new LinkedList<>();
150        String code = "class A { int a; int b; int c; }";
151        CompilationUnit cu = JavaParser.parse(code);
152        ClassOrInterfaceDeclaration cd = cu.getClassByName("A");
153        cd.getMembers().register(createObserver(changes));
154
155        cd.getMembers().replaceAll(bodyDeclaration -> {
156            FieldDeclaration clone = (FieldDeclaration)bodyDeclaration.clone();
157            VariableDeclaratorId id = clone.getVariable(0).getIdentifier();
158            id.setName(id.getName().getIdentifier().toUpperCase());
159            return clone;
160        });
161        assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0", "'int A;' ADDITION in list at 0",
162                "'int b;' REMOVAL in list at 1", "'int B;' ADDITION in list at 1",
163                "'int c;' REMOVAL in list at 2", "'int C;' ADDITION in list at 2"), changes);
164    }
165
166    @Test
167    public void removeIf() {
168        List<String> changes = new LinkedList<>();
169        String code = "class A { int a; int longName; int c; }";
170        CompilationUnit cu = JavaParser.parse(code);
171        ClassOrInterfaceDeclaration cd = cu.getClassByName("A");
172        cd.getMembers().register(createObserver(changes));
173
174        cd.getMembers().removeIf(m -> ((FieldDeclaration)m).getVariable(0).getIdentifier().getName().getIdentifier().length() > 3);
175        assertEquals(Arrays.asList("'int longName;' REMOVAL in list at 1"), changes);
176    }
177}
178