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