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